PDA

Просмотр полной версии : Поиск rva указателей в VMT


don.kein
02.12.2012, 13:15
Приветствую, вопрос к знатокам

На форуме есть исходники программы SendPacketDump, там есть кусок кода


//установка перехватов по захардкоденным rva указателей в VMT (VA-base)

//1. SendPacket
int* SendPacketPtrPtr=(int*)(hEngine+(0x0201D410-0x01B80000));
OriginalSendPacketPtr=*SendPacketPtrPtr;
*SendPacketPtrPtr=(int)&SendPacketHook;

Вот как найти эти адреса 0x0201D410-0x01B80000 ?

За информацию готов заплатить.

Sherman
03.12.2012, 11:58
Под Olly бряк на любой ф-ции отправки скила на сервер, и ее трассировка. Проходишь до send. Это будет адрес который в примере "0x0201D410". Адрес "0x01B80000" - это начальный адрес размещения DLL-ки в памяти. Если ничего не попутал.

Вообще в примере надо было написать ( hEngine+0x49D410 ), что бы не сбивать с толку.
Правда сам у себя тоже так делал. Копировал текущее размещение Engine и вычитал его из найденного смещения. Полученный результат прибавлял к GetModuleHandle('Engine.dll'), в примере это hEngine.

don.kein
03.12.2012, 12:36
Вот поставил брекпоинт на

Address=203D4280
Type=Export
Name=?RequestUseItem@UNetworkHandler@@UAEHAAVL2Par amStack@@@Z

В игре кликнул по предмету, остановилось на адресе 203D4280

203D4268 90 NOP
203D4269 E8 E297C7F4 CALL Core.?Logf@FOutputDevice@@QAAXPB_WZ>
203D426E 83C4 2C ADD ESP,0x2C
203D4271 5F POP EDI
203D4272 B8 01000000 MOV EAX,0x1
203D4277 5E POP ESI
203D4278 C2 8800 RETN 0x88
203D427B CC INT3
203D427C CC INT3
203D427D CC INT3
203D427E CC INT3
203D427F CC INT3
203D4280 > 53 PUSH EBX
203D4281 8B1D 9CC34820 MOV EBX,DWORD PTR DS:[0x2048C39C] ; Core.?Top@L2ParamStack@@QAE_JXZ
203D4287 55 PUSH EBP
203D4288 56 PUSH ESI
203D4289 57 PUSH EDI
203D428A 8B7C24 14 MOV EDI,DWORD PTR SS:[ESP+0x14]
203D428E 8BF1 MOV ESI,ECX
203D4290 8BCF MOV ECX,EDI
203D4292 FFD3 CALL EBX
203D4294 8BCF MOV ECX,EDI
203D4296 8BE8 MOV EBP,EAX
203D4298 FFD3 CALL EBX
203D429A 8B4E 48 MOV ECX,DWORD PTR DS:[ESI+0x48]
203D429D 8B11 MOV EDX,DWORD PTR DS:[ECX]

В каком направлении теперь идти ?

Добавлено через 6 минут
Вот сама функция RequestUseItem@UNetworkHandler@@UAEHAAVL2ParamStac k@@@Z


203D4280 > 53 PUSH EBX
203D4281 8B1D 9CC34820 MOV EBX,DWORD PTR DS:[0x2048C39C] ; Core.?Top@L2ParamStack@@QAE_JXZ
203D4287 55 PUSH EBP
203D4288 56 PUSH ESI
203D4289 57 PUSH EDI
203D428A 8B7C24 14 MOV EDI,DWORD PTR SS:[ESP+0x14]
203D428E 8BF1 MOV ESI,ECX
203D4290 8BCF MOV ECX,EDI
203D4292 FFD3 CALL EBX
203D4294 8BCF MOV ECX,EDI
203D4296 8BE8 MOV EBP,EAX
203D4298 FFD3 CALL EBX
203D429A 8B4E 48 MOV ECX,DWORD PTR DS:[ESI+0x48]
203D429D 8B11 MOV EDX,DWORD PTR DS:[ECX]
203D429F 50 PUSH EAX
203D42A0 8B42 6C MOV EAX,DWORD PTR DS:[EDX+0x6C]
203D42A3 55 PUSH EBP
203D42A4 6A 19 PUSH 0x19
203D42A6 68 D8295120 PUSH Engine.205129D8 ; ASCII "cdd"
203D42AB 51 PUSH ECX
203D42AC FFD0 CALL EAX
203D42AE 8B0D D8C34820 MOV ECX,DWORD PTR DS:[0x2048C3D8] ; Core.?GNetworkLog@@3PAVFOutputDevice@@A
203D42B4 8B11 MOV EDX,DWORD PTR DS:[ECX]
203D42B6 68 B08F5120 PUSH Engine.20518FB0 ; UNICODE "(Send)UseItemPacket"
203D42BB 52 PUSH EDX
203D42BC 90 NOP
203D42BD E8 8E97C7F4 CALL Core.?Logf@FOutputDevice@@QAAXPB_WZZ
203D42C2 83C4 1C ADD ESP,0x1C
203D42C5 5F POP EDI
203D42C6 5E POP ESI
203D42C7 5D POP EBP
203D42C8 B8 01000000 MOV EAX,0x1
203D42CD 5B POP EBX
203D42CE C2 0400 RETN 0x4

Demion
03.12.2012, 12:46
Найдите в VMT адрес AddNetworkQueue. Адрес на SendPacket обычно находится на смещении (-0xA4). В большинстве хроник смещение сохраняется, хотя это не обязательно. В любом случае SendPacket можно найти по вызову ws2_32.send();

HMODULE hEngine = LoadLibraryA("engine.dll");

unsigned int VMT = (unsigned int) hEngine + 0x507B70;
unsigned int AddNetworkQueue = (unsigned int) GetProcAddress(hEngine, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPa cket@@@Z");

while (*(unsigned int*) VMT != AddNetworkQueue)
VMT++;

unsigned int SendPacket = *(unsigned int*) (VMT - 0xA4);

don.kein
03.12.2012, 13:00
И откуда значения взялось 0x507B70 ?

Хорошо, вот ставлю брекпоинт на

Names in WS2_32, item 97
Address=71A94C27
Section=.text
Type=Export (Known)
Name=send

при одевании оружия например, остановка идет на

00124C80 203D8C9C /CALL to send from Engine.203D8C97
00124C84 000007B8 |Socket = 0x7B8
00124C88 00124CA0 |Data = 00124CA0
00124C8C 0000000B |DataSize = B (11.)
00124C90 00000000 \Flags = 0

выглядит в общем окне это так

203D8C97 E8 8BBF6B51 CALL WS2_32.send

Куда дальше ?

Sherman
03.12.2012, 13:49
И откуда значения взялось 0x507B70 ?


Это указатель на Виртуальную Таблицу Методов, что это такое - отдельная тема разговора. В Engine.dll она в начале dll-ки располагается помоему, в этом примере по адресу 0x507B70.


203D42AC FFD0 CALL EAX вызов функции шифрации и отправки пакета. В EAX - адрес.

Если надо хукать вызов send, то трассишь до того места, где появится send и запоминаешь адрес. Если нужен хук всей функции в EAX кладешь адрес своей функции. В конце своей функции скорее всего прийдется аддами или сабами регистра ESP исправлять стек.

Если нужен именно неэкспортируемый метод SendPacket то пример Demion а показал как его найти.

don.kein
03.12.2012, 14:26
Если надо хукать вызов send, то трассишь до того места, где появится send и запоминаешь адрес.
т.е. до сюда 203D8C97 E8 8BBF6B51 CALL WS2_32.send ?

Sherman
03.12.2012, 14:40
т.е. до сюда 203D8C97 E8 8BBF6B51 CALL WS2_32.send ?

Да, адрес входа в функцию, в которой размещен этот вызов - есть адрес функции клиента SendPacket

don.kein
06.12.2012, 00:52
Спасибо Sherman'у, за то что помог разобраться во всей этой области, так же спасибо всем тем "добрым" людям кто прошел мимо :)

byldas
11.07.2013, 14:05
Ув.форумчане. Цель. найти смещение, понять хоть немного суть.
Все темы по данному вопросу на этом портале были перечитаны.

Подскажите, ставлю брекпоинт на WS2_32.send

При одевании оружия в игре кидает на

71A94C27 > 8BFF MOV EDI,EDI
модуля WS2_32,

нашел откуда вызывается Engine.203B0CD9

как мне добраться до адреса c
?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPa cket@@@Z