Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обход перехвата 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]

Ээээ... а ты ЭТО ужн запускал?


Наверх

Титульная страница Поиск, карта сайта Написать письмо