скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Исследование 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 нуждается в новых членах! Если вы считаете, что способны на многое и хотите поделиться своими знаниями и взамен получить новые пишите мне}






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook