Как изменить код любой программы

Как изменить код программы, если потерян исходник Бывают ситуации, когда под рукой нет исходника, а Вам срочно требуется внести изменения в коде, написанной ранее Вами программы. Например, дано приложение «TextEdit.exe» — текстовый редактор, написанный на языке c#, который имеет простой...

Как изменить код программы, если потерян исходник

Бывают ситуации, когда под рукой нет исходника, а Вам срочно требуется внести изменения в коде, написанной ранее Вами программы. Например, дано приложение «TextEdit.exe» — текстовый редактор, написанный на языке c#, который имеет простой пользовательский интерфейс, состоящий из двух кнопок и текстового поля.

28381

При нажатии на кнопку “Чтение” из файла 1.txt считываются и выводятся все строки в окно элемента управления textBox, а при нажатии на кнопку “Запись” данные из текстового поля сохраняются в файле 2.txt

Для хранения путей в программе используются две текстовых переменных: filePathIn и filePathOut

28382

Прошёл год, как программа была написана и отдана заказчику, но вдруг ему потребовалось изменить имя папки, в которой должны храниться оба файла, c 123 на Text. Задача простая, но прошло уже много времени, и исходник был потерян, что делать в такой ситуации?

Для начала вспомним, как образуется .NET сборка

28383

Полученный в результате компиляции файл (сборка) содержит внутри себя метаданные, манифест, код на языке IL (MSIL).

Метаданные — описывают типы данных и их члены

Манифест описывают саму сборку

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

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

Дизассемблер ILDASM

Данный инструмент входит состав пакета .Net Framework SDK, который является бесплатным и устанавливается вместе с Visual Studio (включая Express версию). С помощью него вы можете, как просматривать внутреннее содержимое сборки, так и изменять его.

Для удобства работы создадим отдельную папку, например: ”c:newasm” и поместим в неё файл TextEdit.exe

28384

Затем в меню “Пуск” открываем папку: «Visual Studio Tools»

28385

Запускаем командную строку разработчика

28386

Откроется консоль, вводим первую команду: ildasm. Для выполнения команды нажмите клавишу Enter.

28387

Появиться главное окно программы.

28388

Переместим файл сборку TextEdit.exe в окно дизассемблера ILASM, в результате отобразиться её внутреннее содержимое.

28389

Убедимся, что в ней содержатся нужные нам данные (пути к файлам).

28390

Два поля на месте, теперь взглянем на метаданные.

28391

Для доступа к метаданным Вы так же можно использовать сочетание горячих клавиш: Ctrl+M. Затем с помощью кнопки Find, найдём имя одного из файлов.

28393

28394

28395

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

Выгрузка данных

Выберите пункт меню File -> Dump

28396

Появится меню. В данном примере, все пункты меню оставим без изменений и просто нажмём кнопку OK.

28397

Появится диалоговое окно

28398

Выберем ранее созданную папку “newasm”, затем укажем имя и тип файла и нажмём на кнопку “Сохранить”

28399

В результате в папке “newasm” должно появиться несколько новых файлов

28400

Закрываем окно ildasm, а так же удаляем файл Textedit.exe, больше он нам не понадобиться. Теперь нас интересует полученный файл texted.il и для начала откроем его любым текстовым редактором, например блокнотом.

28401

Снова воспользуемся поиском (Ctrl+F)

28402

Так же видим найденные строки, которые содержат пути к файлам.

28403

Изменим текущее имя папки 123 на новое название Text, для обоих файлов

28404

Сохраняем внесённые изменения и закрываем блокнот.

Ассемблер ILASM

Изменения внесены и теперь нужно преобразовать файл txted.il обратно в исполняемый файл (.exe) Для этого нам понабиться второй инструмент ILASM, ассемблер, который так же входит в состав пакета SDK и не требует отдельной установки.

Код:

файл (.il) -> компилятор ilasm =  сборка (.exe и .dll)

Возвращаемся в консоль

28408

Вводим вторую команду:

Код:

ilasm /exe c:newasmtxted.il /output=c:newasmtextEdit.exe

Первый параметр: /exe — указывает компилятору, что на выходе мы хотим получить файл с расширением .exe. Затем указываем файл, который содержит MSIL-код. С помощью второго параметра /output — указываем имя и расширение нового файла.

28406

Если компиляции прошла успешно, то в окне консоли вы должны увидеть сообщение, которое выделено на картинке, а внутри папке “newasm” должен появиться новый файл TextEdit.exe, который теперь уже содержит новые пути к файлам.

28407

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

Читайте также:

  • Cоздание файла dll
  • Программное выравнивание текста по ширине
  • Как удалить параметр реестра Windows

Иногда случаются такие ситуации, когда нужно внести изменения в программу, но исходный код отсутствует. Как тогда изменить код программы?

Решение воздействовать на код программы в отсутствие ее исходного кода случается довольно часто и в основном этому предшествуют 2 основные причины:

  • вы потеряли исходный код;
  • его у вас никогда и не было, но хотите доработать какую-то программу.

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

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

 

Как изменить код программы без исходников?

Первым в этом случае вам может помочь процесс декомпиляции. Декомпиляция — это способ создания исходного кода программного обеспечения на том языке, на котором оно было разработано. То есть компиляция — это когда исходный код программного обеспечения преобразуется в машинный код, а декомпиляция — это обратный процесс.

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

Декомпиляцию возможно осуществить при помощи специализированных программ:

  1. VB Decompiler;
  2. ReFox;
  3. DeDe;
  4. EMS Source Rescuer;
  5. PEID;
  6. и др.

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

Суть декомпиляции сводится к следующему: вы из машинного кода программы пытаетесь восстановить ее исходный код, в котором будете вносить необходимые изменения. Это самый простой метод, но он работает не всегда. Есть еще один альтернативный метод, как изменить исходный код программы без исходника, но он требует специальной подготовки.

 

Как изменить код программы без декомпиляции?

В качестве альтернативного метода, как изменить код программы без исходника, выступает изучение ассемблера, в частности раздела «реверс-инженерия», чтобы уметь воздействовать на машинный код. Да, это сложно, так как потребует долгого и упорного изучения, но это будет самым верным подходом. Ведь в этом случае вы будете знать, на какой байт вам нужно воздействовать, чтобы произвести изменения в машинном коде программе. На сайте SpyLife вы сможете найти топ-3 программных обеспечений, позволяющее получать всю необходимую информацию со стороннего устройства.

В качестве вспомогательного инструмента в этом случае будут программы OllyDbg и Ida PRO.

 

Заключение

Изменить код программы без исходника возможно только одним из описанных выше способов:

  • используя декомпилятор;
  • изучая ассемблер.

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

Здравствуйте! Только что задался вопросом: можно ли изменить код уже скомпилированной программы(так чтобы она работала)? То есть, имея исполняемый файл, можно ли его открыть как текстовый документ и изменять(ну всё-таки исходные коды линковщиков и компиляторов есть же). Я понимаю, что после работы компилятора, си там уже не пахнет, но всё же, изучив структуру ехе файла — это можно сделать, или это полный бред?

задан 28 апр 2017 в 20:26

Stdugnd4ikbd's user avatar

1

Полностью исходный код программы конечно получить не возможно, но есть декомпиляторы которые его стараются восстановить, но получается из этого вырви-глаз и разбирать там не чего, а тем более редактировать. Насчёт редактирования ПО, это вам нужно изучить ассемблер (советую гуглить по запросу «реверс инжиниринг») и научиться таким программам как OllyDbg либо IdaPRO (платная и достаточно дороговатая) и потом уже делать патчи на те программы которые вы хотите, точнее редактировать. Но есть проблема в вашем вопросе, как вы хотите её редактировать, если просто дизайн, то вам достаточно и редактора ресурсов, которых OVER 9999+ в интернете как бесплатных(Resource Hacker), так и платных(Resource Tuner).

ответ дан 28 апр 2017 в 20:31

alex-rudenkiy's user avatar

alex-rudenkiyalex-rudenkiy

4,0122 золотых знака17 серебряных знаков34 бронзовых знака

13

Через конкретно блокнот (или там Word) — нет, запорет он вам некоторые символы…
А вот hex-редактором — в принципе можно. А как, по-вашему, всякие ломалки работают? :) Именно так — меняя в нужных местах код/данные.
Только тут — как в том апокрифе со старшим Капицей, которому якобы обещали за границей 10000 марок за ремонт какой-то там установки. Он приехал, посмотрел, сказал ассистенту ударить молотком в таком-то месте — все заработало. За такую работу принимающей стороне сумма показалась слишком большой, попросили счет. Он выглядел так:

Удар молотком — 1 марка.
За то что знал, где ударить — 9999 марок.

Словом, чтоб знать, куда ударить и какие байты и как поменять — надо долго и упорно учиться :)

Поменять какие-то данные типа, чтоб не Hello world выводила, а типа Coolhacker :) — это попроще…

ответ дан 29 апр 2017 в 5:09

Harry's user avatar

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

Hashim Aziz's user avatar

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:

  1. 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.

  2. 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.

  3. 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.

Community's user avatar

answered Jan 1, 2016 at 20:28

falx's user avatar

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 ferrie's user avatar

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

Hashim Aziz's user avatar

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:

  1. 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.

  2. 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.

  3. 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.

Community's user avatar

answered Jan 1, 2016 at 20:28

falx's user avatar

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 ferrie's user avatar

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 файл с таким кодом

Pascal
1
2
3
4
5
6
7
begin
var a,b,c:integer;
a:=200;
b:=300;
c:=a+b;
writeln(c);
end.

Как можно без сторонних программ изменить, допустим, значение переменной 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

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

Решение

Цитата
Сообщение от Nikakula
Посмотреть сообщение

Как можно без сторонних программ изменить

Да никак.



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

Цитата
Сообщение от Nikakula
Посмотреть сообщение

без сторонних программ

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



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, можете поподробнее рассказать про

Цитата
Сообщение от Arigato_RU
Посмотреть сообщение

Открывай файл с exe, находи то место, где прописано нужное значение, записывай туда новое значение, закрывай файл.

там же одни иероглифы

Добавлено через 1 минуту
Я же правильно понимаю, что разрешение вместо exe надо поменять на txt, и открывать или как то по другому?



0



Arigato

Программист

307 / 182 / 176

Регистрация: 05.12.2013

Сообщений: 683

Записей в блоге: 5

25.03.2014, 19:29

9

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

Решение

Берем исходную программу:

Pascal
1
2
3
4
5
6
7
8
begin
var a,b,c:integer;
a:=200;
b:=300;
c:=a+b;
writeln(c);
readln;
end.

Компилируем, получаем Program1.exe (можно скачать из вложения).

Теперь пишем программу-патч:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var
  a,b: integer;
  f: file;
  ok: boolean;
begin
  write('a = '); readln(a);
  write('b = '); readln(b);
  ok:=true;
  try
    assign(f,'Program1.exe');
    reset(f);
    seek(f,$EEE);
    write(f,a);
    seek(f,$EF4);
    write(f,b);
    close(f);
  except
    ok:=false;
  end;
  if ok
    then writeln('OK')
    else writeln('WRONG');
end.

Она просит ввести новые значения переменных, записывает их прямо в Program1.exe. Для этого надо знать адреса, где хранятся значения: $EEE — переменная a, $EF4 — переменная b. Я узнал эти адреса, запустив программу WinHex, открыв в ней Program1.exe и воспользовавшись поиском целых значений. В принципе, такой поиск легко написать на Pascal, просто просматриваем файл и сравниваем с нужным значением, тем самым находим его адрес.

Вложения

Тип файла: rar Program1.rar (4.0 Кб, 16 просмотров)



1



9 / 9 / 16

Регистрация: 07.03.2014

Сообщений: 202

25.03.2014, 19:33

 [ТС]

10

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



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 минуты
И еще я не понял, вот ты перемещаешь указатель в то место, где записано значение переменной a, и сразу пишешь новое значение, а куда старое девается?



0



Программист

307 / 182 / 176

Регистрация: 05.12.2013

Сообщений: 683

Записей в блоге: 5

25.03.2014, 20:03

13

Цитата
Сообщение от Nikakula
Посмотреть сообщение

Ну а все-таки, как написать программу поиска этих адресов

Банальная работа с файлами, чтение файла.

Цитата
Сообщение от Nikakula
Посмотреть сообщение

И еще я не понял, вот ты перемещаешь указатель в то место, где записано значение переменной a, и сразу пишешь новое значение, а куда старое девается?

Старое значение исчезает навсегда



0



Nikakula

9 / 9 / 16

Регистрация: 07.03.2014

Сообщений: 202

25.03.2014, 20:18

 [ТС]

14

Цитата
Сообщение от Arigato_RU
Посмотреть сообщение

Банальная работа с файлами, чтение файла.

Я понимаю, что работа с файлами, но как найти этот адрес, как определить, что у переменной «a» адрес $EEE?

Pascal
1
2
3
4
var f:text
begin
assign(f,'путь к программе');
reset(f);

напиши хотябы словами, как дальше делать, что именно там надо искать? Надо искать значение 200(для переменной «a»), если так, то найду я его, и как дальше, как найти адрес?



0



Arigato

Программист

307 / 182 / 176

Регистрация: 05.12.2013

Сообщений: 683

Записей в блоге: 5

25.03.2014, 20:25

15

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

Вот пример для поиска произвольного значения в бинарном файле, находит только первое встретившееся:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var
  f: file;
  a,x: integer;
  p,ef: int64;
  found: boolean;
begin
  write('a = '); readln(a);
  assign(f,'Program1.exe');
  reset(f);
  p:=0;
  found:=false;
  ef:=filesize(f)-sizeof(integer);
  while p<ef do begin
    seek(f,p);
    read(f,x);
    if x=a then begin
      writeln(p);
      found:=true;
    end;
    inc(p);
  end;
  close(f);
  if not found then
    writeln('Not Found!');
end.



0



9 / 9 / 16

Регистрация: 07.03.2014

Сообщений: 202

25.03.2014, 20:37

 [ТС]

16

Я не понимаю вот что
там в файл так и будет написано
$EEE=200 или как там будет в файле написано, что «a» = 200
я понимаю, как искать, я не понимаю, что мне надо искать



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

Pascal
1
ef:=filesize(f)-sizeof(integer);

и можешь еще объяснить эту строчку

Добавлено через 53 секунды
Ну, допустим, я нашел 200, а как узнать адрес?

Добавлено через 1 минуту
А с таким опытным человеком, как вы, можно и не в такие дебри лезть



0



Программист

307 / 182 / 176

Регистрация: 05.12.2013

Сообщений: 683

Записей в блоге: 5

25.03.2014, 20:41

19

Цитата
Сообщение от Nikakula
Посмотреть сообщение

и можешь еще объяснить эту строчку

Размер файла в байтах минус размер переменной типа integer (оно 4 равно).

Цитата
Сообщение от Nikakula
Посмотреть сообщение

Ну, допустим, я нашел 200, а как узнать адрес?

Так где нашел, там и адрес.



0



Nikakula

9 / 9 / 16

Регистрация: 07.03.2014

Сообщений: 202

25.03.2014, 20:59

 [ТС]

20

Цитата
Сообщение от Arigato_RU
Посмотреть сообщение

Размер файла в байтах минус размер переменной типа integer (оно 4 равно).

А зачем это делать?

Цитата
Сообщение от Arigato_RU
Посмотреть сообщение

Так где нашел, там и адрес.

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

Добавлено через 5 минут

Pascal
1
2
3
4
5
p:=0;
  found:=false;
  ef:=filesize(f)-sizeof(integer);
  while p<ef do begin
    seek(f,p);

А зачем каждый раз указатель возвращать в начало, проверятся же по сути будет одно и тоже слово!

Pascal
1
2
read(f,x);
    if x=a then begin

А здесь, в переменную «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) и выбираем раздел «Дизассемблирование».

Гайд. Как редактировать исходный код игры., изображение №2

Указываем путь к файлу «disassemble.pу», который лежит в папке, в которую установлена Krakatau, потом указываем все остальные папки и файлы.

У вас может быть и другое местонахождение файлов и папок.

Если вы все сделали правильно, то у вас должно появиться такое окно командной строки:

Дизассемблирование может занять несколько минут.

После окончания дизассемблирования, откройте папку, которую вы указали, как «Директория, куда отправятся дизассемблированные файлы» и найдите там файл Menu_About.j (без цифр). Откройте его любым текстовым редактором.

Перед вами должна появиться примерно такая картина:

Выглядит страшно

Это — байт-код java, с ним мы и будем дальше работать.

Для начала определимся, что мы будем изменять. Допустим, вы решили заменить автора музыки в разделе «Подробнее».

Это читерство! Учимся взламывать игры и писать читы на простом примере

Существуют разные виды читов. Можно разделить их на несколько групп.

External — внешние читы, которые работают в отдельном процессе. Если же мы скроем наш external-чит, загрузив его в память другого процесса, он превратится в hidden external.

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

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

Network proxy — читы, которые используют сетевые прокси, те, в свою очередь, перехватывают трафик клиента и сервера, получая или изменяя необходимую информацию.

Есть три основные тактики модификации поведения игры.

  1. Изменение памяти игры. API операционной системы используется для поиска и изменения участков памяти, содержащих нужную нам информацию (например, жизни, патроны).
  2. Симуляция действий игрока: приложение повторяет действия игрока, нажимая мышкой в заранее указанных местах.
  3. Перехват трафика игры. Между игрой и сервером встает чит. Он перехватывает данные, собирая или изменяя информацию, чтобы обмануть клиент или сервер.

Большинство современных игр написаны для Windows, поэтому и примеры мы будем делать для нее же.

Пишем игру на C

Про читы лучше всего рассказывать на практике. Мы напишем свою небольшую игру, на которой сможем потренироваться. Я буду писать игру на C#, но постараюсь максимально приблизить структуру данных к игре на C++. По моему опыту читерить в играх на C# очень просто.

Принцип игры прост: нажимаешь Enter и проигрываешь. Не особо честные правила, да? Попробуем их изменить.

Приступим к реверс-инжинирингу

Исполняемый файл игры

Исполняемый файл игры

У нас есть файл игры. Но вместо исходного кода мы будем изучать память и поведение приложения.

Начнем с поведения игры

Начнем с поведения игры

При каждом нажатии Enter жизни игрока уменьшаются на 15. Начальное количество жизней — 100.

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

Подключение CE к игре

Подключение CE к игре

Первым делом мы получаем список всех значений 85 в памяти.

Все значения, которые нашел CE

Все значения, которые нашел CE

Нажмем Enter, и показатель жизней будет равен 70 . Отсеем все значения.

Значение найдено

Значение найдено

Вот и нужное значение! Изменим его и нажмем Enter для проверки результата.

Значение изменено Значение изменено
Скрин игры, после того как мы нажали Enter Скрин игры, после того как мы нажали 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-чита выглядит так:

  1. Найти ID процесса.
  2. Получить дескриптор к этому процессу с нужными правами.
  3. Найти адреса в памяти.
  4. Пропатчить что-то, если нужно.
  5. Отрисовать GUI, если он имеется.
  6. Считывать или изменять память по мере надобности.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Как изменить код?

Такой вопрос, у меня есть своя браузерная игра, и я бы хотел узнать : в разных играх можно с помощью разных IDE редакторов ((или как-то так, можно локально изменить работу игры, например указываешь путь и скажем, можно изменить скорость передвижения персонажа )) и вот я хотел спросить, как можно провернуть такую же фигню в браузерной игре? ((скрин это пример))

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить код класса на учи ру
  • Как изменить код киви кошелька
  • Как изменить код замка на чемодане американ туристер
  • Как изменить код доступа на домофоне
  • Как изменить код доступа на айфоне

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии