ключевой процесс GETORIX | INT3 Спецвыпуск: Хакер, номер #066, стр. 066-054-5 .text:000295A8 ADD R0, SP, #0x20+Msg ; lpMsg .text:000295AC BL GetMessageW [принять сообщение] .text:000295B0 MOVS R3, R0 .text:000295B4 ADDNE R0, SP, #0x20+Msg ; lpMsg .text:000295B8 BLNE DispatchMessageW [обработать сообщение] GetMessageW в качестве одного из параметров принимает структуру MSG, содержащую в себе параметр message (он определяет, какое именно сообщение было передано). Установка breakpoint на адрес 295B0 позволяет перехватить несколько сообщений, имеющих следующие идентификаторы: 0х0F, 0х0113. Смысл этих сообщений поможет понять файл winuser.h, обычно он лежит в папке \Include\Armv4 (при установленном Pocket PC 2003 SDK). Ищем полученные коды и находим события: WM_PAINT — 0х0F (не очень подходит) WM_TIMER — 0х0113 (то, что нужно) После GetMessageW идет вызов DispatchMessageW, который по идее должен привести к обработчику сообщения. Но отладчики не дают отлаживать системные библиотеки. Как же узнать адрес функции обработчика? Наверное, способов не так много, но, естественно, все из них очень трудоемкие, поскольку подразумевают долгие поиски. Впрочем, как гласит народная мудрость, лень — двигатель прогресса, так что для начала полностью изучим содержимое Strings Window. Вдруг попадется что-то интересное? И действительно, внимание должна привлечь следующая строка: • "%u i key * c 5 %s << 2 * + key i << +". Да это же как раз Handango Dynamic Registration! Для того чтобы узнать, где и как используется эта строка, снова воспользуемся перекрестными ссылками (XREF). Итак, сначала дважды щелкнем по этой строке в окне Strings window, в результате попадаем в секцию .text. Теперь переходим по ссылке «DATA XREF: sub_1CAB4:off_1D03C», затем по «DATA XREF: sub_1CAB4+53C». Handango Dynamic Registration HANDAGO ЗАНИМАЕТСЯ ПРОДАЖЕЙ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ РАЗЛИЧНЫХ ПРОИЗВОДИТЕЛЕЙ (НАПРИМЕР RESCO), ПРЕДЛАГАЯ ПОСТАВЩИКАМ ЗАЩИТИТЬ ПРОДУКТЫ С ПОМОЩЬЮ СОБСТВЕННОЙ РАЗРАБОТКИ КОМПАНИИ — HANDANGO DYNAMIC REGISTRATION (ПРЕДСТАВЛЯЕТ СОБОЙ АЛГОРИТМ ГЕНЕРАЦИИ КЛЮЧА С ИСПОЛЬЗОВАНИЕМ RPN (ОБРАТНОЙ ПОЛЬСКОЙ ЗАПИСИ). В ТЕ ДАЛЕКИЕ ВРЕМЕНА, КОГДА ЭВМ БЫЛИ БОЛЬШИМИ, ЭТА ФОРМА ЗАПИСИ БЫЛА БОЛЕЕ ИЗВЕСТНА В КРУГАХ ПРОГРАММИСТОВ. ЕЕ СУТЬ — ВОЗМОЖНОСТЬ ЗАПИСАТЬ ЛЮБУЮ МАТЕМАТИЧЕСКУЮ ФОРМУЛУ ТАКИМ ОБРАЗОМ, ЧТОБЫ ЭВМ СМОГЛА ПРОЧИТАТЬ И ВЫПОЛНИТЬ ЕЕ ЗА ОДИН ПРОХОД, БЕЗ ВОЗВРАТОВ. НАПРИМЕР, У НАС ЕСТЬ ФОРМУЛА (((i == 0) * 123) + key) + (c * 4). ТОГДА СНАЧАЛА ВЫПОЛНИТСЯ ДЕЙСТВИЕ i==0, ПОТОМ (i==0) * 123, ЗАТЕМ ((i == 0) * 123) + key, ДАЛЕЕ c * 4. НАКОНЕЦ, (((i == 0) * 123) + key) + (c * 4). RPN ТРЕБУЕТ, ЧТОБЫ СНАЧАЛА БЫЛИ ЗАПИСАНЫ ОПЕРАНДЫ, А ПОТОМ — САМА ОПЕРАЦИЯ. ТОГДА НАША ФОРМУЛА БУДЕТ ВЫГЛЯДЕТЬ ТАК: i 0 == 123 * key + c 4 * + АЛГОРИТМ HANDAGOO ИСПОЛЬЗУЕТ ДЛЯ ГЕНЕРАЦИИ КЛЮЧА СЛЕДУЮЩИЙ ПРИНЦИП. ДЛЯ КАЖДОЙ БУКВЫ ИМЕНИ (OWNER) ВЫЗЫВАЕТСЯ ФУНКЦИЯ key = F(c,i,key), ГДЕ key — КЛЮЧ, ПЕРЕДАЮЩИЙСЯ НА СЛЕДУЮЩИЙ ШАГ, С — ТЕКУЩАЯ ДЛЯ ДАННОГО ШАГА БУКВА ИМЕНИ, I — ПОЗИЦИЯ ЭТОЙ БУКВЫ, А F() — СОБСТВЕННО ФУНКЦИЯ, РЕАЛИЗУЮЩАЯ RPN. ПО ОКОНЧАНИИ РАБОТЫ ПЕРЕМЕННАЯ KEY ДОЛЖНА СОДЕРЖАТЬ ПЯТИЗНАЧНЫЙ КЛЮЧ, СООТВЕТСТВУЮЩИЙ ВВЕДЕННОМУ ИМЕНИ. ПОДРОБНО АЛГОРИТМ РАБОТЫ РАССМОТРЕН НА ОФИЦИАЛЬНОМ САЙТЕ HANDAGOO ДЛЯ РАЗРАБОТЧИКОВ [HTTP://DEVELOPER.HANDANGO.COM/DEVELOPERINFORMATION.JSP?SITEID=1&JID=E5FE799F7X8C843F8565EFC72776D3AC&CKEY=DEV_DYNAMICREGISTRATION&PAGEID=6]. |