Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #66, МАЙ 2006 г.

термоядерный инлайн

GETORIX | INT3

Спецвыпуск: Хакер, номер #066, стр. 066-068-3


.text:00018DC8 BEQ loc_18E04 ; [если нет — переход, да — счетчик++]

.text:00018DCC MOV R0, R6

.text:00018DD0 BL sub_16760

.text:00018DD4 LDR R3, =__rt_udiv

.text:00018DD8 LDR R1, [R4,R5]

.text:00018DDC LDR R3, [R3]

.text:00018DE0 MOV LR, PC

.text:00018DE4 MOV PC, R3

.text:00018DE8 CMP R0, #0x3C ; '<' ; [вышел ли счетчик в 60 секунд?]

.text:00018DEC BLS loc_18E04 ; [если меньше либо равно — переход]

.text:00018DF0 LDR R0, =aThisTrialCopyO ; [иначе — сообщение и выход]

.text:00018DF4 BL sub_168E8

.text:00018DF8 STRB R9, [R4,R7]

.text:00018DFC STRB R9, [R4,#0x410]

.text:00018E00 BL sub_16940

.text:00018E04

.text:00018E04 loc_18E04 ; CODE XREF: sub_18D68+60 j

.text:00018E04 ; sub_18D68+84 j

.text:00018E04 MOV R8, R4

.text:00018E08 LDRB R3, [R8,#0x48]!

Изучив этот код, а особенно переходы по адресам 18DC8 и 18DEC, можно догадаться, что программа продолжает работу: если одна секунда еще не прошла (видимо, об этом говорит байт, равный нулю и взятый по адресу [R4,R7]) или если таймер насчитал меньше 60 секунд (#0x3C). Таким образом, проблему решит замена условного перехода «BLS loc_18E04» на безусловный «BLS loc_18E04» по адресу 18DEC.

К сожалению, это еще не все. При загрузке программы появляется диалог с напоминанием об ограничениях. Ликвидируем его для большего удобства. Подойдем к вопросу творчески, запустим Resource Hacker. Загрузив в него наш файл, изучим вкладку Dialog и в подпапке «117» найдем знакомое нам окно (оно изображено на рис. 2). Прикинув в уме, получим шестнадцатеричное значение: 117 = 0х75h. Именно так, скорее всего, будет выглядеть идентификатор этого диалога в листинге IDA перед загрузкой из ресурсов.

Возвращаемся в IDA и с начала листинга жмем <Alt>+<T>, где в строке поиска вводим «FindResource» (эта функция используется для поиска ресурса в файле ресурсов). Останавливаемся по адресу 11158. Смотрим выше на ID ресурса... #0x75! Наверное, повезло. Так или иначе, изучим предшествующий этому событию код, отраженный в листинге 3.

Листинг 3. Проверка регистрации при старте

.text:0001113C BL sub_190D8 ; [функция проверки регистрации]

.text:00011140 ANDS R3, R0, #0xFF ; [зарегистрирована ли программа?]

.text:00011144 BNE loc_11184 ; [если нет — вывод диалога, да — переход]

.text:00011148 LDR R5, =unk_29AA0

.text:0001114C MOV R2, #5 ; lpType

.text:00011150 MOV R1, #0x75 ; 'u' ; lpName

.text:00011154 LDR R0, [R5] ; hModule

.text:00011158 BL FindResourceW

.text:0001115C MOV R1, R0 ; hResInfo

.text:00011160 LDR R0, [R5] ; hModule

.text:00011164 BL LoadResource

.text:00011168 MOV R3, #0

.text:0001116C LDR R2, [R4] ; hWndParent

.text:00011170 MOV R1, R0 ; hDialogTemplate

.text:00011174 STR R3, [SP,#0x48+wRemoveMsg]

.text:00011178 LDR R3, =sub_117E0 ; lpDialogFunc

.text:0001117C LDR R0, [R5] ; hInstance

.text:00011180 BL DialogBoxIndirectParamW

.text:00011184

.text:00011184 loc_11184 ; CODE XREF: WinMain+C0 j

.text:00011184 ; WinMain+184 j

.text:00011184 MOV R3, #0 ; wMsgFilterMax

Как видно, этот диалог перестанет появляться, если заставить сработать условный переход по адресу 11144, реагирующий на результат, возвращаемый функцией sub_190D8 (видимо, это функция проверки зарегистрированности). Решение — заменить условный переход «BNE loc_11184» безусловным «B loc_11184» по адресу 11144.

Назад на стр. 066-068-2  Содержание  Вперед на стр. 066-068-4