"Опыт дизассемблирования большой .com - программы" - читать интересную книгу автора (Крупник А.Б.) ret ;03f69
;----------------------------------------------------- add BYTE PTR [si],bh ;03f6a push es ;03f6c jnz b03f79 ;03f6d ;Jump not equal(ZF=0) В приведенном фрагменте текста метка b03f6b отсутствует. Между тем эта метка должна "разрубить" пополам инструкцию add BYTE PTR [si],bh , которая начи- нается в оригинальной программе, подвергаемой дизассемблированию, со смещения 03f6a. Выход здесь может быть только один - смещению 03f6a соответствует байт данных, а инструкция начинается со смещения 03f6b. Исправленный фрагмент дол- жен выглядеть так: b03f53: cmp al,05 ;03f53 jnz b03f6b ;03f55 ;Jump not equal(ZF=0) ...................................................... ret ;03f69 ;----------------------------------------------------- d03f6a db 0 ;03f6a b03f6b: cmp al,06h ;03f6b jnz b03f79 ;03f6d ;Jump not equal(ZF=0) Путаница между данными и инструкциями возникает довольно часто. SOURSER спосо- бен выдавать целые метры бессмысленных инструкций. DisDoc 2.3 в этом отношении 3. Зависимость от транслятора Программисты на ассемблере склонны пренебрегать правилами хорошего тона, на- рушать все мыслимые табу, и это создает дополнительные трудности при дизас- семблировании. В качестве примера приведем фрагмент кода, выданного дизассем- блером s25 proc near inc cx ;0086b add di,bp ;0086c adc si,00 ;0086e add dx,si ;00871 push di ;00873 shl di,1 ;00874 ;Multiply by 2's adc dx,00 ;00876 pop di ;00879 ret ;0087a Этот фрагмент представляется совершенно невинным, и действительно, он дизас- семблирован правильно. Вся беда в том, что программист задумал изменять этот фрагмент, то есть резать по живому. Оказывается, в программе есть еще такой кусок |
|
|