скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Регистрация 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 можно без проблем опять зарегистрировать и пока записи в реестре сохраняются, он будет работать без проблем.






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook