MasterGH Опубликовано 23 декабря, 2009 Поделиться Опубликовано 23 декабря, 2009 Спрос на трейнер: не актульноДата выхода: 7 июня 2005Минимальные требования: CPU 1 GHz, 256 Mb, 64 Mb VideoРекомендуемые требования: CPU 1,5 GHz, 512 Mb, 128 Mb VideoНа данный момент по игре рассмотрены:1. Расструктуризация оружия (автор MasterGH)]ВведениеВ статье рассматривается механизм обращения к слотам оружия. Зная этот механизм, вы можете проводить собственные аналогии по другим играм уже придерживаясь своих целей.Я не ставил цель рассмотрение бесконечного оружия для Карла по той простой причине, что это не сложно, но всё-таки напишу немного об этом в конце статьи.ОбзорВ GTASA есть два типа отображения снаряжения у главного героя Карла: оружие с обоймой и без обоймы.Я решил разбирать первый тип оружия, зная, что он как-то пересечётся со вторым.Беру к примеру автоматЕго значение патронов «4905-30» (первое число - патроны, второе - патроны в обойме)На картинке общее количество патронов и количество патронов в обойме это две взаимосвязанные величины. Перезарядка произойдёт, если в обойме будет 0 патронов. Для начала отсеиваю адрес со значением 30. Какой нашёлся адрес неважно, он не зелёного цвета, а значит динамический и у вас будет отличаться. Ставлю на него бряк на доступ.Вошёл в игру. Прострелял все 30 патронов. Перезарядил. Поменял оружие на другое. Появились инструкции. Обзор инструкций таков.При входе в игру из меню при уже выбранном автомате.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],ecx0058953b - 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],eax007428e9 - 8b 46 08 - mov eax,[esi+08]При перезарядке0073aeef - 89 46 08 - mov [esi+08],eaxСразу внимание привлекает sub esi,[edi+edx+000005a8] поскольку это самая расширенная инструкция.На этом этапе следует представить структуру и соотнести это представление с тремя значениями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. Зелёные адреса теоритически никогда не поменяют своего местоположения (пример изображен на рисунке)Обратите внимание, что рисунок я привел в качестве примера. Вместо 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.Давайте-ка я вам напомню.У нас две ячейки памяти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],eax007428e9 - 8b 46 08 - mov eax,[esi+08]Вот что бросается в глаза – как раз два вычитания.Поскольку инструкции сработали от одного бряка давайте сразу предположим что:[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],1mov byte ptr [[edi]+edx+5aс],1Где edi=00B6F3B8, edx - данный вид оружия в данный моментПроблема состоит в этом - edx. Как его рассчитать??Это самый первый бряк окно которого вы увидели. Слава Богу что этого куска кода достаточно. Попадаются игры где этого далеко не достаточно.Проревисим в уме и развернём инструкцию бряка.[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 проверим. 4905+30=4935Тогда правильным будет предположение, что edx= b[[00B6F3B8]+718h]*1cТакже будет правильно (надеюсь уже вы догадались) что выражение b[[00B6F3B8]+718h] будет целым числом от 0 до 12. На скриншоте видно, что выбрана 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)Внизу я написал скрипт как пример записи во всю структуру.Если обоймы нет, то в адресе обоймы будет всёравно еденица (об этом должен был раньше сказать) Получилось. Во все слоты вписывается значения единиц. На этом расструктуризация закончена.Как сделать бесконечное оружие?Смотрим в отладчике близлежащие инструкции. Простой способСамый короткий способ сделать бесконечное оружие так это вписать в показанный адрес единицу. Есть недостаток – бесконечное оружие будет у всех.Сложный способПоставить фильтр на Карла. Если стреляет Карл, то «перепрыгивать» оба «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) Ссылка на комментарий Поделиться на другие сайты Поделиться
Nizami Опубликовано 27 марта, 2012 Поделиться Опубликовано 27 марта, 2012 обьясните пожалуйста,у меня не получается найти адрес таймера в миссиях.в 4байта я нашел 1значение статическое но оно экранное.а в других типах не ишетЕсли в игре таймер показывает например 10с. не значит, что нужно искать 4 байт или all bytes 10. Ищи неизвестное значение.//Uchiha Sasuke а если попробовать неизвестное значение с отсеиваниями на интервал (was decreased by/was increased by?Тоже можно, но откуда знать, что значение уменьшается точно на 1 как секунды таймера (10..9..).Таймеры лучше всегда искать через неизвестное 4 байта \ с точкой и затем уменьшилось-уменьшилось (а бывает, что и наоборот - увеличилось). Редко попадаются игры, где 10 секунд - это (DWORD) 10.я так и делал неизвестное значение уменьшилось на... таким образом я только нашел экранное статическое значениея так и делал неизвестное значение уменьшилось на... таким образом я только нашел экранное статическое значениеПопробуй поставь на него брейкпоинт на чтение и глянь, что за код с ним работает. Сначала обычно обновляется внутриигровое значение, а затем - экранное, так что код будет повыше. Ну или ищи "неизвестное" - "изменилось - изменилось - изменилось".спасибо всем метод изменилось изменилось изменилось ооочень помогло=)) Ссылка на комментарий Поделиться на другие сайты Поделиться
24K Опубликовано 28 марта, 2012 Поделиться Опубликовано 28 марта, 2012 Я спецально сделал трейнер для версии от 1C http://forum.gamehac...ta-san-andreas/ ... пользуйся не трать силы на поиски ..... ну если хочешь сам найти адрес таймера то садись в коповскую тачку, запускай CE, поиск неизвестного значение, и когда время будет уменьшаться в CE, decreased value, убиваешь приступника, время прибавляется в CE, Increased value и так далее.... сделаешь скрипт, и он будет работать в миссиях и доп миссиях. т.е бесконечное время будет везде где есть задания на время .... таймер 4 байта.. Ссылка на комментарий Поделиться на другие сайты Поделиться
M4K Опубликовано 28 марта, 2012 Поделиться Опубликовано 28 марта, 2012 >таймер 4 байта4 байта целое или float? Ссылка на комментарий Поделиться на другие сайты Поделиться
Nizami Опубликовано 29 марта, 2012 Поделиться Опубликовано 29 марта, 2012 4 байта целое Ссылка на комментарий Поделиться на другие сайты Поделиться
24K Опубликовано 29 марта, 2012 Поделиться Опубликовано 29 марта, 2012 >таймер 4 байта4 байта целое или float?Таймер 4 байта, не float, адрес времени не изменяется но скрипт написать требуется для того чтобы время было бесконечное везде в миссиях, подмиссиях и дополнительных заданиях Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 29 марта, 2012 Поделиться Опубликовано 29 марта, 2012 Просто float - это тоже четыре байта, просто дробное. Ссылка на комментарий Поделиться на другие сайты Поделиться
24K Опубликовано 29 марта, 2012 Поделиться Опубликовано 29 марта, 2012 если сделать вот так,то игра вылетит[ENABLE]//code from here to '[DISABLE]' will be used to enable the cheatalloc(newmem,2048) //2kb should be enoughlabel(returnhere)label(originalcode)label(exit)007B1020:jmp newmemnopreturnhere:newmem: //this is allocated memory, you have read,write,execute access//place your code heremov [eax+000000b4],(float)1originalcode:mov ecx,[eax+000000b4] <----- инструкция денегexit:jmp returnhere[DISABLE]//code from here till the end of the code will be used to disable the cheat007B1020:mov ecx,[eax+000000b4]//Alt: db 8B 88 B4 00 00 00dealloc(newmem) Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 29 марта, 2012 Поделиться Опубликовано 29 марта, 2012 А почему нельзя вместо:mov [eax+000000b4],(float)1mov ecx,[eax+000000b4]Сделать:mov ecx,(float)1? Ссылка на комментарий Поделиться на другие сайты Поделиться
24K Опубликовано 29 марта, 2012 Поделиться Опубликовано 29 марта, 2012 А почему нельзя вместо:mov [eax+000000b4],(float)1mov ecx,[eax+000000b4]Сделать:mov ecx,(float)1?тоже вариант Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 29 марта, 2012 Поделиться Опубликовано 29 марта, 2012 Что "тоже вариант"? Тоже не работает? Тоже работает? 0_о Ссылка на комментарий Поделиться на другие сайты Поделиться
24K Опубликовано 29 марта, 2012 Поделиться Опубликовано 29 марта, 2012 Нет, я говорю это один из вариантов Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 29 марта, 2012 Поделиться Опубликовано 29 марта, 2012 Эээ, и всё-таки? Один из вариантов нерабочего скрипта? Ссылка на комментарий Поделиться на другие сайты Поделиться
24K Опубликовано 29 марта, 2012 Поделиться Опубликовано 29 марта, 2012 я сейчас проверить не могу, я игру взломал а таблицу не сохранил Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 29 марта, 2012 Поделиться Опубликовано 29 марта, 2012 Что ломаем денга или таймер? "gta_sa.exe"+1700FB mov [esi+000000B8] инструкция денег, я когда то ломал. Ссылка на комментарий Поделиться на другие сайты Поделиться
Nizami Опубликовано 1 апреля, 2012 Поделиться Опубликовано 1 апреля, 2012 я просто нупами таймер затер и все норм Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения