找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 656|回复: 1

Delphi版 通过开启远程线程 注射DLL至目标进程 有完整注释

[复制链接]

35

主题

102

回帖

204

牛毛

一级牛人

积分
204
QQ
发表于 2009-4-29 16:31:20 | 显示全部楼层 |阅读模式 来自 四川省遂宁市
作者:pathletboy
日期:2007-11-2 23:19
代码:
unit Inject;
interface
uses Windows, SysUtils, Messages, Classes;
//再目标进程中申请空间,写入注射代码后 ,开启远程线程以执行
function InjectDll(pid: thandle; dllname: string; timeout: cardinal = 7000):
  boolean;
//参数  pid  进程ID ,dllname 欲注射dll的名字
//调用样例 InjectDll(pid,'.\inject.dll');
//原理 使得目标进程通过API函数LoadLibraryA主动加载欲注射的DLL。
var
  RemoteCode: array[0..18] of char = (#$60, #$9C, #$B8, #$88, #$77, #$66, #$55,
    #$BA, #$44, #$33, #$22, #$11, #$52, #$FF, #$D0, #$9D, #$61, #$C3, #$00);
  {
  注射的代码
  60              pushad
  9C              pushfd
  B8 887****6655     mov     eax, 556****7788
  BA 443****2211     mov     edx, 112****3344
  52              push    edx
  FFD0            call    eax
  9D              popfd
  61              popad
  C3              retn
  }
implementation
function InjectDll(pid: thandle; dllname: string; timeout: cardinal = 7000):
  boolean;
var
  Rpid: thandle;
  RemotePoint, RemoteFilename: pointer;
  LoadLibptr: pointer;
  rcode: longbool;
  temp: cardinal;
  threadid: cardinal;
begin
  result := false;
  Rpid := OpenProcess(PROCESS_ALL_ACCESS, false, pid); //打开目标进程
  if Rpid = 0 then
    exit; //打开失败则退出
  RemoteFilename := VirtualAllocEx(Rpid, nil, length(dllname) + 1, MEM_COMMIT,
    PAGE_READWRITE);
  //在目标进程中申请空间 大小为欲注射dll名字长度+1 权限为可读写
  if RemoteFilename = nil then
  begin
    CloseHandle(Rpid);
    exit; //申请空间失败则退出
  end;
  rcode := WriteProcessMemory(Rpid, RemoteFileName, @dllname[1],
    length(dllname), temp);
  //将欲注射dll名字写入刚刚已经申请的空间中
  if not rcode then
  begin
    CloseHandle(rpid);
    exit; //写入失败则退出
  end;
  LoadLibptr := GetProcAddress(GetModuleHandle('Kernel32.dll'), 'LoadLibraryA');
  //获取LoadLibraryA函数的地址指针
  if LoadLibptr = nil then
  begin
    CloseHandle(rpid);
    exit; //获取失败则退出
  end;
  RemotePoint := VirtualAllocEx(Rpid, nil, sizeof(RemoteCode) + 1, MEM_COMMIT,
    PAGE_EXECUTE_READWRITE);
      //在目标进程中申请空间 大小为注射代码的字节数+1  权限为可执行可读写
  if RemotePoint = nil then
  begin
    CloseHandle(rpid);
    exit; //申请失败则退出
  end;
  {
  注射的代码
  60              pushad
  9C              pushfd
  B8 887****6655     mov     eax, 556****7788
  BA 443****2211     mov     edx, 112****3344
  52              push    edx
  FFD0            call    eax
  9D              popfd
  61              popad
  C3              retn
  }
  CopyMemory(@RemoteCode[3], @LoadLibptr, 4);
    //将LoadLibraryA的地址指针(4字节)写入 将如上887****6655覆盖
  CopyMemory(@RemoteCode[8], @RemoteFilename, 4);
    //将dll名字的首地址指针(4字节)写入 将如上443****2211覆盖
  rcode := WriteProcessMemory(Rpid, RemotePoint, @RemoteCode[0],
    sizeof(Remotecode), temp); //将注射代码写入申请的空间中
  if rcode then
  begin
    result := CreateRemoteThread(rpid, nil, 0, RemotePoint, nil, 0, threadid) <>
      0; //写入成功则开启一个远程线程执行
    CloseHandle(rpid);
  end;
end;
end.原理很简单 在远程进程中申请空间,写入注射代码,然后开启远程线程执行之.

8

主题

87

回帖

102

牛毛

一级牛人

积分
102
QQ
发表于 2009-4-29 21:21:35 | 显示全部楼层 来自 广东省广州市
LZ辛苦了
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-4-30 15:39 , Processed in 0.144765 second(s), 39 queries .

Powered by Discuz! X3.5

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