Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с кодом 
:(
    Опции темы
Delphist
  Дата 20.4.2004, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Я специально создал новую тему опять же про "Внедрением Dll и перехват Api функций",но несколько
иного характера.Поговорим про статью "Перехват API-функций в Windows NT/2000/XP"
(Кто бы мог перевести все исходники этой статьи"Перехват API-функций в Windows NT/2000/XP"
(если надо скинуть обращайтесь на [email protected])
на Delphi. И привести примеры на Delphi(с хорошими комментариями)по внедрению Dll в чужие процесы
всеми с пособами (через Хуки записью короткого участка машинного кода в память процесса))
Я перевел исходник на Delphi из пункта:"Перехват API непосредственной записью в код системной
функции" вот результат: MyDll.dll
Код
library WinApi_Hook;
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,ShellApi;
{$R *.res}
Type
jmp_far = record
    instr_push:BYTE; //здесь будет код инструкции push
    arg:Dword;       //аргумент push
    instr_ret:BYTE;  //здесь будет код инструкции ret
    end;
Var
  old:Array[1..6]of BYTE; //область для хранения 6-ти затираемых байт начала функции
  adr_MessageBoxA:LongInt;  //будущий адрес оригинальной функции
  written:Dword;          //вспомогательная переменная
  jump:jmp_far;           //здесь будет машинный код инструкции перехода
  hModule:THANDLE;
  lpReserved:Pointer;
  S:PChar;
Function Intercept_MessageBoxA(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
//Var S:PAnsiChar;
Begin
{Сначала восстанавливаем 6 первых байт функции. Это не обязательное
действие, просто мы решили подшутить над пользователем, и все
сообщения функции MessageBoxA переделать на свои, поэтому нам придется
вызвать оригинальную функцию, а для этого следует восстановить ее адрес:}
WriteProcessMemory(GetCurrentProcess(), @adr_MessageBoxA,@old, 6,
written);
S := 'Перехват удался!!!';
//Вызываем оригинальную функцию через указатель
MessageBox(0,S,'MessageBox',MB_OK);
  //Снова заменяем  6 байт функции на команду перехода на нашу функцию
WriteProcessMemory(GetCurrentProcess(), @adr_MessageBoxA,
                     @jump, 6,written);
end;
Procedure InterceptFunctions;
Begin
  //сначала получим абсолютный адрес функции для перехвата
  adr_MessageBoxA := Dword(GetProcAddress(GetModuleHandle('user32.dll'),
                    'MessageBoxA'));
  if adr_MessageBoxA = 0 then
  begin
     MessageBox(0, 'Can`t get adr_MessageBoxA', 'Error!', 0);
     exit;
  end;
  // Зададим машинный код инструкции перехода, который затем впишем
  // в начало полученного адреса:
  jump.instr_push:= $68;
  jump.arg:= Dword(@Intercept_MessageBoxA);
  jump.instr_ret:=$C3 ;

//Прочитаем и сохраним первые оригинальные 6 байт стандартной API функции
ReadProcessMemory(GetCurrentProcess(), @adr_MessageBoxA,
                    @old, 6, written);
//Запишем команду перехода на нашу функцию поверх этих 6-ти байт
  WriteProcessMemory(GetCurrentProcess(), @adr_MessageBoxA,
     @jump, 6, written);
end;
Function DllMain(hModule:THANDLE;ul_reason_for_call:LongInt;Var
                       lpReserved:Pointer):BOOL;
{ Если система подключает DLL к какому-либо процессу,
 она сначала вызовет главную функцию DLL с параметром
 DLL_PROCESS_ATTACH, на что мы сразу вызовем нашу функцию
 InterceptFunctions, которая произведет подмену стандартной API функции
 MessageBoxA нашей функцией Intercept_MessageBoxA (см. ниже)}
begin
  if ul_reason_for_call = DLL_PROCESS_ATTACH
  then begin
        InterceptFunctions;
        Result:=TRUE
        end
  else begin ShowMessage('WinApi_Hook - не удалось загрузить');
       Result:=False;end;
end;
exports InterceptFunctions;
begin
DLLProc:= @DllMain;
DllMain(hModule,DLL_PROCESS_ATTACH,lpReserved)
end.

Подключаю я эту (MyDll.dll) к своей проге в которой по нажатию выдается сообщение
MessageBox(0,'HelloWorld','Information',0), и оно не перехватывается.
--------
С чего начал тем и закончу:
Вообщем кто бы мог перевести все исходники этой статьи"Перехват API-функций в Windows NT/2000/XP"
(если надо скинуть обращайтесь на [email protected])
на Delphi. И привести примеры на Delphi(с хорошими комментариями)по внедрению Dll в чужие процесы
всеми с пособами (через hook'и записью короткого участка машинного кода в память процесса)

Это сообщение отредактировал(а) p0s0l - 29.9.2005, 13:15


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Pathfider
Дата 3.1.2005, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.7.2004
Где: все там же

Репутация: нет
Всего: 1



Погляди в Арсенале пост RAdmin'а - ApiHook(архив). Именно то, чо ты ищешь, правда я и сам в нем разобраться не могу smile
--------------------
Trust is a weakness
PM MAIL   Вверх
dm9
Дата 4.1.2005, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 1
Всего: 137



smile
Delphist, постарайся пользоваться тэгами [ code ], если не сложно. Для этого надо нажать кнопку "Код" smile  

Вот так лучше же...

Код
library WinApi_Hook;
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls,ShellApi;
{$R *.res}
Type
jmp_far = record
   instr_push:BYTE; //здесь будет код инструкции push
   arg:Dword;       //аргумент push
   instr_ret:BYTE;  //здесь будет код инструкции ret
   end;
Var
 old:Array[1..6]of BYTE; //область для хранения 6-ти затираемых байт начала функции
 adr_MessageBoxA:LongInt;  //будущий адрес оригинальной функции
 written:Dword;          //вспомогательная переменная
 jump:jmp_far;           //здесь будет машинный код инструкции перехода
 hModule:THANDLE;
 lpReserved:Pointer;
 S:PChar;
Function Intercept_MessageBoxA(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
//Var S:PAnsiChar;
Begin
{Сначала восстанавливаем 6 первых байт функции. Это не обязательное
действие, просто мы решили подшутить над пользователем, и все
сообщения функции MessageBoxA переделать на свои, поэтому нам придется
вызвать оригинальную функцию, а для этого следует восстановить ее адрес:}
WriteProcessMemory(GetCurrentProcess(), @adr_MessageBoxA,@old, 6,
written);
S := 'Перехват удался!!!';
//Вызываем оригинальную функцию через указатель
MessageBox(0,S,'MessageBox',MB_OK);
 //Снова заменяем  6 байт функции на команду перехода на нашу функцию
WriteProcessMemory(GetCurrentProcess(), @adr_MessageBoxA,
                    @jump, 6,written);
end;
Procedure InterceptFunctions;
Begin
 //сначала получим абсолютный адрес функции для перехвата
 adr_MessageBoxA := Dword(GetProcAddress(GetModuleHandle('user32.dll'),
                   'MessageBoxA'));
 if adr_MessageBoxA = 0 then
 begin
    MessageBox(0, 'Can`t get adr_MessageBoxA', 'Error!', 0);
    exit;
 end;
 // Зададим машинный код инструкции перехода, который затем впишем
 // в начало полученного адреса:
 jump.instr_push:= $68;
 jump.arg:= Dword(@Intercept_MessageBoxA);
 jump.instr_ret:=$C3;

//Прочитаем и сохраним первые оригинальные 6 байт стандартной API функции
ReadProcessMemory(GetCurrentProcess(), @adr_MessageBoxA,
                   @old, 6, written);
//Запишем команду перехода на нашу функцию поверх этих 6-ти байт
 WriteProcessMemory(GetCurrentProcess(), @adr_MessageBoxA,
    @jump, 6, written);
end;
Function DllMain(hModule:THANDLE;ul_reason_for_call:LongInt;Var
                      lpReserved:Pointer):BOOL;
{ Если система подключает DLL к какому-либо процессу,
она сначала вызовет главную функцию DLL с параметром
DLL_PROCESS_ATTACH, на что мы сразу вызовем нашу функцию
InterceptFunctions, которая произведет подмену стандартной API функции
MessageBoxA нашей функцией Intercept_MessageBoxA (см. ниже)}
begin
 if ul_reason_for_call = DLL_PROCESS_ATTACH
 then begin
       InterceptFunctions;
       Result:=TRUE
       end
 else begin ShowMessage('WinApi_Hook - не удалось загрузить');
      Result:=False;end;
end;
exports InterceptFunctions;
begin
DLLProc:= @DllMain;
DllMain(hModule,DLL_PROCESS_ATTACH,lpReserved)
end.


Это сообщение отредактировал(а) dm9 - 4.1.2005, 01:27
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0572 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.