ACCES VIOLOTATION по адресу 008E47C2, находим его, ищем начало и конец функции
PHP код:
008E47A0
008E47A0
008E47A0
008E47A0
008E47A0
008E47A0 sub_8E47A0 proc near
008E47A0
008E47A0
008E47A0 arg_0 = dword ptr 8
008E47A0
008E47A0 55 push ebp
008E47A1 8B EC mov ebp, esp
008E47A3 8B 55 08 mov edx, [ebp+arg_0]
008E47A6 85 D2 test edx, edx
008E47A8 75 07 jnz short loc_8E47B1
008E47AA 8D 42 25 lea eax, [edx+25h]
008E47AD 5D pop ebp
008E47AE C2 04 00 retn 4
008E47B1
008E47B1
008E47B1 loc_8E47B1:
008E47B1 8B 41 14 mov eax, [ecx+14h]
008E47B4 83 C1 14 add ecx, 14h
008E47B7 3B C1 cmp eax, ecx
008E47B9 C7 02 00 00 00 00 mov dword ptr [edx], 0
008E47BF 74 13 jz short loc_8E47D4
008E47C1 56 push esi
## вот и виновник торждества
##008E47C2
##008E47C2 loc_8E47C2:
##008E47C2 8B 70 08 mov esi, [eax+8]
008E47C5 8B B6 D4 00 00 00 mov esi, [esi+0D4h]
008E47CB 01 32 add [edx], esi
008E47CD 8B 00 mov eax, [eax]
008E47CF 3B C1 cmp eax, ecx
008E47D1 75 EF jnz short loc_8E47C2
008E47D3 5E pop esi
008E47D4
008E47D4 loc_8E47D4:
008E47D4 33 C0 xor eax, eax
008E47D6 5D pop ebp
008E47D7 C2 04 00 retn 4
008E47D7 sub_8E47A0 endp
008E47D7
008E47D7
008E47DA CC CC CC CC CC CC
Потом в это дело преобразуем в более читабельный вид:
PHP код:
INT32 __thiscall unk_8E47A0(INT obj_ptr, DWORD *unk_arg)
{
INT eax@3, ecx@3;
if (unk_arg)
{
eax@3 = *(DWORD *)(obj_ptr + 0x14); // вероятнее всего указатель на обьект (юнита)
ecx@3 = obj_ptr + 0x14;
for (*unk_arg = 0; eax@3 != ecx@3; eax@3 = *(DWORD*)eax@3)
// в этом месте ловим ACCES VIOLOTATION
*unk_arg += *(DWORD *)(*(DWORD*)(eax@3 + 0x8 /* предпологаю, что это GUIDLOW */) + 0xD4); // скорее всего GUIDLOW + offset = GUIDHEIGHT
return 0x00;
}
else
return 0x25;
}
Далее ищем откуда вызывается ... предположительно до момента отправки\получения пакетов от клиент\сервер
Первая "цепочка" меня привела к отправке серверу CMSG_NEXT_CINEMATIC_CAMERA...
Можно сделать детур с такими условиями:
PHP код:
INT32 __thiscall unk_8E47A0(INT obj_ptr, DWORD *unk_arg)
{
INT eax@3, ecx@3;
if (unk_arg)
{
eax@3 = *(DWORD *)(obj_ptr + 0x14);
ecx@3 = obj_ptr + 0x14;
for (*unk_arg = 0; eax@3 != ecx@3; eax@3 = *(DWORD*)eax@3)
if((eax@3 + 0x8)!=nullptr)
*unk_arg += *(DWORD *)(*(DWORD*)(eax@3 + 0x8) + 0xD4);
return 0x00;
}
return 0x25;
}
И краш не должен повторяться, но это костыль в клиенте ... разве что на крайний случай.