Секреты ассемблирования дизассемблерных листингов

         

IDA Pro сгенерировала неработоспособный листинг для парной функции strcpy/strcat


Никаким ухищрениями у нас не получится перетасовать код так, чтобы метка loc_402D11

оказалась в границах видимости, но… ведь как то же это было запрограммировано?! Обратившись к исходным текстам библиотеки LIBC.LIB (они поставляются вместе с компилятором) мы обнаружим волшебный ключик. Чтобы метка была видна отовсюду, после нее должен стоят не один знак ":", а целых два — "::".

Самая трудная задача осталась позади и теперь нам предстоит разобраться с уже встречавшимися ошибками типа "missing operator in expression". На этот раз транслятору не понравились конструкции "push large dword ptr fs:0" и "pop large dword ptr fs:0". Убираем все лишнее, превращая их в "push fs:0" и "pop fs:0" и движемся дальше, где нас ждет ошибка "immediate operand not allowed" (непосредственный операнд недозволен), затаившаяся в 3640 строке: "cmp Locale,0". Естественно, транслятор решил трактовать Locale как смещение, а не как содержимое ячейки, поэтому без явной расстановки квадратных скобок здесь не обойтись: "cmp dword ptr ds:[Locale],0".

Теперь на линии фронта остается лишь большой конгломерат ошибок типа "symbol redefinition" (символ переопределен), против которых не пропрешь, ведь он действительно переопределен, вот например, взять тот же cchMultiByte:

___crtLCMapStringA proc    near          ; CODE XREF: _setSBUpLow+BEp

                                         ; _setSBUpLow+E6p

Locale        = dword       ptr  8

lpMultiByteStr       = dword       ptr  10h

cchMultiByte  = dword       ptr  14h

___crtLCMapStringA endp

cchMultiByte  dd 1                       ; DATA XREF: _wctomb+31r



Содержание раздела