Как изменить код программы, если потерян исходник
Бывают ситуации, когда под рукой нет исходника, а Вам срочно требуется внести изменения в коде, написанной ранее Вами программы. Например, дано приложение «TextEdit.exe» — текстовый редактор, написанный на языке c#, который имеет простой пользовательский интерфейс, состоящий из двух кнопок и текстового поля.
При нажатии на кнопку “Чтение” из файла 1.txt считываются и выводятся все строки в окно элемента управления textBox, а при нажатии на кнопку “Запись” данные из текстового поля сохраняются в файле 2.txt
Для хранения путей в программе используются две текстовых переменных: filePathIn и filePathOut
Прошёл год, как программа была написана и отдана заказчику, но вдруг ему потребовалось изменить имя папки, в которой должны храниться оба файла, c 123 на Text. Задача простая, но прошло уже много времени, и исходник был потерян, что делать в такой ситуации?
Для начала вспомним, как образуется .NET сборка
Полученный в результате компиляции файл (сборка) содержит внутри себя метаданные, манифест, код на языке IL (MSIL).
Метаданные — описывают типы данных и их члены
Манифест описывают саму сборку
MSIL код, полученный в результате компиляции файла исходного кода
То есть перед вами тот же исходник, только в другом формате. И для того, чтобы поработать с ним, Вам понадобиться специальный инструмент, который позволяет просматривать и редактировать данные внутри сборки.
Дизассемблер ILDASM
Данный инструмент входит состав пакета .Net Framework SDK, который является бесплатным и устанавливается вместе с Visual Studio (включая Express версию). С помощью него вы можете, как просматривать внутреннее содержимое сборки, так и изменять его.
Для удобства работы создадим отдельную папку, например: ”c:newasm” и поместим в неё файл TextEdit.exe
Затем в меню “Пуск” открываем папку: «Visual Studio Tools»
Запускаем командную строку разработчика
Откроется консоль, вводим первую команду: ildasm. Для выполнения команды нажмите клавишу Enter.
Появиться главное окно программы.
Переместим файл сборку TextEdit.exe в окно дизассемблера ILASM, в результате отобразиться её внутреннее содержимое.
Убедимся, что в ней содержатся нужные нам данные (пути к файлам).
Два поля на месте, теперь взглянем на метаданные.
Для доступа к метаданным Вы так же можно использовать сочетание горячих клавиш: Ctrl+M. Затем с помощью кнопки Find, найдём имя одного из файлов.
Как видно присутствуют оба. Пути найдены, и теперь их нужно изменить, но все данные, в текущий момент, доступны только для просмотра, и изменить их в самой дизассемблере нельзя, поэтому воспользуемся второй возможностью данной программы и выгрузим содержимое сборки в файл.
Выгрузка данных
Выберите пункт меню File -> Dump
Появится меню. В данном примере, все пункты меню оставим без изменений и просто нажмём кнопку OK.
Появится диалоговое окно
Выберем ранее созданную папку “newasm”, затем укажем имя и тип файла и нажмём на кнопку “Сохранить”
В результате в папке “newasm” должно появиться несколько новых файлов
Закрываем окно ildasm, а так же удаляем файл Textedit.exe, больше он нам не понадобиться. Теперь нас интересует полученный файл texted.il и для начала откроем его любым текстовым редактором, например блокнотом.
Снова воспользуемся поиском (Ctrl+F)
Так же видим найденные строки, которые содержат пути к файлам.
Изменим текущее имя папки 123 на новое название Text, для обоих файлов
Сохраняем внесённые изменения и закрываем блокнот.
Ассемблер ILASM
Изменения внесены и теперь нужно преобразовать файл txted.il обратно в исполняемый файл (.exe) Для этого нам понабиться второй инструмент ILASM, ассемблер, который так же входит в состав пакета SDK и не требует отдельной установки.
Код:
файл (.il) -> компилятор ilasm = сборка (.exe и .dll)
Возвращаемся в консоль
Вводим вторую команду:
Код:
ilasm /exe c:newasmtxted.il /output=c:newasmtextEdit.exe
Первый параметр: /exe — указывает компилятору, что на выходе мы хотим получить файл с расширением .exe. Затем указываем файл, который содержит MSIL-код. С помощью второго параметра /output — указываем имя и расширение нового файла.
Если компиляции прошла успешно, то в окне консоли вы должны увидеть сообщение, которое выделено на картинке, а внутри папке “newasm” должен появиться новый файл TextEdit.exe, который теперь уже содержит новые пути к файлам.
Вот таким не сложным способом можно выйти из данной ситуации, при этом не имея исходника под рукой.
Читайте также:
- Cоздание файла dll
- Программное выравнивание текста по ширине
- Как удалить параметр реестра Windows
Иногда случаются такие ситуации, когда нужно внести изменения в программу, но исходный код отсутствует. Как тогда изменить код программы?
Решение воздействовать на код программы в отсутствие ее исходного кода случается довольно часто и в основном этому предшествуют 2 основные причины:
- вы потеряли исходный код;
- его у вас никогда и не было, но хотите доработать какую-то программу.
Итак, есть скомпилированный файл, но нет исходного кода, как тогда изменить код программы? На помощь может прийти процесс декомпиляции. Почему «может»? Потому что в некоторых случаях и этот процесс бессилен. Плюс, возможно, вы хотите изменить исходный код программы, который специально защищен. В таком случае программы-декомпиляторы могут оказаться бессильными. Помимо этого, многое зависит от конкретного декомпилятора и языка программирования, на котором написана ваша программа. В некоторых случаях декомпилятор выдает исходный код, в котором вы не сможете найти нужный участок кода для его изменения.
В общем, «в таком положении» — без отсутствия исходного кода — вероятность, что что-то получится, невысокая, но она есть. А раз есть вероятность, значит, можно пробовать.
Как изменить код программы без исходников?
Первым в этом случае вам может помочь процесс декомпиляции. Декомпиляция — это способ создания исходного кода программного обеспечения на том языке, на котором оно было разработано. То есть компиляция — это когда исходный код программного обеспечения преобразуется в машинный код, а декомпиляция — это обратный процесс.
Декомпиляция в некоторых случаях позволяет изменить код программы без исходников, однако нужно понимать, что полностью восстановить исходный код программы может не получиться. Декомпилятор вообще может вам выдать непонятный результат, и вы просто не будете знать, что с этим результатом делать. На практике получается, что чем «меньше» программа, тем качественней проходит процесс декомпиляции, и наоборот — высоконагруженные программы тяжело декомпилируются.
Декомпиляцию возможно осуществить при помощи специализированных программ:
- VB Decompiler;
- ReFox;
- DeDe;
- EMS Source Rescuer;
- PEID;
- и др.
Если вам известно, на каком языке была разработана программа, то нужно искать декомпилятор именно под этот язык программирования. Если же вам неизвестно, на каком языке был разработан исходный код программы, тогда вам потребуется попробовать несколько декомпиляторов, чтобы найти нужный.
Суть декомпиляции сводится к следующему: вы из машинного кода программы пытаетесь восстановить ее исходный код, в котором будете вносить необходимые изменения. Это самый простой метод, но он работает не всегда. Есть еще один альтернативный метод, как изменить исходный код программы без исходника, но он требует специальной подготовки.
Как изменить код программы без декомпиляции?
В качестве альтернативного метода, как изменить код программы без исходника, выступает изучение ассемблера, в частности раздела «реверс-инженерия», чтобы уметь воздействовать на машинный код. Да, это сложно, так как потребует долгого и упорного изучения, но это будет самым верным подходом. Ведь в этом случае вы будете знать, на какой байт вам нужно воздействовать, чтобы произвести изменения в машинном коде программе. На сайте SpyLife вы сможете найти топ-3 программных обеспечений, позволяющее получать всю необходимую информацию со стороннего устройства.
В качестве вспомогательного инструмента в этом случае будут программы OllyDbg и Ida PRO.
Заключение
Изменить код программы без исходника возможно только одним из описанных выше способов:
- используя декомпилятор;
- изучая ассемблер.
Кстати, декомпилятор может помочь узнать, на каком языке написан исходный код. Принцип распознавания прост: к какому языку программирования относится декомпилятор, который сможет обработать загружаемый код, к тому языку и будет относиться исходный код программы.
Здравствуйте! Только что задался вопросом: можно ли изменить код уже скомпилированной программы(так чтобы она работала)? То есть, имея исполняемый файл, можно ли его открыть как текстовый документ и изменять(ну всё-таки исходные коды линковщиков и компиляторов есть же). Я понимаю, что после работы компилятора, си там уже не пахнет, но всё же, изучив структуру ехе файла — это можно сделать, или это полный бред?
задан 28 апр 2017 в 20:26
1
Полностью исходный код программы конечно получить не возможно, но есть декомпиляторы которые его стараются восстановить, но получается из этого вырви-глаз и разбирать там не чего, а тем более редактировать. Насчёт редактирования ПО, это вам нужно изучить ассемблер (советую гуглить по запросу «реверс инжиниринг») и научиться таким программам как OllyDbg либо IdaPRO (платная и достаточно дороговатая) и потом уже делать патчи на те программы которые вы хотите, точнее редактировать. Но есть проблема в вашем вопросе, как вы хотите её редактировать, если просто дизайн, то вам достаточно и редактора ресурсов, которых OVER 9999+ в интернете как бесплатных(Resource Hacker), так и платных(Resource Tuner).
ответ дан 28 апр 2017 в 20:31
alex-rudenkiyalex-rudenkiy
4,0122 золотых знака17 серебряных знаков34 бронзовых знака
13
Через конкретно блокнот (или там Word) — нет, запорет он вам некоторые символы…
А вот hex-редактором — в принципе можно. А как, по-вашему, всякие ломалки работают? 
Только тут — как в том апокрифе со старшим Капицей, которому якобы обещали за границей 10000 марок за ремонт какой-то там установки. Он приехал, посмотрел, сказал ассистенту ударить молотком в таком-то месте — все заработало. За такую работу принимающей стороне сумма показалась слишком большой, попросили счет. Он выглядел так:
Удар молотком — 1 марка.
За то что знал, где ударить — 9999 марок.
Словом, чтоб знать, куда ударить и какие байты и как поменять — надо долго и упорно учиться 
Поменять какие-то данные типа, чтоб не Hello world выводила, а типа Coolhacker 
ответ дан 29 апр 2017 в 5:09
HarryHarry
210k15 золотых знаков115 серебряных знаков224 бронзовых знака
I have a small executable that I downloaded from the net, and that runs in the Command Line, which makes me think it may be a DOS program. The program works perfectly, but due to being developed by a non-English speaker, the interface/presentation of it needs to be cleaned up to make it look a little more professional. Is it possible to get to the file’s source code and edit it?
asked Jan 1, 2016 at 20:05
1
Principally: Yes.
But: it’s not practically.
You could change the machine-code within the .exe, but that’s not really practically if you want to change the interface/presentation. Also you would need to do it at least in assembly language.
If you want to improve the software, I think, the best would be to contact the developer and ask if you can help him to improve the software.
If you want to take a look inside the .exe anyway you could try OllyDbg.
If you want to change something in such an existing program, you have basically 3 ways to do it:
-
Changing the machine code itself:
The representation of the machine code does not need to be 1’s and 0’s, you can use any other number system. Anyway machine code is really, really hard to read and edit. Additionally you have also the same problems like you ‘simply’ disassemble the program. -
Use a disassembler and modify the assembler code:
You have to take care of the memory layout of the software you want to modify. Since any change on some string could override another variable. And assembler is also not easy to read and write. So depending on the size of the software, it takes some time to get a basic overview about where to change the code. -
Or use a decompiler:
But you mostly won’t get any useful variable names, since the compiler removes them most of the time.
Another point you have to take a look at is anti debugging and reverse engineering tools. They may prevent from running the piece of code inside debugger like OllyDbg or getting useful decompiled code.
Also take a look at peter ferrie’s answer.
answered Jan 1, 2016 at 20:28
falxfalx
664 bronze badges
4
The short answer is no — the source is not available if only the .exe is available. The source code is an entirely separate file which is generally not shared with the public. However, given the .exe file, it might be possible to «decompile» it into a form of source code which would allow a new .exe file to be produced, and which should match the existing one fairly well when performing a byte-for-byte comparison.
With that decompiled source code in hand, it would be possible to make modifications to the behavior or appearance of the program, but it would be far from trivial, since such relatively important things as variable names will not be present, so deriving the meaning of certain memory accesses will require a lot of time and effort.
You would need to consider carefully if the effort is worth the reward.
answered Jan 2, 2016 at 5:18
peter ferriepeter ferrie
4,5413 gold badges17 silver badges33 bronze badges
0
I have a small executable that I downloaded from the net, and that runs in the Command Line, which makes me think it may be a DOS program. The program works perfectly, but due to being developed by a non-English speaker, the interface/presentation of it needs to be cleaned up to make it look a little more professional. Is it possible to get to the file’s source code and edit it?
asked Jan 1, 2016 at 20:05
1
Principally: Yes.
But: it’s not practically.
You could change the machine-code within the .exe, but that’s not really practically if you want to change the interface/presentation. Also you would need to do it at least in assembly language.
If you want to improve the software, I think, the best would be to contact the developer and ask if you can help him to improve the software.
If you want to take a look inside the .exe anyway you could try OllyDbg.
If you want to change something in such an existing program, you have basically 3 ways to do it:
-
Changing the machine code itself:
The representation of the machine code does not need to be 1’s and 0’s, you can use any other number system. Anyway machine code is really, really hard to read and edit. Additionally you have also the same problems like you ‘simply’ disassemble the program. -
Use a disassembler and modify the assembler code:
You have to take care of the memory layout of the software you want to modify. Since any change on some string could override another variable. And assembler is also not easy to read and write. So depending on the size of the software, it takes some time to get a basic overview about where to change the code. -
Or use a decompiler:
But you mostly won’t get any useful variable names, since the compiler removes them most of the time.
Another point you have to take a look at is anti debugging and reverse engineering tools. They may prevent from running the piece of code inside debugger like OllyDbg or getting useful decompiled code.
Also take a look at peter ferrie’s answer.
answered Jan 1, 2016 at 20:28
falxfalx
664 bronze badges
4
The short answer is no — the source is not available if only the .exe is available. The source code is an entirely separate file which is generally not shared with the public. However, given the .exe file, it might be possible to «decompile» it into a form of source code which would allow a new .exe file to be produced, and which should match the existing one fairly well when performing a byte-for-byte comparison.
With that decompiled source code in hand, it would be possible to make modifications to the behavior or appearance of the program, but it would be far from trivial, since such relatively important things as variable names will not be present, so deriving the meaning of certain memory accesses will require a lot of time and effort.
You would need to consider carefully if the effort is worth the reward.
answered Jan 2, 2016 at 5:18
peter ferriepeter ferrie
4,5413 gold badges17 silver badges33 bronze badges
0
|
Nikakula 9 / 9 / 16 Регистрация: 07.03.2014 Сообщений: 202 |
||||
|
1 |
||||
|
25.03.2014, 10:10. Показов 14907. Ответов 21 Метки нет (Все метки)
Вот, допустим, имеем exe файл с таким кодом
Как можно без сторонних программ изменить, допустим, значение переменной a?Еще раз говорю имеем только exe файл!
__________________
0 |
|
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
25.03.2014, 10:10 |
|
21 |
|
Почетный модератор 64272 / 47571 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
|
25.03.2014, 10:24 |
2 |
|
Решение
Как можно без сторонних программ изменить Да никак.
0 |
|
9 / 9 / 16 Регистрация: 07.03.2014 Сообщений: 202 |
|
|
25.03.2014, 10:27 [ТС] |
3 |
|
Понятно, спасибо
0 |
|
Программист 307 / 182 / 176 Регистрация: 05.12.2013 Сообщений: 683 Записей в блоге: 5 |
|
|
25.03.2014, 12:42 |
4 |
|
без сторонних программ А что вообще на компе делается без сторонних программ? Воздействовать непосредственно на ячейки памяти остается. Ну а если допустимо использовать программы, то элементарно заменяется.
0 |
|
9 / 9 / 16 Регистрация: 07.03.2014 Сообщений: 202 |
|
|
25.03.2014, 17:36 [ТС] |
5 |
|
Arigato_RU, нет, я имел ввиду не использовать всякие уже готовые программы, скачанные из интернет, в которых только кнопочку нажать и все. Добавлено через 2 минуты
0 |
|
Программист 307 / 182 / 176 Регистрация: 05.12.2013 Сообщений: 683 Записей в блоге: 5 |
|
|
25.03.2014, 17:49 |
6 |
|
Открывай файл с exe, находи то место, где прописано нужное значение, записывай туда новое значение, закрывай файл.
0 |
|
0 / 0 / 0 Регистрация: 28.07.2013 Сообщений: 30 |
|
|
25.03.2014, 17:56 |
7 |
|
Дружище для того чтобы изменить код программы уже ехе файла, тебе нужно стать спецом в области дисассемблирования. Успехов
0 |
|
9 / 9 / 16 Регистрация: 07.03.2014 Сообщений: 202 |
|
|
25.03.2014, 19:25 [ТС] |
8 |
|
Arigato_RU, можете поподробнее рассказать про
Открывай файл с exe, находи то место, где прописано нужное значение, записывай туда новое значение, закрывай файл. там же одни иероглифы Добавлено через 1 минуту
0 |
|
Arigato Программист 307 / 182 / 176 Регистрация: 05.12.2013 Сообщений: 683 Записей в блоге: 5 |
||||||||||
|
25.03.2014, 19:29 |
9 |
|||||||||
|
РешениеБерем исходную программу:
Компилируем, получаем Program1.exe (можно скачать из вложения). Теперь пишем программу-патч:
Она просит ввести новые значения переменных, записывает их прямо в Program1.exe. Для этого надо знать адреса, где хранятся значения: $EEE — переменная a, $EF4 — переменная b. Я узнал эти адреса, запустив программу WinHex, открыв в ней Program1.exe и воспользовавшись поиском целых значений. В принципе, такой поиск легко написать на Pascal, просто просматриваем файл и сравниваем с нужным значением, тем самым находим его адрес. Вложения
1 |
|
9 / 9 / 16 Регистрация: 07.03.2014 Сообщений: 202 |
|
|
25.03.2014, 19:33 [ТС] |
10 |
|
Я просто не такой хакер, как ты
0 |
|
Программист 307 / 182 / 176 Регистрация: 05.12.2013 Сообщений: 683 Записей в блоге: 5 |
|
|
25.03.2014, 19:36 |
11 |
|
seek — переместить указатель файла в нужную позицию. Для поиска адреса качай WinHex и в нем ищи.
0 |
|
9 / 9 / 16 Регистрация: 07.03.2014 Сообщений: 202 |
|
|
25.03.2014, 20:00 [ТС] |
12 |
|
Ну а все-таки, как написать программу поиска этих адресов Добавлено через 3 минуты Добавлено через 2 минуты
0 |
|
Программист 307 / 182 / 176 Регистрация: 05.12.2013 Сообщений: 683 Записей в блоге: 5 |
|
|
25.03.2014, 20:03 |
13 |
|
Ну а все-таки, как написать программу поиска этих адресов Банальная работа с файлами, чтение файла.
И еще я не понял, вот ты перемещаешь указатель в то место, где записано значение переменной a, и сразу пишешь новое значение, а куда старое девается? Старое значение исчезает навсегда
0 |
|
Nikakula 9 / 9 / 16 Регистрация: 07.03.2014 Сообщений: 202 |
||||
|
25.03.2014, 20:18 [ТС] |
14 |
|||
|
Банальная работа с файлами, чтение файла. Я понимаю, что работа с файлами, но как найти этот адрес, как определить, что у переменной «a» адрес $EEE?
напиши хотябы словами, как дальше делать, что именно там надо искать? Надо искать значение 200(для переменной «a»), если так, то найду я его, и как дальше, как найти адрес?
0 |
|
Arigato Программист 307 / 182 / 176 Регистрация: 05.12.2013 Сообщений: 683 Записей в блоге: 5 |
||||
|
25.03.2014, 20:25 |
15 |
|||
|
Ты вообще представляешь, что такое файл? У меня складывается ощущение, что не представляешь. Вот пример для поиска произвольного значения в бинарном файле, находит только первое встретившееся:
0 |
|
9 / 9 / 16 Регистрация: 07.03.2014 Сообщений: 202 |
|
|
25.03.2014, 20:37 [ТС] |
16 |
|
Я не понимаю вот что
0 |
|
Программист 307 / 182 / 176 Регистрация: 05.12.2013 Сообщений: 683 Записей в блоге: 5 |
|
|
25.03.2014, 20:37 |
17 |
|
200 надо искать. Вообще, рано вы полезли в такие дебри.
0 |
|
Nikakula 9 / 9 / 16 Регистрация: 07.03.2014 Сообщений: 202 |
||||
|
25.03.2014, 20:40 [ТС] |
18 |
|||
и можешь еще объяснить эту строчку Добавлено через 53 секунды Добавлено через 1 минуту
0 |
|
Программист 307 / 182 / 176 Регистрация: 05.12.2013 Сообщений: 683 Записей в блоге: 5 |
|
|
25.03.2014, 20:41 |
19 |
|
и можешь еще объяснить эту строчку Размер файла в байтах минус размер переменной типа integer (оно 4 равно).
Ну, допустим, я нашел 200, а как узнать адрес? Так где нашел, там и адрес.
0 |
|
Nikakula 9 / 9 / 16 Регистрация: 07.03.2014 Сообщений: 202 |
||||||||
|
25.03.2014, 20:59 [ТС] |
20 |
|||||||
|
Размер файла в байтах минус размер переменной типа integer (оно 4 равно). А зачем это делать?
Так где нашел, там и адрес. Вообщем, чтобы проще было, можешь пример написать, как это выглядит Добавлено через 5 минут
А зачем каждый раз указатель возвращать в начало, проверятся же по сути будет одно и тоже слово!
А здесь, в переменную «x» считывается же вся строчка, как ты можешь проверять равна ли она x, тебе же надо только слово сравнивать?
0 |
|
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
25.03.2014, 20:59 |
|
20 |
Гайд. Как редактировать исходный код игры.
Сегодня мы наконец-то расскажем вам, как-же редактировать исходный код игры на ПК.
Необходимый софт
Немного теории
И так, что же мы будем делать?
Мы сначала дизассемблируем AoC2, проверим результат, внесем некоторые изменения и заново соберем АоС2.
Что же такое дизассемблирование?
Для начала, разберемся с Java Virtual Machine (JVM).
Что такое JVM? JVM — это программное обеспечение, которое эмулирует компьютер. JVM используется для запуска приложений, написанных на java. Однако JVM читает не просто java код, а скомпилированный байт-код Java, предварительно созданный из исходного кода Java-программой-компилятором Java (javac).
Использование байт-кода и JVM позволяет запустить скомпилированную программу на любом другом устройстве, на котором установлена JVM.
Вот мы и подошли к дизассемблированию. Дизассемблирование — это трансляция машинного кода в изменяемый байт-код.
(Если кто-то еще не понял, то АоС2 написана на Java)
Итак, мы разобрались как работает JVM, и можем приступать к работе.
Дизассемблирование
Заходим в скачанную нами программу (muxv.exe) и выбираем раздел «Дизассемблирование».
Указываем путь к файлу «disassemble.pу», который лежит в папке, в которую установлена Krakatau, потом указываем все остальные папки и файлы.
Если вы все сделали правильно, то у вас должно появиться такое окно командной строки:
После окончания дизассемблирования, откройте папку, которую вы указали, как «Директория, куда отправятся дизассемблированные файлы» и найдите там файл Menu_About.j (без цифр). Откройте его любым текстовым редактором.
Перед вами должна появиться примерно такая картина:
Это — байт-код java, с ним мы и будем дальше работать.
Для начала определимся, что мы будем изменять. Допустим, вы решили заменить автора музыки в разделе «Подробнее».
Это читерство! Учимся взламывать игры и писать читы на простом примере
Существуют разные виды читов. Можно разделить их на несколько групп.
External — внешние читы, которые работают в отдельном процессе. Если же мы скроем наш external-чит, загрузив его в память другого процесса, он превратится в hidden external.
Internal — внутренние читы, которые встраиваются в процесс самой игры при помощи инжектора. После загрузки в память игры в отдельном потоке вызывается точка входа чита.
Pixelscan — вид читов, который использует картинку с экрана и паттерны расположения пикселей, чтобы получить необходимую информацию от игры.
Network proxy — читы, которые используют сетевые прокси, те, в свою очередь, перехватывают трафик клиента и сервера, получая или изменяя необходимую информацию.
Есть три основные тактики модификации поведения игры.
- Изменение памяти игры. API операционной системы используется для поиска и изменения участков памяти, содержащих нужную нам информацию (например, жизни, патроны).
- Симуляция действий игрока: приложение повторяет действия игрока, нажимая мышкой в заранее указанных местах.
- Перехват трафика игры. Между игрой и сервером встает чит. Он перехватывает данные, собирая или изменяя информацию, чтобы обмануть клиент или сервер.
Большинство современных игр написаны для Windows, поэтому и примеры мы будем делать для нее же.
Пишем игру на C
Про читы лучше всего рассказывать на практике. Мы напишем свою небольшую игру, на которой сможем потренироваться. Я буду писать игру на C#, но постараюсь максимально приблизить структуру данных к игре на C++. По моему опыту читерить в играх на C# очень просто.
Принцип игры прост: нажимаешь Enter и проигрываешь. Не особо честные правила, да? Попробуем их изменить.
Приступим к реверс-инжинирингу
Исполняемый файл игры
У нас есть файл игры. Но вместо исходного кода мы будем изучать память и поведение приложения.
Начнем с поведения игры
При каждом нажатии Enter жизни игрока уменьшаются на 15. Начальное количество жизней — 100.
Изучать память мы будем при помощи Cheat Engine. Это приложение для поиска переменных внутри памяти приложения, а еще хороший дебаггер. Перезапустим игру и подключим к ней Cheat Engine.
Подключение CE к игре
Первым делом мы получаем список всех значений 85 в памяти.
Все значения, которые нашел CE
Нажмем Enter, и показатель жизней будет равен 70 . Отсеем все значения.
Значение найдено
Вот и нужное значение! Изменим его и нажмем Enter для проверки результата.


Проблема в том, что после перезапуска игры значение будет уже по другому адресу. Каждый раз отсеивать его нет никакого смысла. Необходимо прибегнуть к сканированию AOB (Array Of Bytes — массив байтов).
При каждом новом открытии приложения из-за рандомизации адресного пространства (ASLR) структура, описывающая игрока, будет находиться на новом месте. Чтобы найти ее, необходимо сначала обнаружить сигнатуру. Сигнатура — это набор не меняющихся в структуре байтов, по которым можно искать в памяти приложения.
После нескольких нажатий на Enter количество жизней изменилось на 55 . Снова найдем нужное значение в памяти и откроем регион, в котором оно находится.
Регион памяти
Выделенный байт и есть начало нашего int32 -числа. 37 00 00 00 — число 55 в десятичной форме.
Я скопирую небольшой регион памяти и вставлю в блокнот для дальнейшего изучения. Теперь перезапустим приложение и снова найдем значение в памяти. Снова скопируем такой же регион памяти и вставим в блокнот. Начнем сравнение. Цель — найти байты рядом с этой сигнатурой, которые не будут меняться.
Начинаем сравнивать байты
Проверим байты перед структурой.
Бинго!
Как видишь, выделенные байты не изменились, значит, можно попробовать использовать их как сигнатуру. Чем меньше сигнатура, тем быстрее пройдет сканирование. Сигнатура 01 00 00 00 явно будет слишком часто встречаться в памяти. Лучше взять 03 00 00 01 00 00 00 . Для начала найдем ее в памяти.
Сигнатура не уникальна
Сигнатура найдена, но она повторяется. Необходима более уникальная последовательность. Попробуем ED 03 00 00 01 00 00 00 .
В подтверждение уникальности получим такой результат:
Сигнатура уникальна
Нам необходимо найти отступ от сигнатуры, чтобы получить ее стартовый адрес, а не адрес жизней. Пока сохраним найденную сигнатуру и отложим на некоторое время. Не беспокойся, мы к ней еще вернемся.
Жизненный цикл external
Используя функцию OpenProcess , внешние читы получают дескриптор для нужного процесса и вносят необходимые изменения в код (патчинг) или считывают и изменяют переменные внутри памяти игры. Для модификации памяти используются функции ReadProcessMemory и WriteProcessMemory .
Так как динамическое размещение данных в памяти мешает записать нужные адреса и постоянно к ним обращаться, можно использовать технику поиска AOB. Жизненный цикл external-чита выглядит так:
- Найти ID процесса.
- Получить дескриптор к этому процессу с нужными правами.
- Найти адреса в памяти.
- Пропатчить что-то, если нужно.
- Отрисовать GUI, если он имеется.
- Считывать или изменять память по мере надобности.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Как изменить код?
Такой вопрос, у меня есть своя браузерная игра, и я бы хотел узнать : в разных играх можно с помощью разных IDE редакторов ((или как-то так, можно локально изменить работу игры, например указываешь путь и скажем, можно изменить скорость передвижения персонажа )) и вот я хотел спросить, как можно провернуть такую же фигню в браузерной игре? ((скрин это пример))

Сообщение было отмечено Nikakula как решение


можешь объяснить, что значит seek в 14 строчке и как написать эту самую программу поиска адресов переменных, я вообще не понял, что за адрес, объясни пожалуйста)















