bendme, не находятся. Точнее они находились бы, но почему-то в цикле перебирается (проверял с помощью MessageBox'ов) Код (Text): While pThunk.Name1 <> 0 do Begin ppfn := pointer(pThunk^.Name1); [b]MessageBox(0, PChar(IntToStr(cardinal(ppfn))), PChar(IntToStr(cardinal(pfnCurrent))),0);[/b] bFound := ppfn = pfnCurrent; IF bFound then Begin WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew), Temp); Result := true; break; End; Inc(pThunk, 4); End; всего часть импорта главного модуля, а точнее 12 из 78 функций в kernel32.dll. В указатели отличаются совсем на чуть-чуть. Может ли это быть связано с тем, что я хукаю функции сразу во время инициализации dll-шки? Спасибо.
bendme, а что это должно быть? объясни, пожалуйста. я думал, pThunk - это указатель на массив указателей на структуры import_by_name, состоящие из двух полей (во закрутил...)). В ней поле Name1 - адрес прилинкованной функции. Не так?
Всем спасибо!! Разобрался. Оказывается, Delphi неправильно обрабатывает инструкцию inc (не знаю, что он с ней делает, но адреса получаются неправильными). Итак, рабочий и исправленный код: Код (Text): { cut from windows.inc } Const IMAGE_DIRECTORY_ENTRY_EXPORT = 0; IMAGE_DIRECTORY_ENTRY_IMPORT = 1; IMAGE_DIRECTORY_ENTRY_RESOURCE = 2; IMAGE_DIRECTORY_ENTRY_EXCEPTION = 3; IMAGE_DIRECTORY_ENTRY_SECURITY = 4; IMAGE_DIRECTORY_ENTRY_BASERELOC = 5; IMAGE_DIRECTORY_ENTRY_DEBUG = 6; IMAGE_DIRECTORY_ENTRY_COPYRIGHT = 7; IMAGE_DIRECTORY_ENTRY_GLOBALPTR = 8; IMAGE_DIRECTORY_ENTRY_TLS = 9; IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG = 10; IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT = 11; IMAGE_DIRECTORY_ENTRY_IAT = 12; IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16; Type IMAGE_IMPORT_DESCRIPTOR = record OriginalFirstThunk: cardinal; TimeDateStamp: cardinal; ForwarderChain: cardinal; Name: cardinal; FirstThunk: cardinal; End; IMAGE_IMPORT_BY_NAME = record Hint: WORD; Name: cardinal; End; { cut ends here } PIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR; Function ImageDirectoryEntryToData(Base: THandle; MappedAsImage: BOOL; DirectoryEntry: cardinal; var Size: cardinal): PIMAGE_IMPORT_DESCRIPTOR; stdcall; Function ReplaceImportEntry(hModule: cardinal; fDLL, fName: string; pfnNew: pointer): boolean; Implementation Function ImageDirectoryEntryToData; external 'imagehlp.dll'; Function ReplaceImportEntry(hModule: cardinal; fDLL, fName: string; pfnNew: pointer): boolean; Var pImport: PIMAGE_IMPORT_DESCRIPTOR; pThunk: PCardinal; p, pOld: pointer; pszDLLName: PChar; Temp: cardinal; Begin Result := false; { Получение указателя на секцию импорта } pImport := ImageDirectoryEntryToData(hModule, true, IMAGE_DIRECTORY_ENTRY_IMPORT, Temp); IF pImport = nil then Exit; { Получение указателя на секцию импорта у нужной библиотеки } pszDLLName := PChar(fDLL); While pImport^.Name <> 0 do Begin p := pointer(hModule + pImport^.Name); IF lstrcmpiA(pszDLLName, p) = 0 then Break; pImport := pointer(cardinal(pImport)+SizeOf(IMAGE_IMPORT_DESCRIPTOR)); End; IF pImport^.Name = 0 then Exit; { Получение указателя на нужную функцию и его подмена } pThunk := pointer(hModule + pImport^.FirstThunk); pOld := GetProcAddress(GetModuleHandle(PChar(fDLL)), PChar(fName)); While PCardinal(pThunk)^ <> 0 do Begin p := pointer(pThunk^); IF p = pOld then Begin WriteProcessMemory(GetCurrentProcess, p, @pfnNew, 4, Temp); Result := true; Break; End; pThunk := pointer(cardinal(pThunk)+4); End; End;