ключевой процесс GETORIX | INT3 Спецвыпуск: Хакер, номер #066, стр. 066-054-6 ДЛЯ НИХ ЖЕ HANDAGOO ЛЮБЕЗНО ВЫЛОЖИЛА ПРОГРАММУ ПРОВЕРКИ — DYNAMIC REGISTRATION CODE TESTER [HTTP://DEVELOPER.HANDANGO.COM/REGCODE.JSP], В КОТОРУЮ НЕОБХОДИМО ВВЕСТИ RPN И ИМЯ (OWNER), ПОСЛЕ ЧЕГО БУДЕТ АВТОМАТИЧЕСКИ ПОСЧИТАН КЛЮЧ. НЕ ПРАВДА ЛИ, ПРОСТО? ЕСЛИ УЧЕСТЬ, ЧТО OWNER НАМ ИЗВЕСТЕН, ОСТАЕТСЯ ТОЛЬКО НАЙТИ В ПРОГРАММЕ ЗАВЕТНУЮ СТРОКУ RPN. [может быть, простое везение], а может, недосмотр автора привел нас к вот этому блоку кода (см. «Формирование строки RPN в памяти»). формирование строки RPN в памяти .text:0001CFDC MOV R1, #2 ; size .text:0001CFE0 MOV R0, #0x80 ; num .text:0001CFE4 BL calloc [выделяем место в памяти] .text:0001CFE8 MOV R2, R6,LSL#16 .text:0001CFEC LDR R3, =asc_48EE4 .text:0001CFF0 LDR R1, =aUIKeyC5S2KeyI ; wchar_t * .text:0001CFF4 MOV R2, R2,ASR#16 .text:0001CFF8 MOV R4, R0 .text:0001CFFC BL swprintf [записываем строку по формату] С помощью функции calloc выделяется чистый блок памяти, затем (при использовании найденной выше строки в качестве формата) функцией swprintf в этом блоке формируется RPN. Установим breakpoint на адрес 1CFFC и запустим отладчик. После остановки можно изучить передаваемые параметры. Вот они: char *buffer — 92D90 [указатель на пустое место] const char *format — "%u i key * c 5 %s << 2 * + key i << +" argument 1 — 0x05B7 [1463] argument 2 — "%" Чтобы увидеть результат (а именно, готовую RPN), необходимо перейти в память по адресу 92D90 и выполнить функцию swprintf. вид RPN в памяти программы debug905:00092D90 31 00 34 00 36 00 33 00 20 00 69 00 20 00 6B 00 1.4.6.3. .i. .k. debug905:00092DA0 65 00 79 00 20 00 2A 00 20 00 63 00 20 00 35 00 e.y. .*. .c. .5. debug905:00092DB0 20 00 25 00 20 00 3C 00 3C 00 20 00 32 00 20 00 .%. .<.<. .2. . debug905:00092DC0 2A 00 20 00 2B 00 20 00 6B 00 65 00 79 00 20 00 *. .+. .k.e.y. . debug905:00092DD0 69 00 20 00 3C 00 3C 00 20 00 2B 00 00 00 00 00 i. .<.<. .+..... Кажется, теперь все необходимые ингредиенты для генерации ключа известны. Так что можно отключить все breakpoints и на этой радужной ноте закончить исследовательскую часть. [теперь, зная RPN] и измененный Owner, перейдем на страничку тестирования [http://developer.handango.com/RegCode.jsp] и там введем данные в соответствующие поля. Итак, смотрим: Owner: Getorix RPN: 1463 i key * c 5 % << 2 * + key i << + Нажимаем кнопку Calculate Registration Code и получаем: The Registration Code for this user will be: 19539 Убираем breakpoints, запускаем программу в нормальном режиме и пытаемся зарегистрироваться с полученным ключом. «Thank you for registering our product», — говорит Lexisgoo. «Ура-ура!» — доносится из глубины души... [на посошок] можно сказать, что Handango Dynamic Registration очень распространена среди программ для PocketPC, но, как можно было убедиться, она не создает надежной защиты. Количество «исследователей» PocketPC-программ растет с каждым днем, и можно только удивляться авторам, которые используют эту защиту, но не торопятся обезопасить свой программный продукт. |