Опыт дизассемблирования большой com программы


Опыт дизассемблирования большой com программы

Вы выбрали книгу «Опыт дизассемблирования большой .com программы. Крупник А.Б». Вы можете совершенно бесплатно скачать эту книгу, но только для ознакомления и личного, не коммерческого использования. Ссылка на скачивание расположена ниже на странице.

Для начала скачивания выберите сервер и нажмите ссылку «скачать»

Все книги запакованы архиватором RAR. Чем распаковать читайте тут. Внутри архива Вы найдёте файл(ы) книги, как открыть и просмотреть файл книги читайте здесь.

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

Опыт дизассемблирования большой com программы

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

Начнем с популярного нынче дотнета. Не будет преувеличением сказать, что самый мощный на сегодняшний день инструмент для потрошения приложений на .NET — это бесплатный проект dnSpy. Он включает в себя декомпилятор C# и Visual Basic .NET, отладчик, редактор сборки с подсветкой синтаксиса, HEX-редактор и еще множество инструментов. Русский язык в наличии. Самую свежую версию можно всегда скачать с офсайта.

IDA Pro (сокращение от Interactive DisAssembler) — один из моих основных инструментов для реверс-инжиниринга и разбора файлов. Это интерактивный дизассемблер и отладчик с поддержкой множества форматов исполняемых файлов для большого числа процессоров и операционных систем. Чтобы перечислить все его возможности потребуется целая книга. Но даже тут возможности IDA не заканчиваются. Плагин Hex-Rays для IDA Pro позволяет декомплировать ассемблерный листинг в более-менее человекопонятный псевдокод, по синтаксису похожий на C. В некоторых случаях это значительно облегчает работу. Просто так приобрести IDA Pro частным лицам практически невозможно, и дело не только в непомерной цене, а в том, что автор придерживается абсолютно неадекватной политики в плане продаж. К счастью, несколько последних версий этого замечательного дизассемблера, несмотря на все трудности, были успешно слиты в свободный доступ. Это IDA Pro Advanced 6.8, последняя доступная версия, которая работает с 32-битными системами, а также IDA Pro Advanced 7.0 и IDA Pro Advanced 7.2 для 64-битных систем. Если по каким-то причинам вы не можете использовать варез, то на офсайте есть бесплатные демо-версии с урезанным функционалом.

IDR (Interactive Delphi Reconstructor) — бесплатный декомпилятор исполняемых файлов и динамических библиотек. В отличие от IDA Pro, этот декомпилятор создан специально для разбора файлов, написанных на языке Delphi. Сейчас проект прекратил развитие, если какие изменения и вносятся, то исключительно косметические. Исходники для доработки открыты. Лично я пользуюсь стабильным комплектом Interactive Delphi Reconstructor 2.6.0.1.

Еще один специализированный декомпилятор — VB Decompiler Pro. Он работает с программами (EXE, DLL, OCX), написанными на Visual Basic. В случае, если приложение собрано в p-code, декомпилятор может разобрать его практически до исходного кода. Но даже если приложение скомпилировано в native code, в этом случае VB Decompiler анализирует и восстанавливает довольно много инструкций, чтобы насколько это возможно приблизить ассемблерный код к исходному. Это сильно упростит задачу анализа алгоритмов исследуемой программы. Честные граждане могут воспользоваться бесплатной Lite-версией с офсайта, для любителей полных версий софта есть релиз VB Decompiler Pro 10.0. Антивирусы могут ругаться на активатор, но тут вы уже сами решайте что делать.

Конечно, это далеко не полный список инструментов для дизассемблирования и декомпиляции, который есть в свободном доступе. Например, та же набирающая популярность Ghidra от АНБ может составить конкуренцию IDA Pro с Hex-Rays. Но я в этой статье перечислил лишь те программы, которыми пользуюсь сам и которые упоминаются в статьях на этом сайте.

Искусство дизассемблирования. Наиболее полное руководство.

Книга посвящена вопросам и методам дизассемблирования, знание которых позволит эффективно защитить свои программы и создать более оптимизированные программные коды. Объяснены способы идентификации конструкций языков высокого уровня таких, как C/C++ и Pascal, показаны различные подходы к реконструкции алгоритмов. Приводится обзор популярных хакерских инструментов для Windows, UNIX и Linux — отладчиков, дизассемблеров, шестнадцатеричных редакторов, API и RPC шпионов, эмуляторов. Рассматривается исследование дампов памяти, защитных механизмов, вредоносного программного кода — вирусов и эксплоитов. Уделено внимание противодействию антиотладочным приемам. Для программистов и продвинутых пользователей.

Компьютерные услуги в Москве и Московской области.

Установка операционных систем.

• Правильно, быстро, надежно и качественно установить и настроить, а также помочь выбрать нужную операционную систему помогут мастера нашего центра.

Установка программного обеспечения.

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

• Восстановление информации на жестких дисках. Восстановление удалённых файлов. Восстановление после форматирования. Восстановление данных с флэш носителя.


Удаление компьютерных вирусов.

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

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

• Мы оказываем качественные и надежные услуги по ремонту компьютеров самого разного уровня. Возможность выполнения ремонта как в офисе, так и на дому.

Сборка компьютера на заказ.

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

Установка и настройка рабочих станций.

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

Установка и настройка серверов.

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

Установка и настройка оргтехники.

• Установка и настройка оргтехники дома или в офисе. Принтеры, сканеры, МФУ, другая оргтехника – важная составляющая повседневной жизни современного человека и неотъемлемая часть каждого офиса.

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

• Чистка компьютера от пыли – это важная операция, которую должен проводить каждый пользователь компьютера.

Дизассемблирование *.exe?

Всем доброго вечера, такая ситуация, есть exe файл программы, написана на C++, необходимо вскрыть ее. Реально ли получить исходный код на том же С++? Использую IDA Pro, но он показывает мне только ассемблер, а я с ним практически незнаком. Читал, что IDA может и С код показывать, и еще много чего, но вот разобраться не могу. Может подскажет кто нибудь, как это сделать? и вообще реально ли это?

P.S. ничем плохим не занимаюсь, просто такое задание дали на тестировании.

  • Вопрос задан более трёх лет назад
  • 4871 просмотр

Вы же делаете дизАССЕМБЛИРОВАНИЕ, понятно что получаете ассемблер.
Есть некоторые тулзы, которые производят декомпиляцию, но при декомпилировании невозможно получить имена переменных, функций и стилистику кода. По
В IDA Pro должен быть декомпилятор Hex-Rays встроенный, он переводит в C код

Введение в дизассемблирование

Базовые понятия дизассемблирования

Что такое дизассемблирование. Дизассемблирование – преобразование программы на машинном языке к ее ассемблерному представлению. Декомпиляция – получение кода языка высокого уровня из программы на машинном языке или ассемблере.

Декомпиляция – достаточно сложный процесс. Это обусловлено следующими причинами:

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

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

− Декомпиляторы в значительной степени зависимы от конкретного языка и библиотек. Обрабатывая исполняемый файл, созданный компилятором Delphi, декомпилятором, разработанным для C, можно получить фантастический результат.

− Необходимо точное дизассемблирование исполняемого файла. Любая ошибка или упущение на фазе дизассемблирования практически наверняка размножатся в результирующем коде.

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

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

− анализ вредоносного программного обеспечения;

− анализ уязвимостей программного обеспечения с закрытым исходным кодом;

− анализ совместимости программного обеспечения с закрытым исходным кодом;

− отображение команд программы в процессе отладки.

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

Анализ уязвимостей. Для простоты, можно разделить процесс аудита безопасности на три стадии: поиск уязвимостей, анализ уязвимостей, и разработка эксплойта. Одни и те же шаги предпринимаются вне зависимости от того, имеется ли у вас исходный код; однако, уровень трудоемкости резко возрастает, когда в вашем распоряжении есть лишь исполняемый файл. Первый шаг — исследование потенциально уязвимых условий в программе. Это зачастую достигается использованием динамических техник, таких как фаззинг, однако также может быть реализовано (обычно со значительно большими усилиями) посредством статического анализа. Как только проблема обнаружена, требуется определить, является ли она уязвимостью и если да, то при каких условиях.

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

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


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

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

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

Базовый алгоритм дизассемблирования

Шаг 1. Первым шагом в процессе дизассемблирования является идентификация кодового сегмента. Так как команды обычно смешаны с данными, то дизассемблеру необходимо их разграничить.

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

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

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

Алгоритм линейной развертки

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

Главное преимущество алгоритма линейной развертки состоит в полном покрытии кодового сегмента. Одним из основных недостатков является невозможность распознать данные, если они совмещены с кодом. Это очевидно из листинга, демонстрирующего результат дизассемблирования функции при помощи данного алгоритма. Эта функция содержит конструкцию switсh. Компилятор принял решение реализовать switch как таблицу переходов. Более того, компилятор предпочел разместить таблицу переходов внутри самой функции. Конструкция jump по адресу 401250 ссылается на таблицу адресов начиная с 410257. К сожалению, дизассемблер рассматривает ее как набор команд и неверно генерирует соответствующее представление на языке ассемблера.

40123f: 55 pushebp

401240: 8bec movebp,esp

401242: 33 c0 xor eax,eax

401244: 8b 55 08 mov edx,DWORD PTR [ebp+8]

401247: 83 fa 0c cmp edx,0xc

40124a: 0f 87 90 00 00 00 ja 0x4012e0

401250: ff 24 95 57 12 40 00 jmp DWORD PTR [edx*4+0x401257]

401257: e0 12 loopne 0x40126b

401259: 40 inc eax


40125a: 00 8b 12 40 00 90 add BYTE PTR [ebx-0x6fffbfee],cl

401260: 12 40 00 adc al,BYTE PTR [eax]

401263: 95 xchg ebp,eax

401264: 12 40 00 adc al,BYTE PTR [eax]

401267: 9a 12 40 00 a2 12 40 call 0x4012:0xa2004012

40126e: 00 aa 12 40 00 b2 add BYTE PTR [edx-0x4dffbfee],ch

401274: 12 40 00 adc al,BYTE PTR [eax]

401277: ba 12 40 00 c2 mov edx,0xc2004012

40127c: 12 40 00 adc al,BYTE PTR [eax]

40127f: ca 12 40 lret 0x4012

401282: 00 d2 add dl,dl

401284: 12 40 00 adc al,BYTE PTR [eax]

401287: da 12 ficom DWORD PTR [edx]

401289: 40 inc eax

40128a: 00 8b 45 0c eb 50 add BYTE PTR [ebx+0x50eb0c45],cl

401290: 8b 45 10 mov eax,DWORD PTR [ebp+16]

401293: eb 4b jmp 0x4012e0

Алгоритм рекурсивного спуска

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

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


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

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

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

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

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

Команды возврата. В некоторых случаях, алгоритм рекурсивного спуска терпит неудачу. Команда возврата из функции (например, ret x86) не предоставляет информации о том, какая команда будет выполнена далее. Если бы программа была на самом деле запущена, управление было бы передано по адресу, расположенному на вершине стека. У дизассемблера нет возможности доступа к стеку. Вместо этого дизассемблирование внезапно останавливается. В этом случае алгоритм рекурсивного спуска обращается к списку отложенных адресов, и процесс дизассемблирования возобновляется. Этот рекурсивный процесс отражает смысл названия алгоритма.

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

Дата добавления: 2020-06-27 ; просмотров: 1646 ; ЗАКАЗАТЬ РАБОТУ

Защита программ от дизассемблирования

Наверное каждый из вас сталкивался с проблемой что-то изменить в какой-то чужой проге. Если это предусматривало просто замену информации, то вы, недолго думая, запускали свой любимый HEX вьюер и меняли все что можно. Не всегда для достижения результата удавалось сохранить размер программы. Но и тогда крутой программер не останавливался и запускал свой дизассемблер (дизассемблирование — процесс, в результате которого из программы вы получаете ее исходный код на . ассемблере :). Ha сегодняшний день известна туева хуча приличных д/а, как то IDA, Periscope, Bubble
Chamber, Sourcer, etc. ). Если у Вас такого еще нет, то я советую начать с IDA (Interactive DisAssembler Pro), который можно достать на
www.datarescue.com/idabase. Далее в полученных ASM файлах менялось что было нужно, и затем из них снова лепили
работающую прогу. Наиболее продвинутые программеры часто из полученных исходников пытаются собрать программы для языков высокого уровня, будь то С, Fortran или даже Basic и Pascal. Этот процесс называется декомпиляцией, из-за его сложности автоматические реализации встречаются крайне редко. Декомпилируют обычно вручную, при этом ищут конец и начало функций. Например, встретив строки ‘push ebp; mov ebp,esp’ вы можете сказать, что это начало функции, а ‘pop ebp; retn’ — ее конец. Такие продвинутые дизассемблеры как IDA уже выделяют все функции, и задача ставится только понять, что они делают.

Но вот вы начали дизассемблировать программу и . облом :(. Ваша прога выдала очень маленький код и завалила какими-то db с непонятными цифрами. При этом вы явно заподозрили что-то неладное. Если программа закодирована или защищена чем-то очень страшным, не стоит сразу отбрасывать ее и орать «Я такую гадость и за сто лет не расшифрую !». Достаточно осознать, чем бы программа не была закодирована, ОНА САМА ЖЕ СЕБЯ РАСКОДИРУЕТ, чтобы работать . Ну вот. А далее остается только действовать. Если программа себя дешифрует/распаковывает или еще_х_знает_что_делает, то можно эту часть программы запустить и взять уже РАСПАКОВАННЫЙ КОД. Есть и другой подход, в принципе не отличающийся от предыдущего: запустить прогу, и во время ее работы записать используемую ей память на диск.

Как правило, шифруемые программы, в том числе и полиморфные вирусы :), шифруют себя несколько раз, при этом они могут переносить или даже изменять свой код, запускать расшифрованную информацию для дальнейшей распаковки, ну а также применять и другие запутывающие подходы. Отсюда следует, что дизассемблером пользоваться невыгодно. Для этой цели выглядит выгодно последовательно прогу выполнять по одной инструкции (так называемое трассирование — trace) или выполнять программу до заданной инструкции/области памяти. Такими функциями обладают практически все отладчики (дебаггеры). Только не говорите мне, что у вас их нет ! Даже в DOSе (и мастдайке в т.ч) есть утилитка DEBUG — самый простой отладчик. Но он, к сожалению, 16-битный, и в общих чертах не удовлетворяет требованиям крутых программеров. Вообще, практически у любого языка программирования есть дебаггер. У Borlandовских (Turbo Assembler (TASM), Borland’s C++) — это серия TD (Turbo Debugger). TD — для DOSовских программ, TDW — для виндовских. Но часто TDW не берет программу с заголовком PE/NE 32bit. Тогда смело запускайте TD32. Не стоит забывать и MicroSoft. В их продуктах (MicroSoft Assembler, MASM) можно найти отладчик CodeView (CV, CVW). Относительно недавно появился пакет утилит NuMega фирмы Compuware, смотрите на
www.numega.com. Отладчик NuMega SoftIce (winice) позволяет дебаггить даже ядро системы, а также с легкостью просматривать все треды, процессы и окна. Часто он входит в комплект BoundsChecker.

Теперь у нас есть все для взлома. Запускаете в отладчике нужную прогу, и выполняете по инструкции. �� если же терпежа не хватит, то поставите breakpoint на выходе из цикла и запустите программу с того места, на котором остановились. Программа передаст управлению отладчику перед выполнением инструкции, помеченной breakpointом. Чаще всего breakpointы представляют собой прерывания (точнее, ловушки), которые заменяют помеченные инструкции. Зачем я это пишу ? — просто
будьте бдительны, чтобы программа не заменила инструкцию, на которой стоит breakpoint, а то он может
потеряться, и программа будет выполняться пока не закончиться :-(. Ну вот, допустим мы дошли до того места, когда начинается собственно распакованная программа. по крайней мере как Вы думаете, а на самом деле это может быть продолжение декодера :D. Теперь можете сохранить всю полученную кашу как EXEшник. Но только учтите вашу новую точку входа и
позаботьтесь о том, чтобы значение регистров сохранилось. а вдруг они далее будут использованы ? Заголовок вы можете посмотреть с помощью классной утилиты HIEW (Hacker’s View) by SEN (ftp.kemsc.ru/pub/sen). Если прога DOSовская — заголовок MZ, виндовская — чаще всего PE.

Теперь рассмотрим некоторые способы защиты программ от дизассемблирования. Если Вы — крутой программер, сделали классную прогу, и по каким-то причинам хотите скрыть ее код ( а вдруг кто заметит там моего любимого троянчика . ), то первое, что придет вам на ум — зашифровать ее. Тут вы можете полистать веселые книжки по криптографии, но в конце понять, что распаковщик слишком прост. Я могу также предложить не только зашифровать, но и запаковать инфу. Если ничего не знаете — первое, что придумаете, будет RunLengthEncode, но паковать им код — дохлый номер. Лучше использовать какую-нибудь модификацию алгоритма LZW. Он, точнее его модификации, используются во многих архиваторах (RAR, ZIP), в графических файлах GIF, даже в PDFах, им запаковываются EXEшники (PKLITE). Теперь, когда есть основа, подумаем о том, как испортить жизнь любителям вскрывать программы. Во-первых, можно зашифровать часть распаковщика, вообще так можно шифровать программу по частям, и по несколько раз зашифровывать расшифровщики :), а потом еще все вместе зашифровать :))). Можно спокойно перемешивать части программы, что также может привести в замешательство.
Помимо этого, можно придумать и более действенные способы защиты ! Как вы думаете, что будет находиться в регистрах после выполнения следующего участка кода:

Label1: mov ax,1ab8h
mov bx,06bbh
mov cx,00b9h
mov dx,01bah
mov si,0ffbeh
mov di,32bfh
jmp Label1+1

Правильный ответ: bx = 0x0b906; cx = 0x0ba00; dx = 0x0be01; si = 0x0bfff; di = 0x0eb32. Не поняли почему ? Тогда откомпилируйте ее и протрассируйте ! Чтобы убирать наставленные breakpointы можно изменять выполняемый код, например, увеличивать или уменьшать следующую инструкцию, можно ставить на них маски, складывать, да и просто перезаписывать. Таким образом каждый раз последующая инструкция может быть изменена:

push cs
pop ds
mov ch,0ebh
mov esi,offset $ или Label2: mov esi, offset Label2
add byte ptr[esi+07],08
sub byte ptr[esi+10],5
db Rel

Этот фрагмент выполняет относительный переход на Rel байтов (равносильно Jmp short ptr Rel). Можно (даже нужно) защищать программы от. трассирования. Да, именно от трассирования. Ну, и ежу понятно, что трассирование гораздо дольше обычного выполнения программы. Это и можно использовать. Ниже я приведу фрагмент, вызывающий функцию DOS ‘Get
Time’:

mov ah,2ch ; Get Time
int 21h ; call DOS services
push dx; dh — seconds, dl — hundredths of a second (0-99)
mov ah,2ch ; Get Time
int 21h ; call DOS services
pop ax; ah — seconds
cmp dh,ah
jz continue
; GOTCHA .

Если время в секундах не изменилось, то осуществляется переход на метку continue, иначе продолжается выполнение программы. Ну а здесь. можно поставить и низкоуровневое форматирование диска 80H (ну, C: я имею в виду. ) . Это для особо нехороших людей типа меня :p, а остальным. советую просто подвесить систему.
Даже вышеприведенный фрагмент, на самом деле, можно протрассировать гораздо быстрее секунды, поэтому советую вставлять запросы времени в разные участки программы,
можно даже по-разному запакованные, так как распаковка гораздо быстрее трассирования.
Более того, сравнение полученных секунд можно отложить на следующий участок кода, так чтобы он не особо выделялся, а то сразу заподозрят: сначала посмотрел сколько времени, потом сравнил с чем-то, а зачем . Часто у многих крекеров (меня в т.ч.) вызывают подозрения команды условного перехода, поэтому уместнее было бы написать все это без них:


; fragment 1
xor ecx,ecx
xor edx,edx
mov ah,01
int 1ah
;установить счетчик тиков на 0
;каждую секунду происходит примерно 18.2 тика
;поэтому предположим, что 2 тика уже слишком много
;fragment 2
xor eax,eax; здесь можно использовать ax,bx,cx,
;но для 32х разрядной машины 32х разрядные регистры занимают меньше памяти
int 1ah; взять число тиков
mov ax,cx
shl eax,16
mov ax,dx ;конвертируем 32-битное число CX:DX в EAX
and al,-1 ;Один тик — не страшно, очистим первый бит
mov edx,eax
mov ecx,31
Label3: shr edx,1
or eax,edx
loop Label3
and eax,2
shl eax,1
add ebx,eax ;допустим, в ebx был нами рассчитан какой-то адрес
call [ebx+xxx]; ebx+xxx — по этому адресу — нормальная процедура
;ebx+xxx+4 — а по этому адресу — перехват трассировщиков .

Искусство дизассемблирования. Наиболее полное руководство.

Книга посвящена вопросам и методам дизассемблирования, знание которых позволит эффективно защитить свои программы и создать более оптимизированные программные коды. Объяснены способы идентификации конструкций языков высокого уровня таких, как C/C++ и Pascal, показаны различные подходы к реконструкции алгоритмов. Приводится обзор популярных хакерских инструментов для Windows, UNIX и Linux — отладчиков, дизассемблеров, шестнадцатеричных редакторов, API и RPC шпионов, эмуляторов. Рассматривается исследование дампов памяти, защитных механизмов, вредоносного программного кода — вирусов и эксплоитов. Уделено внимание противодействию антиотладочным приемам. Для программистов и продвинутых пользователей.

Компьютерные услуги в Москве и Московской области.

Установка операционных систем.

• Правильно, быстро, надежно и качественно установить и настроить, а также помочь выбрать нужную операционную систему помогут мастера нашего центра.

Установка программного обеспечения.

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

• Восстановление информации на жестких дисках. Восстановление удалённых файлов. Восстановление после форматирования. Восстановление данных с флэш носителя.

Удаление компьютерных вирусов.

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

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

• Мы оказываем качественные и надежные услуги по ремонту компьютеров самого разного уровня. Возможность выполнения ремонта как в офисе, так и на дому.

Сборка компьютера на заказ.

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

Установка и настройка рабочих станций.

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

Установка и настройка серверов.

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

Установка и настройка оргтехники.


• Установка и настройка оргтехники дома или в офисе. Принтеры, сканеры, МФУ, другая оргтехника – важная составляющая повседневной жизни современного человека и неотъемлемая часть каждого офиса.

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

• Чистка компьютера от пыли – это важная операция, которую должен проводить каждый пользователь компьютера.

Как дизассемблировать DOS СОМ программу

Здравствуйте, Не подскажите мне пожалуйста, Как я смогу узнать код ассемблера
(( Я хочу изучить программу FDISK.COM и FORMAT.COM — Но для этого мне нужно перевести COM файл в ассемблерный язык ))

У меня есть диссамблер (( IDA pro и OllyDbg ))

Спасибо и До свидания . . . .

11.05.2015, 00:06

Как дизассемблировать файл
Как дисассемблировать файл не подскажете.

Как создать корректную статическую (lib) библиотеку под MS-DOS (16 bit) из Windos (32-64 bit) или из MS-DOS?
Привет всем! Кто подскажет, как корректно создавать статические библиотеки для 16-битного режима.

Как в DOS-BOX написать BAT-файл чтобы ЛЕГКО запустить DOS-программу ?
ВСЕМ ДОБРОГО ВРЕМЕНИ ! Надо на Windows_7 СРОЧНО запустить старую программу, написанную еще под DOS.

Программирование СОМ-порта под DOS
ЗДравствуйте! Очень нужна помощь! БУду благодарен любому ответу или подсказке. Суть вопроса в.

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

IDA Pro — самый мощный дизассемблер в мире

Вступление

Интервью

От автора: Я настоятельно рекомендую вам следующую страницу: http://www.hex-rays.com/idapro/idasupport.htm . На ней можно найти новую документацию по IDA Pro, ссылки на дружественные ресурсы, «туториалы» и «мануалы», дополнительные утилиты и т. д. То есть, как любят писать в сетевых обзорах, must visit!

Первым ассемблером и одновременно первым интерпретатором стал псевдокод и набор инструкций Short Code, разработанный в июле 1949 года американцами Пресом Экертом и Джоном Мошли для компьютера BINAC. Решение любой задачи вначале записывалось математическими уравнениями. Те, в свою очередь, посимвольно транслировались в коды: из “a=b+c” в “S0 03 S1 07 S2”. На заключительном этапе коды приобретали двоичный вид, а каждая строка после ввода автоматически выполнялась. Первая практическая задача, которую решил ассемблер, — расчет таблиц артиллерийской стрельбы для американских баллиститов. Ассемблеры на мнемонических кодах (с “MOV” и “ADD”) появились только в середине 50-х. Авторы ассемблера более известны изобретением самых первых вычислительных машин (на вакуумных трубках): ENIAC (1946), BINAC (1949) и прямого предка современных компьютеров UNIVAC I (1951). К сожалению, ни Эскерт, ни Мошли до наших дней не дожили.

Дизассемблирование програмики

Доброго времени суток.

Возникла у меня потребность, получить исходный код программки на шарпе, в универе дали задание написать прогу, и дали пример (.exe). Самому писать лень. Заюзал дизассемблер, что поставляется вместе со студией, не очень понравился резуальтат. Слишком много пальце-двежений нужно для создания проекта. Попробовал Dis#, уже лучше, выдало мне много кода и ничего лишнего, на радостях копи-пастнул все это дело, но возникла ожидаемая проблема с Гуем. Зато посмотрев код, понял что мне нужно то всего ничего пару значений переменных там поменять, да кнопочки в другие места расставить. В связи с чем прошу помощи:

  • Как мне из .exe скомпиленным в более старой версии c# создать проект в c# 2010 с возможностью мышкой потыкать вин форму?
Илон Маск рекомендует:  Как сделать рамку вокруг таблицы
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL