Исследование защиты программы Macrorit Disk Scanner
Скриншот программы Macrorit Disk Scanner
Macrorit Disk Scanner - программа для сканирования дисков на предмет наличия битых секторов. Программы такого назначения имели место во времена MS-DOS, когда надо было проверить дискеты на целостность, что-то такое даже было в пакете Norton Utilities. Сейчас же, во времена S.M.A.R.T. и SSD, сканировать диски по секторам как минимум странно, а еще более странно требовать за это деньги.
Забираем с офсайта дистрибутив максимальной версии, распаковываем, смотрим. Версия портативная, устанавливать ничего не надо.
Сообщение о неправильной регистрации
В заголовке надпись "UNREGISTERED", в интерфейсе кнопки активации, при попытке ввода левого серийника программа реагирует следующим сообщением. Исходных данных полно, я начну со строки о неправильной регистрации.
Строка сообщения в ресурсах
Строка сообщения обнаруживается в ресурсах под индексом 64831 или 0FD3Fh, если в шестнадцатеричной системе счисления. Вы ведь уже без напоминания отправили исполняемый файл в дизассемблер? Молодцы, теперь поищем в листинге этот индекс и все, что его касается.
Code (Assembler) : Убрать нумерацию
- .text:0076F820 dd 0FD3Fh
- .text:0076F824 off_76F824 dd offset hInstance
Code (Assembler) : Убрать нумерацию
- .data:00984654 off_984654 dd offset off_76F824
Code (Assembler) : Убрать нумерацию
- .text:0094A094 sub_94A094 proc near
- .text:0094A094 var_4 = dword ptr -4
- .text:0094A094 arg_0 = dword ptr 8
- .text:0094A094
- .text:0094A094 push ebp
- .text:0094A095 mov ebp, esp
- .text:0094A097 push 0
- .text:0094A099 xor eax, eax
- .text:0094A09B push ebp
- .text:0094A09C push offset loc_94A0F5
- .text:0094A0A1 push dword ptr fs:[eax]
- .text:0094A0A4 mov fs:[eax], esp
- .text:0094A0A7 push 2
- .text:0094A0A9 push 2
- .text:0094A0AB push 0
- .text:0094A0AD lea edx, [ebp+var_4]
- ; Загрузить строку из ресурсов и вывести сообщение
- .text:0094A0B0 mov eax, off_984654
- .text:0094A0B5 call sub_40DD88
- .text:0094A0BA mov eax, [ebp+var_4]
- .text:0094A0BD movzx ecx, ds:word_94A100
- .text:0094A0C4 mov dl, 1
- .text:0094A0C6 call sub_8058A4
- .text:0094A0CB mov eax, [ebp+arg_0]
- .text:0094A0CE mov eax, [eax-4]
- .text:0094A0D1 mov eax, [eax+3E0h]
- .text:0094A0D7 mov edx, [eax]
- .text:0094A0D9 call dword ptr [edx+0FCh]
- ...
Code (Assembler) : Убрать нумерацию
- .text:0094A2CB jnz short loc_94A303
- ; Вызвать функцию проверки
- .text:0094A2CD call sub_807414
- ; Если она вернула AL не равное 3, то все нормально
- .text:0094A2D2 cmp al, 3
- .text:0094A2D4 jnz short loc_94A2DD
- .text:0094A2D6 push ebp
- ; Вывести сообщение о неправильной регистрации
- .text:0094A2D7 call sub_94A094
- .text:0094A2DC pop ecx
Code (Assembler) : Убрать нумерацию
- .text:00807414 sub_807414 proc near
- .text:00807414 push ebp
- .text:00807415 mov ebp, esp
- .text:00807417 mov ecx, 4Ch
- .text:0080741C loc_80741C:
- .text:0080741C push 0
- .text:0080741E push 0
- .text:00807420 dec ecx
- .text:00807421 jnz short loc_80741C
- .text:00807423 push ecx
- .text:00807424 push ebx
- .text:00807425 xor eax, eax
- .text:00807427 push ebp
- .text:00807428 push offset loc_8077A6
- .text:0080742D push dword ptr fs:[eax]
- .text:00807430 mov fs:[eax], esp
- .text:00807433 lea eax, [ebp+var_224]
- .text:00807439 call sub_8061F0
- .text:0080743E mov eax, [ebp+var_224]
- .text:00807444 push eax
- .text:00807445 call sub_80659C
- .text:0080744A lea ecx, [ebp+var_220]
- .text:00807450 pop edx
- .text:00807451 call sub_8059E8
- .text:00807456 test al, al
- .text:00807458 jz loc_807747
- .text:0080745E lea eax, [ebp+var_4]
- .text:00807461 lea edx, [ebp+var_218]
- .text:00807467 mov ecx, 104h
- .text:0080746C call sub_40AA9C
- .text:00807471 lea ecx, [ebp+var_8]
- .text:00807474 mov edx, offset aMax_wang ; "max.wang"
- .text:00807479 mov eax, [ebp+var_4]
- .text:0080747C call sub_805DCC
- .text:00807481 lea eax, [ebp+var_228]
- .text:00807487 push eax
- .text:00807488 mov ecx, 2
- .text:0080748D mov edx, 1
- .text:00807492 mov eax, [ebp+var_8]
- .text:00807495 call sub_40ADBC
- .text:0080749A mov eax, [ebp+var_228]
- .text:008074A0 mov edx, offset aTc ; "TC"
- .text:008074A5 call sub_40AD84
- .text:008074AA jnz short loc_8074CE
- .text:008074AC mov ebx, [ebp+var_8]
- .text:008074AF test ebx, ebx
- .text:008074B1 jz short loc_8074B8
- .text:008074B3 sub ebx, 4
- .text:008074B6 mov ebx, [ebx]
- .text:008074B8 loc_8074B8:
- .text:008074B8 lea eax, [ebp+var_8]
- .text:008074BB push eax
- .text:008074BC mov ecx, ebx
- .text:008074BE sub ecx, 8
- .text:008074C1 mov edx, 9
- .text:008074C6 mov eax, [ebp+var_8]
- .text:008074C9 call sub_40ADBC
- .text:008074CE loc_8074CE:
- .text:008074CE lea edx, [ebp+var_22C]
- .text:008074D4 mov eax, offset aProf ; "PROF"
- .text:008074D9 call sub_8066CC
- .text:008074DE mov edx, [ebp+var_22C]
- .text:008074E4 mov eax, [ebp+var_8]
- .text:008074E7 call sub_40AD84
- .text:008074EC jnz short loc_8074F5
- .text:008074EE mov bl, 4
- .text:008074F0 jmp loc_807749
- .text:008074F5 ; ---------------------------------------
- .text:008074F5 loc_8074F5:
- .text:008074F5 lea edx, [ebp+var_230]
- .text:008074FB mov eax, offset aServ ; "SERV"
- .text:00807500 call sub_8066CC
- .text:00807505 mov edx, [ebp+var_230]
- .text:0080750B mov eax, [ebp+var_8]
- .text:0080750E call sub_40AD84
- .text:00807513 jnz short loc_80751C
- .text:00807515 mov bl, 5
- .text:00807517 jmp loc_807749
- .text:0080751C ; ---------------------------------------
- .text:0080751C loc_80751C:
- .text:0080751C lea edx, [ebp+var_234]
- .text:00807522 mov eax, offset aEnte ; "ENTE"
- .text:00807527 call sub_8066CC
- .text:0080752C mov edx, [ebp+var_234]
- .text:00807532 mov eax, [ebp+var_8]
- .text:00807535 call sub_40AD84
- .text:0080753A jnz short loc_807543
- .text:0080753C mov bl, 6
- .text:0080753E jmp loc_807749
- .text:00807543 ; ---------------------------------------
- .text:00807543 loc_807543:
- .text:00807543 lea edx, [ebp+var_238]
- .text:00807549 mov eax, offset aUnlimited ; "UNLIMITED"
- .text:0080754E call sub_8066CC
- .text:00807553 mov edx, [ebp+var_238]
- .text:00807559 mov eax, [ebp+var_8]
- .text:0080755C call sub_40AD84
- .text:00807561 jnz short loc_80756A
- .text:00807563 mov bl, 7
- .text:00807565 jmp loc_807749
- ...
- ...
- ...
- .text:0080767B loc_80767B:
- .text:0080767B lea edx, [ebp+var_258]
- .text:00807681 mov eax, offset aProfb_2 ; "PROFB_2"
- .text:00807686 call sub_8066CC
- .text:0080768B mov edx, [ebp+var_258]
- .text:00807691 mov eax, [ebp+var_8]
- .text:00807694 call sub_40AD84
- .text:00807699 jnz short loc_8076A2
- .text:0080769B mov bl, 0Fh
- .text:0080769D jmp loc_807749
- .text:008076A2 ; ---------------------------------------
- .text:008076A2 loc_8076A2:
- .text:008076A2 lea edx, [ebp+var_25C]
- .text:008076A8 mov eax, offset aServ_2 ; "SERV_2"
- .text:008076AD call sub_8066CC
- .text:008076B2 mov edx, [ebp+var_25C]
- .text:008076B8 mov eax, [ebp+var_8]
- .text:008076BB call sub_40AD84
- .text:008076C0 jnz short loc_8076C9
- .text:008076C2 mov bl, 10h
- .text:008076C4 jmp loc_807749
- .text:008076C9 ; ---------------------------------------
- .text:008076C9 loc_8076C9:
- .text:008076C9 lea edx, [ebp+var_260]
- .text:008076CF mov eax, offset aEnte_2 ; "ENTE_2"
- .text:008076D4 call sub_8066CC
- .text:008076D9 mov edx, [ebp+var_260]
- .text:008076DF mov eax, [ebp+var_8]
- .text:008076E2 call sub_40AD84
- .text:008076E7 jnz short loc_8076ED
- .text:008076E9 mov bl, 11h
- .text:008076EB jmp short loc_807749
- .text:008076ED ; ---------------------------------------
- .text:008076ED loc_8076ED:
- .text:008076ED lea edx, [ebp+var_264]
- .text:008076F3 mov eax, offset a30_d_0 ; "30_D"
- .text:008076F8 call sub_8066CC
- .text:008076FD mov edx, [ebp+var_264]
- .text:00807703 mov eax, [ebp+var_8]
- .text:00807706 call sub_40AD84
- .text:0080770B jnz short loc_807743
- .text:0080770D mov eax, [ebp+var_220]
- .text:00807713 mov dword ptr [ebp+var_10], eax
- .text:00807716 mov eax, [ebp+var_21C]
- .text:0080771C mov dword ptr [ebp+var_10+4], eax
- .text:0080771F call sub_4282D4
- .text:00807724 add esp, 0FFFFFFF8h
- .text:00807727 fstp [esp+27Ch+var_27C] ; double
- .text:0080772A wait
- .text:0080772B push dword ptr [ebp+var_10+4]
- .text:0080772E push dword ptr [ebp+var_10] ; double
- .text:00807731 call sub_4F7444
- .text:00807736 cmp eax, 1Eh
- .text:00807739 jg short loc_80773F
- .text:0080773B mov bl, 2
- .text:0080773D jmp short loc_807749
- .text:0080773F ; ---------------------------------------
- .text:0080773F loc_80773F:
- ; Некорректные регистрационные данные
- .text:0080773F mov bl, 3
- .text:00807741 jmp short loc_807749
- .text:00807743 ; ---------------------------------------
- .text:00807743 loc_807743:
- .text:00807743 xor ebx, ebx
- .text:00807745 jmp short loc_807749
- ...
- ...
- ...
- .text:008077AD loc_8077AD:
- ; Записать результат в EAX
- .text:008077AD mov eax, ebx
- .text:008077AF pop ebx
- .text:008077B0 mov esp, ebp
- .text:008077B2 pop ebp
- .text:008077B3 retn
- .text:008077B3 sub_807414 endp
Программа успешно "зарегистрирована"
Кнопки покупки и активации пропали, ограничение на параллельное сканирование дисков больше не появляется, в заголовке главного окна и в окне "О программе" красуется безграничный тип лицензии. Цель достигнута.
Просмотров: 1663 | Комментариев: 18
Метки: исследование защиты, HDD
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
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
Например, поставил "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
Сектора нумеруются, начиная с 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, обойдясь однобайтовым патчем.
Его я и имел в виду.
push 7
pop eax
ret
Ничья ;)
Его я и имел в виду.
push 7
pop eax
ret
Ничья ;)
X-Wing Top Ace
(27.08.2021 в 13:15):
Кстати, сабж не видит флоп, от слова "совсем". Дискету этой прогой не проверишь.
Norton Disk Doctor же! Сокращенно NDD. Есть даже жаргонное словечко "эндэдить", которое и означает "проверять диск на целостность".
В порядке байтового крохоборства занес по адресу .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 в ряде случаев помогает прикинуть, что именно стоит делать дальше.
з.ы. Программа, к слову, весьма сильно так себе. Так и речь была не совсем про одни ее прелести.
Автор (обычно вполне хладнокровный в суждениях) позволил себе слегка неосторожное высказывание, так за это ему тут же было нагажено в комментах.
Если по делу, то маппинг 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
Можно найти её 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, как-то так уж получается.
но программа безобразно диких размеров.
Хранить такое просто противно.
К слову, имею интересную статистику.
Обратил внимание случайно, когда в очередной раз полез по сусекам
искать программу да делфи, чтобы глянуть на стартап-код компилятора.
Так вот - нет у меня в использовании и не захомячено ни одной программы,
написанной на делфи. И на вижуальном басике то же самое.
Только Си и АSM, как-то так уж получается.
qqq
(26.08.2021 в 18:12):
"сканировать диски по секторам как минимум странно"
как минимум странно когда ассемблерщики не шарят в железе :)
харды будут жить еще долго, а битые сектора с ростом объёмов и мудацкими черепичными записями будут всегда, смарт тебе покажет только факт наличия уже в конец убитых секторах, а вот где они(и просто тормозные) находятся покажет только сканер, соответственно их можно вырезать из использования
как минимум странно когда ассемблерщики не шарят в железе :)
харды будут жить еще долго, а битые сектора с ростом объёмов и мудацкими черепичными записями будут всегда, смарт тебе покажет только факт наличия уже в конец убитых секторах, а вот где они(и просто тормозные) находятся покажет только сканер, соответственно их можно вырезать из использования
Добавить комментарий
Заполните форму для добавления комментария
Вот в программе Bart Stuff Test есть опция "проверка физического девайса"
(только для зарегистрированных пользователей) -
так там выполняется ещё и тестирование записью секторов.
И не знаю, чем может при таком тесте обернуться внезапное отключение питания.
Впрочем, если тестировать пустой диск, то ничем страшным тоже не обернётся.