Автор страшно любит модульное программирование и поэтому у него вышло не одна прога, а целых 6. Да-да 6 exe файлов...
Computerzal.exe - прога управления клиентами
Setup.exe - прога настроек для Computerzal.exe
czclient.exe - клиент
clientsetup.exe - прога для настройки клиента
LogViewPrint.exe - прога для печати логов
PassClean.exe - прога для сброса забытых паролей
Две последние нас не интересуют т.к. их подозревать не в чем. А остальные могут нас кидать по-полной.
О "защите": Упакована UPX. Файлы конфигурации криптует. Данные конфигурации клиента тупо пишет в реестр не скрывая ничего. Номер машины и число клиентов заблокировано через ограниечение в элементе Spinedit (edit+updown).
Приступим...
В файле Computerzal.exe искать пока нечего, т.к. н берет данные из файла конфигурации, который генерится из setup.exe. Поэтому начнем с Setup.exe. Распаковываем. Теперь не плохо бы узнать как же задается диапозон значений для spinedit. Так как spinedit состоит из edit и updown то нужно искать разгадку именно в элементе updown, т.е. чтобы изменить число мы кликаем именно на него. Берем win32.hlp и ищем Up-Down Control Messages... Там их не много. И вот что есть интересного:
The UDM_SETPOS message sets the current position for an up-down control
UDM_SETPOS
wParam = 0;
lParam = (LPARAM) MAKELONG((short) nPos, 0);
New position for the up-down control. This parameter must be in the
range specified by the upper and lower limits for the control.
и вот еще:
The UDM_SETRANGE message sets the minimum and maximum
positions (range) for an up-down control.
UDM_SETRANGE
wParam = 0;
lParam = (LPARAM) MAKELONG((short) nUpper, (short) nLower);
Maximum position and minimum position for the up-down control.
Neither position can be greater than the UD_MAXVAL value or
less than the UD_MINVAL value. In addition, the difference
between the two positions cannot exceed UD_MAXVAL.
Сообщения это хорошо... Но где жеж взять их численные значения чтоб найти, где происходит ограничивание области значений? Естественно в WWW (World Wide Wreck - всемирная свалка :).
UDM_SETPOS 467
UDM_SETRANGE 465
Теперь дизасмим и ищем "00000465". B вот что я вижу:
* Reference To: USER32.SendMessageA, Ord:0000h
|
:00402C19 8B3DDCD34100 mov edi, dword ptr [0041D3DC]
.........
:00402D10 8B9658030000 mov edx, dword ptr [esi+00000358]
:00402D16 6804000100 push 00010004 ; 1 - минимум 4- максимум...
:00402D1B 6A00 push 00000000
:00402D1D 6865040000 push 00000465 ; UDM_SETRANGE
:00402D22 52 push edx ; Handle
:00402D23 FFD7 call edi ; SendMessageA
Если взять айс и посмотреть что же делает call 004019E0, то можно довольно быстро понять, что в нем происходит чтение из файла конфигурации "Числа машин в сетке". А эти числа что пушатся перед ним - это ограничения! А то мало ли ... вдруг мы чужой файл конфигурации подсунем.
Для упокоения совести ищем "00010004" ... B вот что видим:
Подправив эти push 00010004 можно выставить нунжый максимум числа машин. Осталось проверить еще одну подлость: как бы оно не проверяло перед сохранением файла конфигураци... Поставив bpx на getwindowtexta, а потом bpm на адрес прочтенной строки, можно легко определить, что идет еще одна проверка вот тут:
Поставив bpx на createfilea нужно найти место где открывается файл "cz.cfg". Потом bpx readfile и после первого срабатывания, понажимав F12 мы окажемся тут:
:004128C7 6A04 push 00000004 ; Где-то я это уже видел...
:004128C9 8D442464 lea eax, dword ptr [esp+64]
:004128CD 6A01 push 00000001 ; Где-то я это уже видел...
:004128CF 8B8E64040000 mov ecx, dword ptr [esi+00000464]
:004128D5 50 push eax
:004128D6 6A04 push 00000004 ; Где-то я это уже видел...
:004128D8 C744247024000000 mov [esp+70], 00000024
:004128E0 C744247407020000 mov [esp+74], 00000207
:004128E8 E833440000 call 00416D20 ; После этого call в eax лежит число машин
:004128ED 33FF xor edi, edi
:004128EF 68FFFF0000 push 0000FFFF
:004128F4 8D8C24A4000000 lea ecx, dword ptr [esp+000000A4]
:004128FB 57 push edi
:004128FC 51 push ecx
:004128FD 8B8E64040000 mov ecx, dword ptr [esi+00000464]
:00412903 6852030000 push 00000352
:00412908 8986D8010000 mov dword ptr [esi+000001D8], eax - а тут запоминаем число машин...
Дальше возникает умная мысль: "А что если bpm esi+000001D8 ?". Эта мысль приводит нас к тому что мы очень быстро увидим следующие ограничения:
Прога запустилась... появились дополнительные машины! но они неактивны :((( Вот блин... Ну так это ... bpx enablewindow. После этого меня просто достало жать F5 (т.к. очень много раз срабатывало) и я решил глянуть чо ж оно там стока блокирует... и вылез тут:
Это call который блокирует новые машины! Я просто перепрыгнул с адреса 411A84 (push не делал) на
411A8D и все машины стали активными. Тока вот еще два глюка... почему-то не горит "Free" и почему-то горят на некоторых машинах зеленые квадратитики как-будто они уже подключены. Закраска делается через Setbkcolor. Поэтому легко можно определить что надпись "Free" блокирует ограничение:
:0040BF62 8B08 mov ecx, dword ptr [eax]
:0040BF64 56 push esi
:0040BF65 83F903 cmp ecx, 00000003 ; А тут они с 0 считают :)
:0040BF68 57 push edi
:0040BF69 0F8FF0020000 jg 0040C25F
И вот остался последний огромный глюк + последнее ограничение. Глюк с подключением клиента... Состоит он в том, что прога падает при попытке подключения клиента с номером больше 4, квадратики подключения клиента ваще никак не реагируют, прога падает при выходе... А причина всего этого, скажу я вам, это называется глюк из-за статических массивов. При попытке содния более чем 4 машин мы просто вылазим запределы выделенного пространнства и поганим другие переменные. Ну и прога в том числе тоже поганит наши данные... Будем исправлять...
Прога падает тут:
:0040DE1D 8B4668 mov eax, dword ptr [esi+68]
:0040DE20 53 push ebx
:0040DE21 8B0CB8 mov ecx, dword ptr [eax+4*edi] - в edi идет номер машины
:0040DE24 83C170 add ecx, 00000070
:0040DE27 51 push ecx
:0040DE28 8D4C2424 lea ecx, dword ptr [esp+24]
:0040DE2C E8C79B0000 call 004179F8
в ecx попадает не то значение... и потом внутри call 004179F8 оно слетает окончательно...
[eax+4*edi]... Пляшут относительно eax. Eax не меняется... меняется тока индекс - это 100% работа с одномерным массивом! Чтоже у нас в EAX там у нас 4453F8. Делаем d 4453F8 и н смотрим чо там делается... будет цикл который заполнит DWORD числами массив. Длинна массива равна коичеству машин. Делаем bpr 445408 xxxxxx RW (откуда я знаю скока вы себе там машин сделаете). Я сделал именно 445408, а не 4453f8 т.к. первые 4 dword числа нас не интересуют они и так в пезопасности. А теперь будем следить, где начнутся попытки читать или писать. Начнутся они совсем рядом:
ebp меняется но вот вычитаемое остается константой. Все что нам нужно, это заставить программу использовать данные где-нить подальше от нашего массива. Я сделал это очень просто:
Теперь у меня еще аж 120h-60h=C0h места. C0h /4h = 30h = 48 машин. Прям как в зарегеной :)
После такого изменения прога больше не падает и можно управлять машинами! Остался тока глюк с индикацией подключения. Ну тут все тоже связано с EBP :) Поставив bpx на SetBkColor я нашел в чем глюк:
Клинта и сетап к нему ломайте сами. Я задолбался уже писать этот туториал...
Компьютерный зал 1.81 Demo2Full: защита от более чем 4 машин.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.