Исследование Acdsee32 version 2.4 или как рубить хвосты
Оформил: DeeCo
Автор: http://www.cracklab.narod.ru
Наверное всем приходилось работать с этой замечательной программой, которая
просматривает практически все графические форматы современного компьютера.
Так вот, я всегда пользовался для регистрации этой программы написанным для
неё генератором регистрационного номера, НО мне стало интересно, есть ли в
природе крак к этой программе, но ничего подобного не нашёл, а так как делать
мне тогда было нечего, я решил поисследовать защиту этой вещи.
Для начала запустил программу и увидел, что в заголовке окна надпись
"(Unregistred)". Я запустил WDasm и дизассемблировал програмку, затем зашёл
в String Reference и начал искать в списке увиденную мной строку
"(Unregistred)" и когда нашёл, то кликнул на неё (Внимание! Эта строка в
программе встречается дважды, в такой ситуации WDasm при нажатии первый раз
открывает первое место, где эта строка встречается, при следующем нажатии
второе место и т.д.). Т.е. вам надо нажать на эту надпись два раза и вы
окажетесь тут:
* Possible Reference to String Rsource ID= 00195: "[Unregistered]"
:004013C5 68C3000000 push 000000C3
:004013CA 51 push ecx
теперь посмотрим чуть выше и увидим вот что:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401387(U) |
:0040139D E8CE520000 call 00406670 ;вызываем процедуру проыерки зарегестрированности
:004013A2 83F801 cmp eax, 00000001
:004013A5 742A je 004013D1 ;если зарегестрированны - прыгаем мимо "[Unregistered]"
:004013A7 8D942414010000 lea edx, dword ptr [esp+00000114]
:004013AE 6A50 push 00000050
:004013B0 52 push edx
* Reference To: KERNEL32.lstrlenA, Ord :03 08h
|
:004013B1 FF1514C24C00 Call dword ptr [004CC214]
:004013B7 8B8B00020000 mov ecx, dword ptr [ebx+00000200]
:004013BD 8D840418010000 lea eax, dword ptr [esp+eax+00000118]
:004013C4 50 push eax
Здесь стало ясно, что процедура проверки находится по адресу 00406670. Ну что
же, зайдем по этому адресу (F12) и вот что мы видим:
* Referenced by a CALL at Addresses:
|:0040103F , :004010D4 , :0040114D , :0040124F , :0040139D
|:004014D3 , :0040175B , :004017F5 , :0040195F , :00401D4C
|:004021F4 , :0040241C , :004024A7 , :004039B8
|
:00406670 81EC24020000 sub esp, 00000224
:00406676 8A1558B84E00 mov dl, byte ptr [004EB858]
:0040667C 56 push esi
:0040667D 57 push edi
:0040667E B907000000 mov ecx, 00000007
:00406683 33C0 xor eax, eax
:00406685 8D7C2415 lea edi, dword ptr [esp+15]
:00406689 88542414 mov byte ptr [esp+14], dl
:0040668D 88542434 mov byte ptr [esp+34], dl
:00406691 F3 repz
:00406692 AB stosd
:00406693 66AB stosw
Судя по количеству адресов, по которым происходит вызов этой процедуры, можно
сказать, что это скорее всего и есть основная (и как оказалось единственная)
процедура проверки зарегестрированности.
Теперь тут можно было бы искать место где сравнивают наш рег. номер и
правильный, затем поменять условный переход после этой проверки на
противоположный, но вдеь не зря статья называется "Как рубить хвосты",
поэтому мы пойдём другим путём.
Итак, как вы помните, после выполнения процедуры проверки в eax записыватеся
либо "0" - незарегестрированны, либо "1" - зарегестрированны. Так вот, я
предлагаю найти выход из процедуры проверки и на выходе дописать mov eax,01.
Но для начала посмотрим чуть ниже и увидим вот это место:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004066C2(C)
|
:0040671F 8A442414 mov al, byte ptr [esp+14]
:00406723 33FF xor edi, edi
:00406725 84C0 test al, al ;проверяют есть ли хоть один символ в сохранённом в реестре имени
:00406727 C70540004E0000000000 mov dword ptr [004E0040], 00000000
:00406731 8D742414 lea esi, dword ptr [esp+14]
:00406735 741F je 00406756 ;если нет прыгаем
Тут надо, чтобы мы прыгали не на 00406756, а на следующую строку, т.е.
заменим je 00406756 на je 00406737. Чтобы даже если в реестре не записано
никакое имя мы всё равно были бы зарегестрированны.
Теперь ещё чуть ниже такой кусок кода:
:00406748 8A4601 mov al, byte ptr [esi+01]
:0040674B 46 inc esi
:0040674C 84C0 test al, al
:0040674E 75E7 jne 00406737
:00406750 6683FF05 cmp di, 0005 ;сравнивают длинну нашего Р.Н.
:00406754 7D0B jge 00406761 ; и если он больше 5 символов - прыгаем
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406735(C)
|
:00406756 5F pop edi ;иначе - заходим сюда
:00406757 33C0 xor eax, eax ;записываем в eax "0"
:00406759 5E pop esi
:0040675A 81C424020000 add esp, 00000224
:00406760 C3 ret ;выходим из процедуры проверки
Здесь нам нужно поменять по адресу 00406754 команду jge 00406761 на
jmp 00406761, чтобы программа всегда думала, что в нашем имени больше 5
символов.
Теперь ищем конец процедуры проверки.
Для этого в WDasm'e скролим вниз окно до окончания процедуры проверки, т.е.
до этого места:
:0040676D 6888034E00 push 004E0388
:00406772 E819230500 call 00458A90
:00406777 83C410 add esp, 00000010
:0040677A F7D8 neg eax ; вычитаем и возвращаем eax
:0040677C 1BC0 sbb eax, eax ;что-то типа eax-eax
:0040677E 5F pop edi
:0040677F F7D8 neg eax ;опять вычитаем и возвращаем eax
:00406781 A340004E00 mov dword ptr [004E0040], eax
:00406786 5E pop esi
:00406787 81C424020000 add esp, 00000224
:0040678D C3 ret ; возвращаемся из процедуры
Итак, на выходе по адресам (0040677A, 0040677C, 0040677F) происходят какие-то
действия над eax. Именно эти строки мы и будем "затирать" строкой mov eax,01
НО строка mov eax,01 занимает 5 байт (B801000000) а в строках
(0040677A, 0040677C) всего четыре "свободных" байта (F7D81BC0) т.е. нужная
нам строка не помещается. Тогда делаем так:
меняем местами строку 0040677E и 0040677F теперь получили свободными 6 байт.
Помещаем в первые 5 нашу строку (mov eax,01) а в последний байт записываем
nop.
теперь картина должна принять вид:
:0040676D 6888034E00 push 004E0388
:00406772 E819230500 call 00458A90
:00406777 83C410 add esp, 00000010
:0040677A B801000000 mov eax, 00000001
:0040677F 90 nop
:00406780 5F pop edi
:00406781 A340004E00 mov dword ptr [004E0040], eax
:00406786 5E pop esi
:00406787 81C424020000 add esp, 00000224
:0040678D C3 ret
Таким образом, на выходе из процедуры всегда будет записываться в eax 1.
(если вы хотите видеть в окне о программе своё имя, то нужно либо сперва
ввести имя и рег код в окне регистрации, а потом кракать, либо пойти в
системный реестр по адресу HKEY_LOCAL_MACHINE\Software\ACD Systems\ACDSee32
и в поля RegCode и RegName вписать ваши реквизиты)
Как всегда прилагаю готовый крак:
-------вырезать тут-----------
Acdsee32 v 2.4 Crack by vallkor//PTDS (vallkor@chat.ru)
All checked!
Acdsee32.exe
0000677A: F7 B8
0000677B: D8 01
0000677C: 1B 00
0000677D: C0 00
0000677E: 5F 00
0000677F: F7 90
00006780: D8 5F
00006754: 7D EB
00006736: 1F 00
-------вырезать тут-----------
PS: эта статья была написана для людей, мало-мальски разбирающихся в
исследовании программ, но я попытался описать всё доступным для новичков
языком, поэтому если эксперимент у меня не удался - камнями не кидайтесь.
исследовал и наваял туториал:
vallkor //PTDS (vallkor@chat.ru)
{Комманда PTDS нуждается в новых членах! Если вы считаете, что способны
на многое и хотите поделиться своими знаниями и взамен получить новые
пишите мне}
|