В4 ОЭ БД 77 01 CD 21

Вот она! Но что представляет собой опкод ОхВА? Попробуем определить это in трем младшим битам. Они принадлежат регистру DL(DX). А ОхВ4 0х9 — это шоу АН,9. Теперь нетрудно догадаться, что оригинальный код выглядел следую­щим образом:

Mov ah,9

Mov dx, 0x177

И это при том, что не требуется помнить опкод команды MOV! (Хотя это очень распространенная команда, и ее опкод запомнить все же не помешает.)

Вызов 21-го прерывания OxCD 0х21 легко отыскать, если запомнить его символьное представление '=" в правом окне дампа. Как нетрудно видеть, следующий вызов int 21 лежит чуть правее по адресу ОхС. При этом DX указывает на 0х156. Это соответствует смещению 0х56 в файле. Наверняка эта функция читает пароль. Что ж, уже теплее. Остается выяснить, кто и как к нему обращается. Ждать придется недолго.

При разборе байта ОхЕ не забудьте, что адресации [ВР) не существует в природе. Вместо этого мы получим [offsetl6l. На размер регистра и приемник результата указывают два младших бита байта Ох8А. Они равны 10Ь. Следова­тельно, мы имеем дело с регистром CL, в который записывается содержимое ячейки [0х156].

Все, кто знаком с ассемблером, усмотрят в этом действии загрузку длины пароля (первый байт строки) в счетчик. Неплохо для начала? Мы уже дизассем-блировали часть файла и при этом нам не потребовалось знание ни одного опкода операции, за исключением, быть может OxCD =^ INT. Продолжим в том же духе.

Вряд ли мы скажем, о чем говорит опкод 0х87. (Впрочем, обращая внимание на его близость к операции NOP = xchg ах,ах, можно догадаться, что 0х87 — это опкод операции xchg). Обратим внимание на связанный с ним байт OxF2:

F2 — 11110010

|---|---|-----|

Reg/Rag •—| | |—> (DX) (SI)

(SI)

Как нетрудно догадаться, эта команда заносит в SI смещение пароля, содержащееся в DX. Этот вывод мы делаем только исходя из смыслового значения регистров, полностью игнорируя опкод команды. К сожалению, этого нельзя сказать о следующем байте — ОхАС. Это опкод операции LODSB, и его просто придется запомнить.

0х02 — это опкод ADD, а следующий за ним байт — это AH.AL (не буду больше повторяться).

ОхЕ2 — это опкод операции LOOP, а следующий за ним байт — это знаковое относительное смещение перехода.