Как узнать чем компилировалась программа

Пытался гуглить на эту тему, да как-то не получается сформулировать вопрос.

Вопрос: Включается ли в скопилированный *.exe информация о среде разработки, компиляторе?

Что-то (здравый разум) мне подсказывает, что IDE — нет, а вот про компилятор — да.

И второй вопрос: как поменять эту информацию?

ЗЫ: Если бы в настройках компилятора ObjectPascal можно было бы сменить такую инфу я бы очень удивился и очень обрадовался ))

G.Azamat < Web Development / Computer simulation >
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.

Заблокирован
Регистрация: 20.07.2008
Сообщений: 4,033

Поменять практически не возможно, ибо это не одна запись а куча маленьких:
http://ru.wikipedia.org/wiki/%D0%A1%. B9%D0%BB%D0%B0

Например, любой откомпилированный класс языка Java начинается с шестнадцатеричного «магического числа» 0xCAFEBABE. Второй широко известный пример — любой исполняемый файл ОС Microsoft Windows с расширением .exe начинается с последовательности байт 0x4D5A. Менее известным примером является неинициализированный указатель в Microsoft Visual С++ (начиная с 2005 версии Microsoft Visual Studio), который в режиме отладки имеет адрес 0xDEADBEEF.

Участник клуба
Регистрация: 11.01.2009
Сообщений: 1,916

У многих программа перестала работать…. Что делать?

Вопрос: Включается ли в скопилированный *.exe информация о среде разработки, компиляторе?

Есть такая бесплатная игрушка «Detect it easy»
На вкладке Scan жмешь внизу OpenPE и смотришь инфу по файлу .

Вложения

die_0.64.rar (930.1 Кб, 250 просмотров)

php / delphi
Форумчанин
Регистрация: 10.06.2007
Сообщений: 175
Спасибо большое))
Detect it easy оказалась совсем хорошей игрушкой! И показала

Borland Delphi [ver: 7] | Object Pascal

вопреки всем мои ожиданиям ))

Поменять практически не возможно

Ну я пока надежды не теряю )) Внушает уверенность небольшая выдержка из одного мануала

Delphi 2005
Предопределенный символ для идентификации компилятора — VER170 (выяснено опытным путем, в Help информация отсутствует).

Вдруг там в одном месте ногтем подколупнуть, и вуаля. Где бы еще эти «предопределенные символы» узнать.

G.Azamat < Web Development / Computer simulation >
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.

Реверсинг python программы, почему python не безопасен

Trust no one.
Регистрация: 07.04.2009
Сообщений: 6,526

А я вот, что заметил — в файлах, сделанных с помощью паскаля (exe,TP) — включается такая строка: «copyright borland 19xx-19xx» откройте в хексе и убедитесь.

SQUARY PROJECT — НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK — УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

php / delphi
Форумчанин
Регистрация: 10.06.2007
Сообщений: 175

Ну это вроде не то, идентификация куда-то глубже привязана)) Я вот вскрыл свой экзешник через Resours Hacker (эдакий редактор для бездельников/домозяек), а там вот чего есть:

type=»win32″
name=»DelphiApplication»
version=»1.0.0.0″
processorArchitecture=»*»/>

type=»win32″
name=»Microsoft.Windows.Common-Controls»
version=»6.0.0.0″
publicKeyToken=»6595b64144ccf1df»
language=»*»
processorArchitecture=»*»/>

Менять пробовал — в «Detect it easy» все попрежнему

G.Azamat < Web Development / Computer simulation >
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.

я получил эту роль
Регистрация: 25.05.2007
Сообщений: 3,694

DiE, как и многие другие тулзы, ищет сигнатуры, свойственные разным компиляторам — у программ, написанных на делфи, это 3-4 вызова процедуры инициализации + мусор в ресурсах, в С — вызов GetModuleHandle и функция Main, кроме того майкрософтовский линкер оставляет сигнатуру Rich после MZ-заголовка. Какой-то конкретной ‘волшебной метки’ нет

php / delphi
Форумчанин
Регистрация: 10.06.2007
Сообщений: 175

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

Какой-то конкретной ‘волшебной метки’ нет

Например, проги откомпилированные Lasarus идентифицировались как С/С++. Видимо какая-то из библиотек оставляла специфичный код ))

Зато узнал много нового))

G.Azamat < Web Development / Computer simulation >
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.

Регистрация: 14.02.2010
Сообщений: 2

Спасибо большое))
Detect it easy оказалась совсем хорошей игрушкой! И показала

вопреки всем мои ожиданиям ))
Ну я пока надежды не теряю )) Внушает уверенность небольшая выдержка из одного мануала

Вдруг там в одном месте ногтем подколупнуть, и вуаля. Где бы еще эти «предопределенные символы» узнать.

Есть ещё одна интересная игрушка — OgreGUI. Позволяет поменять много чего в уже откомпилированном файле.

.equ CMD_PORT= PORTA
.equ CMD_PIN = PINA
.equ CMD_DDR = DDRA

Источник: www.programmersforum.ru

Compiler Explorer – это больше, чем посмотреть результат компиляции

Сегодня мы поговорим про Compiler Explorer (godbolt.org). Если Вы ещё не знакомы с этим сервисом для экспериментов с компиляцией кода в режиме online, значит пришло время прочитать про этот полезный и интересный инструмент. А если уже знакомы, то после прочтения заметки Вы сможете по новому взглянуть на этот инструмент.

Compiler Explorer – это больше, чем посмотреть результат компиляции

Что такое Compiler Explorer

Compiler Explorer – это интерактивный инструмент, который позволяет Вам набирать код в одном окне и сразу видеть результат компиляции в другом окне (онлайн компилятор).

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

Поддерживаются различные языки, например, Ada, D, Fortran, Python. Впрочем, нам здесь сейчас интересно пообсуждать поддержку языков C и C++.

Скриншот 1

Заметка! Если Вам интересно, у Compiler Explorer есть С++-канал в Slack. Вы можете присоединиться к нему, получив автоматический инвайт.

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

Скриншот 2

Интересный функционал Compiler Explorer

Возможно, всё это Вы уже знали и до прочтения данной статьи. Однако мне есть что добавить. Compiler Explorer постепенно развивается и из просто online-компилятора он превращается в нечто большее. Начал пополняться раздел дополнительных инструментов («Add tool»), и теперь возможно не только скомпилировать код, но и посмотреть, что о коде думают, например, такие анализаторы как clang-tidy или PVS-Studio.

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

Курс по SQL для начинающих

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

Пример использования

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

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

А ещё при этом можно сразу пользоваться статическими анализаторами. Удастся сразу найти многие ошибки/опечатки и заодно приобщиться к хорошей полезной практике применения статических анализаторов кода.

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

Скриншот 3

Как видите, программа компилируется и даже запускается. Вот только она как-то странно работает, и изменённая матрица упрямо не хочет печататься на экране.

Хорошо, что в правом нижнем углу статический анализатор PVS-Studio предупреждает о возможной опечатке. И действительно, во внутреннем цикле увеличивается переменная i, а не j. Возникает вечный цикл. Исправим код и теперь всё работает так, как и ожидалось.

Скриншот 4

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

P.S. Для более сложных лабораторных работ или курсовых проектов такой подход, конечно, не годится. В этом случае можно установить PVS-Studio на компьютер и использовать бесплатные лицензии. См. раздел «Бесплатное использование PVS-Studio студентами и преподавателями».

На сегодня это все, пока!

Источник: info-comp.ru

Реверсинг .NET. Как искать JIT-компилятор в приложениях

Во вре­мя деком­пиляции и ана­лиза .NET-при­ложе­ний ревер­серы стал­кива­ются с раз­личны­ми метода­ми анти­отладки. Один из них — сок­рытие метадан­ных и IL-кода, которые вос­ста­нав­лива­ются толь­ко при JIT-ком­пиляции прог­раммы. Для борь­бы с ними хакеры и реверс‑инже­неры при­дума­ли целый ком­плекс спе­циаль­ных инс­тру­мен­тов и методов, которые мы рас­смот­рим в сегод­няшней статье.

info

C лег­кой руки Microsoft одной из самых популяр­ных плат­форм для прог­рамми­рова­ния в нас­тоящее вре­мя ста­ла .NET. Огромное количес­тво инс­тру­мен­тов, биб­лиотек и докумен­тации обес­печива­ют прос­тоту вхож­дения даже для самых начина­ющих кодеров, а кросс‑плат­формен­ность и все более совер­шенная опти­миза­ция кода дела­ют ее одним из основных стан­дартов написа­ния ком­мерчес­кого соф­та. Как следс­твие, инс­тру­мен­тов для взло­ма и реверс‑инжи­нирин­га под эту плат­форму тоже успе­ли соз­дать немало. Сре­ди них dnSpy, ILspy, ILdasm, Dile, SAE и мно­гие дру­гие, имя им — леги­он!

За­дача для ревер­серов упро­щает­ся тем, что по умол­чанию ском­пилиро­ван­ная прог­рамма фак­тичес­ки содер­жит свой исходник: име­на сим­волов хра­нят­ся в явном виде, а кросс‑плат­формен­ный IL-псев­докод лег­ко вос­ста­нав­лива­ется до исходных син­такси­чес­ких конс­трук­ций C# или VB, из которых он был получен при ком­пиляции. Соот­ветс­твен­но, взлом такой прог­раммы для начина­юще­го хакера — одно удо­воль­ствие: дос­таточ­но заг­рузить ее в dnSpy, и вот она, на блю­деч­ке в сво­их исходни­ках, для удобс­тва даже окра­шен­ных в при­ятные цве­та. Отла­живай и правь как хочешь, как буд­то сам эту прог­рамму и написал!

Немного теории

Ра­зуме­ется, про­изво­дите­ли соф­та мирить­ся с подоб­ным положе­нием дел не могут, и на оче­ред­ном вит­ке кон­фрон­тации меж­ду хакера­ми и про­тек­торами было раз­работа­но мно­го инс­тру­мен­тов, пре­пятс­тву­ющих вос­ста­нов­лению исходно­го кода из IL-сбор­ки. Гру­бо говоря, все подоб­ные инс­тру­мен­ты исполь­зуют три основных прин­ципа:

  • сок­рытие (шиф­рование, ком­прес­сия и так далее) .NET-метадан­ных и IL-кода с вос­ста­нов­лени­ем толь­ко в крат­кий миг JIT-ком­пиляции;
  • об­фуска­ция IL-кода, то есть пред­намерен­ное запуты­вание его логики, борь­ба с чита­емостью тек­сто­вых строк и имен сим­волов, что­бы понять логику работы вос­ста­нов­ленно­го IL-кода было слож­нее;
  • ком­бинация двух пре­дыду­щих катего­рий.

Се­год­ня мы погово­рим о методах из пер­вой катего­рии. В прин­ципе, наибо­лее прос­той и дубовый спо­соб огра­дить прог­рамму от ILDasm — ском­пилиро­вать ее с атри­бутом SupressIldasmAttribute . Понят­ное дело, это защита от чес­тных людей, пос­коль­ку такая сбор­ка пре­вос­ходно детек­тиру­ется как .NET-при­ложе­ние, деком­пилиру­ется дру­гими инс­тру­мен­тами, а дан­ный атри­бут с пол­пинка сни­мает­ся в CFF Explorer или, при изрядной сно­ров­ке, в прос­том HEX-редак­торе. Более инте­рес­но «завер­нуть» метадан­ные в обыч­ное натив­ное при­ложе­ние, фор­миру­ющее и запус­кающее .NET-сбор­ку на лету.

В этом слу­чае никакие детек­торы не рас­позна­ют в ней .NET, если их пред­варитель­но не обу­чили это­му трю­ку, а деком­пилято­ры и отладчи­ки, с ходу не уви­дев­шие в прог­рамме метадан­ных, обло­мают­ся при заг­рузке. С помощью dnSpy мож­но попытать­ся иссле­довать такое при­ложе­ние, одна­ко при пре­рыва­нии он нав­ряд ли смо­жет вос­ста­новить и трас­сировать код даль­ше, что дела­ет такую отладку бес­полез­ной. Как быть в таком слу­чае?

Са­мый прос­той спо­соб — вос­поль­зовать­ся ути­литой MegaDumper (или даже ее более прод­винутой вер­сией ExtremeDumper). Если .NET сфор­мирован и запущен по всем пра­вилам, то он кор­рек­тно рас­позна­ется упо­мяну­тыми ути­лита­ми имен­но как .NET-про­цесс, и при нажатии кно­поч­ки . NET dump дам­пится как стан­дар­тное .NET-при­ложе­ние. Прав­да, Wow­се не факт, что оно будет запус­кать­ся.

Что­бы при­вес­ти его в запус­каемый вид, при­дет­ся про­делать опре­делен­ные телод­вижения, в зависи­мос­ти от прод­винутос­ти про­тек­тора. Тем не менее метадан­ные .NET и IL в такой сдам­плен­ной сбор­ке будут дос­тупны для деком­пиляции и ана­лиза. Мож­но убе­дить­ся в этом, открыв сбор­ку, нап­ример, в CFF Explorer. Одна­ко я спе­циаль­но сде­лал ого­вор­ку «если». Поп­робу­ем разоб­рать­ся, почему подоб­ное может не сра­ботать.

Для это­го пос­тара­юсь корот­ко в двух сло­вах напом­нить прин­цип фун­кци­они­рова­ния .NET-при­ложе­ния для тех, кто забыл мат­часть. Нес­мотря на то что сбор­ка сос­тоит из метадан­ных и кросс‑плат­формен­ного IL-кода, при выпол­нении при­ложе­ния он не интер­пре­тиру­ется, а ком­пилиру­ется в весь­ма опти­мизи­рован­ный натив­ный код целево­го про­цес­сора и целевой опе­раци­онной сис­темы. Дела­ется это непос­редс­твен­но при заг­рузке бло­ка кода один раз, впос­ледс­твии будет выпол­нять­ся уже ском­пилиро­ван­ный натив­ный код метода. Сам про­цесс называ­ется JIT-ком­пиляция (Just In Time, «вре­мен­ная ком­пиляция на лету»). То есть если прер­вать прог­рамму в про­изволь­ный момент в отладчи­ке типа x64dbg, то про­цесс будет оста­нов­лен имен­но во вре­мя исполне­ния такого вре­мен­но ском­пилиро­ван­ного натив­ного кода.

Трас­сировать, отла­живать и ревер­сировать его, конеч­но, мож­но, но целесо­образность это­го сом­нитель­на. Нас инте­ресу­ет дру­гой под­ход — пой­мать и сдам­пить уже вос­ста­нов­ленный фраг­мент IL-кода перед его JIT-ком­пиляци­ей. Логика под­ска­зыва­ет, что, если мы хотим сде­лать это вруч­ную, нам надо най­ти в отладчи­ке изна­чаль­ную точ­ку вхо­да в JIT-ком­пилятор. Самое прос­тое — отыс­кать метод SystemDomain:: Execute в биб­лиоте­ке clr. dll (или mscorwks. dll для более ста­рых вер­сий .NET). Обыч­но для подоб­ных вещей рекомен­дуют исполь­зовать WinDbg и его рас­ширение SOS, но я для при­мера покажу, как это делать в x64dbg.

Ищем JIT-компилятор

Итак, заг­рузив нуж­ное при­ложе­ние в отладчик, мы с неп­рият­ным удив­лени­ем обна­ружи­ваем, что биб­лиоте­ка clr. dll отсутс­тву­ет в спис­ке отла­доч­ных сим­волов. Зна­чит, ее при­дет­ся заг­рузить допол­нитель­но, пред­варитель­но отыс­кав глу­боко в нед­рах под­катало­гов сис­темной пап­ки Windows. Най­дя и заг­рузив clr. dll (попут­но заг­рузит­ся нес­коль­ко биб­лиотек), мы сно­ва с раз­дра­жени­ем обна­ружим, что метод SystemDomain:: Execute отсутс­тву­ет в пра­вом спис­ке экспор­та. Ну что ж, по счастью, x64dbg пре­дос­тавля­ет прек­расную воз­можность заг­рузить отла­доч­ные сим­волы пря­мо с май­кро­соф­тов­ско­го сер­вера — для это­го нуж­но щел­кнуть пра­вой кла­вишей мыши на clr. dll и выб­рать соот­ветс­тву­ющий пункт в кон­текс­тном меню.

По­дож­дав некото­рое вре­мя, мы уви­дим, что спи­сок в пра­вой час­ти окна отладчи­ка изрядно уве­личил­ся и иско­мый метод SystemDomain:: Execute в нем уже при­сутс­тву­ет. Ста­вим на него точ­ку оста­нова и запус­каем прог­рамму. В момент оста­нова на этом методе дот­нетов­ские метадан­ные чаще все­го уже рас­шифро­ваны, рас­пакова­ны и их мож­но дам­пить в файл хоть MegaDumper’ом, хоть Scylla из самого дебаг­гера. Одна­ко это­го тоже может ока­зать­ся недос­таточ­но. Поп­робу­ем коп­нуть чуть глуб­же и вый­ти на исходный JIT-ком­пилятор.

Присоединяйся к сообществу «Xakep.ru»!

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

Источник: xakep.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru