MasterGH Опубликовано 21 сентября, 2011 Поделиться Опубликовано 21 сентября, 2011 Эту тему я хотел написать во флудильне как простое задание для любителей и думал сам не решу до конца. На своё удивления следуя своей логики уже опытного программиста я расколол эту задачку как орех за 15 минут.Кто желает исследуем Dead Island.Цель:1) найти место в коде в котором идёт логическое условие -если пользователь (играет) и (может стрелять) и (нажал на левую кнопку мышки), то произвести выстрел.2) После нахождения этого условия найти функцию "Выстрела для некотрого героя"типа void Shot(pHero * objHero)3) Написать скрипт, который делает выстрел.--------------Решение того что успел.1) Ищу адрес потронов для дробовика2) Ставлю бряк на запись3) Прерываюсь на02E86D9C - 50 - push eax02E86D9D - FF D2 - call edx02E86D9F - FF 48 20 - dec [eax+20] <<02E86DA2 - 83 C0 20 - add eax,2002E86DA5 - E8 4666C7FF - call 02AFD3F0EAX=34289F70EBX=199CD788ECX=34F10F88EDX=02D389E0ESI=199CD788EDI=0000000CESP=0018F1C8EBP=0018F2B8EIP=02E86DA24) Иду по инструкции в дизассемблер Cheat Engine. И ставлю трейс на 10000 тыс инструкций. У меня он проходит меньше чем за 15 секунд.Получаю дерево прохождения кода некотром потоком процесса игры.5) На каждом участке вхождения в дереве сверху вглубь ставлю бряк в дизассемблере на выполнение (нажимаю F5). При это совершаю нажатие на правую, а не на левую кнопку мышки. Если бряк срабатывает, то эта инструкция не та, которая нужна. В итоге я наконец нашёл учаток:game_x86_rwdi.dll+4C5F38 - 8B C7 - mov eax,edigame_x86_rwdi.dll+4C5F3A - E8 A1520000 - call game_x86_rwdi.dll+4CB1E0game_x86_rwdi.dll+4C5F3F - 5D - pop ebp // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<game_x86_rwdi.dll+4C5F40 - 5E - pop esigame_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, 199CD788call game_x86_rwdi.dll+4CB1E0ret[DISABLE]dealloc(newmem)О, Боже я выстрел.. Черт, я даже не думал, что получится, т.к. пишу в режиме ран-тайм... Как же всё просто оказалось Участок кода, если кому надо:game_x86_rwdi.dll+4C5F2D - D8 5C 24 14 - fcomp dword ptr [esp+14]game_x86_rwdi.dll+4C5F31 - DFE0 - fnstsw axgame_x86_rwdi.dll+4C5F33 - F6 C4 44 - test ah,44game_x86_rwdi.dll+4C5F36 - 7A 0F - jp game_x86_rwdi.dll+4C5F47game_x86_rwdi.dll+4C5F38 - 8B C7 - mov eax,edigame_x86_rwdi.dll+4C5F3A - E8 A1520000 - call game_x86_rwdi.dll+4CB1E0game_x86_rwdi.dll+4C5F3F - 5D - pop ebpgame_x86_rwdi.dll+4C5F40 - 5E - pop esigame_x86_rwdi.dll+4C5F41 - 5F - pop edi Ссылка на комментарий Поделиться на другие сайты Поделиться
TheErel Опубликовано 3 декабря, 2018 Поделиться Опубликовано 3 декабря, 2018 6-ой пункт, как декомпилировать? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения