Исследование 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/