Вернуться   CoderX :: Forums > Основные форумы > Полезности
Войти через OpenID

Полезности Исключительно для полезных тем из других разделов.
Темы тут не создаются!
Темы сюда перемещаются из других разделов, и на их старых местах остаются постоянные перенаправления.

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
 
 
Опции темы Опции просмотра
Старый 09.01.2011, 21:58   #11
Новичок
 
Регистрация: 09.01.2011
Сообщений: 1
Сказал Спасибо: 0
Имеет 1 спасибку в 1 сообщении
ancient пока неопределено
По умолчанию

Разбираюсь с перехватом функций клиента и возникла непонятная ситуация: некоторые функции хукаются нормально, а некоторые вызывают криты в клиенте без видимых на то причин.

Вот пример кода:
PHP код:
#include <Windows.h>

#pragma pack(push, 1)
struct jmp_struct {
    
BYTE instruction;
    
DWORD argument;
};
#pragma pack(pop)

BYTE old[5];
DWORD written 0;
jmp_struct jump;

typedef DWORD (__stdcall *t_Func)(voidparam1/*, int param2*/);
t_Func Original_Func NULL;

DWORD WINAPI Intercept_Func(voidparam1/*, int param2*/) {
    
// Сохранение контекста класса перехваченного метода.
    
DWORD this_ptr NULL;
    
__asm mov this_ptrecx;

    
// Восстанавливаем 5 первых байт функции.
    
WriteProcessMemory(GetCurrentProcess(), (void*)Original_Func, (void*)&old5, &written);

    
MessageBox(0L"Hooked"L""MB_OK);

    
// Восстановление в регистр ecx контекста класса перехваченного метода.
    
__asm mov ecxthis_ptr;
    
DWORD originalResult Original_Func(param1/*, param2*/);

    
// Снова заменяем  5 байт функции на команду перехода на нашу функцию
    
WriteProcessMemory(GetCurrentProcess(), (void*)Original_Func, (void*)&jump5, &written);

    return 
originalResult;
}

void InterceptFunctions() {
    
HMODULE hEngine GetModuleHandleA("engine.dll");

    
/* DWORD UGameEngine::OnSocialAction(User* user, int id) */
    //Original_Func = (t_Func)GetProcAddress(hEngine, "?OnSocialAction@UGameEngine@@UAEHPAUUser@@H@Z"); // Работает

    /* DWORD UNetworkHandler::AddNetworkQueue(NetworkPacket* networkPacket) */
    
Original_Func = (t_Func)GetProcAddress(hEngine"?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z"); // Не работает

    
if(Original_Func == 0) {
        
MessageBox(NULLL"Can't get address"L"Error!"MB_OK);
        return;
    }

    
jump.instruction 0xE9;
    
jump.argument = (DWORD)&Intercept_Func - ((DWORD)Original_Func 5); // Смещение для jmp = <адрес назначения> - (<адрес jmp> + sizeof(BYTE) + sizeof(int))

    
ReadProcessMemory(GetCurrentProcess(), (void*)Original_Func, (void*)&old5, &written);
    
WriteProcessMemory(GetCurrentProcess(), (void*)Original_Func, (void*)&jumpsizeof(jmp_struct), &written);
}


BOOL APIENTRY DllMain(HANDLE hModuleDWORD ul_reason_for_callLPVOID lpReserved ) {
    if(
ul_reason_for_call == DLL_PROCESS_ATTACH ) {
        
// MessageBox(0, L"Injected", L"", MB_OK);
        
InterceptFunctions();
    }
    return 
TRUE;

Перехват OnSocialAction (как и многих других функций) работает вполне успешно, а вот AddNetworkQueue перехватить не получается. В чем может быть дело?

P.S. Крит возникает в момент вызова оригинальной функции из функции-перехватчика, т.е сразу после MessageBox(0, L"Hooked", L"", MB_OK);
ancient вне форума   Ответить с цитированием
За это сообщение ancient нажился спасибкой от:
 

  CoderX :: Forums > Основные форумы > Полезности


Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 00:03.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!