AccuTagger 1.01 |
||||||||||||||||||||||||||||||||
[Исследование] |
||||||||||||||||||||||||||||||||
Subject: Cracking Target: AccuTagger 1.01 URL:www.cyberhq.com. Author: aSL! Date: 09.07.2001 |
||||||||||||||||||||||||||||||||
Before starting! |
||||||||||||||||||||||||||||||||
I. Вступление | ||||||||||||||||||||||||||||||||
Здравствуйте мои маленькие любители прекрасного! :) Нам для рассмотрения выдана программа AccuTagger 1.01 (далее AC) от CyberHQ Solutions. Взять можно у них - http://www.cyberhq.com В ходе беглого просмотра .hlp файла, (Кстати: RTFM) мы выяснили, что:
|
||||||||||||||||||||||||||||||||
II. Постановка задачи | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
III. Исследование | ||||||||||||||||||||||||||||||||
Запускаем небезызвестный W32Dasm от URSoftware... Оопсс... Не хотит. Смотрим на exe - тааааак: запакован ASProtect'ом. Ну что же... Сразу хочу сказать, что ручная распаковка ASProtect'а выходит за рамки этой статьи, поэтому будем считать, что программа уже распакована (HINT: Caspr ей помог). Единственное НО: Скажу по секрету, что W32Dasm дизассемблирует секцию только если у нее стоят атрибуты - E0000020 (вообще-то не всегда с такими, но лишь бы секция была помечена, как содержащая исполняемый код, и E0000020 - самый оптимальный вариант, по моему мнению) -- все это безобразие правится ручками по оффсету 0x21c. Итак, программа дизассемблирована... (Кстати, хочу сказать, что сам AC написан на Delphi 4, поэтому можно AC понасиловать с помощью DeDe). В первую очередь смотрим на процедуру регистрации - для этого ищем String Reference "The registration..." - Это выводится при неудачной регистрации. Нашли - по VA 0051A577: * Referenced by a (U)nconditional or (C)onditional Jump at Address:
Оччень интересное нас поджидает по VA 0051A56D:
Что же здесь мы видим??? в eax пишут адрес, находящийся по адресу 0053BEF4, после этого в al загружается байт по адресу, что сейчас находится в eax. Далее, если этот байт равен: 0 - Unregistered В ходе отладки, (в Dasm'е оччень хороший отладчик - в большинстве случаев его хватает за глаза) замечаем, что этот байт изменяется только после call'а по адресу 0051AB00. Это и есть процедура проверки, которая возвращает состояние регистрации! Если на нее посмотреть, то мы замечаем, что она вызывается не менее, чем из двух мест. Почему не менее??? Дело в том, что AC написан на делфи, поэтому весьма вероятен такой код:
push adr_of_return Который тоже будет вызвать эту процедуру. W32Dasm, в отличии от IDA, такие вызовы не ловит, поэтому нам лучше перестраховаться. Так что возникает следующая заглушка в эту функцию: pushaДля этого в HIEW'е меняем код по оффсету 00119F00 с 558BEC33C9515151515153 на 50A1F4BE5300C6000258C3. Запускаем. Все! Зарегистрированно. Вроде бы на этом наша миссия закончена. Ан нет! Если мы запустим AC во время подключенного Internet'а, то мы увидим такое сообщение: "You are running an illegal AccuTagger license. Software piracy is a crime. Cyberspace Headquarters LLC will prosecute anyone attempting illegal use of our software." Хех... Мы забыли о той проверке, что происходит при каждом подключении :) А при последующих запусках: "An illegal AccuTagger license was run on this computer. Illegal use voids the demonstration license. In order to continue using this program, enter a valid registration number, while connected to the internet." Ну что ж... Это дело поправимое: первым делом ищем в referencах второе сообщение... а вот и оно:
Причем заметим, что по адресу 00532999 вызывается нам уже известная 0051AB00.
Процедура по адресу 005328A8, очевидно, осуществляет проверку. Ну что
же... C3 ей поможет :), по адресу 005328A8 меняем 53 на C3 (оффсет 00131CA8),
а по адресу 005329A5 74 на EB (Оффсет 00131DA5). Теперь AC уже не матерится,
но все равно проверяет, да еще у CyberSpace HQ остался наш IP в логах.
Так дело не пойдет :) Теперь нам надо найти место, находящее IP. Для этого программе необходимо сначала инициализировать WinSock. Для этого вызывается WSAStartup. Ищем... Находим ее вызов по адресу 0052AA02, после этого вызвается GetHostName, точно: процедура, в которой мы находимся определенно вычисляет наш IP. Она начинается с 0052A9EC. Тут решение простое: по оффсету 00129DEC вместо 53 ставим C3. Запускаем... Облом... AC совсем не запускается :) Дело тут в следующем: просто в Delphi при вызове процедуры на сегмент данных указывает ebp, а теперь смотрим на код по адресу 00532A0E:
Кстати, вызов находится недалеко от наших нехороших сообщений - его легко заметить если читать листинг внимательно. Почему же здесь такая гадость: дело в том, что функция в ЛЮБОМ случае возвращает IP (Даже если машина не подключена - в этом случаем IP будет 127.0.0.1). А пустая же переменная будет говорить либо об ошибке, либо о нежелательных вмешательствах в код. :) Значит, правим и здесь... меняем байты по адресу 00532A0E (оффсет 00131E0E) c 837DD0000F8440060000 на 90909090909090909090. После этого CyberSpace не получит нашего IP в любом случае :)) (Если только, конечно, сильно не постарается...) Остается только научить AC совсем не подключаться к сайту производителя. Для этого просмотрим вот этот участок кода в случае, когда есть подключение к internet'у и когда - нет. Участок начинается по адресу 00532A30. Здесь мы видим, что для нормального функционирования AC необходимо подправить несколько jmp'ов: по адресу 00532A37 с 74 на EB, по адресу 00532A6B находится длинный je (за 128 байт от eip), поэтому для подстраховки его не инвертируем, а переделаем в jmp (тоже длинный!) Для этого по адресу 00532A69 (оффсет 00131E69) поправим с 84DB0F84E7050000 на E9EA050000909090, по адресу 0053305F (оффсет 0013245F) jne нужно забить nop'ами, а по адресу 00533069 (оффсет 00132469) jne сделать безусловным jmp. Все! AC рабоет даже при подключении к Internet'у и НИКОГДА не стукачит с CyberSpace HQ. |
||||||||||||||||||||||||||||||||
IV. Подводим итоги: (Сравнение распакованных файлов) | ||||||||||||||||||||||||||||||||
00119F00: 55 50 51ab00 Длинноватенько, конечно, получилось, но это не простой bithack :) Далее, проблемой становится пропатчить .exe, запакованную ASProtect'ом. Здесь уже свободное поле для творчества.... Можно сделать Loader, можно прицепить еще одну секцию к .exe, можно... можно... Чего тут можно не напридумывать. От себя я замечу, что гораздо более эффектным (и эффективным) смотрится способ прицепления секции или использования нулей padding'а на границах секций. Мой способ: (Сравнение запакованных файлов) Вот собственно и все! :) |
||||||||||||||||||||||||||||||||
Endnote: © 2001 aSL!( aslsoft@null.ru ) This essay can be freely distributed/ published/ printed etc... as long as no modifications are made in any way. Greets to: Everyone in UOFG\ |