"xGuest Inviter Bot предназначен для рассылки сообщений огромному количеству людей, общающихся на IRC серверах." ©Мануал по хГесту by
xPoison...

Версия 1.6х этой проги была достаточна быстро поломана и кейгены к ней валяются по сей день на куче серваков, но вот новый чудо-зверь хГость 1.7x оказался более взломостойким, и по прошествию многих месяцев реально работающий кряк к нему найти не удаётся...
Впрочем, кейген к этой версии найти тоже не проблема, но вся фишка в том, что он абсолютно бесполезен - все записи о зарегистрированных юзерах хранятся на сервере и при каждом запуске программа проверяет, легально она зарегистрирована или "не очень".

Сначала перечислю юзаемые инструменты: unpecompact, exe2dpr(подойдет и демо-версия), softice. 

Немного поюзав и поизучав прогу, я выяснил следующие вещи:

1. При коннекте прога по http запрашивает файл xmotd.dat с адреса
irctoolz.com/xguest/xmotd.dat, если не находит его там, то продолжает его искать на irctoolz.net и .org , в файле
содержатся всякие новости, инфа о новых версиях и о "защищённых" сетках, каналах и никах.

2. Если программа не зарегистрирована, то на экран выползает баннер и остальные прелести
не зареганной версии, в противном случае повторяется пункт 1 только для файла
reginfo.dat.

3. И если программа зарегистрирована нелегально, то выводится окошко с сообщением о том, что пользователь - нечестный гад, и работа прекращается.

Понятно, что именно в reginfo.dat и содержится какая-то информация о регистрации...
Распакуем екзешник unpecompactом. Далее разложим прогу на кирпичики exe2dpr'ом, посмотрев на получившийся исходник (main.pas), мне бросились в глаза четыре процедуры: a)htGetDataFile - 004cf628, b)htRegInfoDoneFile - 004cf890,c)LoadRegInfo - 004cf664, d)LoadxMOTD - 004cf3c4.

Поставим на них брейкпоинты в SoftIce(bpx 004cf628, bpx 004cf890 и т.д.). Теперь нажимаем на кнопку "Вход в IRC" в хГосте, и
тут же выплывает СофтАйс. Процедуры вызываются в следующем порядке: d),a),c),b).
Я оставил брейкпоинт только на последнюю процедуру - htRegInfoDoneFile и стал трассировать прогу до того момента, пока не вылезает сообщение "Пользователь блаблабла нарушил соглашение блаблабла" и гест выгружается... В результате я обнаружил место, из которого вызывается это неприятное окошко, и вот кусок этого кода:
004CAD28 mov edx, [ebp-00CC]
004CAD2E lea ecx, [ebp-00C8]
004CAD34 mov eax, [004D50D0]
004CAD39 call 00412BD8
004CAD3E cmp dword ptr [ebp-00C8], 00
004CAD45 jnz 004CADC1
...
004CAD9D mov edx, eax
004CAD9F mov ecx, 004CB4C2
004CADA4 mov eax, [004D2EF8]
004CADA9 mov eax, [eax]
004CADAB call 0044CF20 ;<<= вызов ужасно неприятного сообщения 🙁

Вызову по адресу 004CAD39 одним из параметров передаётся введенное имя пользователя, а после выполнения процедуры происходит сравнение переменной [ebp-C8] с нулём, если она не равна нулю, происходит переход к 004CADC1, т.е. минуется вызов по 004CADAB и тут, конечно, возникает мысль о том, что именно в процедуре 00412BD8 происходят некие манипуляции с регистрационными данными
(btw, если просто по адресу 004CAD45 изменить jnz на jz, то сначала Гест
как бы скажет, что всё ок, но вот потом всё
равно вырубается... порывшись в коде можно увидеть, что там вагон и маленькая тележка подобных проверок и "обезвреживать" каждую это стопроцентный геморрой :().

Итак, зайдя в процедуру 00412BD8, обнаруживается ещё один вызов:
...
004CADA4 mov edx, [ebp-04] ; имя пользователя
004CADA9 mov eax, ebx
004CADAB call 00412DB0
Ну ничего не остаётся, как зайти и туда... Ещё немного протрассировав программу, я наткнулся на следующий цикл:
...
00412DEB lea ecx, [ebp-10]
00412DEE mov edx, [ebp-0C]
00412DF1 mov eax, [ebp-04]
00412DF4 mov ebx, [eax]
00412DF6 call [ebx+0C]
...
00412E0C lea eax, [ebp-14]
00412E0F push eax
00412E10 mov ecx, ebx
00412E12 dec ecx
00412E13 mov edx, 00000001
00412E18 mov eax, [ebp-10]
00412E1B call 00404204
00412E20 mov eax, [ebp-14]
00412E23 mov edx, [ebp-8]
00412E26 call 00408E44
00412E2B test eax, eax
00412E2D jz 00412E3C
00412E2F inc [ebp-0C]
00412E32 dec esi
00412E33 jnz 00412DEB

Это стандартный дельфивский TStringList производит поиск нужного значения, по адресу 00412E2B происходит сравнение, найдена или нет моя пара username/key в текущей строке СтрингЛиста, если да, то цикл прекращается, стринглист уничтожается, если нет, то переходим на следующую строку. А теперь самое интересное...
Процедуре 00404204 в качестве параметра в каждый проход цикла передаётся текущее имя и рег.номер в стринглисте (!!) в виде "username=password", а это означает, что у нас в кармане вся база зарегистрированных юзеров и их пассвордов проги xGuest (!!!), достаточно только дойти до 00412E1B и посмотреть содержимое памяти по адресу, находящемуся в eax (d eax) в окне данных в softice сразу видна текущая строка , а если прокрутить окно вниз/вверх, то и весь список.

Из этого следует, что в файле reginfo.dat находится весь список легальных пользователей программы, очень не
предусмотрительно разрешать скачивать такую информацию с сервера, пусть даже и в зашифрованном виде. Скоро, по словам хПоизона, должна
появиться новая версия программы, в которой данный баг будет исправлен...

ЗЫ: По просьбе Xnou3oHa некоторые адреса в статье изменены.
ЗЗЫ: Прошу прощения перед всеми фанатами русского языка за допущенные ашипки, кроме того, статья не является руководством к действию для "кевл-кракеров" и "кевл-хаксеров" 🙂
ЗЗЗЫ:
GreetZ t0: 
DalNet - #Russian_programmer
МИЭМ - C16 
🙂

Check Also

Туннель во времени. Выводим данные с компьютера через Network Time Protocol

Содержание статьиЧто такое NTPСтруктура пакета NTPОграничения на трафик по порту UDP-123Ко…

Оставить мнение