Перейти к содержанию

Dead Island (вызов функции выстрела)


Рекомендуемые сообщения

Эту тему я хотел написать во флудильне как простое задание для любителей и думал сам не решу до конца. На своё удивления следуя своей логики уже опытного программиста я расколол эту задачку как орех за 15 минут.

Кто желает исследуем Dead Island.

Цель:

1) найти место в коде в котором идёт логическое условие -

если пользователь (играет) и (может стрелять) и (нажал на левую кнопку мышки), то произвести выстрел.

2) После нахождения этого условия найти функцию "Выстрела для некотрого героя"

типа void Shot(pHero * objHero)

3) Написать скрипт, который делает выстрел.

--------------

Решение того что успел.

1) Ищу адрес потронов для дробовика

2) Ставлю бряк на запись

3) Прерываюсь на


02E86D9C - 50 - push eax
02E86D9D - FF D2 - call edx
02E86D9F - FF 48 20 - dec [eax+20] <<
02E86DA2 - 83 C0 20 - add eax,20
02E86DA5 - E8 4666C7FF - call 02AFD3F0

EAX=34289F70
EBX=199CD788
ECX=34F10F88
EDX=02D389E0
ESI=199CD788
EDI=0000000C
ESP=0018F1C8
EBP=0018F2B8
EIP=02E86DA2

4) Иду по инструкции в дизассемблер Cheat Engine. И ставлю трейс на 10000 тыс инструкций. У меня он проходит меньше чем за 15 секунд.

Получаю дерево прохождения кода некотром потоком процесса игры.

5) На каждом участке вхождения в дереве сверху вглубь ставлю бряк в дизассемблере на выполнение (нажимаю F5). При это совершаю нажатие на правую, а не на левую кнопку мышки. Если бряк срабатывает, то эта инструкция не та, которая нужна. В итоге я наконец нашёл учаток:


game_x86_rwdi.dll+4C5F38 - 8B C7 - mov eax,edi
game_x86_rwdi.dll+4C5F3A - E8 A1520000 - call game_x86_rwdi.dll+4CB1E0
game_x86_rwdi.dll+4C5F3F - 5D - pop ebp // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
game_x86_rwdi.dll+4C5F40 - 5E - pop esi
game_x86_rwdi.dll+4C5F41 - 5F - pop edi

Именно здесь происходит развилка между выстрелом по левой кнопке и другими действиями. Это именно то, что нужно.

6) Декомпилируем.

Оказались не в огромном switch-e, а сразу после него:



if ( a2 == sub_104CC9C0() && (!*(_BYTE *)(*(_DWORD *)(v4 + 40) + 4820) || sub_10435B80() != 2) )
{
if ( 1.0 == a3 )
sub_104CB1E0(v4); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< где-то внутри будет выстрел
}

v4 = 199CD788 - здесь указатель на что? Пока не понятно. Но он есть в регистрах (см. выше) где был бряк при выстреле.

А что если вызвать функцию sub_104CB1E0(v4) новым потоком и в eax передать 199CD788 ?

[ENABLE]

alloc(newmem,1024)
createthread(newmem)

newmem:
mov eax, 199CD788
call game_x86_rwdi.dll+4CB1E0
ret


[DISABLE]
dealloc(newmem)

О, Боже я выстрел.. Черт, я даже не думал, что получится, т.к. пишу в режиме ран-тайм... Как же всё просто оказалось smile.gif

Участок кода, если кому надо:

game_x86_rwdi.dll+4C5F2D - D8 5C 24 14  - fcomp dword ptr [esp+14]
game_x86_rwdi.dll+4C5F31 - DFE0 - fnstsw ax
game_x86_rwdi.dll+4C5F33 - F6 C4 44 - test ah,44
game_x86_rwdi.dll+4C5F36 - 7A 0F - jp game_x86_rwdi.dll+4C5F47
game_x86_rwdi.dll+4C5F38 - 8B C7 - mov eax,edi
game_x86_rwdi.dll+4C5F3A - E8 A1520000 - call game_x86_rwdi.dll+4CB1E0
game_x86_rwdi.dll+4C5F3F - 5D - pop ebp
game_x86_rwdi.dll+4C5F40 - 5E - pop esi
game_x86_rwdi.dll+4C5F41 - 5F - pop edi

Ссылка на комментарий
Поделиться на другие сайты

  • 7 лет спустя...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.