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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват API 
:(
    Опции темы
<Spawn>
Дата 2.6.2003, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Пробую делать перехват вызовов WinSock API, а именно функции recv. Но что то, используемый мною класс ее ни как не меняет. Внедряюсь в чужое АП при помощи хуков - внедрение проходит успешно, поскольку проверяю наличие библиотеки winsock в процессе через GetModuleHandle.

Вот утсановка хука( часть DLL):
Код
...
const
wsocket='wsock32.dll';
WM_SETSOCKETHOOK=WM_USER+100;
SpecificId=65535;

type
THook_Recv=function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;

var
OldRecv:THook_Recv=nil;
PeImportHooks:=TJclPeMapImgHooks;
Hooked:Boolean=False;

function Hook_Recv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
var
CopyData:TCOPYDATASTRUCT;
begin
//пересылка данных в компонент обработки
Result:=OldRecv(s,Buf,len,flags);
end;

function SetSocketHook:Boolean;
begin
Result:=False;
PeImportHooks:=nil;
PeImportHooks:=TJclPeMapImgHooks.Create;
if PeImportHooks.HookImport(Pointer(HInstance), wsocket, 'recv',
   @Hook_Recv, @OldRecv) then
begin
 Result:=True;
 ShowMessage('Set Hook');
end
else
begin
 ShowMessage('Error Set Hook);
 PeImportHooks.Free;
end;
end;

function MsgProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
msg: PMSG;
begin
if Code >= 0 then
begin
Result := 0;
Msg := Pointer(LParam);
if (Msg.message=WM_SETSOCKETHOOK) and (Msg.wParam=SpecificId) then
begin
 if SetSocketHook then
  Hooked:=True;
end;
end
else
Result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;

procedure SetHook;export;stdcall;
begin
HookHandle:=SetWindowsHookEx(WH_GETMESSAGE, @MsgProc, HInstance, 0);
end;
...


Я заглянул в класс подмены функции таблицы импорта, но там все ок - ошибок не было. Причины была в том, что класс, видимо, не нашел этой функции в таблице импорта, поскольку в цикле просморта я подставлял ShowMessage но нахождения не было:
Код
ImportDesc := PImageImportDescriptor(DWORD(Base) + ImportDir.VirtualAddress);
 while ImportDesc^.Name <> 0 do
 begin
   CurrName := PChar(Base) + ImportDesc^.Name;
   if StrIComp(CurrName, PChar(ModuleName)) = 0 then
   begin
     ImportEntry := PImageThunkData(DWORD(Base) + ImportDesc^.FirstThunk);
     while ImportEntry^.Function_ <> 0 do
     begin
       if IsThunked then
       begin
         ImportThunk := PWin9xDebugThunk(ImportEntry^.Function_);
         FoundProc := IsWin9xDebugThunk(ImportThunk) and (ImportThunk^.Addr = FromProcDebugThunk^.Addr);
       end
       else
         FoundProc := Pointer(ImportEntry^.Function_) = FromProc;
       if FoundProc and not IsBadStringPtr(Pointer(ImportEntry^.Function_), 4) then
       begin
         Pointer(ImportEntry^.Function_) := ToProc; ShowMessage('Proc Finded');
         Result := True;
       end;
       Inc(ImportEntry);
     end;
   end;
   Inc(ImportDesc);
 end;

. Продезассемблировав нужную мне прогу при помощи IDA Pro, я увидел там вот это:
Код
.idata:004E435C                 extrn __imp_recv:dword; DATA XREF: recvr
.idata:004E435C                                        ; Receive data from a socket

Почему в заголовке файла она хранится как __imp_recv?
Подскажите пожалста в чем может быть ошибка подмены импорта.

Это сообщение отредактировал(а) <Spawn> - 3.6.2003, 07:19


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
man2002ua
Дата 3.6.2003, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



сделай вывод ImportEntry^.Function_ при поиске адреса.
здесь:
FoundProc := Pointer(ImportEntry^.Function_) = FromProc;
"вывод"(ImportEntry^.Function_ );

и убедись, что в списке импорта есть адрес recv...


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
<Spawn>
Дата 3.6.2003, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Цитата(man2002ua @ 3.6.2003, 01:46)
и убедись, что в списке импорта есть адрес recv...

Как я уже говорил, я проверял наличие самой библиотеки через GetModuleHandle - все было ок. И еще я проверял наличие самой функции при помощи GetProcAddress. Результат тот же - ее адресс был найден.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
man2002ua
Дата 3.6.2003, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ок, выведи значение ImportEntry для меня


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
<Spawn>
Дата 3.6.2003, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Не найдено таких значений!!!!


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
man2002ua
Дата 3.6.2003, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



То есть:
CurrName := PChar(Base) + ImportDesc^.Name;
if StrIComp(CurrName, PChar(ModuleName)) = 0 then
begin
// не попадает ?



--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
<Spawn>
Дата 3.6.2003, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Да результат функции StrIComp всегда не равен 0. Значения ImportDesc^.Name меняется с 354104 по 360268 за 13 итераций и при этом ни разу не выполняется код после if StrIComp(CurrName, PChar(ModuleName)) = 0 then.

Это сообщение отредактировал(а) <Spawn> - 3.6.2003, 17:26


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 3.6.2003, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Я посмотрел значения всех CurrName := PChar(Base) + ImportDesc^.Name - там небыло wsock32.dll !!!!!!!!!!!!!!!!!!!!!!!!!!


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 3.6.2003, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Как же такое может быть, что GetProcAddress(GetModuleHandle('wsock32.dll'),'recv') возвращает адресс функции, а в таблице импорта она не находится? И не находитcя там сама библиотека wsock32.dll.

Вот список импортируемых ДЛЛ (Почему идет повторение?):

kernel32.dll
user32.dll
advapi32.dll
oleaut32.dll
kernel32.dll
advapi32.dll
kernel32.dll
version.dll
gdi32.dll
user32.dll
kernel32.dll
oleaut32.dll
comctrl32.dll

Я пробовал подменить SelectObject - все было ок.

Это сообщение отредактировал(а) <Spawn> - 3.6.2003, 20:46


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
stab
Дата 4.6.2003, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



может я не совсем что-то понимаю, но получается что на момент установки хука сокеты еще не загружены и динамически подгружаются позже... но может я что-то не понимаю smile.gif


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
man2002ua
Дата 4.6.2003, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



нет, просто wsock32.dll грузит не сам exe, а одна из библиотек до него.
Дай полный список импортируемых dll. Или скажи - там есть wsock32.dll? Смотри PEViewer.exe например.


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
<Spawn>
Дата 4.6.2003, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



А где эту прогу взять можно?

Я при помощи того класса вытащил вот эти библиотеки:
kernel32.dll
user32.dll
advapi32.dll
oleaut32.dll
kernel32.dll
advapi32.dll
kernel32.dll
version.dll
gdi32.dll
user32.dll
kernel32.dll
oleaut32.dll
comctrl32.dll



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
man2002ua
Дата 4.6.2003, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Отправил тебе прогу - смотри почту. Посмотришь, если ли в списке импорта wsock32.dll. Если нет - давай Exе мне.


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
<Spawn>
Дата 4.6.2003, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



ок


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 4.6.2003, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



У меня пока небольшие проблемки смоим основным мылом sad.gif Не мог бы ты, пожалста, послать прогу на [email protected]


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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