"Опыт дизассемблирования большой .com - программы" - читать интересную книгу автора (Крупник А.Б.)


mov di,086bh ;007f8
......................................
mov BYTE PTR [di],4ah ;00800
mov BYTE PTR [di+07],0f1h ;00803
mov BYTE PTR [di+0ch],0d1h ;00807
......................................
ret ;00815

Рис.1



Так как di используется для косвенной адресации, нам прежде всего необходимо
заменить 086bh на соответствующий OFFSET d0086b и пометить этой меткой нача-
ло подпрограммы s25:

s25 proc near
d0086b: inc cx ;0086b
..................................................

Далее следует понять, что делают инструкции, приведенные на рис.1 с подпрог-
раммой s25. Пусть эта подпрограмма асслемблирована с помощью TASM 1.01. Вы-
данный ассемблером код будет таким, как показано на рисунке 2.
41 INC CX 41 INC CX
03FD ADD DI,BP 01EF ADD DI,BP
83D600 ADC SI,0000 83D600 ADC SI,0000
03D6 ADD DX,SI 01F2 ADD DX,SI
57 PUSH DI 57 PUSH DI
D1E7 SHL DI,1 D1E7 SHL DI,1
83D200 ADC DX,0000 83D2000 ADC DX,0000
5F POP DI 5F POP DI
C3 RET C3 RET

Рис.2 Рис.3

Но вся беда в том, что исходная программа была ассемблирована другим ассемб-
лером и имеет вид, показанный на рисунке 3. Как видно из сравнения рисунков
2 и 3, TASM 1.01 и неизвестный ассемблер транслируют инструкции ADD по-разно-
му, и это приводит к катастрофическим последствиям. Действительно, посмотрим,
как воздействует участок кода, показанный на Рис.1 (перед этим заменим 086bh
на OFFSET d0086b) на подпрограмму s25, транслируемую TASMом (рис.4) и неиз-
вестным ассемблером (рис.5).

4A DEC DX 4A DEC DX
03FD ADD DI,BP 01EF ADD DI,BP
83D600 ADC SI,0000 83D600 ADC SI,0000
03F1 ADD SI,CX ;!!!! 01F1 ADD CX,SI ;!!!!
57 PUSH DI 57 PUSH DI
D1E7 SHL DI,1 D1E7 SHL DI,1