Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #94, ОКТЯБРЬ 2006 г.

Сношения с Идой

Крис Касперски

Хакер, номер #094, стр. 094-120-6


Самая трудная задача осталась позади, и теперь нам предстоит разобраться с уже встречавшимися ошибками типа «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

Ничего не остается, как «расщеплять» переменные вручную, давая им различные имена. Главное — не перепутать переменные местами. Впрочем, перепутать будет довольно трудно, поскольку, одна копия переменной — локальная и адресуется через стек, а другая — глобальная, и обращение с ней происходит через непосредственную адресацию.

Разобравшись с астральными переменными, нам остается только побороть три ошибки, связанные с выравниванием. Ну, ошибку в строке 8064 мы ликвидируем путем удаления директивы «align 800h» (800h в десятичном представлении как раз и будет 2048). Две остальные ошибки требуют переименования сегментов _text и _data во что-нибудь другое, например в _text1 и _data1, только это переименование должно идти по всему тексту.

Победа за нами?

Все! Теперь ассемблерный листинг, сгенерированный дизассемблером и «слегка» исправленный напильником, транслируется без ошибок! Добавим к командой строке MASM'а ключ «/Cp», чтобы он соблюдал регистр публичных имен, и вот тут-то выясняется, что полученный obj наотрез отказывается линковаться, потому что линкер не может найти API-функции! Это не покажется удивительным, если вспомнить, что IDA Pro объявила их в «удобочитаемом» виде, который совсем не совпадет с тем, как они объявлены в библиотеках. Но линковка (и последующая доводка программы до ума) — это уже тема совсем другой статьи.

Назад на стр. 094-120-5  Содержание