Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Исследование RegSnap v 2.8

Оформил: DeeCo
Автор: http://www.cracklab.narod.ru

Захотелось мне как-то поисследовать программку на VB :)
и напоролся я на эту вот вешь. Она умеет делать снапшоты регистра форточек и чего-то там ещё, вобщем неважно. Приступим...

Первым делом я поглядел на программку:
1) Огромный NAG при старте с некоторой задержкой при запуске;
2) Напоминательное окно с 3 батонами;
3) Проверка CRC (на изменение кода программы);
4) во-всю юзает (M)ada(F)u(C)ka(42).dll;

Начнём с конца, т.е. отключим проверку CRC:
- Любым HEX-редактором изменим пару байт в программе и запустим её:
мы увидим сообщение "Program corupted" (messagebox)
- Ставим бряк на messageboxA:
bpx MessageboxA
и опять запускаем прогу, при этом мы вывалимся где-то в системной библиотеке, а чтобы из неё выйти и опять попасть в модуль regsnap нужно нажать F12 4 раза, и когда мы это сделаем, то окажемся вот в этом месте:
:00406848 FF1588774100            Call dword ptr [00417788] <--вызов процедуры проверки CRC (в eax 0, если CRC нарушен и 1 - если всё ОК).
:0040684E A1F4494200              mov eax, dword ptr [004249F4]
:00406853 83C408                  add esp, 00000008
:00406856 3BC7                    cmp eax, edi <-- проверяем EAX
:00406858 7520                    jne 0040687A <-- ЕСЛИ всё ОК - прыгаем
:0040685A 6AFF                    push FFFFFFFF
:0040685C 57                      push edi
:00406862 E8DBDA0000              Call 00414342 <-- Вызов сообщения о нарушенном CRC
:00406867 33C0                    xor eax, eax <-- вот тут мы остановились
:00406869 8B4DF4                  mov ecx, dword ptr [ebp-0C]
:0040686C 64890D00000000          mov dword ptr fs:[00000000], ecx
:00406873 5F                      pop edi
:00406874 5E                      pop esi
:00406875 5B                      pop ebx
:00406876 8BE5                    mov esp, ebp
:00406878 5D                      pop ebp
:00406879 C3                      ret
Как видите, по адресу 00406856 проверяют EAX, я предлягаю записать вместо этой команды mov eax,01 чтоюы для последующих проверок, если такие будут, всё было нормально, а вместо команды jne 0040687A вписать jmp 0040687A, чтобы в любом случае перепрыгивать ненужное окно и процедуру закрытия программы. ВНИМАНИЕ!!! команда mov eax,01 сожрёт 5 байт, в то время как cmp eax, edi всего 2 байта, поэтому будет использованы байты, выделенные под процедуру вывода сообщения об ошибке и процедуры закрытия программы, всё равно ведь мы эту процедуру перепрыгиваем и больше никогда использовать не будем!!! Итак, если вы всё сделали как я сказал, то больше программа не будет ругаться на то, что её кто-то изменял.
И ещё, в программе реализован полиморфизм, т.е. при обнаружении CRC ошибки, она сама затирает некоторые куски кода другими опкодами, что делает все краки нерабочими, поэтому при внесении изменений, рекомендую делать эти изменения в абсолютно "чистой" версии regsnap.exe.

2)Лирическое отступление:
Программа записывает в реестре в ключе:
HKEY_CURRENT_USER\Software\Vitas\regsnap\main
в параметре количество дней оставшегося триала. Для начала уберём Огромный NAG-screen при запуске:
- ставим бряк на CreateWindowExA
- запускаем прогу и почти сразу вываливаемся в айсе
- Жмём F12 ровно 12 раз (какое совпадение :) пока не вернёмся в модуль regsnap.exe и оказываемся тут:
:0040687A E893DD0000              Call 00414612 <-- проверяет наличие OLE
:0040687F 85C0                    test eax, eax
:00406881 751D                    jne 004068A0 <-- если нет таких - прыгаем на выход из проги
...............
...Поскипано...
...............
:004068BA E841DD0000              Call 00414600 <-- проверяет необходимость NAG'a
:004068BF 397D90                  cmp dword ptr [ebp-70], edi
:004068C2 740C                    je 004068D0 <-- если не надо - перепрыгиваем его
:004068C4 397DE8                  cmp dword ptr [ebp-18], edi
:004068C7 7507                    jne 004068D0 <-- то же самое
:004068C9 B801000000              mov eax, 00000001
:004068CE EB02                    jmp 004068D2 <-- а если надо - то прыгаем на наг
Здесь предлагаю вместо
je 004068D0
написать
jmp 004068D0
чтобы сразу перепрыгивать NAG и он нас больше не мучал :)
Осталось разобраться с напоминающим окном "Trial Period"...
3) после
:004068C2 jmp 004068D0
скролим то тех пор, пока не появится окно напоминания, это произойдёт в этом месте:
:00406D5D E856D20000              Call 00413FB8 <-- вызываем напоминающее окно
:00406D62 83F801                  cmp eax, 00000001 <-- смотрим: какую кнопку ты нажал
:00406D65 7449                    je 00406DB0 <-- если это кнопка "Try" - прыгаем
здесь я поменял Call 00413FB8 на jmp 00406DB0, т.е. без вызова окна напоминания дал понять программе, что нажата кнопка "Try". Теперь больше не будет этого окна-напоминания и при старте будет сразу открываться главное окно!
Последние штрихи...
4) Это необязательная, но самая приятная часть исследования - уберём все признаки незарегистрированности, т.е. надписи типа "This soft UnRgIsTred"
Я зашёл в WDasm'e в String Reference и нашёл там строку "Registred to %S" кликнул на неё и оказался тут:
:00404616 6818E34100              push 0041E318
:0040461B 56                      push esi
поднялся чуть выше , вот сюда:
* Referenced by a CALL at Addresses:
|:0040148F   , :004051DD   , :004113F7   
|
:004045D0 A188044200              mov eax, dword ptr [00420488] 
:004045D5 81EC00010000            sub esp, 00000100
:004045DB 85C0                    test eax, eax <-- проверяеи зарегистрированны ли мы 
:004045DD 56                      push esi
:004045DE 7452                    je 00404632 <-- если нет - прыгаем
:004045E0 8BB42408010000          mov esi, dword ptr [esp+00000108]
:004045E7 85F6                    test esi, esi
:004045E9 743A                    je 00404625 <-- если нет - прыгаем
:004045EB 83C01D                  add eax, 0000001D
здесь я вместо mov eax, dword ptr [00420488] написал ret ( с тем соображением, что программа выйдет из процедуры присваивания имени ни с чем и будет надпись "Registred to: " и всё), но оказалось ещё круче: Появилась надпись "Registred to: Vitas Ramanchauskas" а в окне "О программе" как я и предполагал Вместо надписи "Registred to" ничего нет.
//Можно написать вместо ret что-то типа mov eax,eax
//тогда адрес строки с именем будет случайный, а т.к. программа проверяет
//имя владельца лицензии после каждой операции, то наше имя будет меняться
//каждый раз, причем имя будет иметь вид "№;%№;%№;%"№;%%::ВАПп" Прикольно!!!
Осталось ещё убрать надпись "Trial" внизу программы: ищем эту надпись в HEX-редакторе и затираем её пробелами или например "fuck".
ВсЁ!

Ну и как всегда, готовый Крак:
-----------вырезать тут-----------
RegSnap v 2.8 Crack by vallkor//PTDS

REmoves All Nag's and limits!!!
regsnap.exe
00006856: 3B B8
00006857: C7 01
00006858: 75 00
00006859: 20 00
0000685A: 6A 00
0000685B: FF EB
0000685C: 57 1D
000068C2: 74 EB
00006D5D: E8 EB
00006D5E: 56 51
000045D0: A1 C3
0001E4B8: 54 46
0001E4B9: 72 75
0001E4BA: 69 63
0001E4BB: 61 6B
0001E4BC: 6C 20
-----------вырезать тут------------
Как всегда, с вами беседовал
vallkor //PTDS
e-mail: vallkor@chat.ru
page: http://vallkor.chat.ru

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay