"Опыт дизассемблирования большой .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 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 |
|
|