Blog. Just Blog

Исследование защиты программы TopStyle 4

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Скриншот программы TopStyle 4
Скриншот программы TopStyle 4

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

Для работы нам потребуется дистрибутив последней версии 4.0.0.62 и дизассемблер. Устанавливаем, запускаем. Налицо все признаки триальности: надпись "Trial" в заголовке программы, триальные надписи и ссылка на покупку в окне About, сообщения об ограничениях в редакторе и еще целая куча подобных прелестей.

Триальные надписи в окне "О программе"
Триальные надписи в окне "О программе"

Смотрим исполняемый файл. По характерным названиям секций визуально определяем, что он накрыт ASPack. Анализаторы исполняемых файлов это подтверждают.

Файл упакован ASPack
Файл упакован ASPack

Распаковываем его или вручную, или с помощью инструментов типа QuickUnpack или Abstersiver, проверяем работоспособность после распаковки и загоняем в дизассемблер. Файл достаточно большой, так что времени на его полную обработку тоже уйдет немало. Когда дизассемблер закончит работу, начнем поиски "нехороших строк" и ссылающегося на них кода.

"Нехорошая строка"
"Нехорошая строка"

Ссылающийся на строчку код:
  1. ...
  2. .text:008F0E77 loc_8F0E77:
  3. ; Вызов функции проверки регистрации
  4. .text:008F0E77                 call    sub_8F0C3C
  5. .text:008F0E7C                 test    al, al
  6. ; Если она вернула 1, то программа зарегистрирована
  7. .text:008F0E7E                 jnz     short loc_8F0E8D
  8. .text:008F0E80                 lea     eax, [ebp+var_4]
  9. ; Ссылка на строку "trial mode (unregistered)"
  10. .text:008F0E83                 mov     edx, offset aTrialModeUnreg
  11. .text:008F0E88                 call    sub_405A00
  12. .text:008F0E8D
  13. .text:008F0E8D loc_8F0E8D:
  14. .text:008F0E8D                 cmp     [ebp+var_4], 0
  15. ...
Забиваем в начало процедуры по адресу 008F0C3C команды MOV AL,1; RET, запускаем, строка пропала. Но все остальные триальные признаки остались. Поищем другой признак, например, строку "Trial" в заголовке:
  1. ...
  2. ; Вызов функции проверки регистрации
  3. .text:0096FB17                 call    sub_96F968
  4. .text:0096FB1C                 test    al, al
  5. .text:0096FB1E                 jnz     short loc_96FB2D
  6. .text:0096FB20                 lea     eax, [ebp+var_4]
  7. ; Ссылка на строку "Trial"
  8. .text:0096FB23                 mov     edx, offset aTrial ; " Trial"
  9. .text:0096FB28                 call    sub_405C60
  10. .text:0096FB2D loc_96FB2D:
  11. .text:0096FB2D                 mov     eax, ebx
  12. .text:0096FB2F                 call    sub_9749F0
  13. .text:0096FB34                 test    eax, eax
  14. ...
Смотрим процедуру по адресу 0096F968 и видим, что она точно такая же! Не та же, а точно такая же. Пропатчиваем ее таким же образом, надпись в заголовке пропала. Попробуем теперь поискать по сигнатуре все аналогичные процедуры проверки. Сразу скажу, что их будет около полутора десятков, в этом плане автор явно большой шутник. Запускаем и видим, что внешние триальные признаки пропали, но через секунду после открытия главного окна появляется сообщение "TopStyle failed a data integrity check, which means either that an error occurred while downloading or that the EXE has been tampered with. Please download this program again." и программа закрывается. Значит еще присутствует проверка целостности кода. Давайте поищем ее. Строка сообщения об ошибке содержится в ресурсах с индексом 0FCEFh, а ссылающийся код сделан в виде такой конструкции:
  1. .text:00581E70 off_581E70      dd offset hInstance
  2. .text:00581E74                 dd 0FCEFh ; <-- наш индекс
В свою очередь на эту конструкцию ссылается указатель в сегменте данных:
  1. .data:009E8764 off_9E8764      dd offset off_581E70
А вот на этот указатель ссылается уже 5 процедур, и снова все они однотипные:
  1. .text:00972E44                 push    ebp
  2. .text:00972E45                 mov     ebp, esp
  3. .text:00972E47                 xor     ecx, ecx
  4. .text:00972E49                 push    ecx
  5. .text:00972E4A                 push    ecx
  6. .text:00972E4B                 push    ecx
  7. .text:00972E4C                 push    ecx
  8. .text:00972E4D                 push    ecx
  9. .text:00972E4E                 push    ecx
  10. .text:00972E4F                 push    ebx
  11. .text:00972E50                 mov     ebx, eax
  12. .text:00972E52                 xor     eax, eax
  13. .text:00972E54                 push    ebp
  14. .text:00972E55                 push    offset loc_972EFD
  15. .text:00972E5A                 push    dword ptr fs:[eax]
  16. .text:00972E5D                 mov     fs:[eax], esp
  17. .text:00972E60                 push    ebx
  18. .text:00972E61                 lea     edx, [ebp+var_4]
  19. ; Здесь выводится окно с сообщением о нарушении целостности, после этого
  20. ; программа закрывается
  21. .text:00972E64                 mov     eax, off_9E8764
  22. .text:00972E69                 call    sub_408254
  23. .text:00972E6E                 mov     eax, [ebp+var_4]
  24. .text:00972E71                 push    eax
  25. .text:00972E72                 lea     eax, [ebp+var_10]
  26. .text:00972E75                 call    sub_9AF3E0
  27. .text:00972E7A                 mov     eax, [ebp+var_10]
  28. .text:00972E7D                 mov     [ebp+var_C], eax
  29. .text:00972E80                 mov     [ebp+var_8], 0Bh
  30. .text:00972E84                 lea     edx, [ebp+var_C]
  31. .text:00972E87                 xor     ecx, ecx
  32. .text:00972E89                 pop     eax
  33. .text:00972E8A                 call    sub_40F35C
  34. .text:00972E8F                 push    10h
  35. .text:00972E91                 lea     eax, [ebp+var_18]
  36. .text:00972E94                 call    sub_9AF390
  37. .text:00972E99                 mov     eax, [ebp+var_18]
  38. .text:00972E9C                 lea     edx, [ebp+var_14]
  39. .text:00972E9F                 call    sub_40E3A4
  40. .text:00972EA4                 mov     eax, [ebp+var_14]
  41. .text:00972EA7                 call    sub_405E24
  42. .text:00972EAC                 push    eax
  43. .text:00972EAD                 mov     eax, [ebx]
  44. .text:00972EAF                 call    sub_405E24
  45. .text:00972EB4                 mov     edx, eax
  46. .text:00972EB6                 mov     eax, off_9E8518
  47. .text:00972EBB                 mov     eax, [eax]
  48. .text:00972EBD                 pop     ecx
  49. .text:00972EBE                 call    sub_4E86E0
  50. .text:00972EC3                 mov     eax, off_9E70DC
  51. .text:00972EC8                 mov     dword ptr [eax], 17h
  52. .text:00972ECE                 mov     eax, off_9E8518
  53. .text:00972ED3                 mov     eax, [eax]
  54. .text:00972ED5                 call    sub_4E85E0
  55. .text:00972EDA                 xor     eax, eax
  56. .text:00972EDC                 pop     edx
  57. .text:00972EDD                 pop     ecx
  58. .text:00972EDE                 pop     ecx
  59. .text:00972EDF                 mov     fs:[eax], edx
  60. .text:00972EE2                 push    offset loc_972F04
  61. .text:00972EE7 loc_972EE7:
  62. .text:00972EE7                 lea     eax, [ebp+var_18]
  63. .text:00972EEA                 mov     edx, 3
  64. .text:00972EEF                 call    sub_40598C
  65. .text:00972EF4                 lea     eax, [ebp+var_4]
  66. .text:00972EF7                 call    sub_405968
  67. .text:00972EFC                 retn
  68. .text:00972EFD loc_972EFD:
  69. .text:00972EFD                 jmp     loc_4050F8
  70. .text:00972F02                 jmp     short loc_972EE7
  71. .text:00972F04 loc_972F04:
  72. .text:00972F04                 pop     ebx
  73. .text:00972F05                 mov     esp, ebp
  74. .text:00972F07                 pop     ebp
  75. .text:00972F08                 retn
Уже зная повадки автора, можно предположить, что и здесь все было сделано простым копированием исходников. А поскольку процедура не содержит условных переходов и просто выводит окно с сообщением, то надо смотреть код, который ее вызывает.
  1. ...
  2. ; Тут какая-то движуха с вычислениями с плавающей запятой
  3. .text:00972FB2                 call    sub_48AEE8
  4. .text:00972FB7                 fstp    [ebp+var_10]
  5. .text:00972FBA                 wait
  6. .text:00972FBB                 push    dword ptr [ebp+var_10+4]
  7. .text:00972FBE                 push    dword ptr [ebp+var_10] ; double
  8. .text:00972FC1                 call    sub_410F28
  9. .text:00972FC6                 add     esp, 0FFFFFFF8h
  10. .text:00972FC9                 fstp    [esp+74h+var_74]
  11. .text:00972FCC                 wait
  12. ; Какая-то функция проверки
  13. .text:00972FCD                 call    sub_8856EC
  14. .text:00972FD2                 cmp     eax, 3
  15. ; Этот условный переход надо пропатчить на безусловный
  16. .text:00972FD5                 jl      short loc_97300B
  17. ; Этот код выполняется, когда проверка целостности не пройдена
  18. .text:00972FD7                 mov     [ebp+var_1], 1
  19. .text:00972FDB                 lea     eax, [ebp+var_18]
  20. ; Вызвать окно с сообщением об ошибке
  21. .text:00972FDE                 call    sub_972E44
  22. .text:00972FE3                 lea     eax, [ebp+var_28]
  23. .text:00972FE6                 mov     dl, 1
  24. .text:00972FE8                 call    sub_41B710
  25. .text:00972FED                 lea     edx, [ebp+var_28]
  26. ...
По очереди смотрим все участки кода и заменяем условные переходы, которые предшествуют вызовам сообщений об ошибке целостности. Таких участков будет пять. Сохраняем изменения, запускаем. Все работает как часы. Ну а про CSS и прочий web-мастеринг можно почитать в другом разделе блога.

Abstersiver 1.13 by PE_KillAbstersiver 1.13 by PE_Kill

Abstersiver.1.13.zip (192,727 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 6429 | Комментариев: 13

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (15.07.2013 в 08:20):
В плане защиты 5-я линейка ничем не отличается от 4-й. Точно так же патчится больше десятка одинаковых функций проверки и на этом все. Я даже нарисовал для себя универсальный патч, который работал на 4-й и продолжает работать на 5-й версии.
brute (15.07.2013 в 07:06):
Отладка новых версий осложняется тем, что нет сообщения о неправильном ключе. Пропатчил переходы в трех местах, убрал наг-скрин (ввод пароля) и триальный функционал. Осталасть строка о триальности в строке состояния - удалил её из ресурсов. Вроде работает, но "осадочек" остался - в about пишет о триале и не удалось отлавить проверку правильного ключа..
ManHunter (22.11.2010 в 18:46):
Новые версии ничем не запакованы и в них нет проверки целостности, оставлена только регистрация. К чему бы это?
ManHunter (13.05.2010 в 07:56):
На руборде посмотри, там версия не самая последняя, но точно рабочая.
Артем (13.05.2010 в 07:40):
ManHunter, можно ли получить работающий пропатченый файл? Я бы и официальный купил, рублей за 300 :) Яндекс.деньги есть, могу скинуть на телефон. artem_собака_kulikov.ru
Буду очень признателен.
ManHunter (24.07.2009 в 23:20):
Варезная IDA 5.2, более новые на паблик не утекали. А как патчить, так я тут даже не знаю что объяснять. У hiew очень подробная документация на русском языке, основные доступные клавиши подсвечены в меню.
Gunter (24.07.2009 в 21:15):
ManHunter
А какая версия у вас ИДЫ?
И можно было бы пару статей именно по патчингу чтоб от нахождения до патча, так сказать весь цыкл производства ))
ManHunter (23.07.2009 в 14:43):
Gunter, я в HIEW обычно патчу, там удобнее.
Gunter (23.07.2009 в 01:05):
Уважаемый ManHunter, супер статьи, читаю все с большим интересом.
Но могли бы вы написать хотя бы в одной, как нужно патчить, а то увы в этом не силен, это делается прямо в IDA или другими способами?
ManHunter (21.07.2009 в 14:30):
hexbear, это распаковщик ASPack от PE_Kill. Прицепил в аттаче.
SAY, поправил, спасибо.
hexbear (21.07.2009 в 11:46):
Abstersiver - это что такое и где его найти?
SAY (20.07.2009 в 12:26):
P.S. "ссылающийся код в сделан виде такой конструкции:"
Может: ссылающийся код сделан в виде такой конструкции:?
SAY (20.07.2009 в 12:25):
ManHunter, а есть ли такая проверка целостности в природе, которую НУ ОЧЕНЬ трудно обойти?

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0067 сек.) / Память: 4.5 Mb
Наверх