Доброго времени суток. У меня такая проблема: пытаюсь перехватить CreateProcessW сплайсингом и инжектировать свой код в созданный процесс. Делаю так: Код (Text): type OldCode = packed record One : dword; two : word; end; far_jmp = packed record PuhsOp : byte; PushArg : pointer; RetOp : byte; end; var JmpCpW : far_jmp; OldCpW : OldCode; PtrCpW : Pointer; // исполнение оригинальной функции function TrueCreateProcessW(lpApplicationName: PWideChar; ... ... var lpProcessInformation: TProcessInformation): BOOL; stdcall; var dwBytesWritten : DWORD; begin WriteProcessMemory(INVALID_HANDLE_VALUE, PtrCpW, @OldCpW, SizeOf(OldCode), dwBytesWritten); Result := CreateProcessW(lpApplicationName, ... lpProcessInformation); WriteProcessMemory(INVALID_HANDLE_VALUE, PtrCpW, @JmpCpW, SizeOf(OldCode), dwBytesWritten); end; // перехваченная функция function NewCreateProcessW(lpApplicationName: PWideChar; ... ... var lpProcessInformation: TProcessInformation): BOOL; stdcall; begin Result := TrueCreateProcessW(lpApplicationName, ... lpProcessInformation); Injection(@SetHook, lpProcessInformation.dwProcessId); end; // установка перехвата procedure SetHook; begin PtrCpW := GetProcAddress(GetModuleHandle('kernel32.dll'), 'CreateProcessW'); ReadProcessMemory(INVALID_HANDLE_VALUE, PtrCpW, @OldCpW, SizeOf(OldCode), dwBytesWritten); JmpCpW.PuhsOp := $68; JmpCpW.PushArg := @NewCreateProcessW; JmpCpW.RetOp := $C3; WriteProcessMemory(INVALID_HANDLE_VALUE, PtrCpW, @JmpCpW, SizeOf(far_jmp), dwBytesWritten); end; // инжектирование function Injection(EntryFunction: Pointer; dwPID: DWORD): bool; stdcall; var za_module : Pointer; za_mem : Pointer; za_handle : DWORD; dwSize : DWORD; dwOldProt : DWORD; dwBytes : DWORD; dwIndex : DWORD; dwBuff : DWORD; za_mbi : MEMORY_BASIC_INFORMATION; begin za_module := pointer(GetModuleHandle(nil)); za_handle := OpenProcess(PROCESS_ALL_ACCESS, false, dwPID); if za_handle = 0 then begin Result := false; Exit; end; VirtualFreeEx(za_handle, za_module, 0, MEM_RELEASE); dwSize := PImageOptionalHeader(pointer(integer(za_module) + PImageDosHeader(za_module)._lfanew + SizeOf(DWORD) + SizeOf(TImageFileHeader))).SizeOfImage; za_mem := VirtualAllocEx(za_handle, za_module, dwSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); if za_mem = nil then begin Result := false; Exit; end; dwBuff := 0; VirtualQueryEx(za_handle, za_mem, za_mbi, SizeOf(MEMORY_BASIC_INFORMATION)); while (za_mbi.Protect <> PAGE_NOACCESS) and (za_mbi.RegionSize <> 0) do begin if za_mbi.Protect <> PAGE_GUARD then begin for dwIndex := 0 to za_mbi.RegionSize do begin dwBuff := dwBuff + $1000; VirtualProtectEx(za_handle, Pointer(Cardinal(za_mem) + dwBuff), $1000, PAGE_EXECUTE_READWRITE, dwOldProt); WriteProcessMemory(za_handle, Pointer(Cardinal(za_mem) + dwBuff), Pointer(Cardinal(za_mem) + dwBuff), $1000, dwBytes); end; end; Cardinal(za_mem) := Cardinal(za_mem) + za_mbi.RegionSize; VirtualQueryEx(za_handle, za_mem, za_mbi, SizeOf(MEMORY_BASIC_INFORMATION)); end; if CreateRemoteThread(za_handle, nil, 0, EntryFunction, za_module, 0, dwBytes) = 0 then begin Result := false; Exit; end; CloseHandle(za_handle); Result := true; end; В программе для примера инжектирую код в Explorer.exe Код (Text): Injection(@SetHook, GetPIDbyName('explorer.exe')); В результате в explorer'e перехват осуществляется, а запускаемые через него приложения вообще не запускаются или все виснет. что я делаю неправильно? подскажите пожалуйста. Спасибо за внимание.
При входе в функцию TrueCreateProcessW в стеке будет находится: 1)адресс возврата в CreateProcessW 2)адресс в Explorer.exe 3)парметры CreateProcessW. Поэтому тебе нужен такой прототип функции: function TrueCreateProcessW(addrCreateProcess: DWORD, lpApplicationName: PWideChar; ... ... var lpProcessInformation: TProcessInformation): BOOL; stdcall; т.е. парметры функции CreateProcessW будут начинаться со второго.
asmasm объясните пожалуйста подробнее. для чего нужна addrCreateProcess: DWORD? что в ней будет передаваться?
Сколько раз вызывается SetHook для исходного процесса, в котором есть несколько вызовов CreateProcessW?
Надо смотреть под отладчиком, если выложишь в откомпилированном виде, то проблему можно быстро решить.
staier не подскажете, что именно я делаю не правильно? psw1 не совсем понял ваш вопрос. сначала я инжектирую SetHook в explorer.exe. при создании нового процесса из explorer.exe в новый процесс тоже должна быть инжектирована SetHook. в explorer.exe инжект проходит без проблем, а в запускаемые из него процессы - нет...