![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не работает перехват win api функции
Dmitrij_K © (2006-03-07 15:13:00)Процедура замены
procedure ReplaceIATEntryInOneMod(const OldProc,
NewProc: FARPROC);
var
Size: DWORD;
ImportEntry: PImageImportDescriptor;
Thunk: PImageThunkData;
Protect, newProtect: DWORD;
DOSHeader: PImageDosHeader;
NTHeader: PImageNtHeaders;
begin
if OldProc = nil then Exit;
if NewProc = nil then Exit;
// Можно искать вот так
ImportEntry := ImageDirectoryEntryToData(Pointer(hInstance), BOOL(1),
IMAGE_DIRECTORY_ENTRY_IMPORT, Size);
if ImportEntry <> nil then
begin
while ImportEntry^.Name <> 0 do
begin
Thunk := PImageThunkData(DWORD(hInstance) +
DWORD(ImportEntry^.FirstThunk));
while Thunk^._function <> nil do
begin
if (Thunk^._function = OldProc) then
begin
if not IsBadWritePtr(@Thunk^._function, sizeof(DWORD)) then
Thunk^._function := NewProc
else
begin
if VirtualProtect(@Thunk^._function, SizeOf(DWORD),
PAGE_EXECUTE_READWRITE, Protect) then
begin
Thunk^._function := NewProc;
newProtect := Protect;
VirtualProtect(@Thunk^._function, SizeOf(DWORD),
newProtect, Protect);
end;
end;
//Exit;
end
else
Inc(PChar(Thunk), SizeOf(TImageThunkData32));
end;
ImportEntry := Pointer(Integer(ImportEntry) + SizeOf(TImageImportDescriptor));
end;
end;
end;
procedure SetAPIHook;
begin
OldMessageBox :=
GetProcAddress(GetModuleHandle('User32.dll'), 'MessageBoxA');
CurrentMessageBox := @HookMessageBox;
ReplaceIATEntryInOneMod(OldMessageBox, CurrentMessageBox);
end;
С MessageBoxA работает нормально
а с GetProcAddress(GetModuleHandle(kernel32), 'TerminateProcess')
не работает
те пе проходит устовие if (Thunk^._function = OldProc) then
Сергей М. (2006-03-09 08:27:00) [1]
> с GetProcAddress(GetModuleHandle(kernel32), 'TerminateProcess')
> не работает
Все правильно. И не будет работать. Потому что ты модифицируешь IAT, а GetProcAddress() с IAT не работает - эта ф-ция получает интересующую т.входа из EAT
Dmitrij_K (2006-03-08 15:25:00) [2]Так и не нашел почему не работает.
Но зато нашел модулек madCodeHook www.madshi.net.
Dmitrij_K (2006-03-07 16:41:00) [3]Пытаюсь перехватить TerminateProcess из kernel32.dll
Сергей М. (2006-03-07 16:27:00) [4]Т.входа в какую конкретноф-цию перехватываешь-то ?