Вот уже много времени мучаюсь над тем что пытаюсь написать что то подобие перехватчика,уже и пробовал перейти на С++ но в основном сижу на делфи.
Вот проблема состоит в том что бы каким то образом перехватить любую вызывающуюся функцию из Engine.dll.
Я получил их названия под свой клиент:
Расшифрована: int UGameEngine::OnDie(struct User *,class L2ParamStack &)
Зашифрована: ?OnDie@UGameEngine@@UAEHPAUUser@@AAVL2ParamStack@@ @Z
Но как прехватить, я вобще не понимаю, посмотрел кучу исходником.
Может найдется тот человек который разжует все, и покажет исходник как именно это осуществить.
P.S Да в принципе пофиг какая функция и какая библиотека,хоть Core.dll хоть Engine.dll
Помогите добрые люди пожалуйста.
Но в таком виде прокатит только если перехватываемая функция идет без параметров, так как в Delphi в функции параметры передаются как stdCall, а в клиенте l2 fastcall. Нужно лепить специальный переходник. Xсor где то выкладывал на форуме.
Да это уже сам перехват,а до этого что вобще нужно сделатЬ?
Каким фигом оно будет HookProc('Engine.dll', ... искать именно эту библиотеку? lpProcName: PChar; это параметр закодированого или открытого
названия функции?*
?OnDie@UGameEngine@@UAEHPAUUser@@AAVL2ParamStack@@ @Z
Вот этот параметр?
Добавлено через 7 минут
Можешь дать свой скайп что бы чуть чуть обьяснить?
Да, все правильно надо передавать закодированное название функции.
Перед тем как хукать нужно подгрузить в процесс l2 свою dll, а уже в ней осуществлять перехват.
В advApiHook есть функции внедрения своей dll в чужой процесс.
Самое главное если стоит LameGuard подгружать dll нужно вручную, не добавляй ее в список автоматом загружаемых dll или у тебя дальше выбора сервера не дойдет.
Если поищешь на этом форуме есть исходники l2cc вот их могу объяснить, но там не используется хукпроцедура, там другой метод.
Хотел бы с тобой пообщаться,может даш скайп или как с тобой связаться для быстрой переписки,видел l2cc
Добавлено через 4 часа 35 минут
Поковырялся,и подумал посидел, в итоге у меня что то получилось.
Взял тотал командер, через F3 вытянул названия из Engine.dll, т.е названия функций.Так как у меня Interlude клиент был под рукой,взял самую мне необходимую. ?RequestBypassToServer@UNetworkHandler@@UAEHAAVL2P aramStack@@@Z
И начал ковырять.
Написал код библиотеки: Оффтоп
Взял WinInject 1.7b и прииньектил к L2.exe мою скомпилированую dll.
Все заработало.
Подхожу к NPC и нажимаю любой диалог, сразу ще выскакивает сообщение "Функция RequesBypassToServer была вызвана."
Вроде все не так уж и плохо.Но в игре действия не происходит,так как не возвращается результат.
Дальше я изменил функцию свою на :
function RequestBypassToServer_New: Integer;
begin
MessageDlg('Функция RequesBypassToServer была вызвана.',mtError, [mbOk],0);
result:=RequestBypassToServer_Old('Engine.dll');
end;
И сразу же выскакивает критом,я понял что результат не возвращается.
Теперь у меня задача,получать параметры от функций а так же их грамотно отправлять.
Помогите с этим.
Можешь сделать пример полегче,что то у меня нечего не получилось, я не понял с переходами,и откуда взять этот чертов параметр.
или даже пример как с моим перехватом Bypass,
еще очень запутался че к чему,если поподробней обьяснить.