Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Anti API hook


Автор: xkor 8.1.2007, 03:48
Здраствуйте!,
Столкнулся я недавно с одной странной проблемой при перехвате API, программа в которой я пытаюсь поставить хук на connect (с другими функциями тоже самое собсно) из ws2_32.dll мигом закрывается как только внедряемая мной длл производит хук. Использую я для перехвата и внедрения модуль advApiHook который я думаю знают многие.
И вот самое интересное что меня и обескураживает так это что закрывается программа моментально после записи всего одного байта:
Код

function HookCode(TargetProc, NewProc: pointer; var OldProc: pointer): boolean;
var
  Address: dword;
  OldProtect: dword;
  OldFunction: pointer;
  Proc: pointer;
begin
  Result := False;
  try
    Proc := TargetProc;
    //вычисляем адрес относительного (jmp near) перехода на новую функцию
    Address := dword(NewProc) - dword(Proc) - 5;
    VirtualProtect(Proc, 5, PAGE_EXECUTE_READWRITE, OldProtect);
    //создаем буффер для true функции
    GetMem(OldFunction, 255);
    //копируем первые 4 байта функции
    dword(OldFunction^) := dword(Proc);
    byte(pointer(dword(OldFunction) + 4)^) := SaveOldFunction(Proc, pointer(dword(OldFunction) + 5));
    //byte(pointer(dword(OldFunction) + 4)^) - длина сохраненного участка


    //закрывается сразу после следующей строки!
    byte(Proc^) := $e9; //устанавливаем переход


    dword(pointer(dword(Proc) + 1)^) := Address;
    VirtualProtect(Proc, 5, OldProtect, OldProtect);
    OldProc := pointer(dword(OldFunction) + 5);
  except
    Exit;
  end;
  Result := True;
end;

я сначала думал что приложение запускает поток с проверкой на хук, но когда я добавил в дллку остановку всех нитей кроме собсно вызывающей ничего неизменилось, приложоние по прежнему закрывается как только выполниться byte(Proc^) := $e9;
причем неважно как и на что я меняю byte(Proc^), программа закрывается сразу при любом изменении этого байта  smile 

может у кого есть идеи как как это реализовано, а то я абсолютно недогоняю как разработчики такого достигли...
кста в оригинальной версии приложения всё пашет на ура, а эта версия переделана какимито умельцами которые даже сорцев неимели, но нужно перехватить именно в этой версии

Автор: dumb 8.1.2007, 05:27
похоже просто по исключению выпадает на блок except. ты проверял, что возвращает VirtualProtect(а саму ее проверял на "перехваченность")? а после ее выполнения проверял статус изменяемого тобой куска?

Цитата(xkor @  8.1.2007,  03:48 Найти цитируемый пост)
а эта версия переделана какимито умельцами которые даже сорцев неимели

про протекторы слышал что-нибудь?

Автор: W4FhLF 8.1.2007, 09:29
Да, может быть там ExeCryptor висит, он такие штучки на корню пресекает. 

Автор: xkor 8.1.2007, 14:52
проблему решил совершенно неожиданным способом, просто решил проверить выполняется ли первое VirtualProtect и в результате длл стала абсолютно нормально всё перехватывать))), правда теперь какаято трабла с пересылкой пакетов но думаю это из за изменений в моей проге в работе с пакетами..., счас всё верну и наверняка заработает)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)