Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
C++ перехват пакетов
#1
Собственно хочу сделать еще одну реинкарнацию пакетхака. На этот раз в виде длл, но возникла большая проблема:
[SRC="c++"]// dllmain.cpp: определяет точку входа для приложения DLL.
#include <Windows.h>

__declspec(dllexport) void dllmain() {}

class UNetworkHandler {};

#pragma pack(push, 1)
struct NetworkPacket
{
unsigned char id, _padding1, exid, _padding2;
unsigned short size, _padding3;
unsigned char* data;
};
struct ClientPacket
{
unsigned char id, _padding1, exid, _padding2;
unsigned short size, _padding3;
unsigned char* data;
};
#pragma pack(pop)

int(__fastcall *UNetworkHandler_AddNetworkQueue)(UNetworkHandler*, int, NetworkPacket*);
typedef void(__cdecl *UNetworkHandler_OutgoingPacket)(unsigned int This, char *Format, ...);
UNetworkHandler_OutgoingPacket true_UNetworkHandler_OutgoingPacket;

void ParseClientPacket(ClientPacket* packet)
{

}

void ParseServerPacket(NetworkPacket* packet)
{

}

//Клиентские пакеты
int __cdecl UNetworkHandler_OutgoingPacket_hook(unsigned int This, char *Format, ...)
{
true_UNetworkHandler_OutgoingPacket(This, Format, ...);
return 0;
}

//Серверные пакеты
int __fastcall UNetworkHandler_IncommingPacket_hook(UNetworkHandler* This, int /*edx*/, NetworkPacket* packet)
{
// Полезная нагрузка перехвата
char buf[1024];
wsprintfA(buf, "Server Packet id=0x%x, size=0x%x", packet->id, packet->size);
OutputDebugStringA(buf);
ParseServerPacket(packet);
//-----------------------------------------
return (*UNetworkHandler_AddNetworkQueue)(This, 0/*чтоугодно*/, packet);
}

DWORD WINAPI InitThread(LPVOID)
{
HMODULE hEngine = LoadLibraryA("Engine.dll");
(FARPROC&)UNetworkHandler_AddNetworkQueue = GetProcAddress(hEngine, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z");
void** UNetworkHandler_vftable = (void**)GetProcAddress(hEngine, "??_7UNetworkHandler@@6BUObject@@@");
void** addr = (void**)(UNetworkHandler_vftable - 0x7); //0x1C for 4 byte
(FARPROC&)true_UNetworkHandler_OutgoingPacket = FARPROC(addr);
*addr = (void*)UNetworkHandler_OutgoingPacket_hook;
void** UNetworkHandler_vftableCheck = UNetworkHandler_vftable;
while (*UNetworkHandler_vftableCheck != (void*)UNetworkHandler_AddNetworkQueue) ++UNetworkHandler_vftableCheck;
*UNetworkHandler_vftableCheck = (void*)UNetworkHandler_IncommingPacket_hook;
return 0;
}

BOOL WINAPI DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID)
{
if (DLL_PROCESS_ATTACH != ul_reason_for_call)
return 1;
DisableThreadLibraryCalls(hModule);

CreateThread(0, 0, &InitThread, 0, 0, 0);
return 1;
}[/SRC]
Собственно почему в одном случае все работает, а в другом ошибка?)
[Изображение: 4e38c909fcd08c5fcdf363b54a62.png]
Ответ
#2
Zubastic,
Почему вы так не используете? Smile

Код:
BOOL InitThread(void)
{
    return 0;
}

BOOL WINAPI DllMain(HMODULE hModule, DWORD hReason, LPVOID hReserved)
{
    DisableThreadLibraryCalls(hModule);
    if (hReason == DLL_PROCESS_ATTACH)
    {
        CreateThread(0, 0, (LPTHREAD_START_ROUTINE)InitThread, 0, 0, 0);
    }
    return TRUE;
}
Ответ
#3
Мопед был найден на просторах интернета, да и для меня большой разницы не было как это реализовать.
Вопрос вот в этом:
[SRC="c++"]int __cdecl UNetworkHandler_OutgoingPacket_hook(unsigned int This, char *Format, ...)
{
true_UNetworkHandler_OutgoingPacket(This, Format, ...);
return 0;
}[/SRC]

Тут эта байда отваливается, хотя я просто хочу пробросить функцию (ну и модифицировать чутка).
[Изображение: 4e38c909fcd08c5fcdf363b54a62.png]
Ответ
#4
Какие хроники?

UNetworkHandler_AddNetworkQueue вызывается без ошибок?

Возможно адрес true_UNetworkHandler_OutgoingPacket рассчитан неправильно.
Ответ
#5
В true_* функциях пролог есть?
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ
#6
n3k0nation Написал:В true_* функциях пролог есть?
Шо це такое?
Чета вон вверху есть.

Добавлено через 5 минут
flopix Написал:Какие хроники?

UNetworkHandler_AddNetworkQueue вызывается без ошибок?

Возможно адрес true_UNetworkHandler_OutgoingPacket рассчитан неправильно.
ХФ 273
[Изображение: 4e38c909fcd08c5fcdf363b54a62.png]
Ответ
#7
Zubastic Написал:Шо це такое?
Чета вон вверху есть.

Добавлено через 5 минут

ХФ 273

like:
Код:
push ebp
mov ebp, esp
;далее твой джамп на функцию со смещением на 5 байт
И да. Корректно ли заменяются 5 байт на jmp near? Ибо пролога у функции может и не быть, что делает кучу гемороя, типа, написания дизассемблера длин и замена с помощью него + нопы, плюс учет стека, состояния регистров, бла-бла-бла
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ
#8
n3k0nation Написал:like:
Код:
push ebp
mov ebp, esp
;далее твой джамп на функцию со смещением на 5 байт
И да. Корректно ли заменяются 5 байт на jmp near? Ибо пролога у функции может и не быть, что делает кучу гемороя, типа, написания дизассемблера длин и замена с помощью него + нопы, плюс учет стека, состояния регистров, бла-бла-бла
Я же заменяю ссылку в vtable на метод. Зачем мне делать пролог?
Я понимаю если бы я экстил функцию в методе, тогда это имело смысл, а так какой смысл? Нет, конечно можно и так сделать, но это дополнительный геморрой, как ты описал.
[Изображение: 4e38c909fcd08c5fcdf363b54a62.png]
Ответ
#9
Попробуйте добавить поиск адреса таким способом и сравнить полученные адреса.
Это рабочий вариант как раз для HF

PHP код:
<?php 
unsigned int GetSendPacketAddress
(void)
{
HMODULE hEngine = LoadLibraryA("engine.dll");

unsigned int startVMT = (unsigned int) GetProcAddress(hEngine, "??_7UNetworkHandler@@6BUObject@@@");
//sprintf_s(outSt, "startVMT: %u\n", startVMT);
//PrintOnConsole(outSt);

unsigned int AddNetworkQueue = (unsigned int) GetProcAddress(hEngine, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z");
unsigned int currVMT = startVMT;

if (
AddNetworkQueue == 0)
{
PrintOnConsole("GetSendPacketAddress: AddNetworkQueue == 0\n");
return
0;
}

while (
true)
{
if (*(
unsigned int*) currVMT == AddNetworkQueue)
{
return *(
unsigned int*) (currVMT - 0xA4);
}

currVMT++;
if (
currVMT - startVMT > 10000)
{
PrintOnConsole("GetSendPacketAddress: currVMT - startVMT > 10000\n");
return
0;
}
}

PrintOnConsole("GetSendPacketAddress: not find\n");
return
0;
}
Ответ
#10
Хорошо, попробую.
Но у меня адрес находится верно в любом случае.
[Изображение: 4e38c909fcd08c5fcdf363b54a62.png]
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Свой сниффер и редактор пакетов SiriusED 0 449 03-22-2024, 03:28 AM
Последний пост: SiriusED
  Реконструкция пакетов из WSARecv\WSASend ANZO 3 2,474 04-17-2016, 08:34 PM
Последний пост: Necroz-Team
  Подмен пакетов katanasmil 4 3,070 06-16-2014, 07:24 PM
Последний пост: PROGRAMMATOR
  Опкоды пакетов при хуке Mifesto 3 2,424 07-09-2013, 04:18 PM
Последний пост: Mifesto

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)