DELPHI代码,直截注入别的进程,之后直截运行在别的进程中的代码!
DELPHI代码,直接注入别的进程,之后直接运行在别的进程中的代码!
效果是弹出一个确认框!
本方法不能在98系统下使用!
function createRemoteThread(hProcess: THandle; lpThreadAttributes: Pointer;
dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter:Pointer;
dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; stdcall;

第一个参数:目标进程 ID
第二个参数:指定 SD (security descriptor), nil 表示使用预设 SD
第三个参数:堆栈大小, 0 表示使用目标进程预设堆栈大小
第四个参数:开始执行函数的地址
第五个参数:插入上面函数参数的地址
第六个参数:标志设定
第七个参数:返回成功后产生的 Thread ID
接着来说明一下,使用流程吧..
1. 取得目标 Process ID ( FindWindow+GetWindowProcessID or createToolhelp32Snapshot)
2. OpenProcess 并设定 PROCESS_ALL_ACCESS (懒,用这最方便)
3. 使用 VirtualAllocEx 在目标进程内要求两块可执行可读写的空间,一块放函数,另一块放参数
4. 使用 WriteProcessMemory 将函数和参数写进刚刚要求的两块空间
5. 准备完毕,createRemoteThread
6. WaitForSingleObject (等待 Thread 结束)
7. VirtualFreeEx 释放刚刚要求的两块地址
需小心的地方:
1. 别使用 VCL, string 也不能用.
2. 在目标进程执行的程序,无法直接使用 API, 需由 LoadLibraryA & GetProcAddress来动态载入 dll 来使用 API。但是所有 kernel32.dll 的函数可直接使用, 因为每个进程必定会载入这个 dll, 所以可由本地进程先好 LoadLibraryA & GetProcAddress 的函数地址,然后塞进参数内
3. 在目标进程执行的程序,如果用到字串的话,要小心! 不可直接用, 需将要使用的字串先写入到参数中
4. 很想用 VCL 的话,目非进程执行的程序就直接载入一个用 delphi 写的 dll XD最后,以一个例子当结尾
简单在指定的 Process 秀出一个 MessageBox..
使用了 FindWindow+GetWindowProcessId 取得目标 Process Id
1. 要在目标进程内执行的程序

procedure myMessageBegin(param: PParam); stdcall;
type
  LoadLibraryFunc = function(lib: PChar): DWORD; stdcall;
  GetProcAddressFunc = function(lib: DWORD; name: PChar): DWORD; stdcall;
  MessageBoxFunc = function(handle: DWORD; msg, title: PChar; flag: DWORD):DWORD; stdcall;
var
  myLoad: LoadLibraryFunc;
  myGetProc: GetProcAddressFunc;
  myMsg: MessageBoxFunc;
  hlib: DWORD;
begin
  myLoad := LoadLibraryFunc(param^.fLoadLibrary);
  myGetProc := GetProcAddressFunc(param^.fGetProcAddress);
  hlib := myLoad(@param^.sUser[0]);
  myMsg := MessageBoxFunc(myGetProc(hlib, @param^.sMessage[0]));
  myMsg(0, @param^.sUser[0], @param^.sMessage[0], MB_OK);
end;
看的出来,写的相当迂回 @@
2. 注入函数的参数型别定义
  //要呼叫 MessageBox, 需先 LoadLibrary User32.dll
  //然后再用 GetProcAddress 取得 MessageBox 地址
  waitforsingleobject函数 //所以需要以下栏位
  // PS: 因为系统 DLL 函数地址在每个进程都一样,
  // 加上每个程行必定含入 kernel32.dll, 所以可以放心先取得
  // LoadLibrary & GetProcAddress 的地址
  PParam = ^TParam;
  TParam = packed record
    fLoadLibrary: DWORD;
    fGetProcAddress: DWORD;
    sUser: array[0..10] of Char;
    sMessage: array[0..11] of Char;
  end;

3. 注入的程序

procedure TForm1.btnInjectClick(Sender: TObject);
var
  hwin, pid: DWORD;
  hprocess: DWORD;
  param: TParam;
  pparam, pfunc: Pointer;
  hlib: DWORD;
  hthread: DWORD;
  s: string;
  v: DWORD;
  iSize: DWORD;
begin
      hwin := FindWindow(nil, PChar(edtName.Text));// 寻指定窗体
  if hwin = 0 then begin
    MessageBox(self.Handle, '不到指定的窗体!', '讯息', MB_OK or MB_ICONWARNING);
    Exit;
  end;
  GetWindowThreadProcessId(hwin, pid);// 取得该窗体所属的 Process Id
  if pid = 0 then begin
    MessageBox(self.Handle, '不到进程ID', '讯息', MB_OK or MB_ICONWARNING);
    Exit;
  end;
      hprocess := OpenProcess(PROCESS_ALL_ACCESS, False, pid);// 开启这个进程,权限设为 ALL
  if hprocess = 0 then begin
    MessageBox(self.Handle, '无法开启进程', '讯息', MB_OK or MB_ICONWARNING);
    Exit;
  end;
  pparam := VirtualAllocEx(hprocess, nil, SizeOf(param), MEM_COMMIT,PAGE_READWRITE);// 在目标进程内要求参数内存
  if pparam = nil then begin
    MessageBox(self.Handle, '要求参数内存失败', '讯息', MB_OK or MB_ICONWARNING);
    CloseHandle(hprocess);
    Exit;
  end;
  // 在目标进程内要求函数内存
  // 这里定义一个 myMessageEnd 空函数来判断 myMessageBegin 大小
  iSize := DWORD(@myMessageEnd)-DWORD(@myMessageBegin)+1;
  pfunc := VirtualAllocEx(hprocess, nil, iSize, MEM_COMMIT,PAGE_EXECUTE_READWRITE);
  if pfunc = nil then begin
    MessageBox(self.Handle, '要求函数内存失败', '讯息', MB_OK or MB_ICONWARNING);
    CloseHandle(hprocess);
    Exit;
  end;
  // 初始化参数
  FillChar(param, SizeOf(param), 0);
  hlib := GetModuleHandle('Kernel32.dll');
  param.fLoadLibrary := DWORD(GetProcAddress(hlib, 'LoadLibraryA'));
  param.fGetProcAddress := DWORD(GetProcAddress(hlib, 'GetProcAddress'));
  s := 'user32.dll';
  Move(s[1], param.sUser[0], Length(s));
  s := 'MessageBoxA';
  Move(s[1], param.sMessage[0], Length(s));
   WriteProcessMemory(hprocess, pparam, @param, SizeOf(param), v);// 写入参数   
  WriteProcessMemory(hprocess, pfunc, @myMessageBegin, iSize, v);// 写入函数
  hthread := createRemoteThread(hprocess, nil, 0, pfunc, pparam, 0, v);//创建一个远程线程
  WaitForSingleObject(hthread, INFINITE);//检测hHandle事件的信号状态
    VirtualFreeEx(hprocess, pfunc, iSize, MEM_DECOMMIT);// 释放刚刚要求的内存
  VirtualFreeEx(hprocess, pparam, SizeOf(param), MEM_DECOMMIT);
  CloseHandle(hprocess);  // 收尾
end;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。