delphiDLL注入完整源码_第1页
delphiDLL注入完整源码_第2页
delphiDLL注入完整源码_第3页
delphiDLL注入完整源码_第4页
delphiDLL注入完整源码_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、DLL注入完整源码1. interface2.3. uses4. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,Dialogs,5.StdCtrls, tlhelp32;6. type7.TProcessEntry32 = record8.dwSize: DWORD; / 大小9.cntUsage: DWORD;10.th32ProcessID: DWORD; /线程的 pid11.th32DefaultHeapID: DWORD;12.th32ModuleID: DWORD;13.cntThreads: DWO

2、RD; /线程数14.th32ParentProcessID: DWORD; /父线程15.pcPriClassBase: integer;16.dwFlags: DWORD;17.szExeFile: array0.MAX_PATH - 1 of char; / 进程名称18.end; /说明某个 进程 TProcessEntry32 结构19. type20.TtoDllFrm = class(TForm)21.Button1: TButton;22.procedure Button1Click(Sender: TObject);23.private24. Private declarat

3、ions 25.public26. Public declarations 27.end;29. var30. toDllFrm: TtoDllFrm;31.32. implementation33.34. $R *.DFM35.36. procedure FindAProcess (const AFilename: string; const PathMatch: Boolean; var ProcessID: DWORD); /自定义一个查找 a 进程的过程 ,获得 pid37. var38. lppe: TProcessEntry32; / 该进程的结构39. SsHandle: Tha

4、ndle; / 该进程的句柄40. FoundAProc, FoundOK: boolean; / 是否找到41. begin42. ProcessID :=0; /初始 pid 数值43. SsHandle := CreateToolHelp32SnapShot(TH32CS_SnapProcess, 0);44. /创建进程快照 即进程的瞬时列表表单 TH32CS_SnapProcess,0 表示进程列 表45. /返回 进程列表的句柄46. lppe.dwSize := SizeOf(TProcessEntry32);47. /在调用Process32First API之前,需要初始化I

5、ppe记录的大小,48. 郁闷测试几个小时 ,没有初始白忙活 近一天 ,始终找不到错误49. FoundAProc := Process32First(SshandIe, Ippe);50. /将进程列表的第一个进程信息读入ppe记录中,并判断是否读入成功.51.51. whiIe FoundAProc do /读入成功 ,进行下面处理52. begin53. if PathMatch then54. FoundOK := AnsiStricomp(Ippe.szExefiIe, PChar(AFiIename) = 0相同时返回 055. / AnsiStricomp 返回 2 字符串类型的

6、比较结果57.eIse58.FoundOK := AnsiStricomp(PChar(ExtractFilename(lppe.szExefile),PChar(ExtractFilename(AFilename) = 0;59. /比较获得的参数和返回的 ExtractFilename(lppe.szExefile) 值 看是否为 0.60. if FoundOK then61. begin62. ProcessID := lppe.th32ProcessID;63. break; /找到后 ,退出循环64. end;65. FoundAProc := Process32Next(SsHa

7、ndle, lppe);66. /否则 继续找 直到找到67. end;68. CloseHandle(SsHandle); / 释放句柄69. end;70. /71. function EnabledDebugPrivilege(const bEnabled: Boolean): Boolean;72. /关于提高线程访问权限的提权 并不是什么进程都可以访问73. /访问不了 那是权限不够 就提权吧74. /这一部分 我也没有弄懂 ,注释以后在 +75. var76. hToken: THandle;77. tp: TOKEN_PRIVILEGES;78. a: DWORD;79. con

8、st80. SE_DEBUG_NAME = SeDebugPrivilege; / 最高权限81. begin82. Result := False;83. if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,hToken)84. /第一参数是要修改访问权限的进程句柄85. /第二个参数指定你要进行的操作类型 ,要修改令牌我们要指定第二个参数为 TOKEN_ADJUST_PRIVILEGES86. /第三个参数就是返回的访问令牌指针87.88.89. then90. begin91. tp.PrivilegeCou

9、nt := 1;92. LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges0.Luid);93. /返回特权名 LUID /修改进程的权限,在此处为修改本进程成为具有退出系统的权限94. /第一个参数是系统的名称,如果是本地系统只要指明为NULL 就可以了,95. /第三个参数就是返回 LUID 的指针,第二个参数就是指明了权限的名称,96. if bEnabled then97. tp.Privileges0.Attributes := SE_PRIVILEGE_ENABLED98. else99. tp.Privileges0.At

10、tributes := 0;100. a := 0;101. AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp), nil, a);102. /第一个参数是访问令牌的句柄;103. /第二个参数决定是进行权限修改还是除能(Disable)所有权限104. /第三个参数指明要修改的权限105. /第四个参数是结构 PreviousState的长度,如果PreviousState为空,该参数应为 NULL1 06. /第五参数也是一个指向 TOKEN_PRIVILEGES 结构的指针,存放修改前的访问 权限的信息,可空107.108. Resul

11、t := GetLastError = ERROR_SUCCESS;109. CloseHandle(hToken);110. end;111. end;112.114. function AttachToProcess(const HostFile, GuestFile: string; const PID: DWORD =0): DWORD; / 自定义注入函数 115. var116.hRemoteProcess: THandle; /远程线程句秉117.dwRemoteProcessId: DWORD; /远程线程 pid118.cb: DWORD;119.pszLibFileRemo

12、te: Pointer; /一个指针 指向远程 dll 的地址120.iReturnCode: Boolean; /返回值作判断用121.TempVar: DWORD;122.pfnStartAddr: TFNThreadStartRoutine; /lib 函数地址123.pszLibAFilename: PwideChar; /一个指向文件名124. begin125.Result := 0;126.EnabledDebugPrivilege(True); /提权127.Getmem(pszLibAFilename, Length(GuestFile) * 2 + 1);128./申请内存

13、 内存的大小由 Length(GuestFile) * 2 + 1 决定129.StringToWideChar(GuestFile, pszLibAFilename, Length(GuestFile) * 2 +1);130.if PID 0 then131.dwRemoteProcessID := PID132.else133.FindAProcess(HostFile, False, dwRemoteProcessID);134.hRemoteProcess := OpenProcess(PROCESS_CREATE_THREAD +允 许远程创建线程 135.PROCESS_VM_O

14、PERATION + 允许远程 VM 操作 136.PROCESS_VM_WRITE, 允许远程 VM 写137.FALSE, dwRemoteProcessId);138.cb := (1 + lstrlenW(pszLibAFilename) * sizeof(WCHAR);139.pszLibFileRemote := PWIDESTRING(VirtualAllocEx(hRemoteProcess, nil, cb,MEM_COMMIT, PAGE_READWRITE);140. /申请内存 ,并指向内寸地址 并付值141. TempVar := 0;142. iReturnCode

15、 := WriteProcessMemory(hRemoteProcess, pszLibFileRemote,pszLibAFilename, cb, TempVar);143. /写入成功 ,将返回一个不为 0-de 值144. if iReturnCode then145. begin146. pfnStartAddr := GetProcAddress(GetModuleHandle(Kernel32), LoadLibraryW);147. /GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址148. /GetModuleHandle 函数可以返回此句柄149. TempVar := 0;150. Result := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, pszLibFileRemote, 0, TempVar);151. /新生成的线程分配的线程 Id 即 TempVar152. end;153. Freemem(pszLibA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论