Сегодня мы займемся регистрацией программы SpyBuddy версии 2.7 от 25.01.2004.
Взять ее можно по адресу: http://www.listsoft.ru/programs/13039/.
Это так называемая программа-шпион. Предназначенная для отслеживания любой
активности на вашем компьютере. Утилита позволяет перехватывать и сохранять
всю информацию, передаваемую по AOL/ICQ/AIM/MSN Chat, запоминает все
посещенные сайты, запушенные приложения, набранные команды, текст и
картинки, копировавшиеся в буфер обмена. Кроме того, может делать снимки
рабочего стола через заданные промежутки времени, сохранять информацию
обо всех открытых окнах и распечатанных документах. И это далеко не все
возможности в ней присутствующие.
Одним словом, программа будет чрезвычайно интересна и полезна
собственно тем, кому это все надо.
Приятные особенности мы обсудили теперь поговорим об обратной стороне медали.
При всех ее возможностях, не удивительным стал факт наличия "shareware" статуса.
С первого взгляда на программу из визуально видимых
ограничений можно отметить постоянно
появляющееся при старте NAG окно, содержащее информацию
о количестве произведенных запусков, процедуре регистрации и остальных присутствующих
в демонстрационной версии ограничениях, собственно что нам и надо.
Отсюда узнаем о главном ограничении - 30-ти минутном лимите работы монитора,
по прошествию этого времени необходимо заново вручную его запускать.
Теперь пропускаем NAG окно и входим в программу. Некоторое время я искал видимые
пути регистрации, но ничего подобного
найдено не было. Посему пришлось искать
сведения о регистрации в разделах "Помощи" программы. Оказалось, что версия которую мы имеем,
не что иное как заведомо запрограммированная демо.
То есть никакого механизма регистрации она не имеет, а после оплаты предлагается скачать другую зарегистрированную версию
программы, такой вот механизм регистрации реализовали авторы.
Такую методику обычно применяют в "дорогих" программных
продуктах, попросту вырезая в своих demo-версиях функции,
присутствующие в полной. Таким образом чтобы превратить demo-версию в полную необходимо самому дописать эти функции
на ассемблере в программу. Это очень долгая и трудоемкая работа. А если эти функции
являются изюминками этих самых программ и попросту невыполнимая.
Но не стоит отчаиваться, в нашем случае все обстоит иначе. Нам предлагается использовать
монитор в течении 30 минут, соответственно код самого монитора в программе присутствует,
а где-то лишь стоит проверка на его рабочее время и нам ничего не мешает это время расширить.
Итак, выделяем наши задачи:
- отключить NAG окно
- найти место в программе где происходит проверка длительности работы монитора
и сделать его "вечным"
Теперь приступим.
Для этого нам потребуются следующие инструменты:
- отладчик SoftIce
- дизассемблер Win32Dasm или любой другой
- hex-редактор hiew
- идентификатор 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-редктора.
Статья предоставлена исключительно в образовательных целях.