Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Исследование FtpWolf 3.01

Обсудить статью на форуме

Очень удобно, когда все крэкерские инструменты, книги и статьи в одном месте. Используйте сборник от EXELAB - вот тут.
 Что ж, здрасьте опять!
 Как и обещал, на этот раз рассказываю о FtpWolf 3.01.
 Защита стандартная: имя/серийник + nag-экран и ограничение функций,
 но с некоторыми прибамбасами
 Мы с вами постараемся разобраться с алгом вычисления серийного номера и зарегистрировать прогу.
 
 В ходе работы нам понадобятся:
 1) Незатуманенный разум
 2) Отладчик (SoftICE)
 3) Дизассемблер (W32Dasm)
 4) Hex-редактор (Hiew)
 5) Вагон времени...
 6) ... и еще больше кофе (или что-вы-там-пьете).
 
 За дело!
 
 Ставим в SoftICE бряк на GetDlgItemTextA.
 
 После "всплытия" дебаггера надавите разок на F5 (чтобы прочитать инфу из обоих полей ввода),
 а затем разок на F12. Должны приземлиться тут:
 
 :004089D6 8D8D00FFFFFF            LEA ECX, DWORD PTR [EBP+FFFFFF00]
 :004089DC 51                      PUSH ECX
 :004089DD 8D5580                  LEA EDX, DWORD PTR [EBP-80]
 :004089E0 52                      PUSH EDX
 :004089E1 E84F88FFFF              CALL 00401235    ;тут происходит все самое интересное :)
 :004089E6 83C408                  ADD ESP, 00000008
 :004089E9 85C0                    TEST EAX, EAX    ;если ЕАХ=0, то...
 :004089EB 752D                    JNE 00408A1A     ;...регистрация неудачна, на выход
 . . .
 
 Перейдя к инструкции "CALL 00401235" давите F8 для входа в процедуру. Именно в ней и
 происходит вся вычислительная байда, с которой надо разобраться:
 
 :00401235 E9F6340100              JMP 00414730---+
 :0040123A CC                      INT 03         |
 :0040123B CC                      INT 03         |
 . . .                                            |
 . . .                                            |
 :00414730 55                      PUSH EBP  <----+
 :00414731 8BEC                    MOV EBP, ESP
 :00414733 81EC80000000            SUB ESP, 00000080
 :00414739 53                      PUSH EBX
 :0041473A 56                      PUSH ESI
 :0041473B 57                      PUSH EDI
 :0041473C 837D0C00                CMP DWORD PTR [EBP+0C], 00000000  ;ввели серийник?
 :00414740 7406                    JE 00414748                       ;если нет - плохо
 :00414742 837D0800                CMP DWORD PTR [EBP+08], 00000000  ;ввели имя?
 :00414746 7507                    JNE 0041474F                      ;если ввели - хорошо
 :00414748 33C0                    XOR EAX, EAX
 :0041474A E9B0010000              JMP 004148FF
 :0041474F 8B450C                  MOV EAX, DWORD PTR [EBP+0C]       ;с/н в ЕАХ
 :00414752 0FBE08                  MOVSX ECX, BYTE PTR [EAX]         ;первый символ серийника...
 :00414755 83F946                  CMP ECX, 00000046                 ;...это "F"?
 :00414758 750C                    JNE 00414766                      ;если нет - плохо
 :0041475A 8B550C                  MOV EDX, DWORD PTR [EBP+0C]
 :0041475D 0FBE4201                MOVSX EAX, BYTE PTR [EDX+01]      ;второй символ серийника...
 :00414761 83F857                  CMP EAX, 00000057                 ;...это "W"?
 :00414764 7407                    JE 0041476D                       ;если да - хорошо
 . . .
 
 Таким образом, первые два символа в серийнике должны быть "FW", иначе дальнейшие вычисления бесполезны.
 Можете выйти из дебаггера, изменить серийник и брякнуться еще раз, а можете изменять значения регистров
 "на лету". Это можно сделать, введя в командной строке SoftICE'а команду:
 
 r <регистр> = <значение> [ввод]
 
 но в нашем случае понадобятся значения не только регистров, поэтому менять их надо в самой памяти.
 Мы уже знаем, что имя хранится по адресу "ebp+08h" , а введенный с/н - по адресу "ebp+0Ch", а чтобы их
 изменить, в командной строке SoftICE'а вводите:
 
 e <адрес>  [ввод]
 
 Чтобы изменения вступили в силу давите [Alt + D].
 Если вам понадобится изменить опкоды инструкции, на которой в данный момент стоит курсор:
 
 e eip [ввод]
 
 (eip, как вы наверняка знаете, содержит адрес (или, если хотите, смещение) текущей инструкции)
 
 Все в порядке? ОК, идем дальше...
 
 . . .
 :00414766 33C0                    XOR EAX, EAX
 :00414768 E992010000              JMP 004148FF
 :0041476D 8B4D0C                  MOV ECX, DWORD PTR [EBP+0C]
 :00414770 51                      PUSH ECX
 :00414771 8D55D0                  LEA EDX, DWORD PTR [EBP-30]
 :00414774 52                      PUSH EDX
 :00414775 E8B6CA0000              CALL 00421230
 :0041477A 83C408                  ADD ESP, 00000008
 :0041477D 8D45D0                  LEA EAX, DWORD PTR [EBP-30]
 :00414780 89450C                  MOV DWORD PTR [EBP+0C], EAX
 :00414783 6A2D                    PUSH 0000002D                ;в стек ASCII-код символа "-" (тире)
 :00414785 8B4D0C                  MOV ECX, DWORD PTR [EBP+0C]
 :00414788 51                      PUSH ECX                     ;в стек с/н, точнее его адрес
 :00414789 E892A70000              CALL 0041EF20                ;проверка серийника на наличие дефиса
 :0041478E 83C408                  ADD ESP, 00000008            ;выравниваем стек
 :00414791 8945F8                  MOV DWORD PTR [EBP-08], EAX
 :00414794 837DF800                CMP DWORD PTR [EBP-08], 00000000  ;тире найдено?
 :00414798 7507                    JNE 004147A1                      ;если да - перейти дальше
 . . .
 
 Отсюда вывод: серийник начинается последовательностью символов "FW-". Иначе вылетит мессага об ошибке.
 Исправили? Исправляйте, я жду................
 
 Великолепно, продолжим...
 
 . . .
 :004147BA 8B4D08                  MOV ECX, DWORD PTR [EBP+08]
 :004147BD 51                      PUSH ECX
 :004147BE 8D55C0                  LEA EDX, DWORD PTR [EBP-40]
 :004147C1 52                      PUSH EDX
 :004147C2 E869D40000              CALL 00421C30   ;в EAX идет 4 первых символа имени в обратном порядке
 :004147C7 83C40C                  ADD ESP, 0000000C
 :004147CA C745CC00000000          MOV [EBP-34], 00000000
 
 А вот сейчас начинается сама рутина генерации серийного номера.
 Я решил не комментировать эту часть кода. Попробуйте разобраться в инструкциях сами. Будет намного
 полезней. А я опишу алгоритм словами после записи его в опкодах.
 
 :004147D1 EB09                    JMP 004147DC
 :004147D3 8B45CC                  MOV EAX, DWORD PTR [EBP-34]
 :004147D6 83C001                  ADD EAX, 00000001
 :004147D9 8945CC                  MOV DWORD PTR [EBP-34], EAX
 :004147DC 8B4D0C                  MOV ECX, DWORD PTR [EBP+0C]
 :004147DF 034DCC                  ADD ECX, DWORD PTR [EBP-34]
 :004147E2 0FBE11                  MOVSX EDX, BYTE PTR [ECX]
 :004147E5 85D2                    TEST EDX, EDX
 :004147E7 7502                    JNE 004147EB
 :004147E9 EB38                    JMP 00414823
 :004147EB C745C800000000          MOV [EBP-38], 00000000
 :004147F2 EB09                    JMP 004147FD
 :004147F4 8B45C8                  MOV EAX, DWORD PTR [EBP-38]
 :004147F7 83C001                  ADD EAX, 00000001
 :004147FA 8945C8                  MOV DWORD PTR [EBP-38], EAX
 :004147FD 837DC804                CMP DWORD PTR [EBP-38], 00000004
 :00414801 7D1E                    JGE 00414821
 :00414803 8B4D0C                  MOV ECX, DWORD PTR [EBP+0C]
 :00414806 034DCC                  ADD ECX, DWORD PTR [EBP-34]
 :00414809 0FBE11                  MOVSX EDX, BYTE PTR [ECX]
 :0041480C 83C202                  ADD EDX, 00000002
 :0041480F 8B45C8                  MOV EAX, DWORD PTR [EBP-38]
 :00414812 8A4405C0                MOV AL, BYTE PTR [EBP+EAX-40]
 :00414816 F6EA                    IMUL DL
 :00414818 8B4DC8                  MOV ECX, DWORD PTR [EBP-38]
 :0041481B 88440DC0                MOV BYTE PTR [EBP+ECX-40], AL
 :0041481F EBD3                    JMP 004147F4
 :00414821 EBB0                    JMP 004147D3
 
 Эта часть кода содержит 2 вложенных цикла:
 1. Берем букву "F" (46h)
 2. 46h + 2 = 48h
 3. Берем букву имени (начиная с первой)
 4. Умножаем ASCII-код буквы на 48h
 5. Заменяем код текущей буквы имени на полученное произведение
 6. Берем следующую букву имени и возвращаемся к пункту 4
 
 7. Берем букву "W" (57h)
 8. 57h + 2 = 59h
 9. Возвращаемся к пункту 3, чтобы проделать те же действия, что и над буквой "F"
 ЗАМЕЧАНИЕ: Вернувшись к пункту 3 будем брать уже не ASCII-коды оригинальных символов имени,
            а их измененные в ходе пунктов 1-6 значения.
 
 Вот так. Надеюсь понятно расписал :)
 
 :00414823 C745CC00000000          MOV [EBP-34], 00000000
 
 Хей, что это!? Похоже еще парочка вложенных циклов, продолжающих генерацию магической последовательности.
 Принцип этой рутины изменился не сильно: на этот раз берем КАЖДУЮ букву ИМЕНИ (а не только символы "F" и
 "W") и производим вычисления над значениями строки, которые были получены в процессе вышеописанных циклов.
 
 :0041482A EB09                    JMP 00414835
 :0041482C 8B55CC                  MOV EDX, DWORD PTR [EBP-34]
 :0041482F 83C201                  ADD EDX, 00000001
 :00414832 8955CC                  MOV DWORD PTR [EBP-34], EDX
 :00414835 8B4508                  MOV EAX, DWORD PTR [EBP+08]
 :00414838 0345CC                  ADD EAX, DWORD PTR [EBP-34]
 :0041483B 0FBE08                  MOVSX ECX, BYTE PTR [EAX]
 :0041483E 85C9                    TEST ECX, ECX
 :00414840 7502                    JNE 00414844
 :00414842 EB38                    JMP 0041487C
 :00414844 C745C800000000          MOV [EBP-38], 00000000
 :0041484B EB09                    JMP 00414856
 :0041484D 8B55C8                  MOV EDX, DWORD PTR [EBP-38]
 :00414850 83C201                  ADD EDX, 00000001
 :00414853 8955C8                  MOV DWORD PTR [EBP-38], EDX
 :00414856 837DC804                CMP DWORD PTR [EBP-38], 00000004
 :0041485A 7D1E                    JGE 0041487A
 :0041485C 8B4508                  MOV EAX, DWORD PTR [EBP+08]
 :0041485F 0345CC                  ADD EAX, DWORD PTR [EBP-34]
 :00414862 0FBE08                  MOVSX ECX, BYTE PTR [EAX]
 :00414865 83C102                  ADD ECX, 00000002
 :00414868 8B55C8                  MOV EDX, DWORD PTR [EBP-38]
 :0041486B 8A4415C0                MOV AL, BYTE PTR [EBP+EDX-40]
 :0041486F 32C1                    XOR AL, CL
 :00414871 8B4DC8                  MOV ECX, DWORD PTR [EBP-38]
 :00414874 88440DC0                MOV BYTE PTR [EBP+ECX-40], AL
 :00414878 EBD3                    JMP 0041484D
 :0041487A EBB0                    JMP 0041482C
 
 Завершение циклов.
 
 :0041487C 8B55C0                  MOV EDX, DWORD PTR [EBP-40]
 :0041487F 8955FC                  MOV DWORD PTR [EBP-04], EDX
 :00414882 837DFC00                CMP DWORD PTR [EBP-04], 00000000
 :00414886 7507                    JNE 0041488F
 :00414888 C745FC01000000          MOV [EBP-04], 00000001
 :0041488F 837DFC00                CMP DWORD PTR [EBP-04], 00000000
 :00414893 7D08                    JGE 0041489D
 :00414895 8B45FC                  MOV EAX, DWORD PTR [EBP-04]
 :00414898 F7D8                    NEG EAX
 :0041489A 8945FC                  MOV DWORD PTR [EBP-04], EAX
 :0041489D 817DFC0F270000          CMP DWORD PTR [EBP-04], 0000270F
 :004148A4 7D0B                    JGE 004148B1
 :004148A6 8B4DFC                  MOV ECX, DWORD PTR [EBP-04]
 :004148A9 6BC90A                  IMUL ECX, 0000000A
 :004148AC 894DFC                  MOV DWORD PTR [EBP-04], ECX
 :004148AF EBEC                    JMP 0041489D
 
 Далее цикл, который уменьшает численное значение вычисленной строки (точнее, последовательности байтов) -
 извините за каламбур - до удовлетворительного значения, т. е. F423Fh.
 
 :004148B1 817DFC3F420F00          CMP DWORD PTR [EBP-04], 000F423F
 :004148B8 7E10                    JLE 004148CA
 :004148BA 8B45FC                  MOV EAX, DWORD PTR [EBP-04]
 :004148BD 99                      CDQ
 :004148BE B90A000000              MOV ECX, 0000000A
 :004148C3 F7F9                    IDIV ECX
 :004148C5 8945FC                  MOV DWORD PTR [EBP-04], EAX
 :004148C8 EBE7                    JMP 004148B1
 
 Конец цикла
 
 :004148CA 8B55FC                  MOV EDX, DWORD PTR [EBP-04]    ;в EDX - правильный серийник.
 :004148CD 52                      PUSH EDX
 :004148CE 688CE14400              PUSH 0044E18C
 . . .
 
 Вот, в принципе и все. Выполнив инструкцию MOV EDX, DWORD PTR [EBP-04] (нажатием на F10) вы получите
 в EDX правильное окончание серийного номера.
 Для своего имени (ry0 я получил в EDX значение 174695, т. о.
 
 Имя: (ry0
 С/Н: FW-174695
 
 Уф, все. Довольный до глубины организма я ввожу свеженькие регистрационные данные, нажимаю ОК, получаю
 лицензионное соглашение... клево! Все прошло как надо. Прога зарегистрирована.
 Делаю как просят: закрываю приложение и запускаю вновь. И тут... моя челюсть на коленях. Честно,
 я ожидал любого подвоха, но не такого сообщения, которое получил:
 
 "Ask yourself, do you think it Wise to use a pirate copy in a..." и т. д. в том же духе.
 
 М-да, прикольно, но ультраглупо, если учесть, что работоспособность программы остается эквивалентной
 зарегистрированной версии. Все открывшиеся ftp engines функционируют. Для проверки я специально полез в Нет
 и поискал пару-тройку файлов. А nag удалить труда не составит даже абсолютному новичку:
 откройте W32Dasm, в меню "Refs" -> "String Data References" найдите строку из nag-экрана (см. выше) и двойной
 клик по ней. Приземлитесь тут:
 
 :004058E9 A1D4244500              mov eax, dword ptr [004524D4]
 :004058EE 0FBE4802                movsx ecx, byte ptr [eax+02]
 :004058F2 83F939                  cmp ecx, 00000039
 :004058F5 7E1F                    jle 00405916
 
 * Referenced by a (U)nconditional or (C)onditional Jump at Address:
 |:004058E7(C)                <--------------------------------<---------------------------<------------------------+
 |                                                                                                                  |
 :004058F7 6A30                    push 00000030                                                                    |
 :004058F9 6820D04400              push 0044D020                                                                    ^
                                                                                                                    |
 * Possible Reference to String Resource ID=01516: "Ask yourself, do you think it Wise to use a pirate copy in a"   |
                                   |                                                                                |
 :004058FE 68EC050000              push 000005EC                                                                    |
 :00405903 E898450100              call 00419EA0                                                                    |
 :00405908 83C404                  add esp, 00000004                                                                ^
 :0040590B 50                      push eax                                                                         |
 :0040590C 8B5508                  mov edx, dword ptr [ebp+08]                                                      |
  . . .                                                                                                             |
                                                                                                                    |
 Пролистав листинг немного вверх, вы должны увидеть обращение к коду из адреса ------>----------------------->------+
 В меню W32Dasm выбирайте "Goto" -> "Goto Code Location" и вводите этот адрес. Приземлитесь примерно здесь:
 
 :004058E7 7C0E                    jl 004058F7
 
 Запишите смешение инструкции в файле (число после "@Offset" в строке в самом низу окна дизасма). У меня это 58E7h.
 Все, открываем hex-редактор, ищем полученное смещение и нопим инструкцию (изменить байты '7C 0E' на '90 90'). Сохраняем
 изменения, закрываем редактор, запускаем FtpWolf... наслаждаемся!
 
 Но должен вам сказать, что лично меня этот взлом не устраивает. Как выдастся свободное время, обязательно копну глубже
 и постараюсь-таки определить, что вызывает этот долбаный nag-экран. А как определю - обязательно расскажу вам.
 Если решите капнуть сами - пишите о результатах. Мне будет очень интересно.
 
 А в следующий раз я расскажу об игрушках. Мы с вами
 1) пропатчим Serious Sam
 2) добавим свою функцию в GTA 3 (Rus & Eng - 2 in 1 от "Фаргус Мультимедия")и перенаправим на нее код.
 
 All.
 
 P. S. Keep on reversin'...
 



 Date  : 05.11.2002
 Author: (ry0
 E-mail: cryo@cydem.zp.ua
 


Обсуждение статьи: Исследование FtpWolf 3.01 >>>


Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS