RCE.SU - реверсинг, кодинг, выделенные сервера, ICQ, proxy

AccuTagger 1.01

[Исследование]

Subject: Cracking
Target: AccuTagger 1.01
URL:www.cyberhq.com.
Author: aSL!
Date: 09.07.2001

Before starting!
Все ниже изложенное предназначено только для образовательных целей.

I. Вступление

Здравствуйте мои маленькие любители прекрасного! :)

Нам для рассмотрения выдана программа AccuTagger 1.01 (далее AC) от CyberHQ Solutions.

Взять можно у них - http://www.cyberhq.com В ходе беглого просмотра .hlp файла, (Кстати: RTFM) мы выяснили, что:

  1. Программа существует в двух вариантах - Standart и Professional
  2. Программа при каждом своем запуске проверяет свой серийный номер у производителя (при этом передается IP машины, с которой был запущен AC - здесь уже можно стукачить провайдеру :)))
II. Постановка задачи
  1. Необходимо сделать программу зарегистрированной
  2. Необходимо отучить ее от плохой привычке стучать производителю - с плохими привычками на бороться, не так ли??? :]
III. Исследование

Запускаем небезызвестный W32Dasm от URSoftware...

Оопсс... Не хотит. Смотрим на exe - тааааак: запакован ASProtect'ом. Ну что же... Сразу хочу сказать, что ручная распаковка ASProtect'а выходит за рамки этой статьи, поэтому будем считать, что программа уже распакована (HINT: Caspr ей помог).

Единственное НО: Скажу по секрету, что W32Dasm дизассемблирует секцию только если у нее стоят атрибуты - E0000020 (вообще-то не всегда с такими, но лишь бы секция была помечена, как содержащая исполняемый код, и E0000020 - самый оптимальный вариант, по моему мнению) -- все это безобразие правится ручками по оффсету 0x21c.

Итак, программа дизассемблирована... (Кстати, хочу сказать, что сам AC написан на Delphi 4, поэтому можно AC понасиловать с помощью DeDe). В первую очередь смотрим на процедуру регистрации - для этого ищем String Reference "The registration..." - Это выводится при неудачной регистрации. Нашли - по VA 0051A577:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0051A56D(C)
|

* Possible StringData Ref from Code Obj ->"The registration information provided"
  ->"is incorrect. Please check the "
  ->"information entered."
  |
 
:0051A577 B8B8A65100 mov eax, 0051A6B8
:0051A57C E8030AF4FF call 0045AF84
:0051A581 EB24 jmp 0051A5A7

Оччень интересное нас поджидает по VA 0051A56D:

:0051A55A E8CD030000
:0051A55F E89C050000
:0051A564 A1F4BE5300
:0051A569 8A00
:0051A56B 2C01
:0051A56D 7208
:0051A56F 7412
:0051A571 FEC8
:0051A573 7421
:0051A575 EB30
call 0051A92C
call 0051AB00
mov eax, dword ptr [0053BEF4]
mov al, byte ptr [eax]
sub al, 01
jb 0051A577
je 0051A583
dec al
je 0051A596
jmp 0051A5A7

Что же здесь мы видим??? в eax пишут адрес, находящийся по адресу 0053BEF4, после этого в al загружается байт по адресу, что сейчас находится в eax. Далее, если этот байт равен:

0 - Unregistered
1 - Standart mode
2 - Professional mode

В ходе отладки, (в Dasm'е оччень хороший отладчик - в большинстве случаев его хватает за глаза) замечаем, что этот байт изменяется только после call'а по адресу 0051AB00. Это и есть процедура проверки, которая возвращает состояние регистрации! Если на нее посмотреть, то мы замечаем, что она вызывается не менее, чем из двух мест. Почему не менее??? Дело в том, что AC написан на делфи, поэтому весьма вероятен такой код:

push adr_of_return
push 0051AB00
ret

Который тоже будет вызвать эту процедуру. W32Dasm, в отличии от IDA, такие вызовы не ловит, поэтому нам лучше перестраховаться. Так что возникает следующая заглушка в эту функцию:

pusha
mov eax, dword ptr [0053BEF4]
mov [eax],00000002
popa
ret
Для этого в HIEW'е меняем код по оффсету 00119F00 с 558BEC33C9515151515153 на 50A1F4BE5300C6000258C3. Запускаем. Все! Зарегистрированно. Вроде бы на этом наша миссия закончена. Ан нет! Если мы запустим AC во время подключенного Internet'а, то мы увидим такое сообщение: "You are running an illegal AccuTagger license. Software piracy is a crime. Cyberspace Headquarters LLC will prosecute anyone attempting illegal use of our software." Хех... Мы забыли о той проверке, что происходит при каждом подключении :) А при последующих запусках: "An illegal AccuTagger license was run on this computer. Illegal use voids the demonstration license. In order to continue using this program, enter a valid registration number, while connected to the internet." Ну что ж... Это дело поправимое: первым делом ищем в referencах второе сообщение... а вот и оно:
:00532999 E86281FEFF
:0053299E E805FFFFFF
:005329A3 84C0
:005329A5 745F
call 0051AB00
call 005328A8
test al, al
je 00532A06
* Possible StringData Ref from Code Obj ->"An illegal AccuTagger license "
  ->"was run on this computer. Illegal "
->"use voids the demonstration license. "
->" In order to continue using this "
->"program, enter a valid registration "
->"number, while connected to the "
->"internet."
  |
 
:005329A7 B8B0305300 mov eax, 005330B0

Причем заметим, что по адресу 00532999 вызывается нам уже известная 0051AB00. Процедура по адресу 005328A8, очевидно, осуществляет проверку. Ну что же... C3 ей поможет :), по адресу 005328A8 меняем 53 на C3 (оффсет 00131CA8), а по адресу 005329A5 74 на EB (Оффсет 00131DA5). Теперь AC уже не матерится, но все равно проверяет, да еще у CyberSpace HQ остался наш IP в логах. Так дело не пойдет :)
Продолжаем разговор :)

Теперь нам надо найти место, находящее IP. Для этого программе необходимо сначала инициализировать WinSock. Для этого вызывается WSAStartup. Ищем... Находим ее вызов по адресу 0052AA02, после этого вызвается GetHostName, точно: процедура, в которой мы находимся определенно вычисляет наш IP. Она начинается с 0052A9EC. Тут решение простое: по оффсету 00129DEC вместо 53 ставим C3. Запускаем... Облом... AC совсем не запускается :) Дело тут в следующем: просто в Delphi при вызове процедуры на сегмент данных указывает ebp, а теперь смотрим на код по адресу 00532A0E:

:00532A0E 837DD000
:00532A12 0F8440060000
cmp dword ptr [ebp-30], 00000000
je 00533058

Кстати, вызов находится недалеко от наших нехороших сообщений - его легко заметить если читать листинг внимательно. Почему же здесь такая гадость: дело в том, что функция в ЛЮБОМ случае возвращает IP (Даже если машина не подключена - в этом случаем IP будет 127.0.0.1). А пустая же переменная будет говорить либо об ошибке, либо о нежелательных вмешательствах в код. :)
Значит, правим и здесь... меняем байты по адресу 00532A0E (оффсет 00131E0E) c 837DD0000F8440060000 на 90909090909090909090. После этого CyberSpace не получит нашего IP в любом случае :)) (Если только, конечно, сильно не постарается...) Остается только научить AC совсем не подключаться к сайту производителя. Для этого просмотрим вот этот участок кода в случае, когда есть подключение к internet'у и когда - нет.
Участок начинается по адресу 00532A30. Здесь мы видим, что для нормального функционирования AC необходимо подправить несколько jmp'ов: по адресу 00532A37 с 74 на EB, по адресу 00532A6B находится длинный je (за 128 байт от eip), поэтому для подстраховки его не инвертируем, а переделаем в jmp (тоже длинный!) Для этого по адресу 00532A69 (оффсет 00131E69) поправим с 84DB0F84E7050000 на E9EA050000909090, по адресу 0053305F (оффсет 0013245F) jne нужно забить nop'ами, а по адресу 00533069 (оффсет 00132469) jne сделать безусловным jmp. Все! AC рабоет даже при подключении к Internet'у и НИКОГДА не стукачит с CyberSpace HQ.
IV. Подводим итоги: (Сравнение распакованных файлов)

00119F00: 55 50 51ab00
00119F01: 8B A1
00119F02: EC F4
00119F03: 33 BE
00119F04: C9 53
00119F05: 51 00
00119F06: 51 C6
00119F07: 51 00
00119F08: 51 02
00119F09: 51 58
00119F0A: 53 C3
0011B818: 55 C3 51c418
00129DEC: 53 C3 52a9ec
00131CA8: 53 C3 5328a8
00131DA5: 74 EB 5329a5
00131E0E: 83 90 532a0e
00131E0F: 7D 90
00131E10: D0 90
00131E11: 00 90
00131E12: 0F 90
00131E13: 84 90
00131E14: 40 90
00131E15: 06 90
00131E16: 00 90
00131E17: 00 90
00131E37: 74 EB 532a37
00131E69: 84 E9 532a69
00131E6A: DB EA
00131E6B: 0F 05
00131E6C: 84 00
00131E6D: E7 00
00131E6E: 05 90
00131E6F: 00 90
00131E70: 00 90
0013245F: 75 90 53305f
00132460: 0A 90
00132469: 75 EB 533069

Длинноватенько, конечно, получилось, но это не простой bithack :) Далее, проблемой становится пропатчить .exe, запакованную ASProtect'ом. Здесь уже свободное поле для творчества.... Можно сделать Loader, можно прицепить еще одну секцию к .exe, можно... можно... Чего тут можно не напридумывать. От себя я замечу, что гораздо более эффектным (и эффективным) смотрится способ прицепления секции или использования нулей padding'а на границах секций.

Мой способ: (Сравнение запакованных файлов)
fc /b AccuTagger.exe AccuTagger_cr.exe
Сравнение файлов AccuTagger.exe и AccuTagger_cr.exe
000A28A9: 89 E9
000A28AA: 85 24
000A28AB: 5F 12
000A28AC: DF 00
000A28AD: 43 00
000A3AD2: 00 89
000A3AD3: 00 85
000A3AD4: 00 5F
000A3AD5: 00 DF
000A3AD6: 00 43
000A3AD8: 00 8B
000A3AD9: 00 85
000A3ADA: 00 50
000A3ADB: 00 E0
000A3ADC: 00 43
000A3ADE: 00 C7
000A3ADF: 00 85
000A3AE0: 00 50
000A3AE1: 00 E0
000A3AE2: 00 43
000A3AE4: 00 F2
000A3AE5: 00 62
000A3AE6: 00 64
000A3AE8: 00 A3
000A3AE9: 00 D2
000A3AEA: 00 62
000A3AEB: 00 64
000A3AED: 00 E9
000A3AEE: 00 BD
000A3AEF: 00 ED
000A3AF0: 00 FF
000A3AF1: 00 FF
000A3AF2: 00 81
000A3AF3: 00 3C
000A3AF4: 00 24
000A3AF5: 00 45
000A3AF6: 00 54
000A3AF7: 00 64
000A3AF9: 00 75
000A3AFA: 00 0A
000A3AFB: 00 C7
000A3AFC: 00 05
000A3AFE: 00 AB
000A3AFF: 00 51
000A3B01: 00 50
000A3B02: 00 A1
000A3B03: 00 F4
000A3B04: 00 BE
000A3B05: 00 81
000A3B06: 00 3C
000A3B07: 00 24
000A3B08: 00 45
000A3B09: 00 54
000A3B0A: 00 64
000A3B0C: 00 75
000A3B0D: 00 0A
000A3B0E: 00 C7
000A3B0F: 00 05
000A3B10: 00 04
000A3B11: 00 AB
000A3B12: 00 51
000A3B14: 00 53
000A3B16: 00 C6
000A3B18: 00 81
000A3B19: 00 3C
000A3B1A: 00 24
000A3B1B: 00 45
000A3B1C: 00 54
000A3B1D: 00 64
000A3B1F: 00 75
000A3B20: 00 0A
000A3B21: 00 C7
000A3B22: 00 05
000A3B23: 00 08
000A3B24: 00 AB
000A3B25: 00 51
000A3B27: 00 02
000A3B28: 00 58
000A3B29: 00 C3
000A3B2A: 00 90
000A3B2B: 00 81
000A3B2C: 00 3C
000A3B2D: 00 24
000A3B2E: 00 45
000A3B2F: 00 54
000A3B30: 00 64
000A3B32: 00 75
000A3B33: 00 07
000A3B34: 00 C6
000A3B35: 00 05
000A3B36: 00 EC
000A3B37: 00 A9
000A3B38: 00 52
000A3B3A: 00 C3
000A3B3B: 00 81
000A3B3C: 00 3C
000A3B3D: 00 24
000A3B3E: 00 45
000A3B3F: 00 54
000A3B40: 00 64
000A3B42: 00 75
000A3B43: 00 07
000A3B44: 00 C6
000A3B45: 00 05
000A3B46: 00 A8
000A3B47: 00 28
000A3B48: 00 53
000A3B4A: 00 C3
000A3B4B: 00 81
000A3B4C: 00 3C
000A3B4D: 00 24
000A3B4E: 00 45
000A3B4F: 00 54
000A3B50: 00 64
000A3B52: 00 75
000A3B53: 00 07
000A3B54: 00 C6
000A3B55: 00 05
000A3B56: 00 A5
000A3B57: 00 29
000A3B58: 00 53
000A3B5A: 00 EB
000A3B5B: 00 81
000A3B5C: 00 3C
000A3B5D: 00 24
000A3B5E: 00 45
000A3B5F: 00 54
000A3B60: 00 64
000A3B62: 00 75
000A3B63: 00 0A
000A3B64: 00 C7
000A3B65: 00 05
000A3B66: 00 0E
000A3B67: 00 2A
000A3B68: 00 53
000A3B6A: 00 90
000A3B6B: 00 90
000A3B6C: 00 90
000A3B6D: 00 90
000A3B6E: 00 81
000A3B6F: 00 3C
000A3B70: 00 24
000A3B71: 00 45
000A3B72: 00 54
000A3B73: 00 64
000A3B75: 00 75
000A3B76: 00 0A
000A3B77: 00 C7
000A3B78: 00 05
000A3B79: 00 12
000A3B7A: 00 2A
000A3B7B: 00 53
000A3B7D: 00 90
000A3B7E: 00 90
000A3B7F: 00 90
000A3B80: 00 90
000A3B81: 00 81
000A3B82: 00 3C
000A3B83: 00 24
000A3B84: 00 45
000A3B85: 00 54
000A3B86: 00 64
000A3B88: 00 75
000A3B89: 00 09
000A3B8A: 00 66
000A3B8B: 00 C7
000A3B8C: 00 05
000A3B8D: 00 16
000A3B8E: 00 2A
000A3B8F: 00 53
000A3B91: 00 90
000A3B92: 00 90
000A3B93: 00 81
000A3B94: 00 3C
000A3B95: 00 24
000A3B96: 00 45
000A3B97: 00 54
000A3B98: 00 64
000A3B9A: 00 75
000A3B9B: 00 07
000A3B9C: 00 C6
000A3B9D: 00 05
000A3B9E: 00 18
000A3B9F: 00 C4
000A3BA0: 00 51
000A3BA2: 00 C3
000A3BA3: 00 81
000A3BA4: 00 3C
000A3BA5: 00 24
000A3BA6: 00 45
000A3BA7: 00 54
000A3BA8: 00 64
000A3BAA: 00 75
000A3BAB: 00 07
000A3BAC: 00 C6
000A3BAD: 00 05
000A3BAE: 00 37
000A3BAF: 00 2A
000A3BB0: 00 53
000A3BB2: 00 EB
000A3BB3: 00 81
000A3BB4: 00 3C
000A3BB5: 00 24
000A3BB6: 00 45
000A3BB7: 00 54
000A3BB8: 00 64
000A3BBA: 00 75
000A3BBB: 00 0A
000A3BBC: 00 C7
000A3BBD: 00 05
000A3BBE: 00 69
000A3BBF: 00 2A
000A3BC0: 00 53
000A3BC2: 00 E9
000A3BC3: 00 EA
000A3BC4: 00 05
000A3BC6: 00 81
000A3BC7: 00 3C
000A3BC8: 00 24
000A3BC9: 00 45
000A3BCA: 00 54
000A3BCB: 00 64
000A3BCD: 00 75
000A3BCE: 00 0A
000A3BCF: 00 C7
000A3BD0: 00 05
000A3BD1: 00 6D
000A3BD2: 00 2A
000A3BD3: 00 53
000A3BD6: 00 90
000A3BD7: 00 90
000A3BD8: 00 90
000A3BD9: 00 81
000A3BDA: 00 3C
000A3BDB: 00 24
000A3BDC: 00 45
000A3BDD: 00 54
000A3BDE: 00 64
000A3BE0: 00 75
000A3BE1: 00 09
000A3BE2: 00 66
000A3BE3: 00 C7
000A3BE4: 00 05
000A3BE5: 00 5F
000A3BE6: 00 30
000A3BE7: 00 53
000A3BE9: 00 90
000A3BEA: 00 90
000A3BEB: 00 81
000A3BEC: 00 3C
000A3BED: 00 24
000A3BEE: 00 45
000A3BEF: 00 54
000A3BF0: 00 64
000A3BF2: 00 75
000A3BF3: 00 07
000A3BF4: 00 C6
000A3BF5: 00 05
000A3BF6: 00 69
000A3BF7: 00 30
000A3BF8: 00 53
000A3BFA: 00 EB
000A3BFB: 00 FF
000A3BFC: 00 25
000A3BFD: 00 D2
000A3BFE: 00 62
000A3BFF: 00 64

Вот собственно и все! :)

Endnote:
© 2001 aSL!( aslsoft@null.ru )
This essay can be freely distributed/ published/ printed etc... as long as no modifications are made in any way.
Greets to: Everyone in UOFG\


<= Вернуться к статьям


Интересно будет почитать:
Про оформление windows xp. Инструкцию для программы можно взять вот здесь. Софт для windows 7
Rambler's Top100