Сегодня мы займемся регистрацией программы SpyBuddy версии 2.7 от 25.01.2004.
Взять ее можно по адресу: http://www.listsoft.ru/programs/13039/.

Это так называемая программа-шпион. Предназначенная для отслеживания любой
активности на вашем компьютере. Утилита позволяет перехватывать и сохранять
всю информацию, передаваемую по AOL/ICQ/AIM/MSN Chat, запоминает все
посещенные сайты, запушенные приложения, набранные команды, текст и
картинки, копировавшиеся в буфер обмена. Кроме того, может делать снимки
рабочего стола через заданные промежутки времени, сохранять информацию
обо всех открытых окнах и распечатанных документах. И это далеко не все
возможности в ней присутствующие.

Одним словом, программа будет чрезвычайно интересна и полезна
собственно тем, кому это все надо.

Приятные особенности мы обсудили теперь поговорим об обратной стороне медали.
При всех ее возможностях, не удивительным стал факт наличия "shareware" статуса.

С первого взгляда на программу из визуально видимых
ограничений можно отметить постоянно
появляющееся при старте  NAG окно, содержащее информацию
о количестве произведенных запусков, процедуре регистрации и остальных присутствующих
в демонстрационной версии ограничениях, собственно что нам и надо.

Отсюда узнаем о главном ограничении - 30-ти минутном лимите работы монитора,
по прошествию этого времени необходимо заново вручную его запускать.
Теперь пропускаем NAG окно и входим в программу. Некоторое время я искал видимые
пути регистрации, но ничего подобного
найдено не было. Посему пришлось искать
сведения о регистрации в разделах "Помощи" программы. Оказалось, что версия которую мы имеем,
не что иное как заведомо запрограммированная демо.
То есть никакого механизма регистрации она не имеет, а после оплаты предлагается скачать другую зарегистрированную версию
программы, такой вот механизм регистрации реализовали авторы.

Такую методику обычно применяют в "дорогих" программных
продуктах, попросту вырезая в своих demo-версиях функции, 
присутствующие в полной. Таким образом чтобы превратить demo-версию в полную необходимо самому дописать эти функции
на ассемблере в программу. Это очень долгая и трудоемкая работа. А если эти функции
являются изюминками этих самых программ и попросту невыполнимая.

Но не стоит отчаиваться, в нашем случае все обстоит иначе. Нам предлагается использовать
монитор в течении 30 минут, соответственно код самого монитора в программе присутствует,
а где-то лишь стоит проверка на его рабочее время и нам ничего не мешает это время расширить.

Итак, выделяем наши задачи:

  1. отключить NAG окно
  2. найти место в программе где происходит проверка длительности работы монитора
    и сделать его "вечным"

Теперь приступим.

Для этого нам потребуются следующие инструменты:

  1. отладчик SoftIce
  2. дизассемблер Win32Dasm или любой другой
  3. hex-редактор hiew
  4. идентификатор PE файлов - PEID

Прежде всего проверим программу на наличие упаковщиком/протекторов с помощью
давно известной программы PEID, откроем ее - загрузим туда
главынй файл программы "sb32mon.exe", выберем "hardcore scan" в единственном меню программы и произведем
сканирование. Анализатор показал "ASPack 2.12b -> Alexey Solodovnikov".

Чтобы свободно исследовать программу посредством дизассемблера нам потребуется
ее распаковать. Автоматического распаковщика у меня не оказалось, так что сделаем это
вручную в темпе вальса.

В PEID смотрим точку входа = 001CC001
Image Base = 00400000

Складываем 001CC001+00400000=005СС001

Запускаем программу, вызываем SoftIce, пишем "addr sb32mon.exe",
затем "bpm 005СС001 x". Отпускаем отладчик, выходим из
программы и заново запускаем. Мы на точке входа:

NOP 
NOP ; точка входа (EP) 
PUSHAD 
CALL 005CC00B 
JMP 45B9C4F8 
PUSH EBP 
RET 
CALL 005CC015 
JMP 005CC073


До 005CC015 пройдемся по F8, затем по F10, пропуская основные циклы
распаковки, и скоро оказываемся на настоящей точке входа в программу:

PUSH EBP ; OEP 
MOV EBP,ESP 
MOV ECX,00000008 
PUSH 00 
PUSH 00 
DEC ECX 
JNZ 005053D8 
PUSH ECX 
PUSH EBX 
PUSH ESI 
PUSH EDI

Зациклим программу, введем "e eip" и заменим 558B на
EBFE. Теперь сделаем дамп процесса с помощью LordPE, выберем наш зацикленный
процесс в списке всех активных процессов и сделаем "full
dump". Теперь откроем ImpRec, также выберем наш процесс, запишем в окне
OEP настоящую точку входа: 001053D0, нажмем "IAT AutoSearch", затем
"GetImport", получаем полностью распознанный
импорт. Теперь пачим наш недавно созданный дамп.

Теперь можем дизассемблировать распакованную программу, сделаем это с помощью
Win32Dasm. Как мы помним, нам надо выполнить две задачи описанные вначале,
выполним сначала первую, а именно отключим NAG окно. Ищем в дизассемблере
по строке "unregistered", находим по адресу 005057С4:

mov eax, 005059D4
call 004E2D18


* Possible StringData Ref from Code Obj ->"This unregistered version of SpyBuddy "
->"has been used "
|
push 00505B14
lea edx, dword ptr [ebp-38]
mov eax, dword ptr [00509F4C]
call 00409200
push [ebp-38]

Теперь поднимемся на экран выше этого кода и видим:

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00505752(C), :0050575B(C)
mov eax, dword ptr [esi]
cmp byte ptr [eax+000005E4], 01
jne 00505848 ;
а это как раз переход, позволяющий обойти назойливый NAG

* Possible StringData Ref from Code Obj ->"UnRegCount"
|
mov edx, 00505B00

Происходит проверка cmp byte ptr [eax+000005E4], 01, и если байт по адресу
eax+000005E4 отличен от 1, NAG мы не увидим. Все сводится к простой замены условного перехода на
безусловный.

Сделаем же несколько иначе, поднимемся еще выше на несколько экранов и видим
следующий код:

mov edx, dword ptr [004EC4E8]
call 00453430
mov eax, dword ptr [esi]
call 004FE4D8
mov eax, dword ptr [esi]
mov byte ptr [eax+000005E4], 01 ;
здесь заносится та самая
единица, изменим ее на ноль

mov eax, dword ptr [esi]
mov byte ptr [eax+0000062A], 00
mov eax, dword ptr [esi]
mov byte ptr [eax+000005C9], 00
mov eax, dword ptr [esi]
add eax, 000005D8

Мы просто заменим команду mov byte ptr [eax+000005E4], 01
на mov byte ptr [eax+000005E4], 00, таким образом по адресу [eax+000005E4] будет
0, и если впереди будут еще проверки нам не придется все их менять.

Откроем hiew, выберем режим дизассемблера, перейдем на аадрес 005055E2,
нажмем F3, затем F2 и меняем записываемый байт с 01 на 00.
Сохраняем F9 и выходим. Пробуем запустить программу NAG-окно не появляется.

Теперь займемся следующим ограничением. Напомню, нам надо найти место
где программа проверяет отработанное время монитора.

Откроем программу и попробуем запустить монитор, чтобы это сделать нам потребуется
выбрать одну из задач, для этого зайдем в "configuration"/"general options" закладка
"Logging", там отмечаем галочкой любую из задач и выходим из опций. После запуска монитора обращаем
внимание на метку в верхнем правом углу "Monitoring Status:", при активном процессе
"Active", при не активном "Not Active", соответственно. Отсюда и будем исходить.
По прошествию полчаса работы монитора метка
меняет название с "Active" на "Not Active". Это и будем искать в дизассемблере. Итак ищем строку "Not Active", находим по адресу 004FE1A7:

mov eax, dword ptr
[esi]
mov eax, dword ptr [eax+00000308]

* Possible StringData Ref from Code Obj ->"Not active."
|
mov edx, 004FE3A8
call 00435190
mov eax, dword ptr [esi]
mov eax, dword ptr [eax+00000524]
xor edx, edx
call 004567C0
mov eax, dword ptr [esi]
mov eax, dword ptr [eax+000002D8]

Поднимаемся на экран выше этого кода и видим:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004FE0E7(C)
|
je 004FE150

* Referenced by a CALL at Addresses:
|:004F17BE , :005006FE , :00500984 ;
это адреса откуда происходит отключение мониторинга. 
|

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004FE14E(C)
|
push ebp
mov ebp, esp
xor ecx, ecx
push ecx

Проверяем эти адреса: 004F17BE, 005006FE, 00500984.

Первый адрес 004F17BE:

* Possible StringData Ref from Code Obj ->"LastStop"
|
mov edx, 004F18F8

* Possible StringData Ref from Code Obj ->"SpyBuddy"
|
mov eax, 004F1894
call 004E2D18
mov eax, dword ptr [005088B0]
mov eax, dword ptr [eax]
call 004FE150
jmp 004F1838

Немного промотав код можно понять, что это добровольное прерывание
мониторинга, т.е. когда мы сами производим остановку процесса "stop monitoring".

Следующий адрес 005006FE:

* Possible StringData Ref from Code Obj ->"Complete"
|
mov ecx, 005007FC
mov edx, ebx
call 004DC6F0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005006B1(C)
|
mov edx, dword ptr [ebp-0C]

* Possible StringData Ref from Code Obj ->"Stop"
|
mov eax, 00500810
call 00404260
test eax, eax
jle 00500716
mov eax, dword ptr [00509F28]
mov byte ptr [eax+0000062A], 00

Здесь, вероятно, происходит остановка мониторинга по
графику.

Смотрим следующее смещение 00500984:

mov eax, dword ptr [ebp-0C]
call 00409264
cmp eax, 0000001E ;
это как раз то, что мы искали 1E=30 мин., после которых происходит отключение мониторинга
jne 0050099D ;
если eax=1E,
то есть время вышло, прыжка не будет, иначе прыгаем и мониторинг продолжается

mov eax, ebx ;
call 004FE150 ;
откуда мы пришли, здесь будет произведена остановка мониторинга
mov ebx, dword ptr [ebx+00000324]
mov edx, edi
mov eax, dword ptr [ebx+0000010C]
call dword ptr [ebx+00000108]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00500980(C)
|
xor eax, eax

Вот мы и нашли место где программа сама прерывает мониторинг по прошествию
тех самых 30 минут = 1E. Нам потребуется лишь заменить условный переход по адресу 00500980 на безусловный
чтобы прыжок всегда происходил и мониторинг продолжал работать.

Запускаем hiew, выбираем режим дизассемблера, переходим по смещению 00500980,
жмем F3, затем F2 и вместо команды "jne 0050099D", пишем "jmp 0050099D",
сохраняем и выходим.

Казалось бы задача выполнена, теперь программа, а именно мониторинг, будет работать
неограниченное время. Для уверенности в этом я оставил программу со включенным
мониторингом на те самые полчаса. По прошествию этого времени, на метке
"Minitoring Status", вместо "Active" красовалась надпись "Suspended", что в переводе означает
"подозрительно". Очевидно, что где то еще происходит дополнительная проверка.
Снова вернемся в дизассемблер и ищем строку "Suspended", находим по адресу 004FFCA6: 

call 00435160
mov eax, dword ptr [ebp-04]
call 00409264
cmp eax, 0000001E
jl 004FFCC8 ; очередная проверка

* Possible StringData Ref from Code Obj ->"Suspended."
|
mov edx, 004FFDB8
mov eax, dword ptr [ebx+00000308]
call 00435190
mov dl, 01
mov eax, dword ptr [ebx+00000324]
call 00435078
jmp 004FFD8F

Как мы и предполагали, очередная проверка, причем проверяется
снова время, но на этот раз вопрос ставится по-другому:
"не работал ли мониторинг больше 30 минут? Ежели так, то это
подозрительно". Европейцы боятся смелых заявлений
:).

Так вот, чтобы это исправить нам понадобиться в очередной раз
исправить условный по адресу 004FFCA1.

Запускаем в hiew и тем же методом заменяем команду по адресу
004FFCA4: "jl 004FFCC8" на "jmp 004FFCC8". Сохраняем и выходим
из hex-редктора.

Статья предоставлена исключительно в образовательных целях.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии