DarkPower2 Опубликовано 6 апреля, 2016 Поделиться Опубликовано 6 апреля, 2016 Игра: Command and Conquer 3. Указатель на координаты: найден. Там 3 адреса на 1 координату которые зависят друг от друга... В итоге я дошел до такой команды: movss [eax+0C],xmm1 В xmm1 и содержится координата. Полистав выше, в поисках кто и что пишет в xmm1, я нашел только: movss xmm1,[ebp-30] Регистр ebp вроде бы негде не менялся, я взял регистр ebp, отнял от него 30 по хексу и добавил его в СЕ. Получил в итоге статический адрес значение которого не совпадает с координатой (при попытки его заморозить игра вылетает, при просмотре что пишет туда игра зависает, так как много команд пишут туда...) Помогите найти инструкцию изменения координаты, вот листинг от movss [eax+0C],xmm1 и выше... Показать контент movss xmm1,[ebp-30] movss xmm0,[ebp-2C] cmp byte ptr [ebx+000001C2],00 lea eax,[ebx+38] movss xmm2,[eax+08] movss [ebp-28],xmm2 je cnc3game.Debug::PostStaticInit+2302BB lea eax,[ebx+000001B4] movss xmm3,[eax] movss [ebp-20],xmm3 movss xmm3,[eax+04] movss [ebp-1C],xmm3 movss [ebp-18],xmm2 lea edi,[ebx+000001B4] lea esi,[ebp-20] movsd movsd movsd mov esi,[ebp-08] mov byte ptr [ebx+000001C2],01 lea eax,[esi+78] movss [eax+1C],xmm0 movss [eax+0C],xmm1 movss [eax+2C],xmm2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 6 апреля, 2016 Поделиться Опубликовано 6 апреля, 2016 В 06.04.2016 в 20:23, DarkPower2 сказал: Помогите найти инструкцию изменения координаты Показать Скорее всего вот они все три координаты: movss [eax+1C],xmm0 movss [eax+0C],xmm1 movss [eax+2C],xmm2 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
DarkPower2 Опубликовано 6 апреля, 2016 Автор Поделиться Опубликовано 6 апреля, 2016 (изменено) В 06.04.2016 в 21:10, Garik66 сказал: Скорее всего вот они все три координаты: movss [eax+1C],xmm0 movss [eax+0C],xmm1 movss [eax+2C],xmm2 Показать Да, это они, но где они изменяются, это меня интересует. То есть где меняется xmm1 к примеру. Изменено 6 апреля, 2016 пользователем DarkPower2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 6 апреля, 2016 Поделиться Опубликовано 6 апреля, 2016 В 06.04.2016 в 21:11, DarkPower2 сказал: Да, это они, но где они изменяются, это меня интересует. Показать Именно этими инструкциями и меняются координаты, которые находятся в [eax+1C], [eax+0C] и [eax+2C]. А в xmm0 (и соответственно в других) лежит новое значение координат. А что ты пишешь? Для чего искал координаты? Телепорт? 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
DarkPower2 Опубликовано 6 апреля, 2016 Автор Поделиться Опубликовано 6 апреля, 2016 В 06.04.2016 в 21:15, Garik66 сказал: Именно этими инструкциями и меняются координаты, которые находятся в [eax+1C], [eax+0C] и [eax+2C]. А в xmm0 (и соответственно в других) лежит новое значение координат. А что ты пишешь? Для чего искал координаты? Телепорт? Показать Да я понимаю... Вот я и хочу как раз узнать где меняются новые координаты... Хочу ускорить моего персонажа. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 6 апреля, 2016 Поделиться Опубликовано 6 апреля, 2016 В 06.04.2016 в 21:16, DarkPower2 сказал: Хочу ускорить моего персонажа. Показать Если в игре, есть замедители (например в воде ГГ идёт медленнее) или ускорители, которые ускоряют скорость, то можно поискать коэффициент. А так, если копать реверсингом, т.е. выходить через инструкции, то тебе судя по выложенному тобой листингу, нужно копать ещё дальше, чем: movss xmm1,[ebp-30] movss xmm0,[ebp-2C] Потому что здесь идёт просто пересылка координат, но не их расчёт. Т.е. тебе нужно искать инструкция откуда в [ebp-30] и т.д. попадают значения, причём не по еbp, а по конкретному адресу, так как регистр может и поменяться. Короче попробуй сделать "Анализ структуры" например из этой инструкции: movss xmm0,[ebp-2C] Скорее всего в ней и будет лежать коэффициент ускорения. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
DarkPower2 Опубликовано 6 апреля, 2016 Автор Поделиться Опубликовано 6 апреля, 2016 (изменено) В 06.04.2016 в 21:28, Garik66 сказал: Короче попробуй сделать "Анализ структуры" например из этой инструкции: movss xmm0,[ebp-2C] Скорее всего в ней и будет лежать коэффициент ускорения. Показать Спасибо, попробую. Я обновил пост из другой темы (про чтение из несуществующего адреса). Изменено 6 апреля, 2016 пользователем DarkPower2 Ссылка на комментарий Поделиться на другие сайты Поделиться
DarkPower2 Опубликовано 6 апреля, 2016 Автор Поделиться Опубликовано 6 апреля, 2016 В 06.04.2016 в 21:28, Garik66 сказал: отому что здесь идёт просто пересылка координат, но не их расчёт. Т.е. тебе нужно искать инструкция откуда в [ebp-30] и т.д. попадают значения, причём не по еbp, а по конкретному адресу, так как регистр может и поменяться. Показать Вот только, почему в xmm1 (то что сверху) не совпадают координатами xmm1 (то что снизу)? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 6 апреля, 2016 Поделиться Опубликовано 6 апреля, 2016 (изменено) В 06.04.2016 в 21:39, DarkPower2 сказал: Вот только, почему в xmm1 (то что сверху) не совпадают координатами xmm1 (то что снизу)? Показать По выложенному тобой участку кода, это не понятно. ЗЫ: Хотя может здесь происходит какое-то изменение: lea edi,[ebx+000001B4] lea esi,[ebp-20] movsd movsd movsd Что такое - 386+ MOVSD Пересылка двойного слова из строки в строку Команда аналогична командам МП 86 movsb и movsw, но позволяет скопировать двойное слово из строки, адресуемой через регистры DS:ESI, в строку, адресуемую через регистры ES:EDI. 3 MOVSD = 3 координаты. Наверное здесь. Изменено 6 апреля, 2016 пользователем Garik66 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
DarkPower2 Опубликовано 6 апреля, 2016 Автор Поделиться Опубликовано 6 апреля, 2016 (изменено) В 06.04.2016 в 21:44, Garik66 сказал: По выложенному тобой участку кода, это не понятно. Показать Ну вот побольше сделал. Показать контент test eax,eax mov [ebp+0C],eax fild dword ptr [ebp+0C] jnl cnc3game.Debug::PostStaticInit+23017D fadd dword ptr [cnc3game.dat+62AE40] fdivr dword ptr [cnc3game.dat+634448] movss xmm1,[ebp+08] comiss xmm1,[edi+40] fstp dword ptr [ebp+0C] jna cnc3game.Debug::PostStaticInit+2301AA test byte ptr [edi+54],01 jne cnc3game.Debug::PostStaticInit+2301AA push ebx mov ecx,edi call cnc3game.Debug::PostStaticInit+22F82A fadd dword ptr [edi+40] movss xmm1,[ebp+08] fstp dword ptr [edi+40] movss xmm0,[edi+40] comiss xmm0,xmm1 jna cnc3game.Debug::PostStaticInit+2301C8 subss xmm0,[ebp-04] comiss xmm1,xmm0 movss [edi+40],xmm0 jna cnc3game.Debug::PostStaticInit+2301C8 movss [edi+40],xmm1 movss xmm0,[esi] mov ecx,[ebp+14] test ecx,ecx movss [ebp-30],xmm0 movss xmm0,[esi+04] movss [ebp-2C],xmm0 movss xmm0,[esi+08] movss [ebp-28],xmm0 movss xmm0,[edi+40] movss [ebp+08],xmm0 je cnc3game.Debug::PostStaticInit+230380 cmp byte ptr [ecx+0E],00 je cnc3game.Debug::PostStaticInit+23020C xorps xmm0,xmm0 movss [edi+40],xmm0 mov byte ptr [ecx+0E],00 inc [ecx] push edi lea eax,[ebp-24] push eax call cnc3game.Debug::PostStaticInit+2F38F6 mov esi,eax lea edi,[ebp-4C] movsd movsd movsd movsd lea esi,[ebp-48] lea edi,[ebp-30] movsd movsd movsd mov esi,[ebp-08] push 01 push ecx fld dword ptr [esi+40] mov ecx,[ebp+14] lea eax,[ebp-30] fstp dword ptr [esp] push eax call cnc3game.Debug::PostStaticInit+30E788 mov ecx,[ebp+14] push esi lea eax,[ebp-24] push eax call cnc3game.Debug::PostStaticInit+2F38F6 mov ecx,[ebp+14] mov esi,eax mov eax,[ecx] test eax,eax lea edi,[ebp-4C] movsd movsd movsd movsd je cnc3game.Debug::PostStaticInit+230264 dec eax mov [ecx],eax movss xmm0,[ebp-48] movss [ebp-20],xmm0 movss xmm0,[ebp-44] movss [ebp-1C],xmm0 movss xmm0,[ebp-40] movss [ebp-18],xmm0 lea edi,[ebx+000001B4] lea esi,[ebp-20] movsd movsd mov byte ptr [ebx+000001C2],01 movsd movss xmm1,[ebp-30] //этот xmm1 не совпадает movss xmm0,[ebp-2C] cmp byte ptr [ebx+000001C2],00 lea eax,[ebx+38] movss xmm2,[eax+08] movss [ebp-28],xmm2 je cnc3game.Debug::PostStaticInit+2302BB lea eax,[ebx+000001B4] movss xmm3,[eax] movss [ebp-20],xmm3 movss xmm3,[eax+04] movss [ebp-1C],xmm3 movss [ebp-18],xmm2 lea edi,[ebx+000001B4] lea esi,[ebp-20] movsd movsd movsd mov esi,[ebp-08] mov byte ptr [ebx+000001C2],01 lea eax,[esi+78] movss [eax+1C],xmm0 movss [eax+0C],xmm1 //xmm1 не совпадает с вот этим movss [eax+2C],xmm2 Изменено 6 апреля, 2016 пользователем DarkPower2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 6 апреля, 2016 Поделиться Опубликовано 6 апреля, 2016 В 06.04.2016 в 21:59, DarkPower2 сказал: Ну вот побольше сделал. Показать Прячь в спойлер, слишком большой код. На сегодня попрощаюсь - у меня уже 1.03 ночи. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
DarkPower2 Опубликовано 7 апреля, 2016 Автор Поделиться Опубликовано 7 апреля, 2016 В 06.04.2016 в 21:44, Garik66 сказал: lea edi,[ebx+000001B4] lea esi,[ebp-20] movsd movsd movsd позволяет скопировать двойное слово из строки, адресуемой через регистры DS:ESI, в строку, адресуемую через регистры ES:EDI. 3 MOVSD = 3 координаты. Наверное здесь. Показать Как то странно, 3 раза копирует одно и тоже в edi. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 7 апреля, 2016 Поделиться Опубликовано 7 апреля, 2016 В 07.04.2016 в 07:30, DarkPower2 сказал: Как то странно, 3 раза копирует одно и тоже в edi. Показать Не одно и тоже и не в одно и тоже место, а в edi и esi лежат указатели и запись происходит так: lea edi,[ebx+000001B4] lea esi,[ebp-20] movsd // значение из [esi] переписывается в [edi] movsd // значение из [esi+04] переписывается в [edi+04] movsd // значение из [esi+08] переписывается в [edi+08] Соответственно тебе скорее всего нужно копать по адресу esi, потому что там лежит новое значение координат, а перед этим оно как то рассчитывается. Ссылка на комментарий Поделиться на другие сайты Поделиться
DarkPower2 Опубликовано 7 апреля, 2016 Автор Поделиться Опубликовано 7 апреля, 2016 Вот оно как, не понятное описанее было. Спасибо, попробую покапать. Вот только они же не влияют на xmm1, или же я ошибкюсь? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 7 апреля, 2016 Поделиться Опубликовано 7 апреля, 2016 В 07.04.2016 в 08:04, DarkPower2 сказал: Вот оно как, не понятное описанее было. Показать Я только предполагаю что movsd работает именно так. Для того, чтобы убедиться в этом, нужно написать скрипт и проверить работу этого опкода. (Могу написать, представляю как это сделать, но времени нет). В 07.04.2016 в 08:04, DarkPower2 сказал: Вот только они же не влияют на xmm1, или же я ошибкюсь? Показать Я тоже этого не знаю, но предполагаю, что влияет, это тоже нужно исследовать, посмотреть, что произойдёт с регистрами FPU при выполнении опкода movsd Как отслеживать регистры FPU немного есть на видео в этом сообщении Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 7 апреля, 2016 Поделиться Опубликовано 7 апреля, 2016 В 07.04.2016 в 08:30, Garik66 сказал: Я только предполагаю что Показать так и есть В 07.04.2016 в 08:30, Garik66 сказал: Я тоже этого не знаю, но предполагаю, что влияет, это тоже нужно исследовать, посмотреть, что произойдёт с регистрами FPU при выполнении опкода Показать xmm это sse, не влияет Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 7 апреля, 2016 Поделиться Опубликовано 7 апреля, 2016 В 07.04.2016 в 09:19, gmz сказал: xmm это sse, не влияет Показать Точно - перепутал регистры, но их также можно отследить. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 7 апреля, 2016 Поделиться Опубликовано 7 апреля, 2016 В 07.04.2016 в 09:19, gmz сказал: так и есть Показать Да уже убедился - написал скрипт, проверил, что это так и записал видео. Скрипт: Показать контент { Game : Tutorial-i386.exe Version: Date : 2016-04-07 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(Primer,Tutorial-i386.exe,89 83 80 04 00 00 8D 55 D4 E8 52) // should be unique alloc(newmem,$1000) label(code) label(return) label(RegistrESI) label(RegistrEDI) registersymbol(RegistrESI) registersymbol(RegistrEDI) registersymbol(Primer) newmem: push esi push edi lea edi,[RegistrEDI] lea esi,[RegistrESI] movsd movsd movsd code: pop edi pop esi mov [ebx+00000480],eax jmp return RegistrESI: db 11 11 11 11 22 22 22 22 33 33 33 33 RegistrEDI: db 0 Primer: jmp newmem nop return: [DISABLE] Primer: db 89 83 80 04 00 00 unregistersymbol(RegistrESI) unregistersymbol(RegistrEDI) unregistersymbol(Primer) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+23920 "Tutorial-i386.exe"+238FC: E8 0F 9B FE FF - call Tutorial-i386.exe+D410 "Tutorial-i386.exe"+23901: E8 1A B6 FE FF - call Tutorial-i386.exe+EF20 "Tutorial-i386.exe"+23906: 50 - push eax "Tutorial-i386.exe"+23907: 85 C0 - test eax,eax "Tutorial-i386.exe"+23909: 75 65 - jne Tutorial-i386.exe+23970 "Tutorial-i386.exe"+2390B: B8 05 00 00 00 - mov eax,00000005 "Tutorial-i386.exe"+23910: E8 5B AD FE FF - call Tutorial-i386.exe+E670 "Tutorial-i386.exe"+23915: 8D 50 01 - lea edx,[eax+01] "Tutorial-i386.exe"+23918: 8B 83 80 04 00 00 - mov eax,[ebx+00000480] "Tutorial-i386.exe"+2391E: 29 D0 - sub eax,edx // ---------- INJECTING HERE ---------- "Tutorial-i386.exe"+23920: 89 83 80 04 00 00 - mov [ebx+00000480],eax // ---------- DONE INJECTING ---------- "Tutorial-i386.exe"+23926: 8D 55 D4 - lea edx,[ebp-2C] "Tutorial-i386.exe"+23929: E8 52 68 01 00 - call Tutorial-i386.exe+3A180 "Tutorial-i386.exe"+2392E: 8B 55 D4 - mov edx,[ebp-2C] "Tutorial-i386.exe"+23931: 8B 83 6C 04 00 00 - mov eax,[ebx+0000046C] "Tutorial-i386.exe"+23937: E8 D4 DA 06 00 - call Tutorial-i386.exe+91410 "Tutorial-i386.exe"+2393C: 83 BB 80 04 00 00 00 - cmp dword ptr [ebx+00000480],00 "Tutorial-i386.exe"+23943: 7D 2B - jnl Tutorial-i386.exe+23970 "Tutorial-i386.exe"+23945: A1 C4 F1 54 00 - mov eax,[Tutorial-i386.exe+14F1C4] "Tutorial-i386.exe"+2394A: E8 A1 29 0F 00 - call Tutorial-i386.exe+1162F0 "Tutorial-i386.exe"+2394F: B8 64 00 00 00 - mov eax,00000064 } Видео (странно вроде уже обработано, наверное идёт какая-нибудь промодерация): 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения