Blog. Just Blog

Исследование защиты программы Macrorit Disk Scanner

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

Macrorit Disk Scanner - программа для сканирования дисков на предмет наличия битых секторов. Программы такого назначения имели место во времена MS-DOS, когда надо было проверить дискеты на целостность, что-то такое даже было в пакете Norton Utilities. Сейчас же, во времена S.M.A.R.T. и SSD, сканировать диски по секторам как минимум странно, а еще более странно требовать за это деньги.

Забираем с офсайта дистрибутив максимальной версии, распаковываем, смотрим. Версия портативная, устанавливать ничего не надо.

Сообщение о неправильной регистрации
Сообщение о неправильной регистрации

В заголовке надпись "UNREGISTERED", в интерфейсе кнопки активации, при попытке ввода левого серийника программа реагирует следующим сообщением. Исходных данных полно, я начну со строки о неправильной регистрации.

Строка сообщения в ресурсах
Строка сообщения в ресурсах

Строка сообщения обнаруживается в ресурсах под индексом 64831 или 0FD3Fh, если в шестнадцатеричной системе счисления. Вы ведь уже без напоминания отправили исполняемый файл в дизассемблер? Молодцы, теперь поищем в листинге этот индекс и все, что его касается.
  1. .text:0076F820                 dd 0FD3Fh
  2. .text:0076F824 off_76F824      dd offset hInstance
Типичная ресурсная конструкция для Дельфи. По перекрестным ссылкам раскручиваем связки дальше.
  1. .data:00984654 off_984654      dd offset off_76F824
Следующая ссылка на функцию, где строка загружается из ресурсов.
  1. .text:0094A094 sub_94A094      proc near
  2. .text:0094A094 var_4           = dword ptr -4
  3. .text:0094A094 arg_0           = dword ptr  8
  4. .text:0094A094
  5. .text:0094A094                 push    ebp
  6. .text:0094A095                 mov     ebp, esp
  7. .text:0094A097                 push    0
  8. .text:0094A099                 xor     eax, eax
  9. .text:0094A09B                 push    ebp
  10. .text:0094A09C                 push    offset loc_94A0F5
  11. .text:0094A0A1                 push    dword ptr fs:[eax]
  12. .text:0094A0A4                 mov     fs:[eax], esp
  13. .text:0094A0A7                 push    2
  14. .text:0094A0A9                 push    2
  15. .text:0094A0AB                 push    0
  16. .text:0094A0AD                 lea     edx, [ebp+var_4]
  17. ; Загрузить строку из ресурсов и вывести сообщение
  18. .text:0094A0B0                 mov     eax, off_984654
  19. .text:0094A0B5                 call    sub_40DD88
  20. .text:0094A0BA                 mov     eax, [ebp+var_4]
  21. .text:0094A0BD                 movzx   ecx, ds:word_94A100
  22. .text:0094A0C4                 mov     dl, 1
  23. .text:0094A0C6                 call    sub_8058A4
  24. .text:0094A0CB                 mov     eax, [ebp+arg_0]
  25. .text:0094A0CE                 mov     eax, [eax-4]
  26. .text:0094A0D1                 mov     eax, [eax+3E0h]
  27. .text:0094A0D7                 mov     edx, [eax]
  28. .text:0094A0D9                 call    dword ptr [edx+0FCh]
  29. ...
И в итоге выходим на следующий код с условным переходом, который инициирует появление сообщения о неправильной регистрации.
  1. .text:0094A2CB                 jnz     short loc_94A303
  2. ; Вызвать функцию проверки
  3. .text:0094A2CD                 call    sub_807414
  4. ; Если она вернула AL не равное 3, то все нормально
  5. .text:0094A2D2                 cmp     al, 3
  6. .text:0094A2D4                 jnz     short loc_94A2DD
  7. .text:0094A2D6                 push    ebp
  8. ; Вывести сообщение о неправильной регистрации
  9. .text:0094A2D7                 call    sub_94A094
  10. .text:0094A2DC                 pop     ecx
Отлично, теперь мы знаем, что неправильной регистрации соответствует результат 3. Давайте посмотрим на функцию проверки, а точнее на ее результаты, которые соответствуют валидным лицензиям. Часть кода я пропустил для удобочитаемости.
  1. .text:00807414 sub_807414      proc near
  2. .text:00807414                 push    ebp
  3. .text:00807415                 mov     ebp, esp
  4. .text:00807417                 mov     ecx, 4Ch
  5. .text:0080741C loc_80741C:
  6. .text:0080741C                 push    0
  7. .text:0080741E                 push    0
  8. .text:00807420                 dec     ecx
  9. .text:00807421                 jnz     short loc_80741C
  10. .text:00807423                 push    ecx
  11. .text:00807424                 push    ebx
  12. .text:00807425                 xor     eax, eax
  13. .text:00807427                 push    ebp
  14. .text:00807428                 push    offset loc_8077A6
  15. .text:0080742D                 push    dword ptr fs:[eax]
  16. .text:00807430                 mov     fs:[eax], esp
  17. .text:00807433                 lea     eax, [ebp+var_224]
  18. .text:00807439                 call    sub_8061F0
  19. .text:0080743E                 mov     eax, [ebp+var_224]
  20. .text:00807444                 push    eax
  21. .text:00807445                 call    sub_80659C
  22. .text:0080744A                 lea     ecx, [ebp+var_220]
  23. .text:00807450                 pop     edx
  24. .text:00807451                 call    sub_8059E8
  25. .text:00807456                 test    al, al
  26. .text:00807458                 jz      loc_807747
  27. .text:0080745E                 lea     eax, [ebp+var_4]
  28. .text:00807461                 lea     edx, [ebp+var_218]
  29. .text:00807467                 mov     ecx, 104h
  30. .text:0080746C                 call    sub_40AA9C
  31. .text:00807471                 lea     ecx, [ebp+var_8]
  32. .text:00807474                 mov     edx, offset aMax_wang ; "max.wang"
  33. .text:00807479                 mov     eax, [ebp+var_4]
  34. .text:0080747C                 call    sub_805DCC
  35. .text:00807481                 lea     eax, [ebp+var_228]
  36. .text:00807487                 push    eax
  37. .text:00807488                 mov     ecx, 2
  38. .text:0080748D                 mov     edx, 1
  39. .text:00807492                 mov     eax, [ebp+var_8]
  40. .text:00807495                 call    sub_40ADBC
  41. .text:0080749A                 mov     eax, [ebp+var_228]
  42. .text:008074A0                 mov     edx, offset aTc ; "TC"
  43. .text:008074A5                 call    sub_40AD84
  44. .text:008074AA                 jnz     short loc_8074CE
  45. .text:008074AC                 mov     ebx, [ebp+var_8]
  46. .text:008074AF                 test    ebx, ebx
  47. .text:008074B1                 jz      short loc_8074B8
  48. .text:008074B3                 sub     ebx, 4
  49. .text:008074B6                 mov     ebx, [ebx]
  50. .text:008074B8 loc_8074B8:
  51. .text:008074B8                 lea     eax, [ebp+var_8]
  52. .text:008074BB                 push    eax
  53. .text:008074BC                 mov     ecx, ebx
  54. .text:008074BE                 sub     ecx, 8
  55. .text:008074C1                 mov     edx, 9
  56. .text:008074C6                 mov     eax, [ebp+var_8]
  57. .text:008074C9                 call    sub_40ADBC
  58. .text:008074CE loc_8074CE:
  59. .text:008074CE                 lea     edx, [ebp+var_22C]
  60. .text:008074D4                 mov     eax, offset aProf ; "PROF"
  61. .text:008074D9                 call    sub_8066CC
  62. .text:008074DE                 mov     edx, [ebp+var_22C]
  63. .text:008074E4                 mov     eax, [ebp+var_8]
  64. .text:008074E7                 call    sub_40AD84
  65. .text:008074EC                 jnz     short loc_8074F5
  66. .text:008074EE                 mov     bl, 4
  67. .text:008074F0                 jmp     loc_807749
  68. .text:008074F5 ; ---------------------------------------
  69. .text:008074F5 loc_8074F5:
  70. .text:008074F5                 lea     edx, [ebp+var_230]
  71. .text:008074FB                 mov     eax, offset aServ ; "SERV"
  72. .text:00807500                 call    sub_8066CC
  73. .text:00807505                 mov     edx, [ebp+var_230]
  74. .text:0080750B                 mov     eax, [ebp+var_8]
  75. .text:0080750E                 call    sub_40AD84
  76. .text:00807513                 jnz     short loc_80751C
  77. .text:00807515                 mov     bl, 5
  78. .text:00807517                 jmp     loc_807749
  79. .text:0080751C ; ---------------------------------------
  80. .text:0080751C loc_80751C:
  81. .text:0080751C                 lea     edx, [ebp+var_234]
  82. .text:00807522                 mov     eax, offset aEnte ; "ENTE"
  83. .text:00807527                 call    sub_8066CC
  84. .text:0080752C                 mov     edx, [ebp+var_234]
  85. .text:00807532                 mov     eax, [ebp+var_8]
  86. .text:00807535                 call    sub_40AD84
  87. .text:0080753A                 jnz     short loc_807543
  88. .text:0080753C                 mov     bl, 6
  89. .text:0080753E                 jmp     loc_807749
  90. .text:00807543 ; ---------------------------------------
  91. .text:00807543 loc_807543:
  92. .text:00807543                 lea     edx, [ebp+var_238]
  93. .text:00807549                 mov     eax, offset aUnlimited ; "UNLIMITED"
  94. .text:0080754E                 call    sub_8066CC
  95. .text:00807553                 mov     edx, [ebp+var_238]
  96. .text:00807559                 mov     eax, [ebp+var_8]
  97. .text:0080755C                 call    sub_40AD84
  98. .text:00807561                 jnz     short loc_80756A
  99. .text:00807563                 mov     bl, 7
  100. .text:00807565                 jmp     loc_807749
  101. ...
  102. ...
  103. ...
  104. .text:0080767B loc_80767B:
  105. .text:0080767B                 lea     edx, [ebp+var_258]
  106. .text:00807681                 mov     eax, offset aProfb_2 ; "PROFB_2"
  107. .text:00807686                 call    sub_8066CC
  108. .text:0080768B                 mov     edx, [ebp+var_258]
  109. .text:00807691                 mov     eax, [ebp+var_8]
  110. .text:00807694                 call    sub_40AD84
  111. .text:00807699                 jnz     short loc_8076A2
  112. .text:0080769B                 mov     bl, 0Fh
  113. .text:0080769D                 jmp     loc_807749
  114. .text:008076A2 ; ---------------------------------------
  115. .text:008076A2 loc_8076A2:
  116. .text:008076A2                 lea     edx, [ebp+var_25C]
  117. .text:008076A8                 mov     eax, offset aServ_2 ; "SERV_2"
  118. .text:008076AD                 call    sub_8066CC
  119. .text:008076B2                 mov     edx, [ebp+var_25C]
  120. .text:008076B8                 mov     eax, [ebp+var_8]
  121. .text:008076BB                 call    sub_40AD84
  122. .text:008076C0                 jnz     short loc_8076C9
  123. .text:008076C2                 mov     bl, 10h
  124. .text:008076C4                 jmp     loc_807749
  125. .text:008076C9 ; ---------------------------------------
  126. .text:008076C9 loc_8076C9:
  127. .text:008076C9                 lea     edx, [ebp+var_260]
  128. .text:008076CF                 mov     eax, offset aEnte_2 ; "ENTE_2"
  129. .text:008076D4                 call    sub_8066CC
  130. .text:008076D9                 mov     edx, [ebp+var_260]
  131. .text:008076DF                 mov     eax, [ebp+var_8]
  132. .text:008076E2                 call    sub_40AD84
  133. .text:008076E7                 jnz     short loc_8076ED
  134. .text:008076E9                 mov     bl, 11h
  135. .text:008076EB                 jmp     short loc_807749
  136. .text:008076ED ; ---------------------------------------
  137. .text:008076ED loc_8076ED:
  138. .text:008076ED                 lea     edx, [ebp+var_264]
  139. .text:008076F3                 mov     eax, offset a30_d_0 ; "30_D"
  140. .text:008076F8                 call    sub_8066CC
  141. .text:008076FD                 mov     edx, [ebp+var_264]
  142. .text:00807703                 mov     eax, [ebp+var_8]
  143. .text:00807706                 call    sub_40AD84
  144. .text:0080770B                 jnz     short loc_807743
  145. .text:0080770D                 mov     eax, [ebp+var_220]
  146. .text:00807713                 mov     dword ptr [ebp+var_10], eax
  147. .text:00807716                 mov     eax, [ebp+var_21C]
  148. .text:0080771C                 mov     dword ptr [ebp+var_10+4], eax
  149. .text:0080771F                 call    sub_4282D4
  150. .text:00807724                 add     esp, 0FFFFFFF8h
  151. .text:00807727                 fstp    [esp+27Ch+var_27C] ; double
  152. .text:0080772A                 wait
  153. .text:0080772B                 push    dword ptr [ebp+var_10+4]
  154. .text:0080772E                 push    dword ptr [ebp+var_10] ; double
  155. .text:00807731                 call    sub_4F7444
  156. .text:00807736                 cmp     eax, 1Eh
  157. .text:00807739                 jg      short loc_80773F
  158. .text:0080773B                 mov     bl, 2
  159. .text:0080773D                 jmp     short loc_807749
  160. .text:0080773F ; ---------------------------------------
  161. .text:0080773F loc_80773F:
  162. ; Некорректные регистрационные данные
  163. .text:0080773F                 mov     bl, 3
  164. .text:00807741                 jmp     short loc_807749
  165. .text:00807743 ; ---------------------------------------
  166. .text:00807743 loc_807743:
  167. .text:00807743                 xor     ebx, ebx
  168. .text:00807745                 jmp     short loc_807749
  169. ...
  170. ...
  171. ...
  172. .text:008077AD loc_8077AD:
  173. ; Записать результат в EAX
  174. .text:008077AD                 mov     eax, ebx
  175. .text:008077AF                 pop     ebx
  176. .text:008077B0                 mov     esp, ebp
  177. .text:008077B2                 pop     ebp
  178. .text:008077B3                 retn
  179. .text:008077B3 sub_807414      endp
В случае корректной регистрации и в зависимости от типа лицензии возвращается значение от 04h до 11h. По фрагментам ключа можно без проблем догадаться, какое значение чему соответствует. Лично мне нравится UNLIMITED. Ну а чо, любить, так сразу королеву, не меньше. Этому типу лицензии соответствует значение 7. Патчим начало функции по адресу 00807414 парой команд MOV EAX,7 и RET. Сохраняем изменения, пробуем.

Программа успешно "зарегистрирована"
Программа успешно "зарегистрирована"

Кнопки покупки и активации пропали, ограничение на параллельное сканирование дисков больше не появляется, в заголовке главного окна и в окне "О программе" красуется безграничный тип лицензии. Цель достигнута.

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

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

Комментарии

Отзывы посетителей сайта о статье
user (29.08.2021 в 18:47):
Да, чтение не опасно.
Вот в программе Bart Stuff Test есть опция "проверка физического девайса"
(только для зарегистрированных пользователей) -
так там выполняется ещё и тестирование записью секторов.
И не знаю, чем может при таком тесте обернуться внезапное отключение питания.
Впрочем, если тестировать пустой диск, то ничем страшным тоже не обернётся.
ManHunter (28.08.2021 в 11:49):
А что опасного-то? Обычное чтение всего диска по секторам.
newfuck (28.08.2021 в 09:30):
Такие проги не опасно запускать?
Например, поставил "Western Digital Data Lifeguard Diagnostic", запустил и услышал страшные звуки своего велоцераптора, тут же срочно выключил, тем более, что весь смарт зелёный:
https://support.wdc.com/downlo...?p=3&lang=en
user (27.08.2021 в 19:54):
По поводу "нулевого сектора" загрузочной дискеты.

Сектора нумеруются, начиная с 1. С ноля же нумеруются цилиндры, или дорожки.

Были в своё время такие тулзы DISKREST и форматтер MDF
- они переразмечали 0-ю дорожку так, чтобы первый сектор оказался в числе годных.
Из моих близко сотни дискет все были такие, с переразмеченной нулевой дорожкой, и отформатированы как загрузочные, даже если и без системных файлов.

С этими дискетами была связана история, как я в конце 90-х отказался напрочь от Linux'а и больше к нему уже не возвращался.

А поставил я себе тогда RedHat 4.0 (Kernel v.2.0),
ужаснулся многим вещам, но меня успокоили - ты шо, линукс это круто и за ним будущее. Ну, ок, давай же я читать в нём свои дискетки.
А они не читаются, ни одна.
Ок, стал пытаться их переформатировать - тоже ни одна не форматируется,
- сообщают мне, что бэд трак 0 и досвидос.
Так я и так знаю, что бэд трак - мне отформатировать надо. А нет.

Как же ж так, говорю, самая крутая система, а дискеты не читает и не форматирует?
А мне говорят - так пользуйся нормальными дискетами, а эти свои выкинь.

По итогу выкинул я как раз линупс, а дискетки продолжали служить.
Пару лет назад даже некоторые проверял - читались, под WinXP
X-Wing Top Ace (27.08.2021 в 16:59):
Цитатаобойдясь однобайтовым патчем

Изящно. Не подумал, хотя сам делал и такие подмены.

Но там рутины чекушки рега были гораздо менее накрученными и запутанными. А здесь куча проверок, среди которых могут быть и обходы этой команды - если не по умыслу копираста, то из-за бага. Ну вот боюсь. ;)

ЦитатаНичья ;)

Да нет, вы меня обставили - ваш вариант с пересылкой через стек на 1 байт меньше моего с обнулением. Проверено вбиванием в HIEW'е.
ManHunter (27.08.2021 в 13:38):
X-Wing Top Ace, если уж совсем крохобайтствовать, то в результате проверяется только AL, при патче начала можно обойтись без обнуления EAX. Или же вообще заменить в коде проверки результат .text:0080773F MOV BL,3 на MOV BL,7, обойдясь однобайтовым патчем.

ЦитатаNorton Disk Doctor же! Сокращенно NDD.

Его я и имел в виду.

push 7
pop eax
ret

Ничья ;)
X-Wing Top Ace (27.08.2021 в 13:15):
ЦитатаПрограммы такого назначения имели место во времена MS-DOS, когда надо было проверить дискеты на целостность

Кстати, сабж не видит флоп, от слова "совсем". Дискету этой прогой не проверишь.

Цитатачто-то такое даже было в пакете Norton Utilities

Norton Disk Doctor же! Сокращенно NDD. Есть даже жаргонное словечко "эндэдить", которое и означает "проверять диск на целостность".

Цитатапарой команд MOV EAX,7 и RET

В порядке байтового крохоборства занес по адресу .807414 аналог:

xor eax, eax
mov al, 7
ret

Урряя, у меня на один байт меньше, чем у вас! ;)
ManHunter (27.08.2021 в 07:55):
ЦитатаСпор остроконечников и тупоконечников :)

Больше срАчей хороших и разных :))
User (27.08.2021 в 03:40):
статья интересна для новичков, с точки зрения подхода к взлому. ManHunter, может быть следующую статью сделаешь в чуть более расширенном виде? Ну т.е. буквально, со скринами от ида. Может быть даже короткий видео-урок: видим это значение, вот так ищем его в ида, вот так проходим по ссылкам, вот так патчим. По сути, можно сделать это один раз и в следующих статьях уже делать ссылку на базовый урок.
Что касается софта: не плохим вариантом считаю проход по новому винту Викторией, в режиме записи. Это не очень долго даже для терабайтников, но даёт вполне наглядную информацию, как будет работать железо, чего от него ждать и стоит ли в следующий раз покупать эту модель.
И, да, ремап на современных жестких при помощи Виктории и прочего ПО бесполезен. Если не прав, поправьте
rtfm (27.08.2021 в 01:38):
Спор остроконечников и тупоконечников :)
Автор (обычно вполне хладнокровный в суждениях) позволил себе слегка неосторожное высказывание, так за это ему тут же было нагажено в комментах.

Если по делу, то маппинг lba-to-file в ряде случаев помогает прикинуть, что именно стоит делать дальше. 

з.ы. Программа, к слову, весьма сильно так себе. Так и речь была не совсем про одни ее прелести.
ManHunter (26.08.2021 в 22:32):
Имхо, если винт начинает хоть как-то брыкаться - на кол такой винт. После того, как я вложился в охулион килорублей для восстановления моей музыкальной коллекции на станке в специализированном сервис-центре, я придерживаюсь именно такого мнения.
Борменталь (26.08.2021 в 22:23):
По поводу битых секторов - в MHDD и виктории имеется возможность ремапа, т.е. если сбой софтовый сектор можно восстановить. Был такой случай диск попилен пополам, в результате сбоя нет доступа не к одному из разделов. Софтом данные выдернул, после прогнал mhhd-ой, отремапил и получил диск с рабочими разделами.
ManHunter (26.08.2021 в 22:06):
Цитатасмарт тебе покажет только факт наличия уже в конец убитых секторах, а вот где они(и просто тормозные) находятся покажет только сканер

Насколько мне позволяют мои познания в железе, микроконтроллер винта самостоятельно переносит битые сектора и помечает их для дальнейшего неиспользования. А если винт начинает тормозить и неконтролируемо плодить битые сектора, значит единственное решение - это срочный перенос всех данных и утилизация харда. И сведения, где находятся битые сектора, в этой ситуации помогут примерно никак. По крайней мере за все мои десятилетия работы с компами это утверждение я считаю справедливым. Такое знание было полезно лет двадцать пять назад с дискетами, чтобы узнать, не убит ли нулевой сектор и можно ли дискету заюзать в качестве загрузочной.
ЗЫ. Про итальянский 800 и PU_1700 от Юрия Панкова в курсе.
user (26.08.2021 в 21:25):
.. Симпатично выглядит программа Bart's Stuff Test v.5.14.
Можно найти её Free Edition, но она довольно просто патчится в Pro.

Обзор софта для тестирования HDD здесь:
https://www.lifewire.com/free-...rams-2626183
user (26.08.2021 в 20:36):
Функционал программы, отнесённый к её размеру, это своеобразный КПД софта.
Что касается упомянутой программы для диагностики авто, мне трудно оценить её функциональность и нужность для меня.
Тут уж тебе виднее.

) А насчёт прошедших времян кб и мб, это особенно смешно звучит на этом блоге.
Борменталь (26.08.2021 в 20:27):
ЦитатаТа оно бы, может, и полезно было бы такое захомячить,
но программа безобразно диких размеров.


Вы их на дисках 5,25 чтоле хомячите?
У меня десяток прог заныкано по диагностике авто. Сама жирная митчел занимает более 100Гб, времена кб и мб помоему давно уже прошло.
user (26.08.2021 в 18:55):
Та оно бы, может, и полезно было бы такое захомячить,
но программа безобразно диких размеров.
Хранить такое просто противно.

К слову, имею интересную статистику.
Обратил внимание случайно, когда в очередной раз полез по сусекам
искать программу да делфи, чтобы глянуть на стартап-код компилятора.
Так вот - нет у меня в использовании и не захомячено ни одной программы,
написанной на делфи. И на вижуальном басике то же самое.
Только Си и АSM, как-то так уж получается.
qqq (26.08.2021 в 18:12):
"сканировать диски по секторам как минимум странно"
как минимум странно когда ассемблерщики не шарят в железе :)
харды будут жить еще долго, а битые сектора с ростом объёмов и мудацкими черепичными записями будут всегда, смарт тебе покажет только факт наличия уже в конец убитых секторах, а вот где они(и просто тормозные) находятся покажет только сканер, соответственно их можно вырезать из использования

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

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

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