Регистрация mIRC32 v5.41
Автор: Russian
ОТ АВТОРА
В данной статье описывается мой первый полностью самостоятельный опыт ис-
следования программы. Прошу заранее извинить за возможные просчеты и несура-
зицы, которые будут бросаться в глаза профессионалам. Рассчитываю главным обра-
зом на таких же как и я новичков в этом деле.
ВВЕДЕНИЕ
Все знают программу для общения в IRC серверах mIRC32.exe (а кто не знает, по-
смотрите на http://www.mirc.co.uk).
Программа mIRC32 v5.41 является Shareware, после 30 дней ее надо зарегистриро-
вать. В принципе можно работать и на этой версии, однако после указанного срока
при запуске начинают появляться навязчивые сообщения с предложением сделать
регистрацию. Как я попытался это проделать, читайте далее.
ИССЛЕДОВАНИЕ
Для начала я установил на компьютере SoftICE и настроил его так как описано в
статье «С чего начинать?». Для таких же как я начинающих, отмечу, что при установ-
ке SoftICE сам определяет видеокарту и пытается использовать ее родной драйвер.
Здесь главное не поддаться искушению и поступить так, как указано в совете номер
один из вышеуказанной статьи, иначе наловитесь всяких ошибок и забудете про иной
другой выход из Windows95, кроме как по кнопке Reset (как говорится, проверено на
себе). Еще я пользовался дизассемблером WinDasm и редактором QuickView (все
программы можно найти в разделе Инструменты).
Запустив mIRC32, я посмотрел в меню Help/Register... При выборе данного пункта
выводится окошко с предложением ввести имя и регистрационный код и нажать кноп-
ку Register. При вводе имени и кода (любых) появляется окно с надписью о том, что
все неправильно и надо пытаться сделать все по новой (далее назову его «окно отка-
за»).
Сначала я пытался остановить программу mIRC в месте ввода кода и имени уста-
новкой прерывания по функции MessageBoxA() (так как по названию программы
сразу видно, что она 32-разрядная, использую функции с А на конце):
bpx MessageBoxA
Не помогает. Пробую:
bpx GetDlgItemTextА
Тоже самое.
Перепробовал я много разных функций. Поймать этот момент можно по двум :
bpx hmemcpy
(как учит нас Эдуард Титов в сборнике статей о исследовании программ)
и
bpx SendDlgItemMessageA.
Вторая более предпочтительна. Небольшая особенность, с которой я столкнулся:
после прерывания по SendDialogItemMessage() при нажатии F12 в SoftICE я не толь-
ко выходил из функции SendDLgItemMessageA() но и «пролетал» по коду mIRC, по-
путно получая «окно отказа» со звуковым сигналом и оказывался опять в каком-то
модуле Windows. То есть уже после момента анализа программой вводимой мною
информации.
Тогда после прерывания по SendDLgItemMessageA() я стал нажимать клавишу F10
и следить за именем модуля в окне кода SoftICE. После около 200 нажатий и «путеше-
ствия» из модуля Kernel32 в модуль User32 и обратно, я все-таки оказался в модуле
mirc32 по адресу 0043D19Bh.
Участок программы по этому адресу, выглядит в WinDasm следующим образом:
* Reference To: USER32.SendDlgItemMessageA, Ord:0000h
|
:0043D196 E8FAEA0700 Call 004BBC95
:0043D19B 68701E4D00 push 004D1E70
* Possible Reference to Dialog: DialogID_003D, CONTROL_ID:02BC, «?»
|
:0043D1A0 68BC020000 push 000002BC
:0043D1A5 6A0D push 0000000D
* Possible Ref to Menu: MenuID_0013, Item: «Contents»
|
* Possible Reference to Dialog: DialogID_0033, CONTROL_ID:0082, «»
|
:0043D1A7 6882000000 push 00000082
:0043D1AC 8B4508 mov eax, dword ptr [ebp+08]
:0043D1AF 50 push eax
* Reference To: USER32.SendDlgItemMessageA, Ord:0000h
|
:0043D1B0 E8E0EA0700 Call 004BBC95
:0043D1B5 68701E4D00 push 004D1E70
:0043D1BA 68B41B4D00 push 004D1BB4
:0043D1BF E844140500 call 0048E608
:0043D1C4 85C0 test eax, eax
:0043D1C6 0F848B000000 je 0043D257
|
Во внутреннем устройстве Windows 95 я, человек, не сильно опытный, но мне по-
казалось, что после получения имени и кода (функции со словом Dlg в названии) идет
вызов какой-то процедуры по адресу 0043D1BFh. А перед этим в стек заносится два
адреса. Поставив прерывание на адрес 043D1BAh можно посмотреть содержимое
этих адресов командой db 04d1bb4 и db 04d1E70 (или установив курсор на адрес в
окне кода и, нажав правую кнопку мыши, выбрать в появившемся меню пункт Display):
04D1BB4h Ҡ введенное Вами имя
04D1E70h Ҡ введенный Вами код
|
Значит, вызывается поцедура анализа этих данных. После нее мы видим проверку
и переход , если EAX равен нулю. Посмотрев, куда осуществляется переход, Вы уви-
дите, что это вывод «окна отказа» и звукового сигнала (функция MessageBeep() сразу
после перехода и ссылка на строку):
* Possible StringData Ref from Data Obj -> «Sorry, your registration... вообщем,
текст «окна отказа»
|
Казалось бы тут можно просто поменять условие перехода или вообще убрать сам
переход. Забегая вперед скажу, что можно так и сделать. Но в тот момент у меня зак-
ралось сомнение, а вдруг внутри этой процедуры происходит, что-то эдакое, что зас-
тавит программу в дальнейшем «увидеть», что она взломана.
Например при проверке ставится какой-то флаг, где-нибудь в ячейке памяти, ука-
зывающий, то мол все нормально, код проверен.
Также хотелось увидеть какой правильный код соответствует моему имени. Про-
трассировав всю подпрограмму клавишей F8 в SoftICE я не смог уловить подробно,
что она такое делает с введенным именем и кодом. Видно, что что-то делает, и как-то
проверяет , но что именно? Разобраться в хитросплетении команд сдвигов и сумми-
рования , а также вызове еще нескольких подпрограмм я не смог (а, вобщем-то, и не
пытался). Единственное, я попытался проследить за содержимым памяти, не появит-
ся ли где мой «правильный» код. Кода нигде не было и в при выходе из этой процеду-
ры я увидел следующее:
:0048E67E 56 push esi
:0048E67F E820FEFFFF call 0048E4A4
:0048E684 85C0 test eax, eax
:0048E686 7407 je 0048E68F
:0048E688 B801000000 mov eax, 00000001
:0048E68D EB02 jmp 0048E691
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048E686(C)
|
:0048E68F 33C0 xor eax, eax
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0048E622(U), :0048E634(U), :0048E67C(U), :0048E68D(U)
|
:0048E691 5F pop edi
:0048E692 5E pop esi
:0048E693 5B pop ebx
:0048E694 5D pop ebp
:0048E695 C20800 ret 0008
|
Очевидно, что здесь производится последняя проверка и по ее результатам выс-
тавляется содержимое регистра EAX. Так как больше никаких ячеек памяти после
финальной проверки не модифицируется, я сделал вывод, что никаких флагов о пра-
вильности проверки программа больше не ставит. Она просто проверяет введенные
данные на соответсвие своим и без генерации правильного пароля устанваливает EAX
в 1 (True), если все нормально и в 0 (False), если есть проблемы. Хоть я так и не увидел
своего «правильного» кода, я ввел по адресу 0048E686h пару NOP и тем самым сделал
процедуру регистрации автоматической независимо от введенной информации.
Но на этом все не закончилось. Дальнейший анализ показал, что зарегистрирован-
ная программа пишет в файл mirc.ini строки типа:
Я попытался подписать такие строки в mirc.ini незарегистрированной программы,
но зарегистрированной она от этого отнюдь не стала. Зато обнаружилась следующая
интересная деталь: после запуска незарегистрированной версии, версия которая была
«зарегистрирована» вышеописанным образом становилась незарегистрированной
вновь. Поначалу мне начали мерещиться «секретные флаги» о которых я не узнал,
но все оказалось гораздо проще. Зарегистрированная mIRC32 записывает в реестр, в
разделе HKEY_Current_User/Software/Mirc некий код (вот для чего процедура кру-
тилась) и введенное имя. А незарегистрированная mIRC32 при запуске все это удаля-
ет. И потом зарегистрированная mIRC32 не найдя в реестре этих данных становится
опять незарегистрированной. Вообщем, сама процедура регистрации, видимо, и со-
стоит в этой модификации реестра.
Естественно после вышеописанной «доработки» разрегистрированный mIRC32
можно без проблем опять зарегистрировать и пока записи в реестре сохраняются, он
будет работать без проблем.
|