Only modification code [ASM KEYGENME#1]

2011-02-04T00:00:00
ID RDOT:1198
Type rdot
Reporter Fairhawk
Modified 2011-02-04T00:00:00

Description

Решил выложить продолжение своей первой статьи, которая находить тут.

В прошлой статье «Реверсинг ASM KEYGENME#1 «, в самом начале пропустил момент, с само-модификацией кода (тогда мы просто нажали F9, и программа все сделала сама). Сейчас подробней разберем тот фрагмент кода, а лучше напишем программу выводящую окно с сообщением, с тем же алгоритмом «шифрования». Сделаем все быстро.

Инструменты:

OllyDbg
Редактор PE (PE Tools)
Hex редактор (Hex Editor Neo)
Компилятор асм (Masm)

// В скобках то, что использовал я.

Main

Открываем в OllyDbg, ASM KEYGENME#1.
Переходим на нужный участок кода, видим:

Для тех кто не знает, красным цветом выделены опкоды, команды процессора. Так например команда ассемблера «Inc Eax», будет пониматься процессором как «46h».

Вот в принципе и все, те кто «считают себя» нормальными «кодерами», наверняка уже и сами разобрались без этих «соплей», и могут спокойно закрывать эту «песочницу», ну а если тебе что то не понятно, не отчаивайся, » В МЕСТЕ МЫ СИЛА» (c) BHC.

Теперь напишем на основе этого, то что нужно нам:

Код:

.386

.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib

.data
MsgBoxCaption  db "Message",0
MsgBoxText     db "ВСТУПАЙТЕ И КОМПЕЛИРУЙТЕ!",0

.code
start:
  Mov Esi, [cod e] // заносим в Esi, адрес начала "true" кода.
decrypt: // код "расшифровки"
  Mov al, byte ptr [Esi] // заносим в al, первый байт опкода по адресу Esi
  Xor al, 25h // расшифровываем
  Mov Byte ptr [Esi], al // записываем обратно
  inc Esi  // следующий байт
  cmp Esi, 00401029h // если не все...
  Jnz decrypt// то повторить еще раз
code:
  invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
  invoke ExitProcess, NULL
end start

Компилируем.
Открываем в OllyDbg и переходим на начало секции "code:" , где расположен наш MessageBox:


Ищем этот фрагмент в Hex редакторе:

Теперь берем, и Xor'им выделенный участок на 25h, любым удобным для тебя способом. Сохраняем измененный файл.

Открываем в отладчике, и видим уже:

Хе-хе, на обычную программу для вывода сообщения это уже не похоже. Нажимаем F7 до тех пор, пока отладчик остановится на cтроке:

Mov Byte PTR DS: [Esi], Al

После чего он упорно упирается, аргументируя это, чем то похожим на "Не возможно записать по адресу..." В свое время, я не много "потерялся" на этом фрагменте, но благо решение нашлось быстро =)

Открываем PE редактор, переходим в режим редактирования секций (нужную можно посмотреть в OllyDbg) , и в строке Характеристики (Characteristics) пишем: E0000020. (В "Pe Tools", можно просто поставить галочку у параметра "Writeable", там же в меню редактирования характеристик). Сохраняем и заново пробуем. Все работает =)

Дальше можешь сам, изучать и улучшать подобные алгоритмы. Как вариант, можешь попробовать переписать первый байт, 2 байтовой команды, на первый байт, 5 байтовой. (сори за тавтологию). И тогда остальные 3 байта, программа возьмет из следующей инструкции.

Удачи.

End