состояние программы, c пропатченной точкой входа, в момент всплытия отладчика
Курсор указывает на инструкцию "in eax,dx" (EDh), представляющую собой "осколок" от пропатченной команды "xor ebp,ebp" (31h EDh). Теперь (по идее) мы должны восстановить оригинальный байт, заменив CCh на 31h, уменьшить регистр EIP на единицу и продолжать трассировку в обычном реже.
Да вот не тут-то было!!! linice это, конечно, порт, но… только очень сырой и модифицировать память страничного имиджа он _не_ умеет, даже если предварительно открыть кодовый сегмент на запись. Ни "E" (редактирование), ни "F" (заполнение), ни "M" (копирование памяти) _не_ работают!!! Зато работает запись в стек и нам, хакерам, этого вполне достаточно.
Запоминаем текущее значение регистра EIP, копируем пропатченную машинную команду на вершину стека, восстанавливаем там байт CCh, передаем на нее управление, меняя значение EIP, выполняем ее, совершив единичный акт трассировки и возвращаем EIP на место, то есть на _следующую_ машинную команду:
:? eip ; узнаем EIP
Hex=080482C1 Dec=0134513345
; смотрим, что находится на вершине стека (из чистого любопытства)
:d esp-10
0018:BFFFEFC0 C0 82 04 08 00 00 00 00 5D 0C 00 40 DC EF FF BF
; копируем пропатченную машинную команду на вершину стека
; число 10h - максимально возможный размер машинной команды на x86
:m eip-1 L 10 esp-10
; смотрим как изменился стек
:d esp-10
0018:BFFFEFC0 CC ED 5E 89 E1 83 E4 F0 50 54 52 68 F0 85 04 08
; ага! стек действительно изменился, самое время править CCh
на 31h
:e esp-10 31
Edit immediate data not implemented yet.
; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; опс! непосредственное присвоение данных в linice
не реализовано
; но мы можем отредактировать дамп в интерактивном режиме (так же как в soft-ice)
; или дать команду "F esp-10 L 1 31", только имейте ввиду, что в отличии от soft-ice
; отладчик linice _не_ обновляет окно дампа, поэтому, после выполнения команды F
; может показаться, что результата нет, на самом деле это не так, стоит только
; обновить дамп командой "D esp-10" и все встанет на свои места
; передаем управление на команду, скопированную в стек
:r eip (esp-10)
reg: eip = BFFFEFC0
; запоминаем это значение регистра EIP
:t ; совершаем единичный акт трассировки
0023:BFFFEFC2 5E pop esi
; ^^^^^^^^
; как мы видим регистр EIP увеличился на 2 (BFFFEFC2h
- BFFFEFC0h) = 02h
; следовательно адрес следующей команды равен: 080482C1h - 01h + 02h = 080482C2h,
; где 080482C1h — начальное значение EIP
при входе в программу, а 01h
- размер INT
03h
:r eip
80482C2 ; устанавливаем EIP
на команду, следующую за пропатченной инструкцией
reg: eip = 80482C2
; - - - продолжаем трассировку в обычном режиме - - -