Исследование Advanced Mass Sender v3.4

Перейти на главную страницу, индексную страницу.


Автор: ViNCE [AHT] <vincelabs@pisem.net>

Инструменты: SoftICE, IDA, FileInfo, AsPackDie, Hex-редактор
Рейтинг программы: [8\10]
Download: www.massender.com
Дата: 16.10.2003

iNTRODUCTION

Сегодня мы исследуем защиту-компонент TRegWare, но для начало - с чего всё начиналось... Однажды проверив свою почту я обнаружил письмецо рассылки сайта RealCoding. Внимательно прочитав содержание рассылки меня заинтриговала новость о новом компоненте появившемся на сайте - TRegWare. Данный компонент разрабатывался для того чтобы без лишних трудов и "заморочек" сделать из freeware программы - shareware с ограниченным периодом работы. В то время я так и "забил" на компонент, но недавно мне предложили посмотреть интересную програмку Advanced Mass Sender и вот что из этого вышло... Advanced Mass Sender (далее - "AMS") - это очень мощная программа для работы с электронной почтой, среди функций, которых превиликое множество: - Встроенный SMTP сервер – возможность рассылать почту минуя SMTP сервер провайдера. - Многопоточная рассылка – возможность рассылать почту одновременно через несколько SMTP серверов. При использовании 3 - 5 потоков можно отправлять до 1500 писем в минуту. - Дополнительная утилита для проверки адресов на предмет существования. - Дополнительная программа для проверки списков рассылки. - Полная поддержка Socks 4/4a/5 прокси. - Проверка списков прокси на предмет работоспособности. - Встроенный HTML редактор с полной поддержкой таблиц, картинок и гиперссылок. - Поддержка всех методов рассылки - To/CC/BCC/Direct Delivery/PersonalCopy. - Возможность разделения списков адресов на группы получателей. Вот такой вот "E-mail монстр" ;) Максим Терентьев (автор программы) расщедрился и просит за своё "детище" всего лишь 500 рублей ~ 16$ - для жителей стран СНГ и 65$ (1950 руб.) для иностранцев. Интересная разница! ;) Итак, перед нами программа которая полнофункционально работает только 20 дней, а после истечения "испытательного периода" необходимо в срочном порядке приобрести сей софт.

iNTRO2

Для работы сегодня мы используем: SoftICE - самый мощный на сегодняшний день отладчик программного обеспечения. IDA v4.04 Pro - самый лучший и продвинутый интеллектуальный дизассемблер. FileInfo - програмка для анализа структуры файла (поиск запаковщиков и защит) AsPackDie - распаковщик компрессий утилитой AsPack HexWorkshop - шестнадцатиричный редактор Приступим...

rIPPING

Сперва используем утилиту FileInfo и посмотрим защищён ли файл? В командной строке набираем: fi.exe masssender.exe Программа выдаёт что AMS запакован утилитой г-на Солодовникова или просто - "AsPack v2.12". Я считаю что нет необходимости тратить время на ручную распаковку данного компрессора (об этом и многом другом вы можете прочитать сами в Интернете), так что мы воспользуемся авто-распаковщиком - AsPackDie. Программа распакована и, замечу, она сильно поправилась: была - 1,90Мб, а стала - 5Мб. Для дальнейших исследований нам понадобиться отладчик (SoftICE). Активируем загрузку отладчика. Перезагружаемся. Залезаем в отладчик и ставим необходимые точки прерывания (брэйкпоинты, бряки):

bpx ReadFile

Почему ReadFile? Нам нужно миновать окно, которое опережает саму программу и сообщает о регистрации (NAG-окошко), а функция чтения файла вызывается в самом начале, когда ещё даже не об одном из окошек и речи не ведётся. Ставим точку останова и выходим к программе (F5). Запускаем masssender.exe и выскочит отладчик - это значит программа осуществила вызов функции ReadFile, на что среагировал отладчик и сообщил нам об этом. Теперь, так как вызовов ReadFile обычно несколько жмём ещё раз F5 и программа снова прервётся. Жмём ещё раз... короче, до того момента когда появится наг. Если вы "перенажимали" и окошко с регистрацией (nag) появилось начните заново. Когда у вас получиться прерваться в нужном месте делаем следующее:

bc *

Убираем точки останова (у нас она одна, а символ "*" означает удалить все доступные точки останова). Мы в программе, но не совсем - нам нужно вернуться к вызову функции ReadFile, т.е. в модуль программы. Жмём F12 несколько раз пока снизу (в отладчике) не будет написано: "ams.code+адрес" Итак, мы в коде программы - трассируем (выполняем) пошагово код нажимая F10. Мы будем блуждать долго по коду пока не окажемся в таком месте:
:004017E9                 call         sub_64BC20
:004017EE                 mov     eax, dword_7C920C
:004017F3                 mov     eax, [eax]
:004017F5                 mov     ecx, dword_7C90C8
:004017FB                 mov     edx, dword_7BB308
:00401801                 call         sub_64BC20
:00401806                 mov     eax, dword_7C920C
:0040180B                 mov     eax, [eax]
:0040180D                 mov     ecx, dword_7C90CC
:00401813                 mov     edx, dword_7BB5E0
:00401819                 call         sub_64BC20
:0040181E                 mov     eax, dword_7C920C
:00401823                 mov     eax, [eax]
:00401825                 call         sub_64BCA0     ;<-вызов окошка с регистрацией
:0040182A                 mov     word ptr [ebp-2Ch], 0
:00401830                 jmp       short loc_40184D
Как только мы выполним строчку по адресу 00401825 появится окошко с напоминанием о регистрации. Но мы помним, что нам надо обойти данное окошко и успешно загрузить программу. Жмём в окошке "Exit" и нас снова выбросит в отладчик. В отладчике удаляем старые бряки и ставим бряк на адрес 00401825. Перезапускаем AMS и срабатывает бряк. Заходим внутрь данного call'а, нажав F8 и мы окажемся тут:

:0064BCA0                 push    ebp
:0064BCA1                 mov     ebp, esp
:0064BCA3                 push    ecx
:0064BCA4                 mov     [ebp+var_4], eax
:0064BCA7                 mov     eax, [ebp+var_4]
:0064BCAA                 mov     byte ptr [eax+95h], 1
:0064BCB1                 xor      edx, edx
:0064BCB3                 push    ebp
:0064BCB4                 push    offset unk_64BD4A
:0064BCB9                 push    dword ptr fs:[edx]
:0064BCBC                 mov     fs:[edx], esp
:0064BCBF                 mov     eax, offset aBik ; "бИк|"
:0064BCC4                 call     sub_690B24
:0064BCC9                 mov     eax, [ebp+var_4]
:0064BCCC                 mov     eax, [eax+38h]
:0064BCCF                 test     eax, eax
:0064BCD1                 jz       short loc_64BD32
:0064BCD3                 mov     edx, dword_7C9700
:0064BCD9                 mov     edx, [edx]
:0064BCDB                 sub     edx, 3
:0064BCDE                 jz       short loc_64BCEE
:0064BCE0                 sub     edx, 4
:0064BCE3                 jnz      short loc_64BCF5
:0064BCE5                 mov     byte ptr [eax+213h], 1
:0064BCEC                 jmp     short loc_64BCF5
:0064BCEE ; ---------------------------------------------------------------------------
:0064BCEE
:0064BCEE loc_64BCEE:            ; CODE XREF: sub_64BCA0+3Ej
:0064BCEE                 mov     dl, 2
:0064BCF0                 call      sub_646178
:0064BCF5
:0064BCF5 loc_64BCF5:            ; CODE XREF: sub_64BCA0+43j
:0064BCF5                             ; sub_64BCA0+4Cj
:0064BCF5                 mov     eax, [ebp+var_4]
:0064BCF8                 cmp     byte ptr [eax+4Bh], 0
:0064BCFC                 jz        short loc_64BD1E
:0064BCFE                 mov     eax, [ebp+var_4]
:0064BD01                 mov     eax, [eax+38h]
:0064BD04                 cmp     byte ptr [eax+213h], 1
:0064BD0B                 jnz       short loc_64BD17
:0064BD0D                 mov     eax, [ebp+var_4]
:0064BD10                 call      sub_64B5F8
:0064BD15                 jmp      short loc_64BD1E
:0064BD17 ; ---------------------------------------------------------------------------
:0064BD17
:0064BD17 loc_64BD17:            ; CODE XREF: sub_64BCA0+6Bj
:0064BD17                 mov     dl, 1
:0064BD19                 call      NAG             ; Вызываем наг!
:0064BD1E
:0064BD1E loc_64BD1E:            ; CODE XREF: sub_64BCA0+5Cj
:0064BD1E                             ; sub_64BCA0+75j ...
:0064BD1E                 mov     eax, [ebp+var_4]
:0064BD21                 call      sub_64BB0C
:0064BD26                 mov     eax, [ebp+var_4]
:0064BD29                 cmp     byte ptr [eax+8Ch], 0
:0064BD30                 jz        short loc_64BD1E
:0064BD32
:0064BD32 loc_64BD32:            ; CODE XREF: sub_64BCA0+31j
:0064BD32                 xor       eax, eax
:0064BD34                 pop      edx
:0064BD35                 pop      ecx
:0064BD36                 pop      ecx
:0064BD37                 mov     fs:[eax], edx
:0064BD3A                 push    offset unk_64BD51
:0064BD3F                 mov     eax, [ebp+var_4]
:0064BD42                 mov     byte ptr [eax+95h], 0
:0064BD49                 retn
Непонятный код... Я потрэйсил этот код отладчиком но к сожалению так ничего и не нашёл, все джампы вели к выходу из программы, а это плохо... У меня возникло предположение, что проверка на зарегистрированность идёт значительно выше... так что "убьём" все бряки в отладчике из дизассемблируем masssender.exe с помощью IDA. После того как IDA закончит свою нелёгкую :] работу можно порыться в коде... а точнее кликнем по кнопке "Open names window" (это аналог WinDASM'кому String Data Reference). Появится окошко со всеми строками проги (ну не совсем конечно...). Листаем бооольшой список и находим интересную строчку - "Unregistered". Кликаем и оказываемся в таком куске кода:

:00412806                 mov     dl, 1
:00412808                 mov     ecx, [eax]
:0041280A                 call      dword ptr [ecx+5Ch]
:0041280D                 mov     word ptr [ebp-180h], 2Ch
:00412816                 mov     edx, offset aUnregistered ; "Unregistered"
:0041281B                 lea       eax, [ebp-30h]
:0041281E                 call      sub_6B5A08
:00412823                 inc      dword ptr [ebp-174h]
:00412829                 mov     edx, [eax]
:0041282B                 mov     eax, dword_7C9044
:00412830                 mov     ecx, [eax]
:00412832                 mov     eax, [ecx+2F8h]
Тут ничего такого интересного, так что нам необходимо посмотреть код повыше, и найти участок отвечающий за состояние зарегистрированности. Попутно находим:
:004126C8                 call      sub_6B5BAC
:004126CD                 mov     eax, [esi+380h]
:004126D3                 call      @Regware2@TRegwareII@CheckExpired$qqrv ; Regware2::TRegwareII::CheckExpired(void)
:004126D8                 test     al, al
:004126DA                 jz        loc_41279E
:004126E0                 push    1
:004126E2                 mov     edx, offset aEvaluationPeri ; "Evaluation period expired. Please purch"...
:004126E7                 mov     word ptr [ebp-180h], 14h
Здесь нам сообщают об истечении испытательного периода, но мы продолжаем искать нужный код выше:
:0041262C                 inc       dword ptr [ebp-174h]
:00412632                 mov     eax, offset aYouHave ; "You have "
:00412637                 call      sub_6B6140
:0041263C                 lea      edx, [ebp-1Ch]
:0041263F                 push    edx
:00412640                 mov     edx, offset aDaySRemaining ; " day(s) remaining"
:00412645                 lea      eax, [ebp-20h]
Эти строки сообщают, сколько осталось "рабочих дней" программы, смотрим выше:
:004125ED                 call     @Regware2@TRegwareII@CheckRegistered$qqrv ; Regware2::TRegwareII::CheckRegistered(void)
:004125F2                 test    al, al
:004125F4                 jnz      loc_412870 ; Прыжок если зарегистрированы
:004125FA                 mov    word ptr [ebp-180h], 8
:00412603                 mov    eax, [esi+380h]
:00412609                 call     Regware2::TRegwareII::GetDaysLeft(void)





























































































































































































































































Наконец-то мы нашли это место! По адресу 004125ED вызывается функция проверки зарегистрированности. Если мы зарегистрированны, то в al складывается 1 и осуществляется прыжок jnz по адресу 004125F4. Если не зарегистрированны, то в al кладётся ноль и прыжок не осуществляется. А если прыжок не сработает дальнейший код вызовет окошко напоминающее о регистрации... короче - "старая песня о главном". Попробуем изменить алгоритм работы защиты. Для изменений я предлагаю два варианта:

1. Просто поменять:
:004125F4                 jnz     loc_412870


на
:004125F4                 jz      loc_412870
2. Поменять:
:004125F2                 test    al, al
на
:004125F2                 mov    al, 01

Чтобы изменения вступили в силу и программа заработала как зарегистрированная откроем файл в HexWorkshop'е и поищем следующую последовательность байтов (для первого способа):

0F857602000066C78580FEFFFF08008B

Жмём поиск байтов и вводим последовательность. Как только HexWorkshop найдёт последовательность меняем байт 85 на 84 и сохраняем изменения. Запускаем "новую" программу - всё! больше напоминаний о регистрации нет.

---
Данная статья написана ТОЛЬКО в образовательных целях, так что автор не несёт никакой ответственности за дальнейшее использование данного материала и исходящие из этого последствия.

ViNCE [AHT]
vincelabs@pisem.net


Материалы находятся на сайте http://cracklab.narod.ru/doc/






Hosted by uCoz