Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Регистрация 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 строки типа:


[about]
show=iamweasel

Я попытался подписать такие строки в mirc.ini незарегистрированной программы, но зарегистрированной она от этого отнюдь не стала. Зато обнаружилась следующая интересная деталь: после запуска незарегистрированной версии, версия которая была «зарегистрирована» вышеописанным образом становилась незарегистрированной вновь. Поначалу мне начали мерещиться «секретные флаги» о которых я не узнал, но все оказалось гораздо проще. Зарегистрированная mIRC32 записывает в реестр, в разделе HKEY_Current_User/Software/Mirc некий код (вот для чего процедура кру- тилась) и введенное имя. А незарегистрированная mIRC32 при запуске все это удаля- ет. И потом зарегистрированная mIRC32 не найдя в реестре этих данных становится опять незарегистрированной. Вообщем, сама процедура регистрации, видимо, и со- стоит в этой модификации реестра.

Естественно после вышеописанной «доработки» разрегистрированный mIRC32 можно без проблем опять зарегистрировать и пока записи в реестре сохраняются, он будет работать без проблем.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay