找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4194|回复: 0

[交流] 通过开启远程线程 注射DLL至目标进程

[复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2010-1-27 21:14:51 | 显示全部楼层 |阅读模式
  1. unit Inject;

  2. interface
  3. uses Windows, SysUtils, Messages, Classes;

  4. //再目标进程中申请空间,写入注射代码后 ,开启远程线程以执行

  5. function InjectDll(pid: thandle; dllname: string; timeout: cardinal = 7000):
  6. boolean;

  7. //参数 pid 进程ID ,dllname 欲注射dll的名字
  8. //调用样例 InjectDll(pid,'.\inject.dll');
  9. //原理 使得目标进程通过API函数LoadLibraryA主动加载欲注射的DLL。

  10. var
  11. RemoteCode: array[0..18] of char = (#$60, #$9C, #$B8, #$88, #$77, #$66, #$55,
  12. #$BA, #$44, #$33, #$22, #$11, #$52, #$FF, #$D0, #$9D, #$61, #$C3, #$00);
  13. {
  14. 注射的代码
  15. 60 pushad
  16. 9C pushfd
  17. B8 88776655 mov eax, 55667788
  18. BA 44332211 mov edx, 11223344
  19. 52 push edx
  20. FFD0 call eax
  21. 9D popfd
  22. 61 popad
  23. C3 retn
  24. }

  25. implementation

  26. function InjectDll(pid: thandle; dllname: string; timeout: cardinal = 7000):
  27. boolean;
  28. var
  29. Rpid: thandle;
  30. RemotePoint, RemoteFilename: pointer;
  31. LoadLibptr: pointer;
  32. rcode: longbool;
  33. temp: cardinal;
  34. threadid: cardinal;
  35. begin
  36. result := false;
  37. Rpid := OpenProcess(PROCESS_ALL_ACCESS, false, pid); //打开目标进程
  38. if Rpid = 0 then
  39. exit; //打开失败则退出
  40. RemoteFilename := VirtualAllocEx(Rpid, nil, length(dllname) + 1, MEM_COMMIT,
  41. PAGE_READWRITE);
  42. //在目标进程中申请空间 大小为欲注射dll名字长度+1 权限为可读写
  43. if RemoteFilename = nil then
  44. begin
  45. CloseHandle(Rpid);
  46. exit; //申请空间失败则退出
  47. end;
  48. rcode := WriteProcessMemory(Rpid, RemoteFileName, @dllname[1],
  49. length(dllname), temp);
  50. //将欲注射dll名字写入刚刚已经申请的空间中
  51. if not rcode then
  52. begin
  53. CloseHandle(rpid);
  54. exit; //写入失败则退出
  55. end;
  56. LoadLibptr := GetProcAddress(GetModuleHandle('Kernel32.dll'), 'LoadLibraryA');
  57. //获取LoadLibraryA函数的地址指针
  58. if LoadLibptr = nil then
  59. begin
  60. CloseHandle(rpid);
  61. exit; //获取失败则退出
  62. end;
  63. RemotePoint := VirtualAllocEx(Rpid, nil, sizeof(RemoteCode) + 1, MEM_COMMIT,
  64. PAGE_EXECUTE_READWRITE);
  65. //在目标进程中申请空间 大小为注射代码的字节数+1 权限为可执行可读写
  66. if RemotePoint = nil then
  67. begin
  68. CloseHandle(rpid);
  69. exit; //申请失败则退出
  70. end;

  71. {
  72. 注射的代码
  73. 60 pushad
  74. 9C pushfd
  75. B8 88776655 mov eax, 55667788
  76. BA 44332211 mov edx, 11223344
  77. 52 push edx
  78. FFD0 call eax
  79. 9D popfd
  80. 61 popad
  81. C3 retn
  82. }

  83. CopyMemory(@RemoteCode[3], @LoadLibptr, 4);
  84. //将LoadLibraryA的地址指针(4字节)写入 将如上88776655覆盖
  85. CopyMemory(@RemoteCode[8], @RemoteFilename, 4);
  86. //将dll名字的首地址指针(4字节)写入 将如上44332211覆盖
  87. rcode := WriteProcessMemory(Rpid, RemotePoint, @RemoteCode[0],
  88. sizeof(Remotecode), temp); //将注射代码写入申请的空间中
  89. if rcode then
  90. begin
  91. result := CreateRemoteThread(rpid, nil, 0, RemotePoint, nil, 0, threadid) <>
  92. 0; //写入成功则开启一个远程线程执行
  93. CloseHandle(rpid);
  94. end;
  95. end;
  96. end.
复制代码
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表