ключевой процесс 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 |