main
не является точкой входа вашей программы на этом уровне.
Язык C является абстракцией, прежде чем main
сможет запустить , необходимо инициализировать среду выполнения .
C ++ еще сложнее, но идея та же: есть какой-то код, который запускается до main
(в противном случае, кто, например, инициализировал бы cout
?)
В конце днявсе языки компилируются в двоичный PE, важно ознакомиться с этим.
Я скомпилировал вашу программу, чтобы показать, как найти main
.
Обратите внимание, что, основываясь наВаш код, я предположил, что вы компилировали файл C, глядя на разборку, кажется, вы скомпилировали файл C ++.C ++, как известно, более сложен для обратного инжиниринга.
Пример ниже будет отличаться от вашего, мой пример представляет собой отладочную сборку x86.
Прежде всего, IDA сообщает вам, где находится точка входа PE в закладке Экспорт
Если дважды щелкнуть по нему и следовать пути, следуя инструкциям jmp
и call
(есть только один путь, вы не можете потеряться), вы получите процедуру с двумя вызовами
VS генерирует cookie-файл безопасности в первую очередь, и именно это делает первая вызванная функция:
Обратите внимание, что эта подпрограмма довольно узнаваема даже без подсказок IDA, потому что она делает очень точные вызовы API, вы можете найти некоторые из названий функций на картинке, чтобы найти документацию.
Предполагается, что этоЭто процедура генерации cookie-файлов безопасности, после чего мы возвращаемся к предыдущему и вводим второй вызов
Это тело вашей программы, а не main
, но если CRT инициализируется и завершается, включая вызов main
.
Takeпосмотрите на блок-схему в левом нижнем углу и увидите, что большая часть работы находится в левой ветви (это означает, что правая ветвь является ошибочным условием).
main
обычно называют за несколько call
с до _exit
или _cexit
.Затем мы приближаемся к этим вызовам:
Если вы наведите курсор мыши на вызов функции, IDA покажет код функции.
Функции, которые являютсяодиночные jmp
присутствуют в сборке отладки, чтобы помочь отладчику, и чаще всего являются функциями времени выполнения.
Первая обведенная функция, когда она находится, показывает вызов подпрограммы «enviroment», это хорошо, так как main
нужны аргументы программы (Windows не передает аргументы программе, для их получения существует специальный API).
Thisвыглядит как вызов main
, аргументы совпадают.
Фактически, если мы введем вызов, мы получим main
:
Конечно, вы могли бы найти main
, просто взглянув на "Hello, world!"строка в «String view» ( Shift + F12 ), но в реальном мире сценарий обратного инжиниринга это почти всегда невозможно.
Создание программы, а затем ее обратное проектирование - очень хороший подход. Если у вас установлена VS, вы можете иметь MS DIA SDK, который позволяет IDA читать файлы pdb
.
Это очень помогает с реверс-инжинирингом, вы можете загрузить две IDA, одну с PDB, а другую без и сравнить.
К сожалению, получить MS DIA SDK может быть не так просто.
Кроме того, IDA FLIRT является обязательным.
Это библиотека сигнатур методов, она позволяет IDA распознавать функции времени выполнения, что позволяет легко сосредоточиться на реальном коде приложения.Трудно найти (и сложнее создать) подпись, хотя они того стоят.
Наконец, обратите внимание, что отладочная сборка может быть сложнее для обратного инжиниринга из-за типа сгенерированного кода.
Если вы сделаете сборку релиза и перепроектируете ее, вы увидите, что прощедобраться до main
.