Цитата(Yanis @ 20.9.2006, 11:27 ) | | А что такое модуль? |
Ну обычная длл-ка. То есть, "инжект модуля" - это внедрение dll-ки в чужое адресное пространство, а "реинжект модуля" - это выгрузка dll-ки из чужого адресного пространства.
Делаю так:
| Код | type TFreeLibraryCode=packed record FreeLibPushOp: byte; FreeLibPushArg: dword; FreeLibCallOp: word; FreeLibCallArg: dword; ExitThreadPushOp: byte; ExitThreadPushArg: dword; ExitThreadCallOp: word; ExitThreadCallArg: dword; FreeLibraryAddress: dword; ExitThreadAddress: dword; end;
function GetCodeBase(CodeSize: integer; pID: integer): Pointer; var hProcess: integer; begin hProcess:=OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_WRITE or PROCESS_VM_OPERATION, false, pID); result:=VirtualAllocEx(hProcess, nil, CodeSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); CloseHandle(hProcess); end;
function ExCodeInRemoteProcess(pCode: Pointer; CodeSize: integer; CodeBase: Pointer; pID: integer): boolean; var hProcess: integer; BytesWritten: Cardinal; hThread: integer; ThreadID: Cardinal; begin hProcess:=OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_WRITE or PROCESS_VM_OPERATION, FALSE, pID); if (hProcess=0) then begin result:=false; exit; end;
result:=WriteProcessMemory(hProcess, CodeBase, pCode, CodeSize, BytesWritten); if (not result) then begin CloseHandle(hProcess); exit; end;
hThread:=CreateRemoteThread(hProcess, nil, 0, CodeBase, nil, 0, ThreadID); if (hThread=0) then begin VirtualFreeEx(hProcess, CodeBase, CodeSize, MEM_RELEASE); CloseHandle(hProcess); result:=false; exit; end;
WaitForSingleObject(hThread, INFINITE); VirtualFreeEx(hProcess, CodeBase, CodeSize, MEM_RELEASE); CloseHandle(hProcess); result:=true; end;
function FreeLibraryInProcess(pID: integer; LibName: string): boolean; var FreeLibraryCode: TFreeLibraryCode; pCode: Pointer; hLib: THandle; begin pCode:=GetCodeBase(sizeof(FreeLibraryCode), pID);
FreeLibraryCode.FreeLibPushOp:=OPCODE_PUSH; hLib:=LoadLibrary(PChar(LibName)); FreeLibraryCode.FreeLibPushArg:=GetModuleHandle(PChar(LibName)); FreeLibrary(hLib); FreeLibraryCode.FreeLibCallOp:=OPCODE_CALL; FreeLibraryCode.FreeLibCallArg:=DWORD(pCode)+DWORD(@FreeLibraryCode.FreeLibraryAddress)-DWORD(@FreeLibraryCode);
FreeLibraryCode.ExitThreadPushOp:=OPCODE_PUSH; FreeLibraryCode.ExitThreadPushArg:=0; FreeLibraryCode.ExitThreadCallOp:=OPCODE_CALL; FreeLibraryCode.ExitThreadCallArg:=DWORD(pCode)+DWORD(@FreeLibraryCode.ExitThreadAddress)-DWORD(@FreeLibraryCode);
FreeLibraryCode.FreeLibraryAddress:=DWORD(GetProcAddress(GetModuleHandle('kernel32.dll'), 'FreeLibrary')); FreeLibraryCode.ExitThreadAddress:=DWORD(GetProcAddress(GetModuleHandle('kernel32.dll'), 'ExitThread'));
result:=ExCodeInRemoteProcess(@FreeLibraryCode, sizeof(FreeLibraryCode), pCode, pID); end;
|
|