ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Як ламати програми Windows (C) ED! SON [UCF], переклад Mr.Boco / TCP
         

     

    Інформатика, програмування

    Як ламати програми Windows (C) ED! SON [UCF], переклад Mr.Boco/TCP

    ЗМІСТ

    1. Введення в ламання Windows-програм

    2. Огляд SoftICE/Win 2.oo

    3. Пошук реєстраційних кодів

    3.1 Task Lock 3.00 - проста захист на основі серійного номера

    3.2 Command Line 95 - проста регсітрація "ім'я-код"

    4. Створення генератора ключів для Command Line 95

    5. Як працюють інструкції PUSH і CALL коли програма викликає функцію

    6. Про програми, написані на Visual Basic

    ПРОГРАМИ

    A. Як у SoftICE завантажувати символьні імена (імена функцій etc)

    B. Синтаксис функцій GetWindowText, GetDlgItemText і GetDlgItemInt

    C. Де знайти програми

    D. Зв'язок з автором

    1. ВСТУП У Ломанов WINDOWS-ПРОГРАМ

    Ламати програми Windows у більшості випадків навіть простіше, ніж ламати програми Dos. У Windows складно що-небудь приховати від того, хто шукає, особливо якщо програма використовує стандартні функції Windows.

    Перша (і часто єдина) річ, яка Вам буде потрібно - це SoftICE/Win 2.oo, потужний відладчик від фірми NuMega. Деяким людям він здається дуже складним у використанні, але я розповім Вам, як з ним управлятися і, я сподіваюся, Ви повірите мені. =) У додатку A я привів деяку інформацію, яку Вам слід прочитати.

    URL всі програми, які Вам знадобляться, наведені у додатку C.

    - ED! SON, [email protected]

    2. ПЕРЕГЛЯД SOFTICE/WIN 2.OO        Нижче         наведено дуже         схематичні малюнок, що демонструє вікно SoftICE:             | ---   |         --------------   Регістри         - |   | 'R' - правка значення регістрів             |         Вікно даних         | 'D' - перегляд пам'яті, 'E' - правка пам'яті             |         Вікно коду         | 'U' - перегляд коду за адресою, 'A' - вставка коду             |         Вікно команд         | Тут ви набираєте команди     

    Інші важливі клавіші (у стандартній настройці):

    'H'/F1 - допомогу

    F5/Ctrl + D - запуск програми (або продовження перерваного програми)

    F8 - покрокова налагодження із заходом в тіло функції

    F10 - покрокова налагодження без заходу в тіло функції

    F11 - вийти з функції (буде працювати тільки до перший PUSH у функції)

    3. ПОШУК РЕЄСТРАЦІЙНИХ КОДІВ

    Можливо, найкращий спосіб попрактикуватися - це знайти де-небудь шареварную (shareware) програмку і спробувати зареєструвати її.

    3.1 Task Lock 3.00 - проста захист на основі серійного номера

    Це дуже проста захист: номер не залежить ні від яких чинників.

    3.1.1 Медичне обстеження

    Який розрядності програма - 16 або 32 біт? Де вводиться реєстраційна інформація? Чи дасть мені довідка які-небудь припущення про те, як влаштована реєстрація? Спробуйте відповісти на ці питання перед тим, як ми продовжимо.

    .... Зараз Ви повинні бути зайняті обстеженням .... Ви зайняті обстеженням? ... Ну як, вже все ?...

    OK, тепер Ви знаєте, що це 32-бітне додаток, що працює під

    Windows 95 і що реєстрація полягає у заповненні реєстраційного номера в діалоговому вікні, що з'являється коли Ви вибираєте меню "Register | Register ...". З довідки Вам також стало відомо, що існує два типи реєстрації: для індивідуального використання і для використання в "конторі" (в оригіналі - site license). Тому дуже ймовірно, що в програмі буде ДВІ перевірки реєстраційних кодів.

    3.1.2 Переривання програми

    Реєстраційні коди найчастіше вводяться в звичайних рядках введення типу Windows Edit. Щоб перевірити код, програма повинна прочитати рядок введення за допомогою однієї з функцій:

    16-біт 32-біт

    ------ ------

    GetWindowText GetWindowTextA, GetWindowTextW

    GetDlgItemText GetDlgItemTextA, GetDlgItemTextW

    Остання буква в назві 32-бітових функцій говорить про те, які рядки використовує ця функція: однобайтові або багатобайтових. Багатобайтових рядка використовуються ДУЖЕ рідко.

    Можливо, що Ви вже вловили мою думку. "Якщо б можна було перерватися за викликом GetWindowText ..." - І Ви МОЖЕТЕ це зробити! Але спершу Ви повинні переконатися, що символьні імена (імена функцій) завантажені SoftICE'ом. Якщо Ви не знаєте, як це зробити - див. додаток A.

    Щоб встановити "пастку" (насправді це називається точкою зупинки або брейкпоінтом) в SoftICE, Ви повинні зайти в відладчик натисканням клавіш Ctrl-D і використовувати команду BPX. Як параметр команди можна використовувати або ім'я функції, або безпосередньо адресу. Так як наш "об'єкт вивчення" (Task Lock) є 32-бітним додатком, ми повинні поставити брейкпоінт на функцію GetWindowTextA. Якщо це не допоможе, спробуйте поставити брейкпоінт на інші функції.

    У командному рядку SoftICE наберіть наступне:

    : bpx getwindowtexta

    Якщо Ви отримаєте повідомлення про помилку (наприклад, "No LDT"), переконайтеся, що в фоні у Вас не виконуються жодні інші додатки. Я помітив, що Norton Commander в фоні є причиною такої поведінки SoftICE.

    Ви можете перевірити наявність брейкпоінтов командою:

    : bl

    У результаті Ви побачите що-небудь типу:

    00) BPX USER32! GetWindowTextA C = 01

    Щоб вийти з відладчика, натисніть Ctrl-D (або F5) ще раз.

    Продовжимо ... Отже, Ви встановили брейкпоінт і тепер SoftICE буде "вискакувати" при кожному виклику функції GetWindowTextA. Спробуємо ввести якесь значення у вікні реєстрації та натиснемо OK. Ви натискаєте OK ... ... і отримуєте дурне повідомлення про те, що Ваш код був неправильним. Значить, це була не функція GetWindowTextA ... Спробуємо GetDlgItemTextA. Видалимо старий брейкпоінт:

    : bc 0

    (0 - це номер брейкпоінта у списку брейкпоінтов)

    І встановимо новий:

    : bpx getdlgitemtexta

    Ну що ж, спробуємо ще раз ...

    3.1.3 У відладчик

    Wow! Працює! Тепер ви в SoftICE, на самому початку функції GetDlgItemTextA. Щоб потрапити туди, звідки вона була викликана, натисніть F11. Тепер Ви всередині модуля SGLSET.EXE. Якщо Ви не впевнені - подивіться на рядок між вікном коду і вікном командного рядка, вона має виглядати так:

    ---------- SGLSET!. text +1 B13 ----------

    Зараз ви вже можете заборонити реакцію на виклик функції:

    : bd 0

    Якщо Вам раптом захочеться знову дозволити її, наберіть:

    : be 0

    Перший рядок у вікні коду виглядає так:

    CALL [USER32! GetDlgItemTextA]

    Щоб побачити рядки над нею, натисніть Ctrl + Up ( "стрілка вгору") до тих пір, поки не побачите нижченаведений шматок коду. Якщо Ви нічого не розумієте в Асемблері, я додав коментарі які можуть Вам допомогти.

    RET; Кінець функції

    PUSH EBP; Початок іншої функції

    MOV EBP, ESP; ...

    SUB ESP, 0000009C; ...

    PUSH ESI; ...

    > LEA EAX, [EBP-34]; EAX = EBP-34

    PUSH EDI; ...

    MOVE ESI, ECX; ...

    PUSH 32; Макс. довжина рядка

    > PUSH EAX; Адреса текстового буферу

    PUSH 000003F4; Ідентифікатор управління

    PUSH DWORD PTR [ESI +1 C]; Ідентифікатор вікна діалогу

    CALL [USER32! GetDlgItemTextA]; Отримати текст

    Команди PUSH означають збереження значень для подальшого використання.

    Я позначив важливі рядки символом '>'. Дивлячись на цей код, ми бачимо, що адреса текстового буферу зберігався в регістрі EAX і що EAX був EBP-34h. Тому нам варто поглянути на EBP-34h:

    : d ebp-34

    Ви повинні були побачити текст, який ви ввели в діалоговому вікні. Тепер ми повинні знайти місце, де Ваш номер порівнюється з реальним серійним номером. Тому ми крок за кроком трассіруем програму за допомогою F10 до тих пір, поки не зустрінемо що-небудь про EBP-34. Не мине й кількох секунд, як Ви наткнетеся на наступний код:

    > LEA EAX, [EBP + FFFFFF64]; EAX = EBP-9C

    LEA ECX, [EBP-34]; ECX = EBP-34

    PUSH EAX; Зберігає EAX

    PUSH ECX; Зберігає ECX

    > CALL 00403DD0; Викликає функцію

    ADD ESP, 08; Видаляє збережену інформацію

    TEST EAX, EAX; Перевіряє значення функції

    JNZ 00402BC0; Стрибає, якщо не "нуль"

    Мені здається, що це виглядає як виклик функції порівняння двох рядків.

    Ця функція працює так: на вході - два рядки, на виході - 0, якщо вони рівні і будь-яке інше значаніе, якщо не рівні.

    А навіщо програмі порівнювати якусь рядок з тією, що ви ввели у вікні діалогу? Та для того, щоб перевірити правильність Вашої рядки (як Ви, можливо, вже здогадалися)! Так-так, значить цей номер ховався за адресою [EBP + FFFFFF64]? SoftICE не зовсім коректно працює з негативними числами і тому цей адреса слід порахувати:

    100000000 - FFFFFF64 = 9C

    Ви можете зробити це обчислення прямо в SoftICE:

    :? 0-FFFFFF64

    Число 100000000 занадто велике для SoftICE, а віднімання з 0 дає той же

    самий результат.

    Нарешті настав час подивитися, що ж ховається за адресою EBP-9C ...

    : d ebp-9c

    У вікні даних SoftICE Ви бачите довгу рядок цифр - це серійний номер!

    Але Ви пам'ятаєте, що я говорив Вам раніше? Два типи реєстрації - два різних серійних номери. Тому після того, як Ви записали на папірець перший серійний номер, продовжуйте трассіровать програму за допомогою F10. Ми дійшли до наступного шматка коду:

    > LEA EAX, [EBP-68]; EAX = EBP-68

    LEA ECX, [EBP-34]; ECX = EBP-34

    PUSH EAX; Зберігає EAX

    PUSH ECX; Зберігає ECX

    > CALL 00403DD0; Знову викликає функцію

    ADD ESP, 08; Видаляє збережену інформацію

    TEST EAX, EAX; Перевіряє значення функції

    JNZ 00402BFF; Стрибає якщо не "нуль"

    І що Ви бачите за адресою EBP-68? Другий серійний номер!

    : d ebp-68

    От і все ... Я сподіваюся, що у Вас все вийшло як доктор прописав? =)

    3.2 Command Line 95 - легка реєстрація "ім'я-код", створення генератора ключів

    Це програма - хороший приклад, з легким алгоритмом генерації коду.

    3.1.1 "Обстеження"

    Ви оглянули програму і побачили, що це 32-бітне додаток, що вимагає ім'я та код у вікні реєстрації. Поїхали!

    3.1.2 Переривання програми

    Ми чинимо так само, як і з Task Lock'ом - ставимо брейкпоінти. Можна навіть поставити відразу два брейкпоінта на найбільш імовірні функції: GetWindowTextA і GetDlgItemTextA. Натисніть Ctrl-D, щоб викликати відладчик і наберіть у вікні команд:

    : bpx getwindowtexta

    : bpx getdlgitemtexta

    Тепер повертайтеся в перервану програму, ідіть у вікно реєстрації і введіть ім'я і який-небудь номер (звичайне ціле число -- це найбільш ймовірний код). Я написав приблизно наступне:

    Name: ED! SON '96

    Code: 12345

    Програма зупинилася на GetDlgItemTextA. Так само, як і у випадку з Task Lock'ом, ми натискаємо F11 щоб повернутися в зухвалу функцію. Переглядаємо вікно коду за допомогою Ctrl + Up. Виклик функції виглядає так:

    MOV ESI, [ESP +0 C]

    PUSH 1E; Максимальна довжина

    PUSH 0040A680; Адреса буфера

    PUSH 000003ED; Ідентифікатор управління

    PUSH ESI; Ідентифікатор вікна діалогу

    CALL [User32! GetDlgItemTextA]

    Число 40A680 здається нам цікавим, тому ми перевіряємо цю адресу:

    : d 40a680

    Що ж видно у вікні даних, як не ім'я, яке ми ввели? =) А тепер поглянемо на шматок коду під вищенаведеним:

    PUSH 00; (не цікаво)

    PUSH 00; (не цікаво)

    PUSH 000003F6; Ідентифікатор управління

    MOV EDI, 0040A680; Адреса буфера

    PUSH ESI; Ідентифікатор вікна діалогу

    CALL [User32! GetDlgItemInt]

    Функція GetDlgItemInt схожа на GetDlgItemTextA, але повертає рядок, а ціле число. Вона повертає його в регістрі EAX, тому ми трассіруем цей код (F10) і дивимося, що ж у нас з'явилося у вікні регістрів після виклику функції ... У моєму випадку воно виглядає так:

    EAX = 00003039

    А що таке шістнадцяткове 3039? Наберіть:

    :? 3039

    І отримаємо наступне:

    00003039 0000012345 "09"

    ^ hex dec ^ ^ ascii

    Як Ви бачите (і, можливо, вже здогадалися) це код, який Ви ввели в діалоговому вікні. Ok, що тепер? Подивимося далі:

    MOV [0040A548], EAX; Зберігає рег. код

    MOV EDX, EAX; А також поміщає його в EDX

    3.1.3 підрахунок реєстраційного коду

    Ми досягли місця, де підраховується реальний реєстраційний код!

    MOV ECX, FFFFFFFF; Ці рядки підраховують

    SUB EAX, EAX; довжину рядка

    REPNZ SCASB;.

    NOT ECX;.

    DEC ECX; ECX тепер містить довжину

    MOVSX EAX, BYTE PTR [0040A680]; Отримує байт за адр. 40A680h

    IMUL ECX, EAX; ECX = ECX * EAX

    SHL ECX, 0A; Зрушення вліво на 0Ah біт

    ADD ECX, 0002F8CC; Додає 2F8CC до результату

    MOV [0040A664], ECX

    ... І де він перевіряється

    CMP ECX, EDX; Порівнює числа

    JZ 00402DA6; Стрибає, якщо рівні

    Коли Ви дотрассіровалі до порівняння чисел, Ви можете подивитися, яким повинен був бути Ваш РЕАЛЬНИЙ реєстраційний код:

    :? ecx

    У моєму випадку це дало:

    000DC0CC 0000901324

    Тобто, правильний код для мене: 901324.

    Натиснемо F5 або Ctrl-D щоб повернутися в програму і спробуємо ще раз, але цього разу з правильним кодом (у десяткового формі). Працює!

    4. СТВОРЕННЯ генератора ключів ДЛЯ COMMAND LINE 95

    Погляньмо на алгоритм генерації коду і спробуємо перекласти його на мову Сі. Ось дуже проста формула, за якою підраховується ключ:

    code = ((uppercase_first_char * length_of_string) <<0x0A) + 0x2f8cc;

    Зауваження # 1: Не слід забувати, що всі символи у вікні введення імені були приведені до верхнього регістру, тому ми повинні зробити те саме.

    Зауваження # 2: "<<0x0A" означає "умножніе на 2 в ступені 10"

    Цілком програма на Сі виглядає так:

    # include

    # include

    int main ()

    unsigned long code;

    unsigned char buffer [0x1e];

    printf ( "CommandLine95 Keymaker by ED! SON '96n"); printf ( "Enter name: ");

    gets (buffer);

    strupr (buffer);

    code = (((unsigned long) buffer [0] *

    (unsigned long) strlen (buffer))

    <<0x0A) + 0x2f8cc;

    printf ( "Your code is:% lu", code);

    return 0;

    Приємних сновидінь!

    4. ЯК ПРАЦЮЮТЬ PUSH І CALL КОЛИ ПРОГРАМА ВИКЛИКАЄ ФУНКЦІЮ        Знову         поглянемо   PUSH   PUSH   PUSH   PUSH   CALL         на шматок коду з Task Lock'а:   32   EAX   000003F4   DWORD PTR [ESI +1 C] [USER32! GetDlgItemTextA]         ;   ;   ;   ;   ;         Макс. довжина рядка   Адреса текстового буферу   Ідентифікатор управління   Ідентифікатор вікна діалогу   Отримує текст     

    Коли Ви викликаєте функцію GetDlgItemTextA з програми на C, виклик виглядає так:

    GetDlgItemTextA (hwndDlg, 0x3F4, buffer, 0x32);

    ^ [ESI +1 C] ^ EAX

    PUSH зберігає дані в області пам'яті, званої стеком. В результаті кожного PUSH'а новий шматок даних міститься у верхівку стека і потім викликається, перевіряє, що лежить в стеку і використовує ці дані на свій розсуд.

    5. Про ПРОГРАМАХ НА VISUAL BASIC

    EXE файли, вироблені Visual Basic'ом, не є справжніми EXE. Вони просто містять код для виклику VBRUNxxx.DLL, який потім читає дані з EXE і виконує програму. Такий пристрій псевдо-EXE файлів є також причиною того, що програми на Visual Basic'е такі повільні.

    А так як EXE файли не є справжніми EXE файлами, Ви не можете трассіровать і розбирання їх - Ви знайдете виклик функції з DLL і купу сміття. І коли Ви будете трассіровать таку програму, Ви "заблукаєте" в DLL.

    Вирішенням цієї проблеми є декомпілятор. Існує декомпілятор для програм, написаних на Visual Basic'е версій 2 і 3, створений кимось, що називає себе DoDi. Ця програма є шареварной і її можна знайти в InterNet'е (див. Додаток C). Для програм, написаних на Visual Basic'е версії 4 (VB для Windows 95), не існує декомпілятора, наскільки мені відомо, хоча я б хотів, щоб він існував. =)

    Примітка: Справжні програмісти на пишуть на Basic'е. =)

    ПРОГРАМИ

    A. ЯК У SOFTICE ЗАВАНТАЖУЙ символьні імена

    Щоб перевірити, завантажив чи SoftICE символьні імена GetWindowText, Ви повинні ввійти в відладчик натисненням на клавіші Ctrl-D і у вікні команд ввести наступне:

    : exp getwindowtext

    Якщо Ви не отримали список усіх функцій GetWindowText, Вам потрібно відредагувати файл SIW95WINICE.DAT, видаливши символ коментаря (';') перед однією з рядків 'exp =', які слідують за текстом: "Examples of export symbols that can be included for chicago" в кінці цього файлу.

    Ви можете видалити коментарі з усіх рядків 'exp =' або зберегти трошки пам'яті, розкоментувати тільки рядки з файлами kernel32.dll, user32.dll і gdi32.dll, які є найважливішими. Після цього Ви повинні перезапустити комп'ютер.

    B. ВИКОРИСТАННЯ ДЕЯКИХ ФУНКЦІЙ

    Вам буде легше зрозуміти, як викликаються функції, про які ми говорили, якщо Ви будете знати їх опису (декларації):

    int GetWindowText (int windowhandle, char * buffer, int maxlen);

    int GetDlgItemText (int dialoghandle, int controlid, char * buffer, int maxlen); int GetDlgItemInt (int dialoghandle, int controlid, int * flag, int type);

    Якщо Вам потрібна більш детальна інформація, то прочитайте документацію до програміста Windows/Win32.

    C. ДЕ ЗНАЙТИ ПРОГРАМИ

    ПРОГРАМИ ДЛЯ ЗЛОМУ

    SoftICE/Win 2.oo: http://www.geocities.com/SoHo/2680/cracking.html Декомпілятор VB: ftp://ftp.sn.no/user/balchen/vb/decompiler/

    ПРОГРАМИ, ВИКОРИСТАНІ У ЯК ПРИКЛАД

    TaskLock: http://users.aol.com/Sajernigan/sgllck30.zip

    CommandLine 95: ftp://ftp.winsite.com/pub/pc/win95/miscutil/cline95.zip

    D. ЯК ЗВ'ЯЗАТИСЯ З АВТОРОМ

    На IRC (EFNet): Канали # Ucf96, # Cracking

    E-mail: [email protected] або [email protected]

    На моїй WWW-сторінці: http://www.geocities.com/SoHo/2680/cracking.html

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status