Вот она! Но что представляет собой опкод ОхВА? Попробуем определить это 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, а следующий за ним байт — это знаковое относительное смещение перехода.