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 地址 //所以需要以下栏位 // 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.T