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

Grand Theft Auto San Andreas, расструктуризация


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

image002df.jpg

post-3-0-46008900-1424505051_thumb.jpg

 

Спрос на трейнер: не актульно

Дата выхода: 7 июня 2005

Минимальные требования: CPU 1 GHz, 256 Mb, 64 Mb Video

Рекомендуемые требования: CPU 1,5 GHz, 512 Mb, 128 Mb Video

На данный момент по игре рассмотрены:

1. Расструктуризация оружия (автор MasterGH)]

Введение

В статье рассматривается механизм обращения к слотам оружия. Зная этот механизм, вы можете проводить собственные аналогии по другим играм уже придерживаясь своих целей.

Я не ставил цель рассмотрение бесконечного оружия для Карла по той простой причине, что это не сложно, но всё-таки напишу немного об этом в конце статьи.

Обзор

В GTASA есть два типа отображения снаряжения у главного героя Карла: оружие с обоймой и без обоймы.

Я решил разбирать первый тип оружия, зная, что он как-то пересечётся со вторым.

Беру к примеру автомат

post-3-0-66835500-1424505055.jpg

Его значение патронов «4905-30» (первое число - патроны, второе - патроны в обойме)

На картинке общее количество патронов и количество патронов в обойме это две взаимосвязанные величины. Перезарядка произойдёт, если в обойме будет 0 патронов. Для начала отсеиваю адрес со значением 30. Какой нашёлся адрес неважно, он не зелёного цвета, а значит динамический и у вас будет отличаться. Ставлю на него бряк на доступ.Вошёл в игру. Прострелял все 30 патронов. Перезарядил. Поменял оружие на другое. Появились инструкции.

image004oup.jpg

post-3-0-57306900-1424505059_thumb.jpg

 

Обзор инструкций таков.

При входе в игру из меню при уже выбранном автомате.

00589461 - 8b 88 a8 05 00 00 - mov ecx,[eax+000005a8]

0058953b - 2b b4 17 a8 05 00 00 - sub esi,[edi+edx+000005a8]

При выборе автомата вместо другого оружия.

00589461 - 8b 88 a8 05 00 00 - mov ecx,[eax+000005a8]

0060b4fa - 89 88 a8 05 00 00 - mov [eax+000005a8],ecx

0058953b - 2b b4 17 a8 05 00 00 - sub esi,[edi+edx+000005a8]

При выстреле

00742429 - 8b 4e 08 - mov ecx,[esi+08]

007428a8 - 8b 46 08 - mov eax,[esi+08]

007428b0 - 89 46 08 - mov [esi+08],eax

007428e9 - 8b 46 08 - mov eax,[esi+08]

При перезарядке

0073aeef - 89 46 08 - mov [esi+08],eax

Сразу внимание привлекает sub esi,[edi+edx+000005a8] поскольку это самая расширенная инструкция.

image005oq.jpg

post-3-0-70550700-1424505063_thumb.jpg

На этом этапе следует представить структуру и соотнести это представление с тремя значениями

edi=048A9180, edx,=70h и 5a8.

Я сформировал её интуитивно: от большего смещения к меньшему.

edi – структура Карла

|_5a8 – структура оружия

|_edx – 1 слот

|_edx – 2 слот

|_edx – 3 слот

|_edx – 4 слот

|_edx – 5 слот

|_edx – 6 слот

|_edx – 7 слот

|_edx – 8 слот

|_edx – 9 слот

|_edx – 10 слот

|_edx – 11 слот

|_edx – 12 слот

Примечание.

Слотов у Карла всего 12. Я просто уже это заранее знаю.

На этом этапе сначала нужно индетифицировать Карла. Для этого поиском адреса edi=048A9180 мной был отсеян указатель. Возьму указатель 00B6F3B8. Зелёные адреса теоритически никогда не поменяют своего местоположения (пример изображен на рисунке)

image006jg.jpg

post-3-0-09771600-1424505068_thumb.jpg

Обратите внимание, что рисунок я привел в качестве примера. Вместо 059669D8 у меня было 048A9180 (! это связано с тем, что мне пришлось перезапустить игру) Т.е. [00B6F3B8]=048A9180

Теперь структура имеет статическое начало [[00B6F3B8]+5a8+edx]

[b6F3B8] – структура Карла

|_+5a8 – структура оружия

|_edx – 1 слот

|_edx – 2 слот

|_edx – 3 слот

|_edx – 4 слот

|_edx – 5 слот

|_edx – 6 слот

|_edx – 7 слот

|_edx – 8 слот

|_edx – 9 слот

|_edx – 10 слот

|_edx – 11 слот

|_edx – 12 слот

Запомните [[00B6F3B8]+5a8+edx]. Это начальный путь, чтобы узнать какими должен быть регистр edx. В нашем случае напомню он равен 70h, а какой это слот не понятно. Также не забывайте, что в эту структуру должны ещё входить патроны общее для данного оружия, а не только для обоймы. Вот общими патронными мы и займемся в OllyDbg.

Давайте-ка я вам напомню.

post-3-0-59940400-1424505072.jpg

У нас две ячейки памяти

1 – «30», мы ставили бряк на это изменение этого значение

2 – «4905+30=4935», мы не искали этот адрес в надежде на то, что мы его и так узнаем..

Теперь логически подумаем. После выстрела должно происходить два раза вычитание.

Бряки при выстреле

00742429 - 8b 4e 08 - mov ecx,[esi+08] // здесь ничего интересного

007428a8 - 8b 46 08 - mov eax,[esi+08] // а здесь я сделал скриншот (ниже)

007428b0 - 89 46 08 - mov [esi+08],eax

007428e9 - 8b 46 08 - mov eax,[esi+08]

Вот что бросается в глаза – как раз два вычитания.

image007eg.jpg

post-3-0-46139900-1424505077_thumb.jpg

Поскольку инструкции сработали от одного бряка давайте сразу предположим что:

[esi+8], тоже самое, что [[00B6F3B8]+5a8+edx]

[esi+С] тоже самое, что [[00B6F3B8]+5a8+edx+4].

[esi+8] и [esi+С] заметно фигурируют на скриншоте. Уже можно догадаться что [esi+8] это обойма, а [esi+С] это общее патроны. Если вы ещё не догадались посмотрите внимательнее. А если опять не понятно откройте справочник по инструкциям чтобы иметь представление о каждой инструкции на этом скриншоте.

Значит, вывод такой общие патроны лежат на 4 байта ниже относительно обоймы.

[b6F3B8] – структура Карла

|

|_+5a8 – структура оружия

|

|_edx – 1 номер обоймы

| |_+4 общее патроны

|_edx – 2 номер обоймы

| |_+4 общее патроны

|_edx – 3 номер обоймы

| |_+4 общее патроны

|_edx – 4 номер обоймы

| |_+4 общее патроны

|_edx – 5 номер обоймы

| |_+4 общее патроны

|_edx – 6 номер обоймы

| |_+4 общее патроны

|_edx – 7 номер обоймы

| |_+4 общее патроны

|_edx – 8 номер обоймы

| |_+4 общее патроны

|_edx – 9 номер обоймы

| |_+4 общее патроны

|_edx – 10 номер обоймы

| |_+4 общее патроны

|_edx – 11 номер обоймы

| |_+4 общее патроны

|_edx – 12 номер обоймы

|_+4 общее патроны

Зная edx, я узнаю как записать патроны (или прочитать).

Например, записать всем патронам по единице

mov byte ptr [[edi]+edx+5a8],1

mov byte ptr [[edi]+edx+5aс],1

Где edi=00B6F3B8, edx - данный вид оружия в данный момент

Проблема состоит в этом - edx. Как его рассчитать??

Это самый первый бряк окно которого вы увидели. Слава Богу что этого куска кода достаточно. Попадаются игры где этого далеко не достаточно.

image005oq.jpg

post-3-0-97063900-1424505081_thumb.jpg

Проревисим в уме и развернём инструкцию бряка.

[edi+edx+5a8]=[[00B6F3B8]+edx+5a8]=[[00B6F3B8]+b[[00B6F3B8]+718h]*1c +5a8]

[[00B6F3B8]+5a8+edx]=[[00B6F3B8]+ b[[00B6F3B8]+718h]*1c +5a8]

[[00B6F3B8]+5aс+edx]= [[00B6F3B8]+b[[00B6F3B8]+718h]*1c +5aс]

И в MHS проверим.

post-3-0-43587700-1424505086.jpg

 

4905+30=4935

image009ao.jpg

post-3-0-06046500-1424505091_thumb.jpg

Тогда правильным будет предположение, что edx= b[[00B6F3B8]+718h]*1c

Также будет правильно (надеюсь уже вы догадались) что выражение b[[00B6F3B8]+718h] будет целым числом от 0 до 12.

image010jn.jpg

post-3-0-77649800-1424505095_thumb.jpg

 

На скриншоте видно, что выбрана 4 «обойма»

Итак, полная структура

[b6F3B8] :Игрок Карл

|_Оружие +5a8

|_1 слот - в обойме (+1*1с)

|_патроны (+4)

|_2 слот - в обойме (+2*1с)

|_патроны (+4)

|_3 слот - в обойме ( +3*1с)

|_патроны (+4)

|_4 слот - в обойме ( +4*1с)

|_патроны (+4)

|_5 слот - в обойме (+5*1с)

|_патроны (+4)

|_6 слот - в обойме (+ 6*1с)

|_патроны (+4)

|_7 слот - в обойме (+7*1с)

|_патроны (+4)

|_8 слот - в обойме (+ 8*1с)

|_патроны (+4)

|_9 слот - в обойме (+9*1с)

|_патроны (+4)

|_10 слот - в обойме (+10*1с)

|_патроны (+4)

|_11 слот - в обойме (+11*1с)

|_патроны (+4)

|_12 слот - в обойме (+ 12*1с)

|_патроны (+4)

Внизу я написал скрипт как пример записи во всю структуру.

Если обоймы нет, то в адресе обоймы будет всёравно еденица (об этом должен был раньше сказать)

 

Получилось. Во все слоты вписывается значения единиц.

post-3-0-10519200-1424505100.jpgpost-3-0-79498100-1424505104.jpg

 

На этом расструктуризация закончена.

Как сделать бесконечное оружие?

Смотрим в отладчике близлежащие инструкции.

image013lx.jpg

post-3-0-60913000-1424505109_thumb.jpg

 

Простой способ

Самый короткий способ сделать бесконечное оружие так это вписать в показанный адрес единицу. Есть недостаток – бесконечное оружие будет у всех.

Сложный способ

Поставить фильтр на Карла. Если стреляет Карл, то «перепрыгивать» оба «dec»-а. Фильтр надо ставить ещё в другом месте чтения данного адреса (иначе патроны будут уменьшаться при стрельбе с мотоцикла, из машины, велосипеда…)

Читы такие как бесконечное оружие и отсутствие оружия у врагов Карла я оставлю вам на самостоятельное решение.

//mov [[00B6F3B8]+n*1c+5a8]],1//mov [[00B6F3B8]+n*1c+5ac]],1//где n =[1..12][ENABLE]alloc(thread,200)registersymbol(tred)label(x1)thread:push eaxpush ecxpush ebxxor ecx,ecxmov eax,[00B6F3B8]add eax,5a8x1:inc ecximul ebx,ecx,1cmov [eax+ebx],1// mov [[00B6F3B8]+n*1c+5a8]],1 - в обоймеmov [eax+ebx+4],1// mov [[00B6F3B8]+n*1c+5ac]],1 - общие патроныcmp ecx,cjne x1pop ebxpop ecxpop eaxcall GetCurrentThreadretcreatethread(thread)[DISABLE]dealloc(thread)
Ссылка на комментарий
Поделиться на другие сайты

  • 2 года спустя...

обьясните пожалуйста,у меня не получается найти адрес таймера в миссиях.в 4байта я нашел 1значение статическое но оно экранное.а в других типах не ишет

Если в игре таймер показывает например 10с. не значит, что нужно искать 4 байт или all bytes 10. Ищи неизвестное значение.

//Uchiha Sasuke а если попробовать неизвестное значение с отсеиваниями на интервал (was decreased by/was increased by?

Тоже можно, но откуда знать, что значение уменьшается точно на 1 как секунды таймера (10..9..).

Таймеры лучше всегда искать через неизвестное 4 байта \ с точкой и затем уменьшилось-уменьшилось (а бывает, что и наоборот - увеличилось). Редко попадаются игры, где 10 секунд - это (DWORD) 10.

я так и делал неизвестное значение уменьшилось на... таким образом я только нашел экранное статическое значение

я так и делал неизвестное значение уменьшилось на... таким образом я только нашел экранное статическое значение

Попробуй поставь на него брейкпоинт на чтение и глянь, что за код с ним работает. Сначала обычно обновляется внутриигровое значение, а затем - экранное, так что код будет повыше. Ну или ищи "неизвестное" - "изменилось - изменилось - изменилось".

спасибо всем метод изменилось изменилось изменилось ооочень помогло=))

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

Я спецально сделал трейнер для версии от 1C http://forum.gamehac...ta-san-andreas/ ... пользуйся не трать силы на поиски ..... ну если хочешь сам найти адрес таймера то садись в коповскую тачку, запускай CE, поиск неизвестного значение, и когда время будет уменьшаться в CE, decreased value, убиваешь приступника, время прибавляется в CE, Increased value и так далее.... сделаешь скрипт, и он будет работать в миссиях и доп миссиях. т.е бесконечное время будет везде где есть задания на время .... таймер 4 байта..

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

>таймер 4 байта

4 байта целое или float?

Таймер 4 байта, не float, адрес времени не изменяется но скрипт написать требуется для того чтобы время было бесконечное везде в миссиях, подмиссиях и дополнительных заданиях

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

если сделать вот так,то игра вылетит

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048) //2kb should be enough
label(returnhere)
label(originalcode)
label(exit)

007B1020:
jmp newmem
nop
returnhere:

newmem: //this is allocated memory, you have read,write,execute access
//place your code here
mov [eax+000000b4],(float)1

originalcode:
mov ecx,[eax+000000b4] <----- инструкция денег

exit:
jmp returnhere



[DISABLE]
//code from here till the end of the code will be used to disable the cheat
007B1020:
mov ecx,[eax+000000b4]
//Alt: db 8B 88 B4 00 00 00
dealloc(newmem)

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

×
×
  • Создать...

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

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