зачем пользоваться глючным стеком? оО
можно проще. например(с++):
перехват инита, для получения NetworkHandler - чистая магия, местами подогнанная по месту, так что приведена исключительно для осознания что и куда.
p.s.как-то пробовал сделать на делфи - могу поискать исходники, но они "портированы" с с++, так что по сути тоже самое
p.p.s. есть еще способ (если защита смотрит откуда сенд вызван)
Тема наверное уже мертва но всё равно попробую
Может кто-то напишет пример как на дельфях получить этот долбаный NetworkHandler
function InitThread(lpParameter: pointer):dword;// stdcall;
begin
//подождать engine.dll, и начать внедрение своего кода
repeat
Sleep(100);
until (GetModuleHandleA('engine.dll')<>0);
buf := DWORD(@UNetworkHandlerInit_hook);
//тут магия, хардкод и шанс попортить регистры.
initUH_orig:=Engine+$003B2D96;
comm :=$e9;
// Обычно страницы в этой области недоступны для записи
// поэтому принудительно разрешаем запись
VirtualProtect(ptr(Engine+$003B2D90),5,PAGE_READWRITE, @op);
//вычисляем смещение которое запишем в джамп
offset := buf - (Engine+$003B2D90 + 5);
// Пишем новый адрес
// нужно писать СМЕЩЕНИЕ!
WriteProcessMemory(GetCurrentProcess(), ptr(Engine+$003B2D90),@comm,1,written);
WriteProcessMemory(GetCurrentProcess(), ptr(Engine+$003B2D90+$01),@offset,4,written);
end;
"DLL Main"
Код:
procedure DLLEntryPoint(dwReason: DWORD); export;
var
ThreadId:dword;
begin
case dwReason of
DLL_PROCESS_ATTACH:
begin
CreateThread(nil,0,@ InitThread,nil,0,ThreadId);
end;
DLL_PROCESS_DETACH:
begin
end;
end
end;
все это "хардкод", "дурной тон" и "так нельзя"
и не забываем все действия десять раз перепроверить в отладчике.
__________________
C++Builder 6, Delphi 7, RAD Studio XE2, MS VC++...
Последний раз редактировалось Elecktron, 08.04.2015 в 01:00.
P.S: Если html_this != NULL, то окно можно открыть хоть на экране ввода логина и пароля.
Хукается вроде успешно, НО где достать пойнтер This, чтобы вызывать эту функцию без предварительного получения This?
Добавлено через 7 минут
Да и вообще очень интересует как вызвать (__thiscall)OnNpcHtmlMessage, да или вообще что угодно из engine.dll !!! Дайте пример или пните в каком направлении капать))
Последний раз редактировалось user713, 09.04.2015 в 11:44.
Причина: Добавлено сообщение
Посоны привет! Я тут это все читаю, чето все всё перехватывают. А я понять не могу - это все делается на клиенте с откусанной темидой и ГГ или прям со всем этим добром? Я просто пытаюсь делать хук и у меня крэшится. Причем крэшится не доходя до моего кода, но и не сразу, а только там где я залез своми грязнуми руками в енжин.длл.
Моя первая цель - вызвать MessageBox при вызове OnNpcHtmlMessage
Это все делается под геймгуардом и с темидой, не знаю влияет ли это как то. Просто бот л2тавер показывает что это возможно. Подсобите че не так делаю? Спасибо.
Твоя функция подмены должна быть по параметрам и возвращаемому значению идентична оригинальной функции. Вот так этот метод класса выглядит:
int __thiscall UGameEngine::OnNpcHtmlMessage(UGameEngine *this, struct User *, wchar_t *, int)
Твоя функция подмены должна быть по параметрам и возвращаемому значению идентична оригинальной функции. Вот так этот метод класса выглядит:
int __thiscall UGameEngine::OnNpcHtmlMessage(UGameEngine *this, struct User *, wchar_t *, int)
Это понятно, если я хочу жить после всего этого. Но щас для меня цель отобразить мессадж бокс и гори оно синим пламенем. Ведь должно же по логике проканать. Мне не надо сохранять стэк и прочее ведь? По сути че происходит - вызывается функция из енжин длл OnNpcHtmlMessage а там вместо ее кода уже мой тупо jmp а по этому жмп тупо call MessageBox.
я не переписываю адрес функции в таблице, я хукаюсь внутрь самой функции и мне в принципе пофигу на параметры.