РЕГИСТРАЦИЯ mIRC32 v5.41
Перейти на главную страницу, индексную страницу.
ОТ АВТОРА
В данной статье описывается мой
первый полностью самостоятельный
опыт ис-
следования программы. Прошу
заранее извинить за возможные
просчеты и несура-
зицы, которые будут бросаться в
глаза профессионалам. Рассчитываю
главным обра-
зом на таких же как и я новичков в
этом деле.
ВВЕДЕНИЕ
Все знают программу для общения в 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
можно без проблем опять
зарегистрировать и пока записи в
реестре сохраняются, он
будет работать без проблем.
Russian
Материалы находятся на сайте
http://cracklab.narod.ru/doc/