PDA

Просмотр полной версии : [C++]Помогите хукнуть пакеты методами клиента


ALF
02.09.2011, 22:04
Всем привет!
Оч надеюсь на Вашу помощь)
В общем задача такова: Заменить клиентские ::SendPacket и ::RecvPacket
с SendPacket я разобрался..
asm
{
mov ecx, [pUNetworkHandler]
mov eax, [ecx+048h]
mov ecx, [eax]
mov eax, [ecx+06Ch] //GF
//mov eax, [ecx+068h] //IT
mov pSendPacket, eax
}
//SplaisingVMT((void *)pSendPacket,(void *)pSendPacket,SendPacketH);
//CreatNewConnect();

void __cdecl SendPacketH(void * Object, char * format, ...)
{
va_list arglist; // Переменные
va_start(arglist,format);

char c_Packet[8120];
C_PacketConstructor Packet;

Packet.SetPointer(&c_Packet[0]);

for (int len=0; *format; format++)
{
switch (*format)
{
case 'c': Packet.WriteC(va_arg(arglist,unsigned char)); len++; break;
case 'h': Packet.WriteH(va_arg(arglist,short));len++; break;
case 'd': Packet.WriteI(va_arg(arglist,int));len++; break;
case 'f': Packet.WriteF(va_arg(arglist,float)); len++; break;
case 'Q': Packet.WriteD(va_arg(arglist,__int64)); len++; break;
case 's': Packet.Writes(va_arg(arglist,char *));len++; break;
case 'S': Packet.WriteS(va_arg(arglist,wchar_t *));len++; break;
case 'b':
case 'x':
{

int cb=va_arg(arglist,int);
const char* p=va_arg(arglist,const char*);
Packet.WriteB(p,cb);
} break;
}
}

//EncryptPacket(c_Packet);
send(NewSocket, c_Packet, Packet.GetSize(), 0);
return;
};


А вот с RecvPacket чуть не понятно...
Подскажите плиз где его искать то?)

supernewbie
02.09.2011, 23:17
поищи где клиент вызывает рекв, там собсна только 1-2 места таких, потом найди смещение и прибавляй его вместо 6С

мб тебе вообще адднетворк нужен? или шифрацию запилить решил?)

Breadfan
02.09.2011, 23:20
альф - да, он защиту делает.

ALF
02.09.2011, 23:29
В общем вот что обнаружил )))
007964B0 . 56 PUSH ESI
007964B1 . 8B7424 08 MOV ESI,DWORD PTR SS:[ESP+8]
007964B5 . 53 PUSH EBX
007964B6 . 55 PUSH EBP
007964B7 . C705 F4FCAB00 >MOV DWORD PTR DS:[ABFCF4],1
007964C1 . 57 PUSH EDI
007964C2 > 8B86 58090100 MOV EAX,DWORD PTR DS:[ESI+10958]
007964C8 . 6A 64 PUSH 64
007964CA . 50 PUSH EAX
007964CB . E8 5EA5A703 CALL 04210A2E
007964D0 . 90 NOP
007964D1 . 3D 02010000 CMP EAX,102
007964D6 . 75 2D JNZ SHORT Engine.00796505
007964D8 . 833D F4FCAB00 >CMP DWORD PTR DS:[ABFCF4],0
007964DF .^75 E1 JNZ SHORT Engine.007964C2
007964E1 . 8B86 58090100 MOV EAX,DWORD PTR DS:[ESI+10958]
007964E7 . 85C0 TEST EAX,EAX
007964E9 . 5F POP EDI
007964EA . 5D POP EBP
007964EB . 5B POP EBX
007964EC . 74 11 JE SHORT Engine.007964FF
007964EE . 50 PUSH EAX
007964EF . E8 0C9BA803 CALL 04220000
007964F4 . 90 NOP
007964F5 . C786 58090100 >MOV DWORD PTR DS:[ESI+10958],0
007964FF > 5E POP ESI
00796500 .^E9 5A8DDCFF JMP Engine.0055F25F
00796505 > 8B8E 1C120100 MOV ECX,DWORD PTR DS:[ESI+1121C]
0079650B . 8B15 2CF7C200 MOV EDX,DWORD PTR DS:[C2F72C]
00796511 . 33ED XOR EBP,EBP
00796513 . 896C24 14 MOV DWORD PTR SS:[ESP+14],EBP
00796517 . 8D0C8A LEA ECX,DWORD PTR DS:[EDX+ECX*4]
0079651A . 0F31 RDTSC
0079651C . 2901 SUB DWORD PTR DS:[ECX],EAX
0079651E . 8B46 38 MOV EAX,DWORD PTR DS:[ESI+38]
00796521 . 55 PUSH EBP ; /Flags
00796522 . 68 00000100 PUSH 10000 ; |BufSize = 10000 (65536.)
00796527 . 68 309AA700 PUSH Engine.00A79A30 ; |Buffer = Engine.00A79A30
0079652C . 50 PUSH EAX ; |Socket
0079652D . 90 NOP ; |
0079652E . E8 3C023071 CALL ws2_32.recv ; \recv
00796533 . 8B8E 1C120100 MOV ECX,DWORD PTR DS:[ESI+1121C]
00796539 . 8B15 2CF7C200 MOV EDX,DWORD PTR DS:[C2F72C]
0079653F . 8BF8 MOV EDI,EAX
00796541 . 8D0C8A LEA ECX,DWORD PTR DS:[EDX+ECX*4]
00796544 . 0F31 RDTSC
00796546 . 83C0 F4 ADD EAX,-0C
00796549 . 0101 ADD DWORD PTR DS:[ECX],EAX
0079654B . 3BFD CMP EDI,EBP
0079654D .^0F8E 6FFFFFFF JLE Engine.007964C2
00796553 . EB 0B JMP SHORT Engine.00796560
00796555 . 8DA424 0000000>LEA ESP,DWORD PTR SS:[ESP]
0079655C . 8D6424 00 LEA ESP,DWORD PTR SS:[ESP]
00796560 > 8B86 C01F0100 MOV EAX,DWORD PTR DS:[ESI+11FC0]
00796566 . 83E8 00 SUB EAX,0 ; Switch (cases 0..1)
00796569 . 0F84 BD000000 JE Engine.0079662C
0079656F . 83E8 01 SUB EAX,1
00796572 . 0F85 64010000 JNZ Engine.007966DC
00796578 . 8B86 1C120100 MOV EAX,DWORD PTR DS:[ESI+1121C] ; Case 1 of switch 00796566
0079657E . 8B0D 2CF7C200 MOV ECX,DWORD PTR DS:[C2F72C]
00796584 . 8D0C81 LEA ECX,DWORD PTR DS:[ECX+EAX*4]
00796587 . 0F31 RDTSC
00796589 . 2901 SUB DWORD PTR DS:[ECX],EAX
0079658B . 8B8E BC1F0100 MOV ECX,DWORD PTR DS:[ESI+11FBC]
00796591 . 8B86 B81F0100 MOV EAX,DWORD PTR DS:[ESI+11FB8]
00796597 . 2BC1 SUB EAX,ECX
00796599 . 3BC7 CMP EAX,EDI
0079659B . 7C 02 JL SHORT Engine.0079659F
0079659D . 8BC7 MOV EAX,EDI
0079659F > 50 PUSH EAX
007965A0 . 8D95 309AA700 LEA EDX,DWORD PTR SS:[EBP+A79A30]
007965A6 . 52 PUSH EDX
007965A7 . 8D8431 5008000>LEA EAX,DWORD PTR DS:[ECX+ESI+850]
007965AE . 50 PUSH EAX
007965AF . E8 7CBBDCFF CALL Engine.00562130
007965B4 . 8B8E B81F0100 MOV ECX,DWORD PTR DS:[ESI+11FB8]
007965BA . 2B8E BC1F0100 SUB ECX,DWORD PTR DS:[ESI+11FBC]
007965C0 . 83C4 0C ADD ESP,0C
007965C3 . 3BCF CMP ECX,EDI
007965C5 . 7C 02 JL SHORT Engine.007965C9
007965C7 . 8BCF MOV ECX,EDI
007965C9 > 8B96 1C120100 MOV EDX,DWORD PTR DS:[ESI+1121C]
007965CF . A1 2CF7C200 MOV EAX,DWORD PTR DS:[C2F72C]
007965D4 . 2BF9 SUB EDI,ECX
007965D6 . 03E9 ADD EBP,ECX
007965D8 . 8D1C90 LEA EBX,DWORD PTR DS:[EAX+EDX*4]
007965DB . 0F31 RDTSC
007965DD . 83C0 F4 ADD EAX,-0C
007965E0 . 0103 ADD DWORD PTR DS:[EBX],EAX
007965E2 . 85C9 TEST ECX,ECX
007965E4 . 7E 0A JLE SHORT Engine.007965F0
007965E6 . 018E BC1F0100 ADD DWORD PTR DS:[ESI+11FBC],ECX
007965EC . 014C24 14 ADD DWORD PTR SS:[ESP+14],ECX
007965F0 > 8B86 B81F0100 MOV EAX,DWORD PTR DS:[ESI+11FB8]
007965F6 . 3986 BC1F0100 CMP DWORD PTR DS:[ESI+11FBC],EAX
007965FC . 0F85 DA000000 JNZ Engine.007966DC
00796602 . 8B16 MOV EDX,DWORD PTR DS:[ESI]
00796604 . 8B52 78 MOV EDX,DWORD PTR DS:[EDX+78]
00796607 . 50 PUSH EAX
00796608 . 8D86 50080000 LEA EAX,DWORD PTR DS:[ESI+850]
0079660E . 50 PUSH EAX
0079660F . 8BCE MOV ECX,ESI
00796611 . FFD2 CALL EDX
00796613 . 33C0 XOR EAX,EAX
00796615 . 8986 B81F0100 MOV DWORD PTR DS:[ESI+11FB8],EAX
0079661B . 8986 BC1F0100 MOV DWORD PTR DS:[ESI+11FBC],EAX
00796621 . 8986 C01F0100 MOV DWORD PTR DS:[ESI+11FC0],EAX
00796627 . E9 B0000000 JMP Engine.007966DC
0079662C > 8B86 1C120100 MOV EAX,DWORD PTR DS:[ESI+1121C] ; Case 0 of switch 00796566
00796632 . 8B0D 2CF7C200 MOV ECX,DWORD PTR DS:[C2F72C]
00796638 . 8D0C81 LEA ECX,DWORD PTR DS:[ECX+EAX*4]
0079663B . 0F31 RDTSC
0079663D . 2901 SUB DWORD PTR DS:[ECX],EAX
0079663F . 8B8E BC1F0100 MOV ECX,DWORD PTR DS:[ESI+11FBC]
00796645 . B8 02000000 MOV EAX,2
0079664A . 2BC1 SUB EAX,ECX
0079664C . 3BC7 CMP EAX,EDI
0079664E . 7C 02 JL SHORT Engine.00796652
00796650 . 8BC7 MOV EAX,EDI
00796652 > 50 PUSH EAX
00796653 . 8D95 309AA700 LEA EDX,DWORD PTR SS:[EBP+A79A30]
00796659 . 52 PUSH EDX
0079665A . 8D8431 5008000>LEA EAX,DWORD PTR DS:[ECX+ESI+850]
00796661 . 50 PUSH EAX
00796662 . E8 C9BADCFF CALL Engine.00562130
00796667 . B9 02000000 MOV ECX,2
0079666C . 2B8E BC1F0100 SUB ECX,DWORD PTR DS:[ESI+11FBC]
00796672 . 83C4 0C ADD ESP,0C
00796675 . 3BCF CMP ECX,EDI
00796677 . 7C 02 JL SHORT Engine.0079667B
00796679 . 8BCF MOV ECX,EDI
0079667B > 8B96 1C120100 MOV EDX,DWORD PTR DS:[ESI+1121C]
00796681 . A1 2CF7C200 MOV EAX,DWORD PTR DS:[C2F72C]
00796686 . 2BF9 SUB EDI,ECX
00796688 . 03E9 ADD EBP,ECX
0079668A . 8D1C90 LEA EBX,DWORD PTR DS:[EAX+EDX*4]
0079668D . 0F31 RDTSC
0079668F . 83C0 F4 ADD EAX,-0C
00796692 . 0103 ADD DWORD PTR DS:[EBX],EAX
00796694 . 85C9 TEST ECX,ECX
00796696 . 7E 0A JLE SHORT Engine.007966A2
00796698 . 018E BC1F0100 ADD DWORD PTR DS:[ESI+11FBC],ECX
0079669E . 014C24 14 ADD DWORD PTR SS:[ESP+14],ECX
007966A2 > B8 02000000 MOV EAX,2
007966A7 . 3986 BC1F0100 CMP DWORD PTR DS:[ESI+11FBC],EAX
007966AD . 75 2D JNZ SHORT Engine.007966DC
007966AF . 66:8B8E 500800>MOV CX,WORD PTR DS:[ESI+850]
007966B6 . 66:898E B81F01>MOV WORD PTR DS:[ESI+11FB8],CX
007966BD . 3986 B81F0100 CMP DWORD PTR DS:[ESI+11FB8],EAX
007966C3 . 7D 0D JGE SHORT Engine.007966D2
007966C5 . 68 E0618900 PUSH Engine.008961E0 ; UNICODE "packet size is under 2 something wrong!"
007966CA . E8 21BEFFFF CALL Engine.007924F0
007966CF . 83C4 04 ADD ESP,4
007966D2 > C786 C01F0100 >MOV DWORD PTR DS:[ESI+11FC0],1
007966DC > 85FF TEST EDI,EDI ; Default case of switch 00796566
007966DE .^0F8F 7CFEFFFF JG Engine.00796560
007966E4 . 8B4424 14 MOV EAX,DWORD PTR SS:[ESP+14]
007966E8 . 0186 70090100 ADD DWORD PTR DS:[ESI+10970],EAX
007966EE . 0186 74090100 ADD DWORD PTR DS:[ESI+10974],EAX
007966F4 .^E9 C9FDFFFF JMP Engine.007964C2


Что интересно - Функция в адресе 007964B0 никогда не вызывается)
а вызывается скорее всего каким то джампом я хз )
Но так и не нашел то что хотел)
Так же клиент постоянно тикает эту функцию, определил я это поставив бряк на
007964D1 . 3D 02010000 CMP EAX,102
Пред ней я так понял и идет проверка "тик это или нет" если нет - значит пакет, значит вызываем Recv
Чето такое....

destructor
03.09.2011, 13:12
а не проще похучить клиентску шифровку\расшифровку ?
Engine.dll:20522A50 dd offset unk_203DA2F0
Engine.dll:20522A54 dd offset loc_203DA610
Engine.dll:20522A58 dd offset sub_203DA590 ; зашифровываем исходящий пакет
Engine.dll:20522A5C dd offset sub_203DA500 ; расшифровываем входящий пакет
Engine.dll:20522A60 dd offset unk_205948B4
Engine.dll:20522A64 engine_??_7UNetworkHandler@@6BUObject@@@ ; этот адрес экспортируется
Engine.dll:20522A68 dd offset off_201124E2
Engine.dll:20522A6C dd offset unk_20112530
Engine.dll:20522A70 dd offset unk_200947D0

ALF
03.09.2011, 13:34
а не проще похучить клиентску шифровку\расшифровку ?
Engine.dll:20522A50 dd offset unk_203DA2F0
Engine.dll:20522A54 dd offset loc_203DA610
Engine.dll:20522A58 dd offset sub_203DA590 ; зашифровываем исходящий пакет
Engine.dll:20522A5C dd offset sub_203DA500 ; расшифровываем входящий пакет
Engine.dll:20522A60 dd offset unk_205948B4
Engine.dll:20522A64 engine_??_7UNetworkHandler@@6BUObject@@@ ; этот адрес экспортируется
Engine.dll:20522A68 dd offset off_201124E2
Engine.dll:20522A6C dd offset unk_20112530
Engine.dll:20522A70 dd offset unk_200947D0


О_о идея не плохая)))
А не подскажите какие аргументы идут при вызове этих функций?

destructor
04.09.2011, 16:59
он защиту делает.
этоже создание вредоносных программ! банить таких надо!!!

А не подскажите какие аргументы идут при вызове этих функций?держи:)
void __stdcall function(char * buff, int64 * pxorkey, int leng)
{
int * pobj; __asm mov pobj, ecx; //опционально

printf("указатель на пакет %p", buff);
printf("указатель на ключик %p", pxorkey);
printf("размер пакета %d",leng) ;
};

ALF
18.12.2011, 22:49
oO Поставил месседжи на те функции - походу клиент не вызывает их О_О.
(Goddess of Destruction)

destructor
19.12.2011, 13:40
криво поставил?

ALF
19.12.2011, 19:12
криво поставил?

(FARPROC &)ClientEncrypt = (FARPROC)((DWORD)UNHandlerTable - 0x0C);
(FARPROC &)ClientDecrypt = (FARPROC)((DWORD)UNHandlerTable - 0x08);
SplaisingVMTF(ClientEncrypt, NewCrypt);
SplaisingVMTF(ClientDecrypt, NewCrypt);

alexteam
19.12.2011, 19:35
SplaisingVMTF(ClientEncrypt, NewCrypt);
SplaisingVMTF(ClientDecrypt, NewCrypt);
э.. и чо это значит ?

ALF
19.12.2011, 20:24
э.. и чо это значит ?

Это просто функции, в которых месседжБокс)

DWORD WINAPI InitThread(LPVOID lpParameter)
{
//HWID();
hEngine = GetModuleHandle("engine.dll");
UNHandlerTable = GetProcAddress(hEngine, nUNHandlerTable);

//GameGuardReplay = GetProcAddress(hEngine, nGameGuardReplay);

(FARPROC &)UNetWorkHandler_Init = GetProcAddress(hEngine, nUNHandlerInit);
(FARPROC &)DispatchNetworkQueue = GetProcAddress(hEngine, nDispatchNetworkQueue);

pDispatchNetworkQueue = (int)DispatchNetworkQueue;
SplaisingVMT(UNHandlerTable,UNetWorkHandler_Init,U NHandler_Init);

//SplaisingVMT(UNHandlerTable,GameGuardReplay,GameGu ardReplayHook);

while (GetModuleHandleA("fire.dll") == 0)
{
Sleep(100);
}

(FARPROC &)SendPacket = (FARPROC)(DWORD *)(**(DWORD **)(pUNetworkHandler + 0x48) + 0x6C);
(FARPROC &)ClientEncrypt = (FARPROC)((DWORD)UNHandlerTable - 0x0C);
(FARPROC &)ClientDecrypt = (FARPROC)((DWORD)UNHandlerTable - 0x08);
SplaisingVMTF(ClientEncrypt, NewCrypt);
SplaisingVMTF(ClientDecrypt, NewCrypt);


return 0;
};


void __stdcall NewCrypt(char * buff, __int64 * Key, int size)
{
MessageBox(0,"New Crypt","New Ctypt Is", MB_OK);
};


DWORD oldprotect;
/************************************************** ************************************************** **
* Хук таблицы VMT
************************************************** ************************************************** **/
void __stdcall SplaisingVMT(void * Table, void * Method, void * Hook)
{
asm
{
mov ecx,-1
cld
mov edi,Table
mov eax,Method
repnz scasd
push Hook
pop edi-4
}
return;
};

void __stdcall SplaisingVMTF(void * Method, void * Hook)
{
int * pMethod = *(int**)(Method);

if(!VirtualProtect(pMethod,10,PAGE_EXECUTE_READWRI TE,&oldprotect))
{
MessageBox(0,"SplaisingVMTF", "Error", MB_OK);
return;
}

pMethod = (int*)Hook;
return;
};

/************************************************** ************************************************** **
* Сплайсинг типа CALL
************************************************** ************************************************** **/
void __stdcall SplaisingCall(void * Method, void * Hook)
{


if(!VirtualProtect(Method,10,PAGE_EXECUTE_READWRIT E,&oldprotect))
{
MessageBox(0,"SplaisingCall", "Error", MB_OK);
return;
}

asm
{
mov eax, [Method]
mov ebx, eax
mov edx, [Hook]
add ebx, 0x05
sub edx, ebx
mov byte [eax], 0xE8
mov dword [eax+1], edx
}
return;
};


Добавлено через 43 минуты
ВСё, проблема решена)
Тему можно закрывать)

destructor
19.12.2011, 22:07
ВСё, проблема решена)ну хоть отписалбы что там было

ALF
20.12.2011, 17:46
Была неправильная функция.
Вот исправил)

void __stdcall SplaisingVMTF(void * Method, void * Hook)
{
if(!VirtualProtect(*(void **)Method,10,PAGE_EXECUTE_READWRITE,&oldprotect))
{
MessageBox(0,"SplaisingVMTF", "Error", MB_OK);
return;
}

*(void **)Method = Hook;
return;
};

[ Mifesto ]
21.12.2012, 13:37
не хочется плодить темы, спрошу тут.

вот получается есть функция поиска адреса SendPacket:

unsigned int GetSendPacketAddress(void)
{
HMODULE hEngine = LoadLibraryA("engine.dll");

unsigned int startVMT = (unsigned int) hEngine + 0x51F658;
unsigned int AddNetworkQueue = (unsigned int) GetProcAddress(hEngine, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPa cket@@@Z");
unsigned int currVMT = startVMT;

if (AddNetworkQueue == 0)
return 0;

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

currVMT++;
if (currVMT - startVMT > 10000)
return 0;
}

return 0;
}


но выше 268 протокола она не работает, попытался сделать так:

unsigned int GetSendPacketAddress(void)
{
HMODULE hEngine = LoadLibraryA("engine.dll");
unsigned int UNHandlerTable = (unsigned int)GetProcAddress(hEngine, "??_7UNetworkHandler@@6BUObject@@@");
return (UNHandlerTable + 0x48) + 0x6C;
}


с этим кодом хук становится, но как только открывается окно то оно сразу крашится:

2013.1.7 22:52:30
OS : Windows XP 5.1 (Build: 2600)
CPU : GenuineIntel Intel(R) Celeron(R) CPU E3300 @ 2.50GHz @ 2506 MHz 2047MB RAM
Video : Radeon X1300XT/X1600Pro/X1650 Series (6925)
PosCode : LS1(273) 0:0:0 2/0 [288]

General protection fault!

History: ViewportLock1 <- Precaching <- UGameEngine::Draw <- UWindowsViewport::Repaint <- UWindowsClient::Tick <- ClientTick <- UGameEngine::Tick <- UpdateWorld <- MainLoop


ткнет пальцем кто на ошибку?

Sinn3r
28.02.2013, 02:26
Тут был глупый вопрос, который разрешился сам собой

Sinn3r
01.03.2013, 21:49
Есть хук на SendPacket
выглядит это дело примерно так
__declspec( naked ) void _cdecl jmpSendPacket(void* obj, char* format,...)
{
_asm jmp lpSendPacket_Original
}

void _cdecl SendPacket_Hook(void* obj, char* format, ...)
{
if(lpSendPacketObject == 0)
lpSendPacketObject = obj;
va_list args;
va_start(args, format);
printf("Format: %s\n", format);
SendPacket_Detour->Remove();
jmpSendPacket(obj, format, args);
SendPacket_Detour->Apply();
}
хук срабатывает, все классно, но, пакет не доходит. Если ставить хук после коннекта к гейм серверу то вылетает из за ошибки подключения

Добавлено через 54 секунды
Предпалагаю что это из за неправильной пердачи параметров..

Deadly
02.03.2013, 00:11
Если не сложно обьясните как вы дизасемблируете код, у меня например вм протектор мозг вынес я так и не смог его обойти, и вообще реально запустить под отладкой хоть какойто клиент л2?

Sinn3r
02.03.2013, 00:44
Deadly, хотелось бы сказать, что как все, но у меня с этим такие же проблемы. Использую встроенный в чит енжин дебагер, функционал скудный, но это лучше чем ничего

Elecktron
03.03.2013, 02:15
olly dbg с плагинами вполне успешно справляется с темидой и винлицензом. тут (http://coderx.ru/showthread.php?t=9439) два варианта решения.

а send проще "захардкодить", если не требуется гибкая работа на разных версиях клиента.
то есть если это делается для конкретного сервера и под конкретный клиент.

Sinn3r
03.03.2013, 08:41
Elecktron, так проблема же не найти сенд, а правильно вызвать.
Вот здесь
void _cdecl SendPacket_Hook(void* obj, char* format, ...)
{
if(lpSendPacketObject == 0)
lpSendPacketObject = obj;

va_list args;
va_start(args, format);
printf("Format: %s\n", format);
SendPacket_Detour->Remove(); //Снял хук
SendPacket(obj, format, args); //<-- волнующий меня момент
SendPacket_Detour->Apply(); //Поставил хук
}
Собственно, а что же конкретно находится в args? На попытку вызвать оригинальную функцию сервер отвечает мне дисконектом, значит я ему передаю какую-то фигню.

А какие плагины? У меня оля с сод/фантом в лучшем случае просто зависает, в худшем краш

Добавлено через 5 часов 42 минуты
Экспериментальным путем выяснил, что все параметры в порядке, тогда почему функция отказывается работать.

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

Morfik
03.03.2013, 12:57
Sinn3r, а где запихивание в ecx указателя на объект unetworkhandle перед вызовом сенда? (правд могу и ошибаться что sendpacket это метод класса unetworkhandle, не баловался с ним)

Sinn3r
03.03.2013, 14:47
Morfik, вроде-бы не надо, объект идет первым параметром.
Кстати, если поставить хук в vtable, а вызывать оригинал джампом непосредственно из того места куда указывала таблица, то все вроде работает, но сцуко, это кошмарная реализация

Morfik
03.03.2013, 15:06
Sinn3r, это у тебя да?

__declspec( naked ) void _cdecl jmpSendPacket(void* obj, char* format,...)
{
_asm jmp lpSendPacket_Original
}

cdecl
Основной способ вызова для Си (отсюда название, сокращение от «c-declaration»). Аргументы передаются через стек, справа налево. Очистку стека производит вызывающая программа. Это основной способ вызова функций с переменным числом аргументов (например, printf(…))
то есть твой объект идет параметром - передается в стек, а должен быть передан в регистр ecx

могу и ошибаться, но поменять 2 строки с ручным запихиваетм объекта в ecx не долго

Sinn3r
03.03.2013, 22:50
Сделал так
lpOriginalSend = *(DWORD*)((DWORD)SendPacket + 1) + 5 + (DWORD)SendPacket;
SendPacket_Detour = new Detour(SendPacket, jmpSendPacket);
SendPacket_Detour->Apply();

__declspec( naked ) void _cdecl jmpSendPacket(void* This, char* format,...)
{
_asm jmp [lpOriginalSend]
}
работает. А вот так
SendPacket_Detour = new Detour(SendPacket, SendPacket_Hook);
SendPacket_Detour->Apply();

void _cdecl SendPacket_Hook(void* obj, char* format, ...)
{
va_list args;
va_start(args, format);
SendPacket_Detour->Remove();
SendPacket(obj, format, args);
SendPacket_Detour->Apply();
}
нет.

До этого пробовал ложить объект в ecx, но ничего не вышло, ибо это cdecl, а не thiscall

Morfik
03.03.2013, 23:01
Sinn3r, методы классов как раз таки и должны быть thiscall... как бы

Sinn3r
03.03.2013, 23:03
Так выглядит лог пакетов в игре
http://puu.sh/2btBj
но при этом никаких действий не совершается, хук срабатывает, но оригинал не вызывается

Добавлено через 1 минуту
Morfik, осмелюсь предположить, что это функция, а не метод
Этот метод передает формат пакета и его данные в неэкспортируемую функцию отправки пакета
void __cdecl SendPacket(UNetworkHandler*,char*,...) .

Sinn3r
04.03.2013, 12:41
за идею c UNetworkHandler.Init спасибо, а то я как дурак хукал адднетворк что бы получить объект.
Остальное уже сделано, и к моей проблеме не относится...вроде бы

Deadly
04.03.2013, 14:15
такой вопрос можно ли каким то образом послать пакет 0000000000000 ????
зы скиньте что-ли чудо ольку которая вм протек обходит(у меня ни с оли адвансер ни с фантомом ни с чем не обходит даже ис дебагер персент в вм протекте хе хе))) +

кс если получить послать пакет 0000000000 то можно снять любую защиту в 2 щета, изначально послать ключик 00000000 и пакет 00000000 и тогда получим чистый ключ которым все шифруется не снимая вм протект и прочую лабуду сейчас над этим и работаю

[ Mifesto ]
12.04.2015, 07:57
Ну что же, апнем старую тему, подскажет кто как найти адрес функций Encrypt\Decrypt в клиенте Епизод? Да и вообще как их можно найти через туже ольку... Сенд пакет можно найти вручную в любом из Request пакетов, я всегда ищу в RequestAutoSoulShot вроде в eax(точно не помню), а как можно найти крипт и декрпт?

ScythLab
14.04.2015, 21:11
Не могу дать 100% гарантии, что метод рабочий.
Метод SendPacket относится к классу CClientSocket, тебе нужно найти VMT данного класса. В ней находишь ссылку на SendPacket, 4-ый метод после SendPacket отвечает за шифрование, следующий (5-ый) метод вроде тоже как-то связан с шифрованием.
Но это в любом случае теория, и нужно проверять на практике.

[ Mifesto ]
17.04.2015, 23:26
Не могу дать 100% гарантии, что метод рабочий.
Метод SendPacket относится к классу CClientSocket, тебе нужно найти VMT данного класса. В ней находишь ссылку на SendPacket, 4-ый метод после SendPacket отвечает за шифрование, следующий (5-ый) метод вроде тоже как-то связан с шифрованием.
Но это в любом случае теория, и нужно проверять на практике.

Спасибо, но 4 и 5 методы в 558+ протоколе уже не те, их перенесли далеко вверх.