![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обход перехвата WinAPI-функции [D5, NT4, 2000, XP]
Barsuk © (2009-02-06 15:10:00)Добрый день.
Интересует следующее: моя програмка использует API функцию PostMessage, но есть другая прога (не моя) которая перехватывает выполнение этой функции, вопрос, если моя програмка будет загружаться раньше "перехватчика" и при загрузке запоминать адрес функции из dll, то возможна ли работа с функцией после старта "программы-перехватчика"
procedure TForm1.FormCreate(Sender: TObject);
var DLLHandle:THandle;
begin
DLLHandle := LoadLibrary('user32.dll');
//Получилось или нет?
if DLLHandle <> 0 then
begin // ищем функцию в dll
@MySendProc := GetProcAddress(DLLHandle, 'PostMessageA');
end;
//освобождаем библиотеку
FreeLibrary(DLLHandle);
end;
procedure TForm1.btnSendKeyClick(Sender: TObject);
var WHandle:HWND;
begin
WHandle:=StrToInt(Edit1.Text);
MySendProc(WHandle, WM_KEYDOWN, VK_F10, 1);
end;
P.S. И еще, подскажите, возможно ли определить что процессу в памяти моей проги происходит иньекция чужого кода? И как это предотвратить?
Barsuk (2009-02-09 11:37:00) [1]Большое спасибо! Все работает.
Rouse_ (2009-02-08 12:44:00) [2]
> компилятор ругается на sysenter.
Ну перепиши вот так:
function SafePostMessage(const AHandle, Msg, WParam, LParam: DWORD): LRESULT;
asm
push LParam
push WParam
push Msg
push AHandle
mov eax, $000011DB // <- Индекс NtUserPostMessage в SDT
lea edx, @done
push edx
push edx
mov edx, esp
db $0F, $34 // sysenter opcode
@done:
add esp, $14
end;
Barsuk (2009-02-06 23:33:00) [3]Попробовал откомпилировать Вашу функцию, компилятор ругается на sysenter.
Rouse_ (2009-02-06 17:04:00) [4]
> моя програмка использует API функцию PostMessage, но есть
> другая прога (не моя) которая перехватывает выполнение этой
> функции
Вот такое твоя программка-перехватчик не поймает, единственное ограничение, что константа уникальна для системы и сервиспака, поэтому ее ручками надо рассчитывать :)
например вот этот код будет работать на ХР SP2.
function SafePostMessage(const AHandle, Msg, WParam, LParam: DWORD): LRESULT;
asm
push LParam
push WParam
push Msg
push AHandle
mov eax, $000011DB // <- Индекс NtUserPostMessage в SDT
lea edx, @done
push edx
push edx
mov edx, esp
sysenter
@done:
add esp, $14
mov Result, eax
end;
Сергей М. (2009-02-06 16:08:00) [5]
> если моя програмка будет загружаться раньше "перехватчика"
> и при загрузке запоминать адрес функции из dll, то возможна
> ли работа с функцией после старта "программы-перехватчика"
Если перехватчик использует методы перехвата, связанные искл-но с модификацией IAT и EAT, то возможна.
DrPass (2009-02-06 15:36:00) [6]Ах да, сорри, не подумал. Оно действительно ж будет работать, т.к. один вызов FreeLibrary не выгрузит user32.dll...
DrPass (2009-02-06 15:32:00) [7]Ээээ... а ты ЭТО ужн запускал?