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

ключевой процесс

GETORIX | INT3

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


.text:0002924C STR R1, [R0]

.text:00029250 MOV R0, R4

.text:00029254 LDR R1, =aThankyouForReg [текст об удачной регистрации]

.text:00029258 BL CWnd__MessageBoxW [вывод сообщения]

Очевидно, что этот код формирует параметры сообщения об успешной регистрации (заголовок и текст «Thank you for registering our product»), после чего происходит вызов функции CWnd__MessageBoxW (более привычный вид CWnd::MessageBoxW). Переход на этот блок осуществляется с адреса 29210, то есть проверка введенного ключа на правильность и принятие решения о том, какое именно сообщение выводить пользователю, находится где-то выше. Поднимемся чуть выше к адресу 29210 (см. «Сообщение о неудачной регистрации»).

сообщение о неудачной регистрации

.text:00029208 LDR R3, [R4,R3] [чтение данных из памяти]

.text:0002920C CMP R3, #0 [проверка на равенство нулю]

.text:00029210 BNE loc_2923C [если не равно — переход]

.text:00029214 LDR R2, =aRegistration [заголовок сообщения]

.text:00029218 MOV R3, #0x10

.text:0002921C LDR R1, =aTheSerialKeyYo [сообщение о НЕудачной регистрации]

.text:00029220 MOV R0, R4

.text:00029224 BL CWnd__MessageBoxW [вывод сообщения]

Итак, решение принимается после загрузки из памяти и последующего анализа содержимого регистра R3. Если значение в R3 равно нулю, то переход BNE не осуществляется, то есть формируется сообщение «The serial key you have entered is invalid». В противном случае (R3!=0) переход осуществляется. Таким образом, для успешной регистрации необходимо, чтобы значение, загружаемое в R3, было отлично от нуля. Пролистав код программы немного выше, можно попытаться найти место, где это значение записывается в память. Начало функции находится по адресу 29130. Разберем основные моменты ее работы с самого начала (бросив взгляд на «Код начала функции принятия решения»).

код начала функции принятия решения

.text:00029130 STMFD SP!, {R4-R7,LR}

...

.text:0002913C LDR R3, [R5,#0x168]!

.text:00029140 LDR R3, [R3,#-8]

.text:00029144 CMP R3, #0 [если введен пустой ключ]

.text:00029148 LDREQ R1, =a00000 [вставляем 00000]

.text:0002914C MOVEQ R0, R5

.text:00029150 BLEQ __4CString__QAAABV0_PBD_Z ; CString::operator=(char const *)

.text:00029154 MOV R0, R5

.text:00029158 BL CString__TrimLeft [удаляем пробелы и т.п. слева]

.text:0002915C MOV R0, R5

.text:00029160 BL CString__TrimRight [удаляем пробелы и т.п. справа]

.text:00029164 MOV R6, R4

.text:00029168 LDR R0, [R6,#0x168]!

.text:0002916C BL _wtol [переводим строку с ключом в число]

.text:00029170 LDR R5, =unk_4D6E8

.text:00029174 ADD R1, R4, #0x164

.text:00029178 MOV R7, R0 [копируем ключ в R7]

.text:0002917C ADD R0, R5, #0xC

.text:00029180 BL __4CString__QAAABV0_ABV0__Z ; CString::operator=(CString const &)

.text:00029184 MOV R3, R7,ASR#31

.text:00029188 STR R7, [R5,#0x10]

.text:0002918C MOV R1, R6

.text:00029190 STR R3, [R5,#0x14]

.text:00029194 ADD R0, R5, #8

.text:00029198 BL __4CString__QAAABV0_ABV0__Z ; CString::operator=(CString const &)

.text:0002919C MOV R5, #0x5A0

.text:000291A0 MOV R3, #0

.text:000291A4 ORR R5, R5, #0xC

.text:000291A8 MOV R1, #0

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