Цитата | Это не совсем вставка, это внедряемый загрузчик. Его можно заменить массивом-константой, но тогда нельзя будет его редактировать.
|
Не нравятся мне оба варианта  Когда я писал агрузчик для CreateRemoteThread я делал так: Код | type TLoadLibrary = function(lpLibFileName: PWideChar): HMODULE; stdcall; TGetProcAddress = function (hModule: HMODULE; lpProcName: LPCSTR): FARPROC; stdcall; TStartProcAddr = procedure; stdcall; TExitThread = procedure (dwExitCode: DWORD); stdcall; TMessageBox = function(hWnd: HWND; lpText, lpCaption: PWideChar; uType: UINT): Integer; stdcall;
TInjectLibParameters = record LibraryName: PChar; StartProcName: LPCSTR; StartProcAddr: TStartProcAddr; LoadLibraryWAddr: TLoadLibrary; LibraryModule: HModule; GetProcAddressAddr: TGetProcAddress; ExitThreadProc: TExitThread; ErrorProcedureText: PChar; ErrorLibraryText: PChar; MessageBoxProc: TMessageBox; end; PInjectLibParameters = ^TInjectLibParameters;
|
Код |
procedure ExternalThreadProcedure(InjectParameters: PInjectLibParameters); stdcall; begin InjectParameters.LibraryModule := InjectParameters.LoadLibraryWAddr(InjectParameters.LibraryName); if InjectParameters.LibraryModule = 0 then InjectParameters.MessageBoxProc(0, InjectParameters.ErrorLibraryText, nil, MB_OK or MB_ICONWARNING);
InjectParameters.StartProcAddr := InjectParameters.GetProcAddressAddr(InjectParameters.LibraryModule, InjectParameters.StartProcName);
if @InjectParameters.StartProcAddr <> nil then InjectParameters.StartProcAddr() else InjectParameters.MessageBoxProc(0, InjectParameters.ErrorProcedureText, nil, MB_OK or MB_ICONERROR);
InjectParameters.ExitThreadProc(0); end; procedure ExternalThreadProcedureEnd; begin //just marker of ExternalThreadProcedure end end;
|
и финально: Код | ZeroMemory(@InjectParams, SizeOf(InjectParams)); InjectParams.ErrorLibraryText := CreateExternalPChar('Invalid hook library!'); //TODO: localize InjectParams.ErrorProcedureText := CreateExternalPChar('Invalid hook procedure!'); //TODO: localize
InjectParams.LibraryName := CreateExternalPChar(DllName); InjectParams.StartProcName := CreateExternalPAnsiChar('LoadHook');
InjectParams.LoadLibraryWAddr := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), PAnsiChar('LoadLibraryW')); InjectParams.GetProcAddressAddr := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), PAnsiChar('GetProcAddress')); InjectParams.ExitThreadProc := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), PAnsiChar('ExitThread')); InjectParams.MessageBoxProc := GetProcAddress(GetModuleHandle('USER32.DLL'), PAnsiChar('MessageBoxW'));
ParamAddr := VirtualAllocEx(Hdl, nil, SizeOf(TInjectLibParameters), MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); WriteProcessMemory(Hdl, ParamAddr, @InjectParams, SizeOf(TInjectLibParameters), BytesWrite);
InjectCodeStart := NativeUInt(Addr(ExternalThreadProcedure)); InjectCodeLength := NativeUInt(Addr(ExternalThreadProcedureEnd)) - InjectCodeStart; InjectCode := VirtualAllocEx(Hdl, nil, InjectCodeLength, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); WriteProcessMemory(Hdl, InjectCode, Pointer(InjectCodeStart), InjectCodeLength, BytesWrite);
|
Как итог - никакого ассеблера и массивов, код один для 32/64
|