Как изменить код программы exe

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

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

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

Бывают ситуации, когда под рукой нет исходника, а Вам срочно требуется внести изменения в коде, написанной ранее Вами программы. Например, дано приложение «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

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

задан 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 бронзовых знака

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

Содержание

  1. Анализ исполняемого файла в IDA Pro
  2. Какую версию IDA Pro выбрать?
  3. Что не так с IDA?
  4. Анализ зашифрованных программ в IDA
  5. Данные
  6. Расшифровка
  7. Создание сегмента
  8. Создание клона
  9. Итоги
  10. Дизассемблер и отладчик в связке
  11. Способ 1
  12. Способ 2
  13. Заключение

С легкой руки Денниса Ритчи повелось начинать освоение нового языка программирования с создания простейшей программы «Hello, World!». Не будем изменять традициям и оценим возможности IDA Pro следующим примером.

#include <iostream>

void main()

{

  std::cout << «Hello, Sailor!n»;

}

Компилятор сгенерирует исполняемый файл объемом почти 190 Кбайт, большую часть которого займет служебный, стартовый или библиотечный код. Попытка дизассемблирования с помощью таких средств, как W32Dasm, не увенчается быстрым успехом, поскольку над полученным листингом размером в два с половиной мегабайта (!) можно просидеть не час и не два. Представьте, сколько времени уйдет на серьезные задачи, требующие изучения десятков и сотен мегабайтов дизассемблированного текста.

Чтобы все было подобно в статье, компилируйте примеры с помощью Visual C++ 2017 вызовом
cl.exe first.cpp /EHcs. Флаг
/EHcs нужен, чтобы подавить возражение компилятора и вместе с тем включить семантику уничтожения объектов.

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

Результат работы IDA Pro

Результат работы IDA Pro

Чтобы открыть текстовое представление, нужбно открыть контекстное меню и выбрать пункт Text view.

Какую версию IDA Pro выбрать?

На момент написания статьи последней версией IDA Pro была 7.3. Цена программы может показаться великоватой для покупки в исследовательских целях. Как известно, разработчик IDA Pro Ильфак Гильфанов очень строго относится к утечкам и появлению взломанных версий своих продуктов в интернете и жестоко с этим бориться.

Но, несмотря на это на сайте компании Hex-Rays в публичный доступ выложена бесплатная версия дизассемблера с функциональными ограничениями. Например, она не получает обновления после достижения майлстоуна целой версии, то есть сейчас для свободной загрузки доступна версия 7.0. Также она поддерживает только архитектуры x86 и x64.

РЕКОМЕНДУЕМ:
Как убить защитный драйвер в Windows

Тем не менее этого вполне достаточно для наших целей. Потому что у нас нет необходимости разбираться в коде для процессоров ARM, Motorola, Sparc, MIPS или Zilog. Еще одно ограничение накладывается на использование в коммерческих целях, но и в этом случае наша совесть чиста.

Закончив автоматический анализ файла
first.exe, IDA переместит курсор к строке
.text:0040628B — точке входа в программу. Не забудьте из графического режима отображения листинга переключиться в текстовый. Также обратите внимание на строчку
.text:00406290 start endp ; spanalysis failed, выделенную красным цветом в конце функции
start. Так IDA отмечает последнюю строку функции в случае, если у нее в конце
return и значение указателя стека на выходе из функции отличается от такового на входе.

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

  • argc — количество аргументов командной строки;
  • argv — массив указателей на строки аргументов;
  • _environ — массив указателей на строки переменных окружения.

Заполняется структура
OSVERSIONINFOEX, которая среди прочего включает:

  • dwBuildNumber — билд;
  • dwMajorVersion — старшую версию операционной системы;
  • dwMinorVersion — младшую версию операционной системы;
  • _winver — полную версию операционной системы;
  • wServicePackMajor — старшую версию пакета обновления;
  • wServicePackMinor — младшую версию пакета обновления.

Далее
Start инициализирует кучи (heap) и вызывает функцию main, а после возвращения управления завершает процесс с помощью функции
Exit. Для получения значений структуры
OSVERSIONINFOEX используется функция
GetVersionEx.

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

CRtO.demo.c

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#include <stdio.h>

#include <stdlib.h>

#include <Windows.h>

void main()

{

  OSVERSIONINFOEX osvi;

  ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));

  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

  GetVersionEx((OSVERSIONINFO*)&osvi);

  int a;

  printf(«>OS Version:ttt%d.%dn

  >Build:ttt%dn

  >Arguments count:t%dn»,

    osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwOSVersionInfoSize, __argc);

  for (a = 0; a < __argc; a++)

    printf(«>t Argument %02d:tt%sn», a + 1, __argv[a]);

  a = !a 1;

  while (_environ[++a]);

    printf(«>Environment variables count:%dn», a);

  while (a)

    printf(«>tVariable %d:tt%sn», a, _environ[a]);

}

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

OS Version: 6.2

Build: 156

Arguments count: 1

Argument 01: CRt0.demo.exe

Environment variables count: 99

...

Variable 20: FrameworkVersion=v4.0.30319

Variable 19: FrameworkDIR32=C:WINDOWSMicrosoft.NETFramework

Variable 18: FrameworkDir=C:WINDOWSMicrosoft.NETFramework

Variable 17: Framework40Version=v4.0

Variable 16: ExtensionSdkDir=C:Program Files (x86)Microsoft SDKsWindows Kits10ExtensionSDKs

Variable 15: DriverData=C:WindowsSystem32DriversDriverData

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

Например, Visual C++ всегда, независимо от прототипа функции
main, передает ей три аргумента: указатель на массив указателей переменных окружения, указатель на массив указателей аргументов командной строки и количество аргументов командной строки, а все остальные функции стартового кода принимают меньшее количество аргументов.

Советую ознакомиться с исходниками стартовых функций популярных компиляторов. Для Visual C++ 14 в соответствии с архитектурой они находятся в подпапках каталога
%Program Files (x86)Microsoft Visual Studio 14.0VCcrtsrc. Их изучение упростит анализ дизассемблерного листинга.

Ниже в качестве иллюстрации приводится фрагмент стартового кода программы
first.exe, полученный в результате работы W32Dasm.

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

26

//******************** Program Entry Point ********************

:0040628B E802070000 call 00406992

:00406290 E974FEFFFF jmp 00406109

* Referenced by a CALL at Addresses:

|:0040380C , :004038B2 , :0040392E , :00403977 , :00403A8E

|:00404094 , :004040FA , :00404262 , :00404BF4 , :00405937

|:004059AE

|

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:004062B6(U)

|

:00406295 8B4DF4 mov ecx, dword ptr [ebp0C]

:00406298 64890D00000000 mov dword ptr fs:[00000000], ecx

:0040629F 59 pop ecx

:004062A0 5F pop edi

:004062A1 5F pop edi

:004062A2 5E pop esi

:004062A3 5B pop ebx

:004062A4 8BE5 mov esp, ebp

:004062A6 5D pop ebp

:004062A7 51 push ecx

:004062A8 F2 repnz

:004062A9 C3 ret

...

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

Поэтому способности дизассемблера тесно связаны с его версией и полнотой комплекта поставки — далеко не все версии IDA Pro в состоянии работать с программами, сгенерированными современными компиляторами.

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

.text:0040628B start proc near

.text:0040628B

.text:0040628B ; FUNCTION CHUNK AT .text:00406109 SIZE 00000127 BYTES

.text:0040628B ; FUNCTION CHUNK AT .text:00406265 SIZE 00000026 BYTES

.text:0040628B

.text:0040628B call sub_406992

.text:00406290 jmp loc_406109

.text:00406290 start endp ; spanalysis failed

.text:00406290

.text:00406295 ; [00000015 BYTES: COLLAPSED FUNCTION __EH_epilog3. PRESS CTRLNUMPAD+ TO EXPAND]

.text:004062AA ; [00000011 BYTES: COLLAPSED FUNCTION __EH_epilog3_GS. PRESS CTRLNUMPAD+ TO EXPAND]

.text:004062BB ; [00000034 BYTES: COLLAPSED FUNCTION __EH_prolog3. PRESS CTRLNUMPAD+ TO EXPAND]

.text:004062EF ; [00000037 BYTES: COLLAPSED FUNCTION __EH_prolog3_GS. PRESS CTRLNUMPAD+ TO EXPAND]

.text:00406326 ; [00000037 BYTES: COLLAPSED FUNCTION __EH_prolog3_catch. PRESS CTRLNUMPAD+ TO EXPAND]

.text:0040635D

.text:0040635D ; =============== S U B R O U T I N E ===============

.text:0040635D

.text:0040635D ; Attributes: thunk

.text:0040635D

.text:0040635D sub_40635D proc near ; CODE XREF: sub_4042FD+19p

.text:0040635D jmp sub_406745

.text:0040635D sub_40635D endp

.text:0040635D

.text:00406362

...

Перечень поддерживаемых компиляторов вы можете найти в файле
%IDA%/SIG/list. В нем есть старинные Microsoft C и Quick C, Visual C++ с первой по восьмую версию и Visual.Net. А вот Visual C++ 14 из Visual Studio 2017 здесь нет. Однако, взглянув в окно IDA, мы видим, что дизассемблер сумел определить многие (но не все) функции.

Заглянем в окно вывода, находящееся внизу. Там, немного прокрутив вывод, мы обнаружим строчку
Using FLIRT signature: SEH for vc714, говорящую о том, что используемая версия IDA все же понимает компиляторы Visual C++ от 7 до 14.

Текстовое отображение результата работы IDA

Текстовое отображение результата работы IDA

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

.text:0040628B start proc near

.text:0040628B call sub_406992

.text:00406290 jmp loc_406109

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

В данном случае, как мы видим по комментарию, IDA отправила нас в начало стартового куска кода. Немного прокрутим листинг вниз, обращая внимание на плавные переходы по меткам.

РЕКОМЕНДУЕМ:
Способы обхода защиты и взлома программ

В итоге доходим до вызова функции:
call    sub_4010D0. Похоже, это и есть функция
main, поскольку здесь дизассемблер смог распознать строковую переменную и дал ей осмысленное имя
aHelloSailor, а в комментарии, расположенном справа, для наглядности привел оригинальное содержимое
Hello, Sailor!n. Смещение этой строки компилятор закинул на вершину стека, а затем ниже через строчку, по всей видимости, происходит вызов функции вывода на экран:

.text:004010D3 push offset aHelloSailor ; «Hello, Sailor!n»

.text:004010D8 push offset unk_42DE30

.text:004010DD call sub_401170

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

Если поместить курсор в границы имени
aHelloSailor и нажать Enter, IDA автоматически перейдет к строке, в которой выполняется определение переменной:

.rdata:0041E1A0 aHelloSailor db ‘Hello, Sailor!’,0Ah,0 ; DATA XREF: sub_4010D0+3o

Выражение
DATA XREF: sub_4010D0+3o называется перекрестной ссылкой и свидетельствует о том, что в третьей строке процедуры
sub_4010D0 произошло обращение к текущему адресу по его смещению (
o от слова offset), а стрелка, направленная вверх, указывает на относительное расположение источника перекрестной ссылки.

Если навести курсор на выражение
sub_4010D0+3o и нажать Enter, то IDA Pro перейдет к следующей строке:

.text:004010D3 push offset aHelloSailor ; «Hello, Sailor!n»

Нажатие Esc отменяет предыдущее перемещение, возвращая курсор в исходную позицию.

К слову, дизассемблер W32Dasm даже не смог распознать строковую переменную.

Что не так с IDA?

Положа руку на сердце — я был слегка разочарован, ибо ожидал, что IDA распознает больше библиотечных процедур. Поэтому я решил натравить «Иду» на такую же программу, но сгенерированную более ранней версией компилятора. Подопытным кроликом был Visual C++ 8.0 (VS 2005).

Сравним результаты работы компиляторов. Тот же исходник, компиляция из командной строки (папка
first05). Загрузим итоговый экзешник в «Иду». Листинг приводится в сокращенном виде для экономии пространства.

Текстовое отображение результата работы IDA

Текстовое отображение результата работы IDA

Мало того что стартовый код меньше по объему, так еще было автоматически определено большее количество библиотечных функций, среди которых: GetVersionExA, GetProcessHeap, HeapFree и ряд других. Среди них достаточно просто найти вызов main и перейти на саму функцию.

Тем не менее VC++ 8.0 — ушедшая эпоха, и в пример я ее привел только для ознакомления.

Тем не менее VC++ 8.0 — ушедшая эпоха, и в пример я ее привел только для ознакомления.

На этом анализ приложения
first.cpp можно считать завершенным. Для полноты картины остается переименовать функцию
sub_4010D0 в
main. Для этого подведите курсор к строке
.text:004010D0 (началу функции) и жмите N. В появившемся диалоге можете ввести
main. Результат должен выглядеть так:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

.text:004010D0 ; int __cdecl main(int argc, const char **argv, const char **envp)

.text:004010D0 main proc near ; CODE XREF: start8Dp

.text:004010D0

.text:004010D0 argc = dword ptr 8

.text:004010D0 argv = dword ptr 0Ch

.text:004010D0 envp = dword ptr 10h

.text:004010D0

.text:004010D0 push ebp

.text:004010D1 mov ebp, esp

.text:004010D3 push offset aHelloSailor ; «Hello, Sailor!n»

.text:004010D8 push offset unk_42DE30

.text:004010DD call sub_401170

.text:004010E2 add esp, 8

.text:004010E5 xor eax, eax

.text:004010E7 pop ebp

.text:004010E8 retn

.text:004010E8 main endp

Обратите внимание: IDA в комментарии подставила прототип функции, а ниже параметры по умолчанию.

Анализ зашифрованных программ в IDA

Другое важное преимущество IDA — возможность дизассемблировать зашифрованные программы. В примере
Crypt00.com используется статическое шифрование, которое часто встречается в «конвертных» защитах. Между тем этот файл не запустится в Windows 10, поскольку *.com для работы требует 16-разрядную исполняемую среду.

Я думаю, это не повод отказаться от анализа столь интересного примера, тем более что существуют мощные средства виртуализации, поэтому поставить 32-битную Windows XP, которая выполняет 16-битные проги, — не проблема. К тому же анализ файлов .com значительно проще, чем .exe, так как первые сильно короче вторых.

Мы уже видели непроходимые заросли библиотечного кода, вставленного компилятором в минимальной exe-программе, тогда как в com все по минимуму, в чем мы скоро убедимся. Отмечу также, что последней версией IDA Pro, работающей в 32-разрядных средах, была 6.8.

Sourcer в деле

Sourcer в деле

Рассматриваемый прием шифрования полностью «ослепляет» большинство дизассемблеров. Например, результат обработки файла
Crypt00.com при помощи Sourcer выглядит так:

crypt00 proc far

3A6A:0100 start:

3A6A:0100 ъBE 010D mov si,10Dh ; (3A6A:010D=0C3h)

3A6A:0103 loc_1: ; xref 3A6A:010B

3A6A:0103 80 34 77 xor byte ptr [si],77h ; ‘w’

3A6A:0106 46 inc si

3A6A:0107 81 FE 0124 cmp si,124h

3A6A:010B 76 F6 jbe loc_1 ; Jump if below or =

3A6A:010D C3 retn

3A6A:010E 7E CD 62 76 BA 56 db 7Eh,0CDh, 62h, 76h,0BAh, 56h

3A6A:0114 B4 3F 12 1B 1B 18 db 0B4h, 3Fh, 12h, 1Bh, 1Bh, 18h

3A6A:011A 5B 57 20 18 05 13 db 5Bh, 57h, 20h, 18h, 05h, 13h

3A6A:0120 56 7A 7D 53 db 56h, 7Ah, 7Dh, 53h

crypt00 endp

Самостоятельно Sourcer не сумел дизассемблировать половину кода, оставив ее в виде дампа. С другой стороны, как-то помочь ему мы не можем. Напротив, IDA изначально проектировалась как дружественная к пользователю интерактивная среда. В отличие от Sourcer-подобных дизассемблеров, IDA не делает никаких молчаливых предположений и при возникновении проблем обращается за помощью к человеку. Результат анализа «Идой» файла
Crypt00.com выглядит так:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

seg000:0100 public start

seg000:0100 start proc near

seg000:0100 mov si, 10Dh

seg000:0103

seg000:0103 loc_10103: ; CODE XREF: start+Bj

seg000:0103 xor byte ptr [si], 77h

seg000:0106 inc si

seg000:0107 cmp si, 124h

seg000:010B jbe short loc_10103

seg000:010D retn

seg000:010D start endp

seg000:010D

seg000:010D ; ——————————————

seg000:010E db 7Eh, 0CDh, 62h, 76h, 0BAh, 56h, 0B4h, 3Fh, 12h, 2 dup(1Bh)

seg000:010E db 18h, 5Bh, 57h, 20h, 18h, 5, 13h, 56h, 7Ah, 7Dh, 53h

seg000:010E seg000 ends

seg000:010E

seg000:010E

seg000:010E end start

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

Данные

Что представляет собой число
10Dh в строке
0x100 — константу или смещение? Очевидно, в регистр SI заносится смещение, потому что впоследствии операнд по этому смещению в памяти интерпретируется как байт и над ним выполняется операция XOR.

Чтобы преобразовать константу в смещение, установите текстовый курсор на
10Dh и нажмите O. Дизассемблируемый текст станет выглядеть так:

seg000:0100 mov si, offset locret_1010D

...

seg000:010D locret_1010D: ; DATA XREF: start+Bo

seg000:010D retn

seg000:010D start endp

seg000:010D

seg000:010D ; ——————————————

seg000:010E db 7Eh, 0CDh, 62h, 76h, 0BAh, 56h, 0B4h, 3Fh, 12h, 2 dup(1Bh)

seg000:010E db 18h, 5Bh, 57h, 20h, 18h, 5, 13h, 56h, 7Ah, 7Dh, 53h

seg000:010E seg000 ends

IDA Pro автоматически создала новое имя
locret_1010D, которое ссылается на зашифрованный блок кода. Попробуем преобразовать его в данные. Для этого надо поставить курсор на строку 010D и дважды нажать D, чтобы утвердительно ответить на вопрос во всплывающем диалоге. Листинг примет следующий вид:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

...

seg000:010D word_1010D dw 7EC3h ; DATA XREF: starto

seg000:010F db 0CDh ; =

seg000:0110 db 62h ; b

seg000:0111 db 76h ; v

seg000:0112 db 0BAh ; ¦

seg000:0113 db 56h ; V

seg000:0114 db 0B4h ; +

seg000:0115 db 3Fh ; ?

seg000:0116 db 12h

seg000:0117 db 1Bh

seg000:0118 db 1Bh

seg000:0119 db 18h

seg000:011A db 5Bh ; [

seg000:011B db 57h ; W

seg000:011C db 20h

seg000:011D db 18h

seg000:011E db 5

seg000:011F db 13h

seg000:0120 db 56h ; V

seg000:0121 db 7Ah ; z

seg000:0122 db 7Dh ; }

seg000:0123 db 53h ; S

seg000:0123 seg000 ends

Но на что именно указывает
word_1010D? Понять это позволит изучение следующего кода:

seg000:0100 start proc near

seg000:0100 mov si, offset word_1010D

seg000:0103

seg000:0103 loc_10103: ; CODE XREF: start+Bj

seg000:0103 xor byte ptr [si], 77h

seg000:0106 inc si

seg000:0107 cmp si, 124h

seg000:010B jbe short loc_10103

seg000:010B start endp

После того как в регистр SI попадает смещение, начинается цикл, который представляет собой простейший расшифровщик: значение в регистре SI указывает на символ, команда XOR с помощью числа
0x77 расшифровывает один байт (один ASCII-символ). Напомню, в ассемблере запись шестнадцатеричных чисел вида 77h. После этого инкрементируется значение регистра SI (указатель переводится на следующий символ) и получившееся значение сравнивается с числом
0x124, которое равно общему количеству символов для расшифровки.

РЕКОМЕНДУЕМ:
Отладка MIPS с помощью GDB

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

Давайте расширим сегмент подопытной программы. Жмем Shift-F7 (View → Open subviews → Segments), откроется вкладка Program Segmentation. В контекстном меню единственного существующего сегмента
seg000 выбираем пункт Edit Segments (Ctrl-E). В диалоге в поле ввода End address введите значение побольше, например
0x10125. Подтвердите свое намерение в появившемся диалоге.

Изменение атрибутов сегмента

Изменение атрибутов сегмента

Можете полюбоваться на увеличившийся сегмент. Вернемся к изучению кода. Если в результате сравнения значение в регистре SI меньше общего количества байтов или равно ему, выполняется переход на метку
loc_10103 и блок кода повторяется для расшифровки следующего байта. Отсюда можно заключить, что
word_1010D указывает на начало последовательности байтов для расшифровки. Подведя к ней курсор, жмем N и можем дать ей осмысленное имя, например
BeginCrypt. А константу
124h можем сначала преобразовать в смещение (Ctrl-O), а затем переименовать, например в
EndCrypt.

Расшифровка

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

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

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

Слева каждой строки указывается имя сегмента и его смещение, например
seg000:0103. Но нам нужно другое значение. Установив текстовый курсор на нужную строку, смотрите на нижнюю часть текущей вкладки (полагаю, у вас это IDA View-A).

Фактический номер строки

Фактический номер строки

При перемещении курсора соответствующее смещение тоже меняется (на рисунке выше оно обведено рамочкой). С его помощью можно обратиться к любой ячейке сегмента. Для чтения и модификации ячеек предусмотрены функции
Byte и
PatchByte соответственно. Их вызов может выглядеть, например, так:
a=Byte(0x01010D) читает ячейку, расположенную по смещению
0x01010D;
PatchByte(0x01010D,0x27) присваивает значение
0x27 ячейке памяти, расположенной по смещению
0x01010D. Как следует из названия функций, они манипулируют ячейками размером в один байт.

Знания языка C и этих двух функций вполне достаточно для написания скрипта-расшифровщика.

Реализация IDA-С не полностью придерживается стандарта, в частности IDA не позволяет разработчику задавать тип переменной и определяет его автоматически по ее первому использованию, а объявление осуществляется ключевым словом
auto. Например,
auto MyVar, s0 объявляет две переменные —
MyVar и
s0.

Для создания скрипта необходимо нажать Shift-F2 или выбрать в меню File пункт Script Command. В результате откроется окно Execute script. Большую его часть занимают список скриптов и поле ввода для редактирования выбранного скрипта.

Дополнительно внизу окна находятся ниспадающий список для выбора используемого языка (IDC или Python), ниспадающий список для указания размера табуляции и четыре кнопки: Run (выполнить скрипт), Export (экспортировать скрипт в файл), Import (загрузить скрипт из файла) и Save (сохранить скрипт в базу данных проекта).

После первого открытия окна в списке скриптов по умолчанию выбран скрипт Default snippet. В качестве его тела введем такой код:

auto a, x;

for (a = 0x01010D; a <= 0x010123; a++) {

  x = Byte(a);

  x = (x ^ 0x77);

  PatchByte(a, x);

  Message(x);

}

Встроенный редактор скриптов

Встроенный редактор скриптов

Как было показано выше, алгоритм расшифровщика сводится к последовательному преобразованию каждой ячейки зашифрованного фрагмента операцией
XOR 0x77:

seg000:0103 xor byte ptr [si], 77h

Сам же зашифрованный фрагмент начинается с адреса
0x01010D и продолжается вплоть до
0x010123.

В конце командой
Message отправляем модифицированный символ в область вывода IDA.

Чтобы запустить скрипт на выполнение, достаточно нажать кнопку Run. Если при вводе скрипта не было опечаток, листинг примет следующий вид:

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

26

27

28

...

seg000:010D BeginCrypt dw 9B4h ; DATA XREF: starto

seg000:010F db 0BAh ; ¦

seg000:0110 db 15h

seg000:0111 db 1

seg000:0112 db 0CDh ; =

seg000:0113 db 21h ; !

seg000:0114 db 0C3h ; +

seg000:0115 db 48h ; H

seg000:0116 db 65h ; e

seg000:0117 db 6Ch ; l

seg000:0118 db 6Ch ; l

seg000:0119 db 6Fh ; o

seg000:011A db 2Ch ; ,

seg000:011B db 20h

seg000:011C db 57h ; W

seg000:011D db 6Fh ; o

seg000:011E db 72h ; r

seg000:011F db 64h ; d

seg000:0120 db 21h ; !

seg000:0121 db 0Dh

seg000:0122 db 0Ah

seg000:0123 db 24h ; $

seg000:0124 EndCrypt db ? ; DATA XREF: start+7o

seg000:0124 seg000 ends

seg000:0124

seg000:0124

seg000:0124 end start

А в окне вывода появится надпись

Возможные ошибки: несоблюдение регистра символов (IDA к этому чувствительна), синтаксические ошибки, неверно заданные адреса границ модифицируемого блока. В случае ошибки необходимо подвести курсор к строке
seg000:010D, нажать клавишу U (для удаления результатов предыдущего дизассемблирования зашифрованного фрагмента) и затем C (для повторного дизассемблирования расшифрованного кода).

Символы перед фразой «Hello, World!» не выглядят читаемыми; скорее всего, это не ASCII, а исполняемый код. Поставим курсор на строку
seg000:010D, жмем C («Преобразовать в инструкцию»). В результате листинг будет выглядеть так:

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

26

27

28

...

seg000:010D BeginCrypt: ; DATA XREF: starto

seg000:010D mov ah, 9

seg000:010F mov dx, 115h

seg000:0112 int 21h ; DOS PRINT STRING

seg000:0112 ; DS:DX > string terminated by «$»

seg000:0114 retn

seg000:0114 ; —————————————

seg000:0115 db 48h ; H

seg000:0116 db 65h ; e

seg000:0117 db 6Ch ; l

seg000:0118 db 6Ch ; l

seg000:0119 db 6Fh ; o

seg000:011A db 2Ch ; ,

seg000:011B db 20h

seg000:011C db 57h ; W

seg000:011D db 6Fh ; o

seg000:011E db 72h ; r

seg000:011F db 64h ; d

seg000:0120 db 21h ; !

seg000:0121 db 0Dh

seg000:0122 db 0Ah

seg000:0123 db 24h ; $

seg000:0124 EndCrypt db ? ; DATA XREF: start+7o

seg000:0124 seg000 ends

seg000:0124

seg000:0124

seg000:0124 end start

Цепочку символов, расположенную начиная с адреса
seg000:0115, можно преобразовать в удобочитаемый вид, если навести на нее курсор и нажать A. Еще можно преобразовать константу
115h в строке 010F в смещение. Теперь экран дизассемблера будет выглядеть так:

...

seg000:010D BeginCrypt: ; DATA XREF: starto

seg000:010D mov ah, 9

seg000:010F mov dx, offset aHelloWord ; «Hello, Word!rn$»

seg000:0112 int 21h ; DOS PRINT STRING

seg000:0112 ; DS:DX > string terminated by «$»

seg000:0114 retn

seg000:0114 ; —————————————

seg000:0115 aHelloWord db ‘Hello, Word!’,0Dh,0Ah,‘$’ ; DATA XREF: seg000:010Fo

seg000:0124 EndCrypt db ? ; DATA XREF: start+7o

seg000:0124 seg000 ends

seg000:0124

seg000:0124

seg000:0124 end start

Команда
MOV AH, 9 в строке
seg000:010D подготавливает регистр AH перед вызовом прерывания
0x21. Она выбирает функцию вывода строки на экран, а ее смещение следующей командой заносится в регистр DX. Иными словами, для успешного ассемблирования листинга необходимо заменить константу
0x115 соответствующим смещением.

Но ведь выводимая строка на этапе ассемблирования (до перемещения кода) расположена совсем в другом месте! Одно из возможных решений этой проблемы — создать новый сегмент и затем скопировать в него расшифрованный код. Это будет аналогом перемещения кода работающей программы.

Создание сегмента

Для создания нового сегмента надо открыть вкладку Segments (Shift-F7) и нажать Insert. Появится вот такое окно.

Использование IDA Pro Создание нового сегмента

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

Базовый адрес сегмента может быть любым, если при этом не перекрываются сегменты
seg000 и
MySeg; начальный адрес сегмента задается так, чтобы смещение первого байта было равно
0x100; размер нового сегмента сделаем таким же, как
seg000. Не забудьте выбрать тип создаваемого сегмента: 16-битный сегмент.

Далее будем двигаться поэтапно. Сначала скопируем команды для вывода символов в консоль. Начнем брать байты со смещения
10D сегмента
seg000, а вставлять — с самого начала сегмента
MySeg. Это можно сделать скриптом следующего содержания:

auto a, x;

for (a = 0x0; a < 0x8; a++) {

  x = Byte(0x1010D+a);

  PatchByte(0x20100+a,x);

}

Для его ввода необходимо вновь нажать комбинацию клавиш Shift-F2. Создать еще один скрипт можно нажатием Insert. После выполнения экран дизассемблера будет выглядеть так (показано только начало сегмента
MySeg):

MySeg:0100 ; Segment type: Regular

MySeg:0100 MySeg segment byte public » use16

MySeg:0100 assume cs:MySeg

MySeg:0100 ;org 100h

MySeg:0100 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing

MySeg:0100 db 0B4h ; +

MySeg:0101 db 9

MySeg:0102 db 0BAh ; ¦

MySeg:0103 db 15h

MySeg:0104 db 1

MySeg:0105 db 0CDh ; =

MySeg:0106 db 21h ; !

MySeg:0107 db 0C3h ; +

MySeg:0108 db ? ;

Надо преобразовать данные в инструкции: поставить курсор на строку
MySeg:0100 и нажать C. Листинг примет ожидаемый вид:

MySeg:0100 mov ah, 9

MySeg:0102 mov dx, 115h

MySeg:0105 int 21h ; DOS PRINT STRING

MySeg:0105 ; DS:DX > string terminated by «$»

MySeg:0107 retn

Чтобы программа-клон вела себя немного не так, как ее родитель, добавим ожидание ввода символа. Для этого надо поставить курсор на команду
retn и выбрать Edit → Patch program → Assemble…

Введите
XOR AX, AX, нажмите Enter. Затем
INT 16h, снова Enter. Последняя инструкция — RET, Enter и Esc для закрытия диалога.

Использование IDA Pro Замена инструкции

Замена инструкции

Теперь с помощью следующего скрипта скопируем байты, составляющие текст «Hello, World!»:

auto a, x, i;

i = 0;

for (a = 0x0115; a < 0x124; a++) {

  x = Byte(0x10000+a);

  PatchByte(0x2010C+i,x);

  i++;

}

Поставив курсор на строку
MySeg:010C, нажимаем A и преобразуем цепочку символов в удобочитаемый вид. В строке
MySeg:0102 надо изменить константу
115h на фактическое значение, по которому расположена фраза для вывода:
MySeg:010C. Для этого ставьте курсор на указанную строку и открывайте диалог Assemble Instruction (Edit → Patch program → Assemble…) и введите
MOV DX, 10Ch.

РЕКОМЕНДУЕМ:
Режим гаммирования в блочном алгоритме шифрования

Теперь надо преобразовать константу
10Ch в смещение, а последовательность символов, расположенную по нему, обратить к светскому виду. Как это делать, вы уже знаете. Напоследок рекомендую произвести косметическую чистку — уменьшить размер сегмента до необходимого. Чтобы удалить адреса, оставшиеся при уменьшении размеров сегмента за его концом, поставьте флажок Disable Address в окне свойств сегмента.

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

  1. mov     si, offset BeginCrypt в сегменте
    seg000;
  2. cmp     si, offset EndCrypt в сегменте
    seg000;
  3. mov     dx, offset aHelloWord_0 в сегменте
    MySeg.

Между тем после ассемблирования символьные имена будут заменены числовыми константами. Будут ли в таком случае в результирующей программе эти смещения указывать на те же вещи, что в исходной? Давайте еще раз проанализируем наш листинг. Первое смещение,
BeginCrypt, указывает на строку
seg000:010D. По сути, весь предыдущий код будет скопирован, поэтому ее значение менять не нужно. Второе смещение,
EndCrypt, указывающее на конец сегмента, должно увеличиться на четыре байта, так как мы добавили две инструкции:

seg000:0114 xor ax, ax

seg000:0116 int 16h

Чтобы подсчитать их размер, достаточно из следующего за ними смещения вычесть их начальное: 118h – 114h = 4h байта. В результате
EndCrypt должно указывать на 124h + 4h = 128h. Установите курсор на строку
seg000:0107, вызовите окно ассемблера и замените инструкцию в ней на
cmp si, 128h.

Третье смещение,
aHelloWord_0, в исходной программе равно
10Ch. Подумаем, как должен измениться адрес. Если
aHelloWord_0 находится в сегменте
MySeg, то нам просто нужно прибавить к имеющемуся смещению размер расшифровщика в сегменте
seg000. Его можно посчитать как разность начального смещения зашифрованного блока и начального адреса: 0x010D – 0x0100 = 0xD байт.

В итоге смещение
aHelloWord_0 должно указывать на 0x10C + 0xD = 0x119. Изменим код: установив курсор на строку
MySeg:0102, с помощью встроенного ассемблера модифицируем ее содержимое на
mov dx, 119h.

В результате полный листинг выглядит следующим образом:

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

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

seg000:0100 ; Segment type: Pure code

seg000:0100 seg000 segment byte public ‘CODE’ use16

seg000:0100 assume cs:seg000

seg000:0100 org 100h

seg000:0100 assume es:nothing, ss:nothing, ds:seg000, fs:nothing, gs:nothing

seg000:0100

seg000:0100 ; =========== S U B R O U T I N E ================

seg000:0100

seg000:0100

seg000:0100 public start

seg000:0100 start proc near

seg000:0100 mov si, offset BeginCrypt

seg000:0103

seg000:0103 loc_10103: ; CODE XREF: start+Bj

seg000:0103 xor byte ptr [si], 77h

seg000:0106 inc si

seg000:0107 cmp si, 128h

seg000:010B jbe short loc_10103

seg000:010B start endp

seg000:010B

seg000:010D

seg000:010D BeginCrypt: ; DATA XREF: starto

seg000:010D mov ah, 9

seg000:010F mov dx, offset aHelloWord ; «Hello, Word!rn$»

seg000:0112 int 21h ; DOS PRINT STRING

seg000:0112 ; DS:DX > string terminated by «$»

seg000:0114 retn

seg000:0114 ; ————————————————

seg000:0115 aHelloWord db ‘Hello, Word!’,0Dh,0Ah,‘$’ ; DATA XREF: seg000:010Fo

seg000:0124 EndCrypt db ?

seg000:0124 seg000 ends

seg000:0124

MySeg:0100 ; ————————————————

MySeg:0100

; ===========================================================

MySeg:0100

MySeg:0100 ; Segment type: Regular

MySeg:0100 MySeg segment byte public » use16

MySeg:0100 assume cs:MySeg

MySeg:0100 ;org 100h

MySeg:0100 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing

MySeg:0100 mov ah, 9

MySeg:0102 mov dx, 119h

MySeg:0105 int 21h ; DOS PRINT STRING

MySeg:0105 ; DS:DX > string terminated by «$»

MySeg:0107 xor ax, ax

MySeg:0109 int 16h ; KEYBOARD READ CHAR FROM BUFFER, WAIT IF EMPTY

MySeg:0109 ; Return: AH = scan code, AL = character

MySeg:010B retn

MySeg:010B ; ————————————————

MySeg:010C aHelloWord_0 db ‘Hello, Word!’,0Dh,0Ah,‘$’

MySeg:011B db ? ;

MySeg:011B MySeg ends

MySeg:011B

MySeg:011B

MySeg:011B end start

Создание клона

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

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

auto a, f, x;

// Открывается файл crypt01.com для записи в двоичном режиме

f = fopen(«crypt01.com», «wb»);

// Копируется расшифровщик

for (a = 0x10100; a < 0x1010D; a++) {

  x = Byte(a);

  fputc(x, f);

}

// Копируется и на лету шифруется весь сегмент MySeg

for (a = SegStart(0x20100); a != SegEnd(0x20100); a++) {

  x = Byte(a);

  x = (x ^ 0x77);

  fputc(x, f);

}

// Файл закрывается

fclose(f);

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

Итоги

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

Использование IDA Клонированное приложение

Клонированное приложение

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

Дизассемблер и отладчик в связке

Дизассемблер, включенный в отладчик, обычно слишком примитивен и не может похвастаться богатыми возможностями. Во всяком случае, дизассемблер, встроенный в WinDbg, недалеко ушел от DUMPBIN, с недостатками которого мы уже сталкивались. Насколько же понятнее становится код, если его загрузить в IDA!

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

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

РЕКОМЕНДУЕМ:
Распаковка исполняемых файлов на примере банковского трояна GootKit

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

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

При этом возникает естественное желание видеть в отладчике все те символьные имена, которые были внесены в дизассемблерный листинг. И IDA Pro предоставляет два способа это сделать! Рассмотрим оба.

Способ 1

Вернемся в Windows 10 и загрузим в IDA Pro файл
first.exe (или ранее созданный «Идой» проект). Выберем в меню File подменю Produce file, а в нем — пункт Create MAP file. На экране появится окно с запросом имени файла (введем, например,
first.map), а затем откроется модальный диалог, уточняющий, какие имена стоит включать в map-файл. Нажмем Enter, чтобы оставить все галочки в состоянии по умолчанию.

Мгновение спустя на диске образуется файл
first.map, содержащий всю необходимую отладочную информацию в map-формате Borland. Отладчик WinDbg не поддерживает такой формат, поэтому перед его использованием файл необходимо конвертировать в формат DBG — отладочный формат Microsoft.

Конвертировать можно с помощью утилиты map2dbg, свободно распространяемой вместе с исходными кодами. Запускать ее нужно из командной строки. В один каталог с ней кладем map-файл и соответствующий .exe. Затем в нашем случае выполняем команду
map2dbg first.exe.

В результате утилита выведет число преобразованных символов, а в текущей папке будет создан новый файл с расширением dbg. Теперь можно загрузить
first.exe в WinDbg. При этом, если
first.dbg находится в том же каталоге, файл подхватится автоматически и будет скопирован в системную папку
C:ProgramDatadbgsymfirst.dbg для дальнейшего исследования экзешника.

Сейчас в WinDbg надо выполнить команду
.reload /f. Она заставит отладчик перезагрузить информацию из модулей. Затем можете выполнить
lm, чтобы увидеть список загруженных модулей. Модуль first будет отмечен как codeview symbols, иначе было бы deferred:

00400000 0041d000 first C (codeview symbols) C:ProgramDataDbgsymfirst.dbg5D5D59DE1d000first.dbg

Исполнение команды
x first!* выведет все символы в файле
first.exe (показана только малая часть списка):

...

004028c4 first!std::_String_const_iterator<char,std::char_traits,std::allocator >::_String_const_iterator<char,std::char_traits,std::allocator > =

00402913 first!std::basic_streambuf<char,std::char_traits >::_Xsgetn_s =

0040298e first!std::basic_streambuf<char,std::char_traits >::xsputn =

00402a57 first!std::basic_filebuf<char,std::char_traits >::_Init =

00402a9e first!std::basic_string<char,std::char_traits,std::allocator >::basic_string<char,std::char_traits,std::allocator > =

00402adb first!std::_Fgetc =

00402af6 first!std::_Fputc =

00402b12 first!std::_Ungetc =

00402b30 first!std::basic_filebuf<char,std::char_traits >::sync =

00402b5b first!std::basic_filebuf<char,std::char_traits >::pbackfail =

00402bc5 first!std::basic_filebuf<char,std::char_traits >::underflow =

00402c29 first!std::basic_filebuf<char,std::char_traits >::setbuf =

00402c70 first!std::basic_string<char,std::char_traits,std::allocator >::begin =

00402c90 first!std::_Locinfo::~_Locinfo =

...

Посмотрим содержимое системной переменной:

0:000> da first!aSouthAfrica

00415500 «south-africa»

Способ 2

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

У бесплатной версии IDA Pro есть и другие недостатки: некорректное создание выходных файлов (в том числе map-файла), некорректное построение диаграммы и прочие пока не затронутые нами вещи.

Теперь можно подключить WinDbg к IDA. Для этого надо открыть конфигурационный файл
ida.cfg, находящийся в каталоге
С:Program FilesIDA 7.0cfg. Проматываем его содержимое до такой строки:

//DBGTOOLS = «C:\Program Files\Debugging Tools for Windows (x86)\»;

Ниже или вместо нее вставить путь к инструментам отладки WinDbg. В моем случае:

DBGTOOLS = «C:Program Files (x86)Windows Kits10Debuggersx64»;

Отсюда вытекает третья мудрость: в случае с IDA 7.0 и новее, даже если приложение дизассемблируется и отлаживается в 32-битной разновидности IDA, путь надо указывать к 64-битной WinDbg. Иначе при запуске отладки вас ждет сообщение об ошибке.

Следующим шагом надо запустить IDA, выбрать WinDbg из ниспадающего списка на панели задач и, нажав F9, запустить отладку. Только отладка приложения
first.exe закончится, не успев начаться. Нужно сделать так, чтобы на точке входа программа замерла. Для этого надо вызвать диалоговое окно Debugger setup (пункт Debugger options в меню Debugger).

IDA Pro как пользоваться Параметры отладчика

Параметры отладчика

Нашу задачу призвана решить область Events. Здесь можно выбрать, на каких событиях мы хотим подвешивать программу. Поставим третий флажок Suspend on process entry point, в результате чего выполнение проги приостановится на стартовом коде.

IDA Pro как пользоваться. Выполнение программы было приостановлено на точке входа

Выполнение программы было приостановлено на точке входа

Знакомые места? Еще бы! Обратите внимание: программа оперирует регистрами процессорной архитектуры x86-64: RCX, RDX, RCI и так далее. Ядро Windows 10 экспортирует 1595 символов, учитывая все установленные обновления операционной системы на моем компьютере.

Это можно проверить, дважды щелкнув на модуле
kernel32.dll в окне Modules во время отладки IDA Pro. Откроется дополнительная вкладка Module: KERNEL32.DLL. Ее можно отцепить и перетащить в любое место. На нижней части рамки окна отображается общее количество символов, экспортируемых данным модулем.

Подключение WinDbg к IDA позволяет «Иде» использовать символьную информацию модулей с публичного сервера Microsoft. Для этого можно создать переменную окружения или определить директорию непосредственно из IDA без ее перезапуска. Пойдем второй, более короткой дорогой, а создать переменную окружения вы можете на досуге. В командную строку IDA (в нижней части окна рядом с кнопкой WINDBG) введи:

.sympath srv*c:debugSymbols*http://msdl.microsoft.com/download/symbols

После этого перезагрузите символы командой
.reload /f. Число экспортируемых модулем
kernel32.dll символов стало 5568.

Теперь символьные имена не только отображаются на экране, что упрощает понимание кода, — на любое из них можно быстро и с комфортом установить точку останова (скажем,
bp GetProcAddress), и отладчик поймет, что от него хотят! Нет больше нужды держать в памяти эти трудно запоминаемые шестнадцатеричные адреса!

РЕКОМЕНДУЕМ:
Взлом приложений для Андроид с помощью отладчика

Заключение

IDA — очень удобный инструмент для модификации файлов, исходные тексты которых утеряны или отсутствуют. Это практически единственный дизассемблер, способный анализировать зашифрованные программы, не прибегая к сторонним средствам. Ну и конечно, IDA обладает отличным пользовательским интерфейсом и удобной системой навигации по исследуемому тексту. В результате с таким инструментом в руках вы можете справиться с любой мыслимой и немыслимой задачей… если, конечно, владеете языком скриптов, что и подтвердили приведенные выше примеры.

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (5 оценок, среднее: 5,00 из 5)

Загрузка…

Restorator
— это редактор ресурсов для многих типов файлов, например, файлов exe, dll, ocx (Active X), scr (заставки) и других, что позволяет самоcтоятельно делать и редактировать стандартные файлы ресурсов.res. Проще говоря, эта программа позволит, к примеру, самостоятельно изменять интерфейс (в том числе и язык меню) любой программы. Кроме этого, с ее помощью можно рассматривать, извлекать и изменять текст, изображения, значки, меню, диалоги, звуки, мультипликацию и т.п. Хотите — измените язык интерфейса, есть желание заменить скин — и это очень просто сделать…

Особенности:
Главный файл упакован UPX
Новое оформление и хорошая русификация, в том числе справка
Подправлена заставка
Авто-регистрация
Новые значки программы
Контекстное меню по умолчанию
Удалены лишние файлы, ненужные программе.

Информация о программе:
Название: Restorator
Версия: 3.70.1747
ОС: Windows® 2000/XP/Vista/7
Год выхода: 2011
Язык интерфейса: русский
Лекарство: не требуется (portable)
Размер: 5 Мб
Формат файла: Rar
Информация для воссстановления: 2%
архив не запаролен

| 0 |

html-cсылка (Ссылка на Ваш сайт, дневник или блог):

Прямая ссылка (Ссылка для ICQ, QIP, Skype, MSN и других):

Предупреждение:

Все ссылки представлены исключительно для ознакомления и расположены не на нашем сервере. Обычно это файлообменные системы такие как: letitbit.net, depositfiles.com, turbobit.net, ifolder.ru, rapidshare.com, narod.ru и т.п. с которых Restorator 2007 v3.70.1747 Portable — редактор файлов exe, dll, ocx можно скачать бесплатно и к которым сайт сайт не имеет никакого отношения. Раздел portable
(портативных программ для usb ключа) является лишь блоком, на котором пользователи выкладывают портативный софт
и ссылки к ним, которые доступны публично. После просмотра вы обязаны удалить и приобрести легальную копию. Если вы с этим не согласны, просьба покинуть сайт.

Онлайн сервисы для проверки на вирусы:

DrWeb: http://www.drweb.ru/scan

Касперский: http://www.kaspersky.ru/scanforvirus


ESET Online Scanner: http://www.eset.com/onlinescan/index.php


VirusTotal (комплексная проверка): http://www.virustotal.com

VirSCAN.org (комплексная проверка): http://virscan.org

Anubis (онлайновый поведенческий анализатор): http://anubis.iseclab.org

Найдя вирус, напишите в каком файле найден вирус, его название и каким антивирусом проверяли.

Если у вас возникли вопросы касаемые этой новости, обращайтесь к автору публикации

Динамическая библиотека служит базой для создания небольших программ в среде Windows. Это внешние источники данных, которые нужны для полноценной работы ПО. Второй вариант расширения — динамические веб-страницы, которые создаются сервером, при обращении пользователей к ним.

Рассмотрим, как работать с обоими типами в различных ОС.

Чем открыть файл dll для редактирования

Вне зависимости от того, является понятие частью прикладной программы или входит в состав систем МС, распространённый вопрос — чем открыть файл dll для редактирования.

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

Но, если вы хотите познакомиться с исходным кодом, вам потребуется специальный редактор для системных ресурсов Resource Hacker (ResHacker). Он позволяет извлекать и изменять код на ваше усмотрение.

Пошаговая инструкция

Итак, как открыть dll файл для изменения?

    Запустите ResHacker.

    Для чтения в исходном формате выберите в верхней панели File>Open.

    Слева будут показаны директивы с содержащимися в них открываемыми объектами.

    В центре утилиты содержатся коды, подлежащие изменениям и сохранению.

    Для компиляции воспользуйтесь кнопкой Compile Script.

    Для сохранения используйте команду File>Save.

Открыть dll файл онлайн

Если вы имеете дело с веб-страницей, то вам понадобится открыть этот dll файл онлайн. Он содержит в себе скрипты сервера, отвечающие за генерирование HTML. К примеру, VB или Perl.

Страницы помещаются на серверах Microsoft IIS. Для их обработки требуется корректная настройка. Они читаются в любом из используемых вами браузеров — , или .

Как открыть dll файл windows 10

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

Поэтому, чтобы их открыть на том же windows10 понадобится соответствующее ПО от МС — Visual Studio или VisualFoxPro.

Также «длл» должен открываться программой, использующей его библиотеку.

Как открыть файл dll на windows 8

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

    Microsoft Windows 8;

    Resource Hacker;

    Microsoft Windows NT 4.0;

    DLL-Files Fixer.

Как открыть файл dll в windows 7

Вы можете встретить распространённый тип документа mfc42u.dll, который относится к Microsoft Foundation Class (MFC). Он отвечает за запуск рабочих дополнений на вашем ПК.

Открыть этот файл dll и подобные ему в windows 7 можно теми же утилитами, что используются для 8 версии, или воспользоваться небольшим редактором исполняемых элементов — Resource Tuner.

Он позволяет изменять различные детали пользовательского интерфейса — строки меню и диалоговых окон, внешний вид курсора, иконок и так далее. В нём ресурсы библиотеки отделены от кода, который остаётся неизменным. Для его редактирования есть используемые в программировании профессиональные редакторы PE Explorer и FlexHex, (в зависимости от вносимых правок).

Resource Tuner предусматривает несколько способов открытия объекта.

    Для просмотра и изменения кликните Open File на панели инструментов.

    Для выполнения действия в меню — введите команду File>Open.

    Или используйте комбинацию клавиш CTRL+O.

Всплывающее окно возле кнопки тулбара предоставит вам список последних открывавшихся элементов. Его можно получить командой File>Recent Files из меню программы, которая пользуется динамически подключаемой библиотекой. Настройка количества данных в списке осуществляется в окне диалога Customize.

Открыть dll файл на MacOS

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

На системные файлы dll в большинстве случаев ссылаются кросс платформенные приложения и по факту, открывать и редактировать их в среде Macintosh нет никакой необходимости.

Открытие dll файл на linux

Чтобы получить доступ к ним на Linux, понадобится эмулятор Windows — Wine. Он подражает поведению различных версий этой операционной системы.

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

Настроить работу Wine можно при помощи вкладки Default Settings — установок по умолчанию. Так он будет автоматически запускать приложения в выбранной вами ОС.

Программа для открытия dll файлов

Для отображения в родной среде можно использовать обычный блокнот. Но в таком случае возникнет трудность с не читаемыми символами. Чтобы её не было, необходима специальная программа для открытия dll файлов. К примеру, бесплатный декомпилятор dotPeek.

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

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

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

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

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

Полученный в результате компиляции файл (сборка) содержит внутри себя метаданные, манифест, код на языке 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)

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

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

Строки в ресурсах хранятся в виде StringTable и MessageTable и используются главным образом для отображения текста в окнах сообщений, в списках, подсказках или в строках состояния. Кроме текста, в строковых таблицах так же могут находится управляющие символы и плейсхолдеры (например, %d или %s).

Строковые таблицы состоят из групп, в каждой из которой находятся одна или несколько нуль-терминированных строк с уникальным идентификатором (ID строки). Максимальная длина строки — 4097 символов.

ID строки изменить нельзя. Это значение жёстко закодировано в исходном коде файла. Его изменение повлечёт за собой ошибки в работе редактируемого файла.

Редактирование строк в.EXE файле при помощи Resource Tuner

1
. Раскройте папку String
в Дереве ресурсов и выберите строковую таблицу из списка. В правой панели вы увидите список строк в виде скрипта STRINGTABLE.

Подсказка: Воспользуйтесь кнопкой поиска в дереве ресурсов (Ctrl+F
), если ищете какую-то определённую строчку.

2
. Выберите строку из таблицы и внесите необходимые изменения. Окно редактирования поддерживает вставку текста из файла (Ctrl+O
) или из буфера обмена (Ctrl+V
).

Особое внимание обращайте на наличие в строках управляющих символов и заполнителей (placeholders), например, %d
или %s
. Случайно изменённый или удалённый управляющий символ может послужить причиной ошибки при выполнении программы вплоть до аварийного завершения.

3
. Выберите в меню «Файл» -> «Сохранить файл»
для сохранения произведённых изменений в файл.

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

Замена строк из командной строки при помощи Resource Tuner Console

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

Исполняемый файл
формата exe представляет собой скомпилированный программный код. Обычными редакторами просмотреть и изменить его содержимое не получится. Для редактирования exe-файл
ов воспользуйтесь редактором двоичных файл
ов, например — программой Hex Edit.

Вам понадобится

  • — программа Hex Edit.

Инструкция

Найдите в интернете и загрузите на компьютер программу Hex Edit. Найти можно на сайте soft.ru. Вы можете воспользоваться другим редактором, найдя его через поисковые системы в интернете. Логика работы с подобными редакторами практически не отличается.

Основное окно программы такое же, как и у любых редакторов: главное меню, панель с кнопками управления, область редактирования и прочее. Откройте exe-файл
через пункт «Открыть» главного меню. Не стоит вносить изменения в оригинал — скопируйте exe-файл
и работайте над копией. Как правило, содержимое оригинального файл
а не должно меняться, так как при неправильном редактировании все содержимое будет работать некорректно, или вообще перестанет работать на персональном компьютере.

Отображение exe-файл
а происходит в интерпретации двоичного содержимого. Это будет выглядеть как строки с цифрами и латинскими буквами, обозначающими участки файл
а. Измените режим отображения документа, чтобы увидеть куски программного кода или важные части файл
а. Вы можете редактировать различные части документа. Не стоит забывать о том, что для работы с подобными файл
ами, у вас должны быть некоторые навыки работы.

Сохраните изменения с помощью соответствующего пункта меню. Проверьте файл
на работоспособность, так как при редактировании exe-файл
а редактором его работоспособность может не сохраниться. Сравните файл
ы между собой. Ознакомьтесь с литературой по редактированию двоичного кода. Есть определенные правила размещения информации в двоичном виде, а также определенная структура построения exe-файл
а. Данную информацию можно найти в интернете, а также на тематических ресурсах, воспользуйтесь поисковиком.

Внимание, только СЕГОДНЯ!

Все интересное

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

PDF – популярный формат электронных документов. Он служит в качестве инструмента хранения полиграфической продукции и изображений для дальнейшего редактирования или просмотра. При помощи специальных программ можно сконвертировать несколько файлов…

DLL – файл библиотеки Windows, который содержит в своем составе набор функций, необходимых для запуска приложений в системе. Для просмотра содержимого этого документа и изменения его параметров вы можете воспользоваться специальными программами для…

Бинарный файл — это любой файл на вашем компьютере. Вся информация на компьютере и связанных с ним носителях записана в битах (отсюда и название). Однако, для сравнения, текстовый файл можно прочитать в соответствующих расширению ридерах (простейшие…

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

Кому хоть раз в жизни не хотелось поставить какое-нибудь оригинальное приветствие при загрузке операционной системы или дополнить домашнее видео репликами героев популярного мультфильма? Для этого нужно всего лишь воспользоваться звуковым редактором…

Бинарный файл представляет собой закодированный текстовый документ с расширением *.BIN. Этот тип файлов используется в прикладных программах и содержит информацию о программном обеспечении. Вы можете сохранять любые типы данных: строки, целые или…

В сервисных файлах с расширением res обычно содержится внутренняя информация программ и игр — элементы интерфейса, различные ресурсы, такие как звуки и анимация. Файлы res сформированы средой разработки определенного языка программирования и…

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

Случается так, что скачанный из интернета флеш шаблон не удовлетворяет всем вашим требованиям. Вы можете его подкорректировать с помощью специальных приложений, таких как Dreamweaver. Как это сделать, читайте далее. Инструкция 1Скачайте из…

HTML (Hypertext Markup Language) – язык гипертекстовой разметки. Именно он предоставляет возможность видеть страницы различных сайтов так, как мы их видим. Все картинки, текст, цвета, ссылки, различные кнопочки описываются языком html. Файлы с…

Основное предназначение любого компьютера — хранение и обработка информации. Но если информации слишком много, то возникает проблема поиска необходимой именно сейчас папки или файла. Так где и как искать? Инструкция 1Нажмите кнопку…

Содержание

  • Способы декомпиляции EXE-файлов
    • Способ 1: VB Decompiler
    • Способ 2: ReFox
    • Способ 3: DeDe
    • Способ 4: EMS Source Rescuer
  • Вопросы и ответы

Как декомпилировать EXE-файлы

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

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

Способ 1: VB Decompiler

Первым рассмотрим VB Decompiler, который позволяет декомпилировть программы, написанные на Visual Basic 5.0 и 6.0.

Загрузить программу VB Decompiler

  1. Нажмите «Файл» и выберите пункт «Открыть программу» (Ctrl+O).
  2. Стандартное открытие программы в VB Decompiler

  3. Найдите и откройте программу.
  4. Открытие EXE в VB Decompiler

  5. Декомпиляция должна сразу запуститься. Если этого не произошло, нажмите кнопку «Старт».
  6. Запуск декомпиляции в VB Decompiler

  7. По завершении внизу окна появится слово «Декомпилировано». В левой части расположено дерево объектов, а в центральной можно просматривать код.
  8. Просмотр исходного кода через VB Decompiler

  9. При необходимости, сохраните декомпилированные элементы. Для этого нажмите «Файл» и выберите подходящий вариант, например, «Сохранить декомпилированный проект», чтобы извлечь все объекты в папку на диске.
  10. Сохранение декомпилированного проекта в VB Decompiler

Способ 2: ReFox

В плане декомпиляции программ, скомпилированных через Visual FoxPro и FoxBASE+, неплохо себя зарекомендовал ReFox.

Загрузить программу ReFox

  1. Через встроенный обозреватель файлов найдите нужный EXE-файл. Если его выделить, то справа будет отображаться краткая информация о нём.
  2. Поиск EXE через ReFox

  3. Откройте контекстное меню и выберите пункт «Decompile».
  4. Переход к декомпиляции в ReFox

  5. Откроется окно, где нужно указать папку для сохранения декомпилированных файлов. После нажмите «ОК».
  6. Запуск декомпиляции в ReFox

    Lumpics.ru

  7. По окончании появится такое сообщение:
  8. Завершение декомпиляции в ReFox

Можно просмотреть результат в указанной папке.

Способ 3: DeDe

А DeDe будет полезна для декомпиляции программ на Delphi.

Загрузить программу DeDe

  1. Нажмите кнопку «Добавление файла».
  2. Добавление файла в DeDe

  3. Найдите файл EXE и откройте его.
  4. Добавление EXE в DeDe

  5. Для запуска декомпиляции нажмите кнопку «Процесс».
  6. Запуск декомпиляции в DeDe

  7. При успешном завершении процедуры появится такое сообщение:
  8. Завершение декомпиляции в DeDe

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

  9. Для сохранения всех этих данных откройте вкладку «Project», проставьте галочки рядом с типами объектов, которые нужно сохранить, выберите папку и нажмите «Сделать файлы».
  10. Сохранение декомпилированных объектов в DeDe

Способ 4: EMS Source Rescuer

Декомпилятор EMS Source Rescuer позволяет работать с EXE-файлами, скомпилированными при помощи Delphi и C++ Builder.

Загрузить программу EMS Source Rescuer

  1. В блоке «Executable File» нужно указать нужную программу.
  2. В «Project name» пропишите имя проекта и нажмите «Next».
  3. Выбор исходника и имя проекта в EMS Source Rescuer

  4. Выберите необходимые объекты, укажите язык программирования и нажмите «Next».
  5. Выбор объектов и языка программирования в EMS Source Rescuer

  6. В следующем окне исходный код доступен в режиме предпросмотра. Осталось выбрать выходную папку и нажать кнопку «Save».
  7. Предпросмотр и сохранение проекта в EMS Source Rescuer

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

Еще статьи по данной теме:

Помогла ли Вам статья?

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

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

  • Как изменить код подразделения паспорта на госуслугах
  • Как изменить код плательщика на мос ру
  • Как изменить код пк белвэб
  • Как изменить код пароль экранного времени у ребенка
  • Как изменить код пароль экранного времени если забыл пароль

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

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