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

Basic encryptions, debugging, backtracing and some info on the stack


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

Ссылка на источник

Гугл-Переводчик

Моё объяснение статьи(!)

 

Уточнение. Зашифрованный адрес количества сердец найти не получилось способом Geri. Есть другой способ. Смотрим на инструкции

0044DB20 - 8B 81 04010000 - mov eax,[ecx+00000104]
0044DB26 - 33 81 80000000 - xor eax,[ecx+00000080]

Идем в дизассемблер на инструкцию 0044DB20. Далее просмотреть проскакивающие адреса в квадратных скобках умерев персом и один из них будет шифрованным значением здоровья. Подробнее на скринах

post-3-0-56050800-1421454359_thumb.pngpost-3-0-24978000-1421454366_thumb.pngpost-3-0-48793400-1421454373_thumb.pngpost-3-0-91092100-1421454377_thumb.pngpost-3-0-91003500-1421454382_thumb.pngpost-3-0-57432500-1421454387_thumb.png

 

Статья Geri еще написана была в 2011 году. О том как можно применять трейссер и пошаговую отладку. Есть даже видео ролик.

Для счастливых обладателей знаний английского языка должно быть понятно. Ну а для тех кто не знает, тем надо подучить с гугл переводчиком. Спасибо Geri за интересную статью.

 

  Показать контент

Usually I don't write any tutorial where the target process is not freely available, but recently I found a game which is small enough, somewhat popular amongst kids and most importantly, it is a fine example to show basic encryptions.

This tutorial will cover info about basic encryptions, checking values in the stack and backtracing some functions in the program.

I will use Cheat Engine 6.0 so get the latest version from here:
http://www.cheatengine.org

The game that I will use is Chicken Invaders 4, but this tutorial contains generic information that can be used in other programs too.

Alright, the first step is to aquire the target process, Chicken Invaders 4 v4.00. This is the program and the exact version that I will use for the demonstration. If You have installed the game, play with it a bit to get familiar what kind of game is this. A simple space shooter against evil chickens. Ridiculously stupid concept but the game itself (regarding the programming, graphics and music) is not a bad job. Now change the game to run in window mode (not in fullscreen).


Mission 1: Finding some values


In this whole tutorial, we will try to change the amount of lives. If You have tried to search for it, You have probably failed miserably. The reason of this failure: the game is using encrypted values to store the lives, points, food, missiles and keys. What You need to do is set the value type to Byte and search for changed/unchanged values when You die.

You will find some high values which are not making any sense at all. Check out what is accessing to the address that You have found and You will see these codes:

0044DB20 - 8B 81 04010000 - mov eax,[ecx+00000104]
0044DB26 - 33 81 80000000 - xor eax,[ecx+00000080]

0044DB5D - 89 B3 80000000 - mov [ebx+00000080],esi
0044DB63 - 33 74 24 10 - xor esi,[esp+10]
0044DB67 - 5F - pop edi
0044DB68 - 89 B3 04010000 - mov [ebx+00000104],esi

NOTE: You can search for food or points too if it is easier for You. You will find these same codes.


Mission 2: What is the encryption

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

  В 15.01.2015 в 16:38, MasterGH сказал:

Ссылка на источник

 

Статья Geri еще написана была в 2011 году. 

 

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

Трейссер - одна из опций Се, которую тоже пока не понимаю, но тоже хочу понять.

Xipho, запишете видео и на эту тему, тоже заранее огромное спасибо. 

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

Перевод статьи Гуглом:

  Показать контент

Основные шифрование, отладка, обратной трассировки и некоторая информация в стеке


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

Этот учебник будет охватывать данные об основных кодировок, проверяя значения в стеке и обратной трассировки некоторые функции в программе.

Я буду использовать Чит Двигатель 6,0 так что получить последнюю версию отсюда:
http://www.cheatengine.org

Игра, которую я буду использовать это Chicken Invaders 4, но этот учебник содержит общую информацию, которая может быть использована в других программах тоже.

Хорошо, первый шаг заключается в aquire целевой процесс, Chicken Invaders 4 v4.00. Это программа и точную версию, что я буду использовать для демонстрации. Если Вы установили игру, играть с ним немного, чтобы ознакомиться какой игре это.Просто космический шутер от злых кур. Смешно глупо понятие, но сама игра (в отношении программирования, графики и музыки) не плохая работа. Теперь измените игру, чтобы запустить в оконном режиме (не в полноэкранном режиме).

 

Миссия 1: Поиск некоторые значения

В этом весь учебник, мы постараемся, чтобы изменить количество жизней. Если Вы пытались искать его, Вы, наверное, с треском провалилась.Причина этой неудачи: игра используют шифрованные значения для хранения жизней, точки, продукты питания, ракеты и ключи. Что Вам нужно сделать, это установить тип значения байт и поиск измененных / неизменным значения, когда ты умрешь.

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

0044DB20 - 8B 81 04010000 - MOV EAX, [ECX + 00000104]
0044DB26 - 33 81 80000000 - XOR EAX, [ECX + 00000080]

0044DB5D - 89 B3 80000000 - MOV [EBX + 00000080], ESI
0044DB63 - 33 74 24 10 - XOR ESI, [ESP + 10]
0044DB67 - 5F - поп-EDI
0044DB68 - 89 B3 04010000 - MOV [EBX + 00000104], ESI

Примечание: Вы можете искать пищу или точек тоже, если это проще для вас. Вы найдете эти же коды.

 

Миссия 2: Что такое шифрование

Ok Вы должны были найти коды, которые я упоминал, и если вы посмотрите на него, вы найдёте инструкцию XOR в каждом случае. XOR используется в шифрования очень часто. В самом деле, большинство шифрование в играх используете простую инструкцию XOR испортить значение и запутать новичков. Это очень легко понять процесс, если вы знаете, что эта инструкция. Позвольте мне процитировать другого автора битной:

     Инструкция XOR соединяет два значения, используя логическое исключающее ИЛИ (помните или использует
      включающее ИЛИ).
      Чтобы понять, XOR лучше, рассмотрим эти два двоичных значений:
 
                                     1001010110
                                     0101001101
 
      Если вы или они, результат 1100011011
 
      Когда два бита на верхней части друг с другом равны, результирующий бит равен 0. Иначе результирующая
      бит 1. Вы можете использовать calc.exe для расчета XOR.
Для получения дополнительной информации, используйте Google. Обучение Буль-алгебру не является частью этого учебника.
Если Вы поняли, что это цель этой инструкции, Вы понимаете, что значение, которое вы ищете, находится объединены с 2 значениями. Глядя на кодах, очевидно, что эти значения.

0044DB20 - 8B 81 04010000 - MOV EAX, [ECX + 00000104]
0044DB26 - 33 81 80000000 - XOR EAX, [ECX + 00000080]

Один из них хранится на [ECX + 0104] и другое значение хранится на [ECX + 0080]. Использование отладчика, чтобы выяснить, какие адреса доступны по этим кодам, Вы можете найти ключевые значения для жизни. Очень хорошо, теперь установите оба значения в 0, и вы должны иметь 0 жизнь. Удивительный, сейчас единственная проблема в том, что Вы имеете 0 жизнь на экране, но в действительности, у вас есть такое же количество жизней, как первоначально. Это означает, что все, что вы найти и изменить был отображаемое значение и вы не изменили реальный объем жизней.

 

Миссия 3: Проверка коды шифрования

Бьюсь об заклад, эта ситуация знакома, если Вы пытались обмануть в некоторых играх.Значение шифруется и / или Вы не нашли реальную стоимость и Вы добились изменения только отображаемое значение. Нет проблем, это не будет достаточно, чтобы создать рабочие читы. Во-первых, мы должны смотреть на коды:

0044DB26 - 33 81 80000000 - XOR EAX, [ECX + 00000080]

Этот код работает часто, читая несколько значений. Очевидно, что не читает число только жизнь, но и некоторые другие вещи тоже.

0044DB5D - 89 B3 80000000 - MOV [EBX + 00000080], ESI
0044DB63 - 33 74 24 10 - XOR ESI, [ESP + 10]
0044DB67 - 5F - поп-EDI
0044DB68 - 89 B3 04010000 - MOV [EBX + 00000104], ESI

Этот код, однако используется только тогда, когда меняется значение. Это код, который пишет для нашего значения. Давайте взглянем на это. Мы видим, что ESI регистр используется для хранения какую-то важную информацию, и эй, он использует XOR на какой-то адрес, [ESP + 10]. Просто из любопытства, давайте посмотрим, что хранится на [ESP + 10].

Начните новую игру, и Вы будете иметь 5 жизней.
Теперь у вас есть 2 варианта, чтобы проверить это значение.
1. Щелкните правой кнопкой мыши на коде и использовать "Перерыв и следа".
2. Нажмите клавишу F5, чтобы установить вручную точку останова.

Если Вы сделали это, вернитесь в игру и умереть. Не убивайте ничего или забрать ничего, просто умереть. Если Вы использовали перерыв и следа, Вы можете увидеть эти важную информацию:

ESP: 0012EB10
XOR ESI, [ESP + 10]
0012EB20 = (DWORD) 00000004 (4)

Если Вы установили ручной останова, игра теперь замораживают, и Вы можете увидеть значение ESP, 0012EB10. ESP + 10 0012EB20 А если добавить этот адрес в таблице, Вы можете видеть, что значение по этому адресу равно 4. Нажмите клавишу F5 снова, чтобы удалить точку останова и нажмите клавишу F9, чтобы включить программу для запуска. Если Вы сделали это, Вы можете видеть, что значение на ваш адрес сразу изменилось.
Очень хорошо, у нас было 5 жизней, мы умерли и ESP + 10 шоу 4. Если Вы умираете снова, он будет показывать 3. Четко держит расшифрованных данных для нашей жизни.

Фото из окна трассировки, когда код работает:

ПРИМЕЧАНИЕ: Более опытные пользователи будут знать, что мы можем использовать условные точки останова для работы с более твердыми кодов, но это легко работать с этим так, мы будем использовать это.

 

Миссия 4: Стек

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

Стек "хранения", где Вы можете поместить значения и загружать их из него. Однако Вы не сможете сохранять и загружать значения в любом порядке.Последнее значение в стеке, что Вы нажимаете на будет первый, который Вы выскочить.

Например предположим, ECX = 3, EDX = 2 и магазины стека следующие значения.


4
5
6

Теперь мы ставим команду, как "толчок ECX". Тогда стек будет выглядеть следующим образом.

3
4
5
6

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

2
3
4
5
6

Теперь мы хотим, чтобы совать значение из стека, как "поп-ЕКБ».

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

3
4
5
6

Если мы даем "поп EDX" Инструкция сейчас, EDX будет 3, а стек будет выглядеть

4
5
6

Результат: стек так же, как когда мы начали, но ECX = 2 сейчас, и EDX = 3, мы изменили свои значения друг с другом.

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

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

0012FF00 4 // это адрес дна стека и содержит значение, 4
0012FEFC 2 // этот адрес следующий уровень в стеке, как вы можете видеть адрес был снижен с 4 байт
-------------------------------------- // После этой линии, есть еще неиспользованные уровнистек
0012FEF8 х
0012FEF4 х

Указатель стека: указатель стека показывает вершину стека, которая в нашем случае ------------------ линии.Указатель стека регистр ESP. В нашем примере 0012FEFC является вершина стека, и это может быть просчитан, проверив значение ESP, которая 0012FEFC.
Теперь давайте нажмите что-то в стеке.
Предположим, что следующая инструкция является:
нажмите 8
После окончания этой команды, наша мини-стек будет выглядеть следующим образом:

0012FF00 4 // это адрес дна стека и содержит значение, 4
0012FEFC 2 // этот адрес следующий уровень в стеке, как вы можете видеть адрес был снижен с 4 байт
0012FEF8 8
-------------------------------------- // После этой линии, есть еще неиспользованные уровнистек
0012FEF4 х

Мы выдвинули значение в стек и вершина стека была снижена с 4 байтов еще раз. Теперь ESP = 0012FEF8 и значение на 0012FEF8 8.

Давайте толкать другое значение снова, скажем, 5.
нажмите 5

0012FF00 4 // это адрес дна стека и содержит значение, 4
0012FEFC 2 // этот адрес следующий уровень в стеке, как вы можете видеть адрес был снижен с 4 байт
0012FEF8 8
0012FEF4 5
-------------------------------------- // После этой линии, есть еще неиспользованные уровнистек

Теперь, как вы видите, верхняя часть стека (снова) был уменьшен с 4 байт. ESP = 0012FEF4 и значение на 0012FEF4 = 5.
Что случится, если мы должны знать значение на 0012FEFC например? Это очень просто, позвольте мне добавить дополнительный coloumn к нашему примеру, чтобы показать ESP.

0012FF00 4 ESP + 0C // этот адрес дно стека и содержит значение, 4
0012FEFC 2 ESP + 08 // этот адрес следующий уровень в стеке, как вы можете видеть адрес был снижен с 4 байт
0012FEF8 8 ESP + 04
0012FEF4 5 ESP
-------------------------------------- // После этой линии, есть еще неиспользованные уровнистек

Как вы можете видеть из примера, значение на 0012FEFC является [ESP + 08].

И теперь, наконец, давайте предположим, что мы должны значение из вершины стека и мы не должны его после этого, так что могут быть удалены. Мы будем использовать эту инструкцию:
поп EAX
Эта инструкция будет копировать 5 до EAX регистр и вершина стека будет двигаться снова.

0012FF00 4 ESP + 08 // этот адрес дно стека и содержит значение, 4
0012FEFC 2 ESP + 04 // этот адрес следующий уровень в стеке, как вы можете видеть адрес был снижен с 4 байт
0012FEF8 8 ESP
-------------------------------------- // После этой линии, есть еще неиспользованные уровнистек
0012FEF4 х

Я надеюсь, что этот пример ясно показал, что цель указателя стека (ESP) и как стек, который используется для хранения информации. Если это не так очевидно, это может помочь, если Вы проследить какой-либо код, и рассмотрим, как это стек работает в этом коде.

 

Final Mission: обратной трассировки

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

XOR ESI, [ESP + 10]

Если Вы делаете сценарий, чтобы изменить [ESP + 10] до 99, Вы заметите, что Вы действительно 99 жизней. И вы также будете иметь 99 очков, 99 продуктов питания, и 99 ракет. Это потому, что код используется для работы с другими значениями тоже не просто с жизнью. И что теперь? Мы не можем использовать этот код, чтобы сделать неограниченное жизнь обманывать.
Это должно быть ясно, что ESP + 10 это адрес в стеке. Это означает, что реальное число жизней хранятся где-то, то оно расшифровывается, перемещается в стек и используется функция, которую мы нашли. Наша задача состоит в том, чтобы найти код, который движется значение в стек.
Если Вы изучили код, когда жизнь изменилась, Вы, возможно, заметили, что ESP всегда 0012EB10, когда наш код работает. Поэтому, когда этот код:

XOR ESI, [ESP + 10]

используется для изменения жизни, ESP + 10 = 0012EB20.
Что нам нужно сделать, это найти код, который будет копировать число жизней 0012EB20. Хотя это только временное хранение, я думаю, вы уже поняли, что мы могли бы просто написать скрипт для изменения 0012EB20, когда этот код работает, но мы не будем делать, потому что это было бы неточным. Мы сделаем это правильный путь, и мы найдем код, который ставит значение в стеке, чтобы увидеть, где она хранится.

Что нам нужно сделать сейчас, это мало обратной трассировки. Вы можете видеть, что вариант Перерыв и следа позволяет отследить исполняемый код из некоторой точки. Но как же нам идти "назад во времени", чтобы увидеть, где же код пришли? Да, я вижу, вы думаете: "мы просто прокрутки вверх в окне дизассемблера", но это не так просто. Вы должны узнать немного о функциях.

Программа полна функций.Цель функции для выполнения какой-либо задачи, чем вернуться к точке, где она была вызвана. В нашем случае, код, который мы нашли, является частью функции для шифрования / дешифрования значения и вызывается из нескольких мест, чтобы выполнить эту задачу. После того, как это делается, он вернется туда, где он был вызван и программа будет продолжаться. Конечно, некоторые задачи настолько велик, что он может быть вскрыт на более мелкие задачи. Если Вы думаете, что об этом так, Вы понимаете, что функция может иметь много вложенных функций, эти подфункции также может иметь подфункции и т.д., чтобы сломать весь процесс малых кусочков. Так как это работает?

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

позвоните 1
       делать то,
        позвоните 2
           делать то,
           в отставке (перейти прямо после вызова 2 в коде)
        делать то,
        в отставке (перейти прямо после вызова 1 в коде)
делать то,

Так почему это важно? Давайте предположим, что наш код работает как это.

позвоните 1
     делать то,
     , число жизней в стек
       позвоните 2
            делать то,
                  позвоните 3
                      делать то,
                           позвоните 4
                                делать то,
                                       позвоните 5
                                            делать то,
                                            XOR ESI, [ESP + 10] (наш код)
                                            в отставке
                                       делать то,
                                       в отставке
                            ...
                            в отставке
                   ...
                   в отставке
       ...
       в отставке
...

Мы хотим, чтобы найти код "поставить число жизней в стек". Для этого мы должны найти, где находится "называют 1", то след от туда и найти код. Мы исходим из крошечной подфункции, и мы должны идти "назад". Как мы можем это сделать? По После возвращения очков. Не забывайте, что если вы знаете, где программа возвращения, вы будете знать, где была вызвана функция. И как инструкции RET являются после нашего кода, мы можем проследить их и увидеть, где программа прыгает, так что мы должны не только возврата очков, но точку входа функции тоже.

Я надеюсь, что это ясно, так что давайте начнем. Во-первых, добавить 0012EB20 к вашему столу, как мы будем искать инструкции, где 0012EB20 изменяется на номер нашей жизни. Тогда начните игру, нажмите правой кнопкой мыши на "XOR ESI, [ESP + 10]" и использовать перерыв и следа. Все, что вам нужно сделать сейчас, это однажды умереть. Ваш след должен быть готов. Щелкните правой кнопкой мыши в окне трассировки и выберите "Развернуть все".

ПРИМЕЧАНИЕ: адреса возврата хранятся в стеке, но, как 6 CE имеет очень красивый вид дерева, который показывает возврата очков, мы не должны беспокоиться слишком много, чтобы их найти. Вот почему новое окно след является одним из моих любимых вариантов.

Вы можете увидеть наш первый инструкцию, "исключающее или ESI, [ESP + 10]». Несколько ниже инструкциям, есть в отставке. Давайте посмотрим, на следующий адрес после отставке:

00591215 - 8B 0D 9C7C7100 - MOV ECX, [00717C9C]: [012560A8]

Изображение с трассы:

Теперь прокрутите вверх строку:

00591210 - E8 1BC9EBFF - звоните 0044DB30
00591215 - 8B 0D 9C7C7100 - MOV ECX, [00717C9C]: [012560A8]

Таким образом, наша функция была вызвана отсюда. Давайте установим точку останова на этот призыв. Нажмите на него и нажмите F5. Теперь потеряете жизнь. Программа в настоящее время остановлен. Посмотрите на наш адрес в таблице, 0012EB20. Это уже держит число наших жизнях, так он был скопирован там до этой функции. Нам нужно идти еще дальше. Нажмите клавишу F5 на код еще раз и нажмите F9 для того, чтобы запустить программу. Посмотрите на нашу следа и найти в отставке инструкцию, которая принесет нам обратно с одного уровня. Как вы прокрутите вниз, вы увидите несколько подфункций, только несколько строк кода, но мы не нуждаемся в них, мы хотим, чтобы вернуться с уровнем так что найти место, где дерево будет вернуться с уровнем ,

Следующий код, что мы найдем это:

00591CF7 - E8 D4F4FFFF - звоните 005911D0
00591CFC - C3 - в отставке

Другая картина, чтобы показать RET для этого шага:


Установить точку останова на этот призыв снова и умереть в игре. Хорошо, игра останавливается. Посмотрите на 0012EB20. Это имеет значение, которое, безусловно, не количество оставшихся жизней. Это означает, что код, который будет поместить значение по этому адресу еще не выполнена. Теперь мы делаем шаг в коде очень медленно и посмотреть, что происходит со стоимостью на 0012EB20. Нажмите клавишу F5, чтобы удалить точку останова, а затем нажмите F7. Теперь Вы активизировали одну строку в коде и вы находитесь в 005911D0, где функция начинается. Шаг снова и снова и снова. И после каждого шага, посмотрите на 0012EB20 в таблицу, чтобы увидеть, если он был изменен.

0012EB20 изменится к числу Ваших оставшихся жизней сразу после выполнения этого кода:

0059120D - 50 - толчок EAX

Это означает, что Ваша жизнь были сохранены на EAX и были оттеснены в стек с помощью этой команды. Очень хорошо. Прокрутка вверх немного, чтобы увидеть весь код:

00591203 - 8B 44 24 24 - MOV EAX, [ESP + 24]
00591207 - 8D B5 E0010000 - Леа ESI, [EBP + 000001E0]
0059120D - 50 - толчок EAX

Из этих нескольких строк, то ясно, что EAX копируется из [ESP + 24], из стека, а затем она была введена в верхней части этого. Ладно, оставим эти коды и нажмите клавишу F9, чтобы что несчастный программу для запуска уже. Мы еще не знаем, где значение, хранящееся в памяти, но у нас есть код, который работает с этим значением, и мы можем изменить его здесь. В качестве последнего теста, положить останова на этот код и играть в игру, чтобы увидеть, что этот код используется только тогда, когда Вы теряете или получить жизнь. Ну что я могу сказать вам, что это функция не используется ни для чего другого, так что вы можете использовать инъекцию кода, чтобы изменить EAX или [ESP + 24] в этой точке.

ПРИМЕЧАНИЕ: Опытные пользователи могут рассмотреть вопрос о создании контрольной точки данных с перерывом на пишите на адрес 0012EB20. Таким образом, они не должны использовать пошаговое и отладчик остановит программу сразу после "толчок EAX" выполняется и значение на 0012EB20 меняется.

Вот видео о завершающем этапе обратной трассировки:



Поздравляю, вы сделали свой "Неограниченные жизни» чит для Chicken Invaders 4 и, надеюсь, Вы узнали что-то новое, что поможет вам обмануть в других играх. Конечно, есть и другие способы, чтобы создать этот код тоже, но это, как я мог положить много информации в одном учебнике, используя только одну игру.

Мир!
Geri

 

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

1. В первый пост я добавил ссылку на перевод всего сайта, потому что удобней читать, когда соблюдено форматирование. Если на русском не понятно, то наводим мышкой и смотрим исходный текст, пытаемся сами перевести по логике.

 

2. Игра называется Chicken Invaders 4 v4.00.  Советую установить игру. Проделать действия, которые описал автор. Лучше один раз сделать самому и увидеть как это работает и как работать с трейсером.

 


 

Объясню статью, для тех кому сложно разобраться.

 

Самая важная часть статьи - это видео, на котором показан принцип работы с логами трейсера и отладчиком. Остальной текст не важен.

 

Есть игрушка Chicken Invaders 4 v4.00. Есть адрес здоровья зашифрованный. Нашли его как показано в первом посте. Поставили бряк. Посмотрели стек. В стеке увидели расшифрованное значение. Не стали делать инъекцию кода, а решили найти инструкцию, которая пишет в стек незашифрованное значение. Вот на видео показано как найти инструкцию push eax, которая запишет незашифрованное значение. Еще раз повторю, важно понять как работать с трейсом.

 

Видео начинается с того, что автор копирует стековый адрес ESP в таблицу CE и изменяет его на адрес 0x0012EB20. Автор будет постоянно следить за этим адресом на видео. Автор хочет найти инструкцию, которая записала незашифрованное число жизней в этот адрес. Это можно сделать как минимум двумя способами. 

 

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

Второй - через пошаговую отладку + трейсер.

 

Первый способ на мой взгляд хуже, т.к. он наудачу. Ведь поставив бряк на запись на 0x0012EB20 можно прерваться много раз и не на исследуемой ветке кода. А вот второй способ четко ведет по ветке кода. Сначала мы поднимается вверх по трейслогам из глубины ветки кода  пока по адресу 0x0012EB20 перестанет показываться здоровье. И вот появился мусор "6209463". Теперь идем вглубь кода F7 и нажимаем F8  двигаясь по шагам, пока по адресу 0x0012EB20 не появится значение жизни - первая запись в стек. И вот мы тут!

 

00591203 - 8B 44 24 24 - mov eax,[esp+24]
00591207 - 8D B5 E0010000 - lea esi,[ebp+000001E0]
0059120D - 50 - push eax << четко тут запись в  0x0012EB20, в стек произошла запись

 

0059120D - 50 - push eax запишет первый раз незашифрованное здоровье. Нужно понять только как мы сюда дошли рабтая с трейсером и пошаговой отладкой. Больше ничего в этой статье понимать не нужно. Дальше идет тупая АА инъекция уже характерная только для этой игры.

 

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

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

  В 16.01.2015 в 09:00, MasterGH сказал:

Есть игрушка Chicken Invaders 4 v4.00. Есть адрес зоровья зашифрованный. Нашли его. Поставили бряк. Посмотрели стек. В стеке увидели расшифрованное значение. 

 

MasterGH я вот все понимаю в этой статьи, НО мне совершенно неясно как он НАШЕЛ зашифрованное значение. Лично я пробовал делать коды почти к всем Chicken Invaders'ам и ничего кроме брони там не сделал, и то только в одной версии. Меня совершенно не интересует нахождение незашифрованного значения, так как здесь его и не найдешь. А нашел он именно ЗАШИФРОВАННОЕ значение, а потом по нему уже делал на мой взгляд ненужные операции.

 

Да и, если не ошибаюсь, товарищь ZOKIR делал видео что делать если по'XOR'ено и как записать именно нужное значение. 

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

  В 16.01.2015 в 16:29, Bromvol сказал:

MasterGH я вот все понимаю в этой статьи,

 

Очень хорошо, что понятно. Больше ничего понимать и не надо. Так как поиск адреса у игр может быть разным и зацикливаться на этом наверно не стоит  :)

 Если не получается найти адрес зашифрованного значения здоровья, то смотрим на инструкции

0044DB20 - 8B 81 04010000 - mov eax,[ecx+00000104]

0044DB26 - 33 81 80000000 - xor eax,[ecx+00000080]

Идем в дизассемблер на инструкцию 0044DB20. Далее просмотреть адреса в квадратных скобках и один из них будет шифрованным значением здоровья.

 

  Показать контент

К сожалению, у меня нет информации о том каким способом искать шифрованное значение в этой игре кроме той информации, что указана в статье. Там указано искать 1 байт изменилось/не изменилось после смерти. Если это сделать, то скорее всего у вас ничего не получиться.

У меня ничего не получилось. Когда я публиковал пост с объяснением статьи, то я не проверял все на игре и думал, что адрес легко найти. Оказалось, что это не так.

Если немного исследовать, что там происходит.

На инструкции 0044DB20 и 0044DB26 необычное ксоривание. Раньше я видел в играх было с ксоривание с постоянной константой и найти было можно по прямой или обратной пропорциональности, т.е. правила поиска: неизвестное, увеличилось, уменьшилось, не изменилось.

А в этой игре константа постоянно рандомится. Т.е. мы имеем два постоянных адреса до гибели с меняющимися шифрованными значениями, ксоривание которых дает расшифрованное значение.

[Адрес1] xor [Адрес2] = Здоровье

или так можно записать

[Адрес1] xor Здоровье = [Адрес2]

[Адрес2] xor Здоровье = [Адрес1]

Здоровье xor  [Адрес1] = [Адрес2]

Здоровье xor [Адрес2] = [Адрес1]

 

Вот какие значения проскакивали на адресах

[ecx+00000104] xor [ecx+00000080]:

8A8F8503 xor 8A8F8507 = 4 сердца

9BBA2503 xor 9BBA2500 = 3 сердца

A605F1C0 xor A605F1C2 = 2 сердца

280EDDDE xor 280EDDDF = 1 сердце

10F4C219 xor 10F4C219 = 0 сердец

Если искать не здоровье, а очки, то будет так

[ecx+00000104] xor [ecx+00000080]:

0x9E0CF73D xor 0x9E0CF6C9 = 500

0x63F00EF6 xor 0x63F00D1E = 1000

0xBF0F1309 xor 0xBF0F14D9 = 2000

Т.е. найти по правилу Geri нереально, похоже он взял это правило с потолка. Отдельные байты по адресам меняются всегда.

 

Когда ни одно правило стандартного поиска не работает, то можно поискать адрес текста, в данной игре адрес теста очков и ставить бряк на запись. Этот адрес точно есть в игре. Трейсить и искать код, который записывает текст из зашифрованных значений.

 

Если и адреса текста найти нельзя, тогда можно попробовать поискать функции через Ultimap. Если опять не работает, то надо думать о других способах

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

Да вот есть такие мастера как Geri. Взломать умеют, а показывают совсем другое.

 

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

 

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

 

P.S. хотелось бы больше узнать об Ultimap в СЕ и об использовании программ FunctionHacker и DynamicCodeAnalize.

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

Прогнал я Ultimap-ом игру. На игру кстати надо переключаться ALt+Tab иначе происходил выход в меню.

 

Так вот, я уменьшал сердца пять раз и по счетчику отсеял инструкции. Они все на скриншоте.

 

Интересно, что адрес на видео... вот он на скриншоте.

 

post-3-0-31476200-1421566915_thumb.png

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

 

Я поставил бряки на все эти инструкции и отпустил игру умерев. Тут же на первой инструкции в стеке засветилось 4 - расшифрованное значение.

 

post-3-0-13193400-1421566908_thumb.png



FunctionHacker я еще попробовал часов шесть назад. FunctionHacker или сейчас его называют CDA: Code Dynamic Analysis не выдерживает работы через какое-то время примерно 10 секунд и закрывает игру с ошибкой.

 

В FunctionHacker все на интуитивном уровне было понятно.

 

1. Подключаем процесс. Снимаем все галочки с регионов памяти и ставим только одну на главном exe модуле игры с правами на выполнения кода (зеленый цвет)

2. Жмем старт

3. Быстренько умирает три раза

4. В фильтре пишем от трех до трех

Все. Игра правда у меня закрывается все равно.

 

Фильтры еще можно ставить по предполагаемым числам в аргументах функций. Но этого можно не делать

 

Вот сравнение Ultimap и CDA

 

post-3-0-96664800-1421569191_thumb.png

 

Много инструкций CDA не увидел. Возможно CDA показал достаточные функции, а Ultimap избыточные, я не проверил. Ultimap показал много инструкций и главное не вылетал через 10 секунд. Ultimap сегодня показал мне BSOD в три ночи и потом после ресета комп не запустился. Я думал, все приплыли. Но после еще одного рестарта все заработало.

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

Спасибо MasterGH, ссылку сюда сделал в своей теме. Всё правильно - если есть в СЕ примочки почему бы не научиться их использовать. Главное понять - как правильно это делать.

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

  • 5 недель спустя...
  В 16.01.2015 в 16:29, Bromvol сказал:

Да и, если не ошибаюсь, товарищь ZOKIR делал видео что делать если по'XOR'ено и как записать именно нужное значение. 

Bromvol, если случайно помнишь, дай ссылку на видео ZOKIR пожалуйста. Просто как раз подобным вопросом занимаюсь. Заранее Благодарю!!!

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

PS:перебрал вручную все видео в разделе, чёй-то ничего похожего за авторством ZOKIR, не нашёл.

Bromvol, так что если помнишь, где это видео лежит, кинь ссылку пжлста. 

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

garik66 вот нашел его видео. В нем есть поиск значения с использованием горячих клавиш, а потом как записывать значения нужные тебе если есть XOR.

 

Вот линк

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

  В 26.02.2015 в 20:42, Bromvol сказал:

garik66 вот нашел его видео. В нем есть поиск значения с использованием горячих клавиш, а потом как записывать значения нужные тебе если есть XOR.

 

Вот линк

Спасибо.

Правда уже успел написать скрипт.

Но всё равно потом посмотрю. 

Ещё раз спасибо.

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

  В 26.02.2015 в 20:42, Bromvol сказал:

garik66 вот нашел его видео. В нем есть поиск значения с использованием горячих клавиш, а потом как записывать значения нужные тебе если есть XOR.

 

Вот линк

Посмотрел.

На мой вкус, у MasterGH на видео гораздо лучше всё объяснено.

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

У ZOCKIR-а видео тяжело понимается, но со второго, третьего... доходит, что оно лучше моего видео по технике без его комментариев, а мое хуже по технике не смотря на объяснения в комментариях. Забегая вперед, я напишу, что полезно смотреть на единую картину целого. Не может существовать одна часть целого без другой части. Так и с двумя видео на одну тему взлома - это одно целое. Ну, да понять сложновато, но если оценивать, что одно хуже, а другое лучше, то это все равно, что удивляться о том, что зима хуже, а лето лучше. Это шанс рассмотреть решение задачи с двух сторон.

 

 Два скрипта, которые он сделал включают и выключают значения в игре сразу, а не после удара как у меня. Потом показано как вышли на xor инструкцию - через поиск уменьшилось/неизменилось - хороший способ. Все достаточно технично выполнено и скрипты вполне хорошие (с сигной было бы идеально)

 

1. Сначала он ищет рабочий адрес золота по правилу уменьшилось

2. Пишет скрипт на золото, а скрипт-то срабатывает и на другие величины. Повезло, ну если бы не повезло, то решалось бы ходу дела.

3. Потом ищет "силу" как float, странно, что эта сила не шифруется

3. Пишет скрипт на силу,  а скрипт-то срабатывает и на другие величины включая здоровье и ману. 

 

Два скрипта, судя по видео рабочие. 

 

Хотя качество видео и мое и ZOKIR хреновое, нечеткое и с трудом понимается, что там за числа в игре, но зато поняв, можно увидеть, что все не так-то сложно ;) Скрипты простые, только в отладке поковыряться немного и с поиском.  Кстати, считать xor в калькуляторе необязательно. Переводы может делать и ассемблерный код.

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

  В 27.02.2015 в 06:01, MasterGH сказал:

Кстати, считать xor в калькуляторе необязательно. Переводы может делать и ассемблерный код.

Да так удобнее, у себя на видео так и делаю.

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

PS: Тем более, что в моём случае константа с которой XORится значение постоянно меняется и калькулятор здесь уже не поможет, только раскодировка в коде инъекции.

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

  • 4 недели спустя...
×
×
  • Создать...

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

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