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

Grand Theft Auto Vice City, метод указателей


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

Бессмертие только для игрока с использованием метода указателей

Сложность: Новичок

Инструменты: Artmoney, Tsearch.

Итак, начнем. Запускаем игру, запоминаем количество жизней:

ff67a9442b37.jpg

Сворачиваем игру и запускаем Artmoney и выбираем игру из списка процессов.

Продолжение статьи далее.

Далее делаем поиск:

4fc81c6efbce.jpg

Почему именно так? Да потому, что жизни в вайсе хранятся в переменной с плавающей точкой.

Далее делаем что-нибудь, чтобы потратить немного жизней, например падаем с крыши невысокого здания (чтобы не насмерть и чтобы жизней осталось на еще два-три таких падения)

Далее делаем отсев с получившимися жизнями по принципу скриншота… то есть диапазон значений вычисляется так:

нижний порог диапазона = текущие жизни-1

верхний порог диапазона = текущие жизни+1

Повторяем отсев до тех пор, пока не останется ОДИН адрес. Вот что получилось у меня в итоге:

В игре:

e559e2a9ed87.jpg

А в Artmoney:

a3484f88aec7.jpg

Как видим, в игре у нас 66 процентов, а в АртМани 66.02 Это потому, что игра просто отбрасывает сотые доли и пишет в жизни тока целую часть. Наверное это сделано для затруднения взлома игры. Ну да нам это не помеха :P

Запускаем TSearch:

6ddef1d22c3a.jpg

и открываем процесс игры. Надеюсь с этим вы справитесь без меня... Далее включаем отладчик:

d0b2f6b5af14.jpg

и открываем AutoHack window. Тоже надеюсь, что найдете где ;)

В этом окне нажимаем зеленую стрелочку:

203427a6052d.jpg

Эта стрелочка позволяет установить breakpoint (точку останова) на адрес наших жизней:

0195a1473bbe.jpg

Это наш адрес жизней найденный в АртМани, вставляем его в окно установки breakpoint’a:

d45d80192198.jpg

Обратите внимание на тип breakpoint’a: он должен быть открытым, то есть срабатывать и на чтение из этого адреса и на запись.

Далее мы возвращаемся в игру и бегаем пару секунд, но жизни НЕ тратим! Да, и в артмани их не замораживаем!

После возврата в TSearch видим, что наше breakpoint сработал, и еще как сработал:

728042d12a82.jpg

Последний из найденных сразу же отсеиваем, так как это сравнение жизней, оно нам не нужно. А вот остальные придется перебирать вручную. Я этого делать не буду, дабы не затягивать туториал, и сразу покажу какой работает на моей версии игры, так как я ее уже ломал dry.gif

Для начала найдем дырку в коде, для вставки нашей процедуры. Я использую для этой цели CodeCaver:

ada177c28703.jpg

я воспользуюсь отмеченным адресом, так как в нем много пустого места...

Включаем в TSearch очень удобную фишку Easy Write:

1f22596dfcc8.jpg

Затем нажимаем new:

ccef31a26e69.jpg

Получаем такое окно:

68e1018d0382.jpg

В верхней части окна пишется код для патча адресов игры, а в нижней – для восттановления исходных значений, если вдруг вы решили поиграть честно ;)

В верхней части набираем такой код:

Сразу даю пояснения…


fld dword ptr [ecx+0x354] – восстанавливаем оригинальную инструкцию
mov dword ptr [ecx+0x354],0x4479C000 – записываем 999.00 в адрес жизней
jmp 0x501979 возврат в игровую рутину

Offset 0x501973 – инструкция по этому адресу читает жизни
jmp 0x006E794F – делаем переход на свою процедуру
 nop – так как оригинальная инструкция всего 6 байт длиной а переход 5 байт длиной, то нам надо вставить это, для баланса байт, иначе получим вылет из игры.
Offset 0x006E794F --- помните, я выбрал этот адрес для своей процедуры

А в нижней вставляем это:


 fld dword ptr [ecx+0x354]
Offset 0x501973

То есть восстановление оригинального кода игры, для честной игры. Включив эту опцию, возвращаемся в игру. Мы стали бессмертными :)

Но что это? Все прохожие и менты тоже стали бессмертными. :angry: Вот тут и начинается основная часть нашего взлома. Выключаем бессмертие. В окне AutoHack выбираем вкладку Дизассемблера.

7cce06aaaa7c.jpg

Затем делаем все четко по скриншотам:

0a9614b79a92.jpg

Этим мы заставим TSearch смотреть, что же происходит в регистрах при выполнении данной инструкции. Далее кликаем на Register:

064efc8a6c3b.jpg

И видим такое окно:

a16dff246068.jpg

Проставляем регистры как на скриншоте и включаем наблюдение (красная рожица слева). Возвращаемся в игру. В игре НИ В КОЕМ СЛУЧАЕ НЕ ВСТУПАЕМ НИ В КАКИЕ РАЗБОРКИ И НЕ ТРАТИМ ЖИЗНИ!!! Бегаем пару сек и снова возвращаемся в это окно. Вот и нашли значение для поиска указателя (если вы помните, это и есть цель этого тутора):

846e9c598a5b.jpg

Далее переводим его в десятичную систему (калькулятором все пользоваться умеют? :) ). И ищем как обычное число в артмани… А можно сразу искать его в шестнадцатиричном. Вот так:

7aca70bca72f.jpg

то есть мы вводим в строку поиска шестнадцатиричное значение, и просто напросто подставляем в конце h чтобы дать АртМани понять, что это шестнадцатиричное значение. Скорее всего адресов найдется много. Выходим из игры, АртМани и TSearch не закрываем! Снова заходим в игру и идем в TSearch. Снова выбираем процесс,  Включаем отладчик в TSearch’e  и переходим в окно Автохака. Оно должно было оставаться открытым. Выключаем наблюдение, снова включаем, переходим в игру, бегаем пару секунд и снова возвращаемся в Автохак

7256d26f5734.jpg

Видим, что регистр изменился… Делаем отсев по этому значению в АртМани… Повторяем заново, до тех пор, пока не останется только один адрес… Если же после 5-6 отсеиваний адресов все равно несколько, то берем любой :P

Я взял адрес 0078F7E4 он мне больше всего понравился:

8425be87f884.jpg

Вот практически и все! Дорабатываем наш код:

(Объясняю только то, что изменилось)


    fld dword ptr [ecx+0x354]
    push eax – сохраняю регистр на всякий случай <img src="http://forum.gamehacklab.ru/public/style_emoticons/default/smile.gif" class="bbc_emoticon" alt=":)">

    mov eax,[0x0078F7E4] – считываю из нашего указателя адрес для сравнения
    cmp ecx,eax – сравниваю с текущим указателем
    pop eax – восстанавливаю регистр (а вдруг он используется)
    jne 0x501979 – если указатели не равны, то возвращаюсь без записи
    mov dword ptr [ecx+0x354],0x4479C000 – записываю жизни
    jmp 0x501979 возвращаюсь в игру.
  
  А это все без изменений

Offset 0x501973
    jmp 0x006E794F
    nop
Offset 0x006E794F

Вот и все!!! Теперь бессмертны только мы!!! 

Заключение

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

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

  • 3 месяца спустя...

Статья GTA Vice City  - это статья с которой я нулевыми знаниям начал путь в advanced gamehacking. А затем F.E.A.R. - тоже произвела впечатление. Три года прошло и если сравнить знания мои до того как я прочёл эти статьи с теми, что сейчас, то можно посмеяться ))) Тогда я смотрел на ассемблерные инструкции типа этого

728042d12a82.jpg

и понятия не имел как с этим работать.... жесть ))) Теперь настало время и я прокомментирую моменты, которые были мне непонятными или которые нужно дополнить. Надеюсь Xipho будет интересно. Комментарии мои могут быть сложным новичкам, но что тут поделаешь, написал как написал...

Для удобства я все картинки вытащил из под спойлеров, а комментарии я буду писать красным. Поехали...

 

Скрытый текст
Цитата
Бессмертие только для игрока с использованием метода указателей

 

Сложность: Новичок

Инструменты: Artmoney, Tsearch.

Итак, начнем. Запускаем игру, запоминаем количество жизней:

ff67a9442b37.jpg

сворачиваем игру и запускаем Artmoney и выбираем игру из списка процессов.

f5bf85c2b7ac.jpg

Далее делаем поиск:

4fc81c6efbce.jpg

Почему именно так? Да потому, что жизни в вайсе хранятся в переменной с плавающей точкой.

Позволю себе отметить, что этот финт поиска данных был известен не каждому. Тогда в той ещё Артмани 7.13 также не было корректировок округления вещественных чисел в настройках. Но увидив данный приём однажды, можно было его применять в других играх.

Далее делаем что-нибудь, чтобы потратить немного жизней, например падаем с крыши невысокого здания (чтобы не насмерть и чтобы жизней осталось на еще два-три таких падения)

Далее делаем отсев с получившимися жизнями по принципу скриншота… то есть диапазон значений вычисляется так:

нижний порог диапазона = текущие жизни-1

верхний порог диапазона = текущие жизни+1

Повторяем отсев до тех пор, пока не останется ОДИН адрес. Вот что получилось у меня в итоге:

В игре:

e559e2a9ed87.jpg

А в Artmoney:

a3484f88aec7.jpg

Как видим, в игре у нас 66 процентов, а в АртМани 66.02 Это потому, что игра просто отбрасывает сотые доли и пишет в жизни тока целую часть. Наверное это сделано для затруднения взлома игры. Ну да нам это не помеха :P

Запускаем TSearch:

6ddef1d22c3a.jpg

Эта программа Хит своего времени (как и MTC) и сейчас может использоваться, но CheatEngine более гибкая и мощнее и также MHS

и открываем процесс игры. Надеюсь с этим вы справитесь без меня... Далее включаем отладчик:

d0b2f6b5af14.jpg

Минус в удобстве TSearch - cпрашивается зачем эти лишние действия, когда отладчик можно было бы включать автоматом при попытке поставить бряк на адресе. Дальнейший путь установки бряка также можно было бы сократить, как это сделано в CE

и открываем AutoHack window. Тоже надеюсь, что найдете где 

В этом окне нажимаем зеленую стрелочку:

203427a6052d.jpg

Эта стрелочка позволяет установить breakpoint (точку останова) на адрес наших жизней:

0195a1473bbe.jpg

Это наш адрес жизней найденный в АртМани, вставляем его в окно установки breakpoint’a:

d45d80192198.jpg

Обратите внимание на тип breakpoint’a: он должен быть открытым, то есть срабатывать и на чтение из этого адреса и на запись.

Многое остаётся за кадром. Почему именно "и на чтение и на запись"?! Ведь сразу после этого идёт следующий абзац и мысль как будто обрывается.

Пояснение. Бряк и на чтение и на запись, так называемый "открытый" брейкпоинт или бряк на доступ позволит найти предполагаемую частообращаемую инструкцию к адресу здоровья. Обычно, эта инструкция типа чтения, а иногда и на запись. О частоте обращения можно только догадываться, т.к. TSerach не считает кол-во обращений. Однако, обычно, частообращаемые инструкции являются инструкциями чтения, которые работают в игре, когда игрок даже ничего не делает. Руководствуясь данным принципом мы можем найти ту самую частообращаемую инструкцию к адресу здоровья и внедрить чит-код в неё и он будет выполняться создавая эффект постоянного здоровья.

Мы также могли бы внедрить в некоторую инструкцию записи из появившихся, когда игрок получил урон, но как показала моя практика, проще внедрять так, как тут описано, хотя случаи бывали разные. Перед вами может стоять выбор:

1. внедрить в одну частообращаему инструкцию,

2. внедрить в одну или несколько инструкций записи, которые срабатывают обычно при уроне,

3. внедрить на ваш выбор, куда угодно и что угодно, лишь бы чит работал должным образом

Далее мы возвращаемся в игру и бегаем пару секунд, но жизни НЕ тратим! Да, и в артмани их не замораживаем!

После возврата в TSearch видим, что наше breakpoint сработал, и еще как сработал:

Когда я читал первый раз статью, я точно помню, что задавался вопросом: "Почему именно так нужно поступать?". Как будто Xipho взял да и угадал что нужно сделать.

Как я уже писал, мы стараемся найти часто обращаемые инструкции (т.к. выбрали этот путь внедрения) и они обычно срабатывают, когда мы просто зашли и вышли из игры. Если мы не будем тратить жизни, то у нас будет меньше инструкций обращения, которые срабатывают только при уроне. Поэтому подмеченное "НЕ" тратим жизни, нужно только для того чтобы не работать с лишними инструкциями (которые срабатывают только при уроне), т.к. нам нужным часто обращаемые.

728042d12a82.jpg

Последний из найденных сразу же отсеиваем, так как это сравнение жизней, оно нам не нужно.

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

Также хочется отменить, что именно сейчас мы имеем возможность охарактеризовать частично структуру героя в игре. Начало структуры является значение регистра, а смещение +0x354 - это велечина от начала структуры по которой находится здоровье.

Наш игрок или не наш игрок имеет такую же структуру с таким же смещением здоровья. Некторые инструкции которые мы видели, работают как с нашим игроком так и не с нашими. Хотя точно утвержать, пока не установим это, мы не можем.

Установив какие инструкции работают только со структурой вашего игрока вы можете сделать чит-код с записью постоянного здоровья по смещению +0x354 чем избавите себя от лишних хлопот. Если инструкций работающих только со структурой вашего героя не будет, то придётся изменять инструкции делая фильтр "является ли регистр структурой вашего игрока". Отличить вашу структуру от структуры ботов можно, например, с помощью указателя на структуру вашего героя, который придётся искать далее.

С этого места можно некоторым образом начать понимать какие инструкции вам необходимо стремиться изменять - часто обращаемые и работающие только со структурой вашего героя. Правда я ещё подстраховываюсь и изменяю также хотябы одну инструкцию урона в случаях, когда урон может отнять всё здоровье героя. Имел ли место быть такой случай в этой игре я без понятия.

А вот остальные придется перебирать вручную. Я этого делать не буду, дабы не затягивать туториал, и сразу покажу какой работает на моей версии игры, так как я ее уже ломал dry.gif

Сложно предположить по какому критерию был перебор вручную Все инструкции теоретически вполне подходят под критерий внедрения. Сдаётся мне что на всех инструкциях нужен фильтр, а Xipho искал, ту которая работает без фильтра

Для начала найдем дырку в коде, для вставки нашей процедуры. Я использую для этой цели CodeCaver:

Это было давно, сейчас Xipho использует выделение памяти, а не "дырку". Что по сути правильно учитывая разные тонкости, о которых можно узнать поискав по форуму.

ada177c28703.jpg

я воспользуюсь отмеченным адресом, так как в нем много пустого места...

Включаем в TSearch очень удобную фишку Easy Write:

1f22596dfcc8.jpg

Затем нажимаем new:

ccef31a26e69.jpg

Получаем такое окно:

68e1018d0382.jpg

В верхней части окна пишется код для патча адресов игры, а в нижней – для восттановления исходных значений, если вдруг вы решили поиграть честно

EasyWrite не такой уж Easy в универсальности. Он не сможет понять адрес "Game.dll+5454:", он не приспособлен к выделению памяти, он не может искать адрес внедрения по цепочке байт. И основная фича за которую его любили или до сих пор любят это генерация байт-кода, который на мой взгляд уже утратил свою актуальность. Зачем заниматься компиляцией байт-кода, копипастами и т.п. Берём ассемлерный скрипт, вставляем в трейнер и юзаем без лишней работы с poke-ами. Это можно сделать в скриптах Cheat Engine и непосредственной компиляцией ассемблерных инструкций в среде программирования с их копированием в процесс игры в выделеную память - однако это надо писать особый код трейнера, что не каждый умеет

В верхней части набираем такой код:

Сразу даю пояснения…

 


fld dword ptr [ecx+0x354] – восстанавливаем оригинальную инструкцию
mov dword ptr [ecx+0x354],0x4479C000 – записываем 999.00 в адрес жизней
jmp 0x501979 возврат в игровую рутину


Offset 0x006E794F --- помните, я выбрал этот адрес для своей процедуры

 

Здесь более правильнее было бы

Offset 0x006E794F

mov dword ptr [ecx+0x354],0x4479C000

fld dword ptr [ecx+0x354] // загружаем в ST(0) значение 0x4479C000

jmp 0x501979

 

jmp 0x006E794F – делаем переход на свою процедуру nop – так как оригинальная инструкция всего 6 байт длиной а переход 5 байт длиной, то нам надо вставить это, для баланса байт, иначе получим вылет из игры.


Offset 0x501973 – инструкция по этому адресу читает жизни

 

А в нижней вставляем это:

 

fld dword ptr [ecx+0x354]


Offset 0x501973

 

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

Но что это? Все прохожие и менты тоже стали бессмертными. Вот тут и начинается основная часть нашего взлома.

Ну, вот... похоже нет инструкции, которая работает только с героем. Если вы хотите узнать работает ли инструкция только с вашим героем, то на этой инструкции (Offset 0x501973) нужно определить адрес здоровья врага. Поставить на него также бряк и сравнить какие инструкции срабатывают у него и у вашего героя. Найти отличные и проверить их на практике.  

Дальеш пойдёт поиск указателя для создания фильтра, чтобы по нему записать здоровье только нашему герою.

 

Выключаем бессмертие. В окне AutoHack выбираем вкладку Дизассемблера.

7cce06aaaa7c.jpg

Затем делаем все четко по скриншотам:

0a9614b79a92.jpg

Этим мы заставим TSearch смотреть, что же происходит в регистрах при выполнении данной инструкции. Далее кликаем на Register:

064efc8a6c3b.jpg

И видим такое окно:

a16dff246068.jpg

Проставляем регистры как на скриншоте и включаем наблюдение (красная рожица слева). Возвращаемся в игру. В игре НИ В КОЕМ СЛУЧАЕ НЕ ВСТУПАЕМ НИ В КАКИЕ РАЗБОРКИ И НЕ ТРАТИМ ЖИЗНИ!!!

Возможно, что если мы потратим чьи-то жизни, то в регистре ecx будет начало структуры того бота, здоровье которого мы отняли в последнюю очередь. В любом случае это подстраховка.

Бегаем пару сек и снова возвращаемся в это окно. Вот и нашли значение для поиска указателя (если вы помните, это и есть цель этого тутора):

846e9c598a5b.jpg

Далее переводим его в десятичную систему (калькулятором все пользоваться умеют? ). И ищем как обычное число в артмани… А можно сразу искать его в шестнадцатиричном. Вот так:

7aca70bca72f.jpg

то есть мы вводим в строку поиска шестнадцатиричное значение, и просто напросто подставляем в конце h чтобы дать АртМани понять, что это шестнадцатиричное значение. Скорее всего адресов найдется много. Выходим из игры, АртМани и TSearch не закрываем! Снова заходим в игру и идем в TSearch. Снова выбираем процесс,  Включаем отладчик в TSearch’e  и переходим в окно Автохака. Оно должно было оставаться открытым. Выключаем наблюдение, снова включаем, переходим в игру, бегаем пару секунд и снова возвращаемся в Автохак

А вот тут есть сюрпризы.

1. Указатель может быть в dll - ке, а это не было проверено в статье.

2. Указатель может быть многоуровневым и должен был быть проверен на статичность. Находится ли этот указатель в статичной памяти? Зелёный ли он в CE или MHS...

7256d26f5734.jpg

Видим, что регистр изменился… Делаем отсев по этому значению в АртМани… Повторяем заново, до тех пор, пока не останется только один адрес… Если же после 5-6 отсеиваний адресов все равно несколько, то берем любой

Здесь я думаю стоило жирным выделить очень полезный финт - способ, которым был найден этот указатель. Именно этот способ помимо реверсинга лежит в основе поиска любого указателя, хоть многоуровневого при этом уровни указателей должны изменять своё положение, чтобы их можно было идентифицировать.

Я взял адрес 0078F7E4 он мне больше всего понравился:

Тут надо было обратить внимание, что этот выбор был ориентирован не спроста: 0x201538 лежит ниже 0x00400000, чего не должно быть. Плюс нужно было убедиться в какой памяти лежит 78F7E4 в статической или в dll

8425be87f884.jpg

Вот практически и все! Дорабатываем наш код:

(Объясняю только то, что изменилось)

  Offset 0x006E794F

    fld dword ptr [ecx+0x354]

    push eax – сохраняю регистр на всякий случай

    mov eax,[0x0078F7E4] – считываю из нашего указателя адрес для сравнения

    cmp ecx,eax – сравниваю с текущим указателем

    pop eax – восстанавливаю регистр (а вдруг он используется)

    jne 0x501979 – если указатели не равны, то возвращаюсь без записи

    mov dword ptr [ecx+0x354],0x4479C000 – записываю жизни

    jmp 0x501979 возвращаюсь в игру.

Можно было написать идеально как-то так:

Offset 0x006E794F

    fld dword ptr [ecx+0x354]

    cmp ecx,dword ptr[0x0078F7E4]

    jne 0x501979

    mov dword ptr [ecx+0x354],0x4479C000

    jmp 0x501979

Вообще-то после "mov dword ptr [ecx+0x354],0x4479C000" должна идти "fld dword ptr [ecx+0x354]" и также сохранены и восстановлены флаги pushf и popf. Но раз игра позволяет значит, можно так оставить.

  А это все без изменений

Offset 0x501973

    jmp 0x006E794F

    nop

Вот и все!!! Теперь бессмертны только мы!!!

Я бы ещё уточнил - бессмертны благодаря внедрению чит-кода в инструкцию, в котором был фильтр на указатель структуры игрока. Только поэтому бессмертны только мы.

Хотел бы отменить ещё одну важную штуку. Указатель на здоровье теперь можно оформить как

[[0078F7E4]+0x354] = 100.0

В статье не нашли инструкцию работающую только со здоровьем героя на уровне [xxx+0x354], а

в этом случае можно поставить бряк на доступ (открытый) на адрес [0078F7E4] и тогда в большинсве случаев можно найти инструкцию, которая работает только со структурой главного героя. Можно внедрить в эту инструкцию без сравнения (без фильтра) с указателем героя как было описано в статье

Заключение.

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

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

  • 1 год спустя...

можете на СЕ показать как сделать "бессмертен только я"ато никак неполучается сделать.сделаю бессмертие на своего героя и тут все стали бессмертными.

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

еще один вопрос=)я вот сделал бесконечное здоровье и все получилось бессмертен только я.а вот с потронами лажа.как можно найти 1 адрес всех потронов.как вапще найти этот адрес и написать на него скрипт.пробовал по статье гта сан адрес не помогла(моя игра Gta vice city).мне скрипт не нужен на готовые беск потроны.я сам хочу понять как найти адрес и написать на него скрипт.заранье спс!

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

Находите адрес патронов допустим ракетницы. Для другого оружия это будет как значение обоим, ставим бряк на доступ к примеру, вылетает инструкция. Она отвечает за обоимы всего вашего оружия и врагов. Далее ищем значение патронов в оружии и так же всё делаем. В итоге будет два скрипта.

Извиняюсь, прочитал не верно, но всё равно для Вашей игры может помочь.

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

вот я нашел адрес ракетницы.дальше я нашел интсрукцию.и че с ней дальше делать я дальше не понял.обьясни по подробней

Писать скрипт

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

Берешь найденную инструкцию, для нее делаешь прыжок на кейв, и в кейве делаешь запись нужного количества патронов для оружия. Поскольку в данной игре эта инструкция работает с патронами ВСЕХ оружий, которые есть у ГГ, соответственно, у них у всех и станут бесконечными патроны. Элементарно.

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

  • 3 недели спустя...

Всем привет:) Помогите сделать 1hit kill отдельно от бессмертия.

Бессмертие ГГ:

fld dword ptr [ebx+00000354]
cmp ebx,dword ptr[0094AD30]
je returnhere
fstp dword ptr [ebx+00000354]

Как только не извращался, либо я бессмертный, либо нпс.

Поидее можно написать mov [ebx+00000354],1 и все, но хочется отделить бессмертие и 1hit kill.

Помогите пожалуйста.

Разобрался.

Бессмертие ГГ:

cmp ebx,dword ptr[0094AD30]
je returnhere
fstp dword ptr [ebx+00000354]
jmp returnhere

1hit kill:

cmp ebx,dword ptr[0094AD30]
jne exit
fstp dword ptr [ebx+00000354]
jmp returnhere
exit:
mov [ebx+00000354],1
jmp returnhere

Отдельно они работают, а вот вместе нет. Работает только 1 из них.

Подскажите пожалуйста.

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

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

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

  • 1 месяц спустя...

неподскажите в каком типе хранятся повреждение машин и прокол шин

Повреждение машин - float, прокол шин - byte в структуре машины. Первый адрес ищется за 5 минут, второй - через структуру, полученную при отладке первого. wink.gif

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

//Uchiha Sasuke это нормально - подсказать, каким типом хранится параметр, как он хранится - на единицу больше/меньше (в случае с тем же адресом жизней), или же, в случае с полоской здоровья - на уменьшение или здоровье хранится как повреждение, и т.д. Искать адреса же он будет сам, в любом случае.

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

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

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

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