This page has been robot translated, sorry for typos if any. Original content here.

Туторіал по злому QSetup Composer 7

Туторіал по злому QSetup Composer 7 (by rel4nium)

Інструменти:
  PEiD
 
  Upx_mod
 
  KWdsm
 
  OlyDGB
 
  Hiew
 
  tpe
 

Для початку визначимо, ніж запакована наша жертва, для цього запустимо PEiD:
UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo
Тепер нам потрібно анпакер для UPX, самому упіксу це не по зубах, так що будемо використовувати Upx_mod, для розпакування нас просто потрібно запустити Upx_mod так:
unp1_24.exe -d QSetup.exe
Так програма розпакована, всі інші операції ми будемо проводити над розпакованим exe-шником, розміром 1,69. Тепер нам потрібно подивитися які види захисту використовуються в програмі:


Отже у нас 3 способи захисту, тепер нам потрібно знайти ці фрази / слова в дізасемблере, запускаємо KWdsm. Визначимося, що будемо шукати:
1) Illegal Registration Code!
2) Unregistered Copy (DEMO)
3) QSetup Composer (DEMO)
Отже після того, як знайдені ці фрази, і знайдені ближні функції (я завжди шукаю ближні переходи функції, тобто je, jne, jmp;):
Illegal Registration Code! - jne 0051D4FB
Unregistered Copy - jmp 0051D369
QSetup Composer - jne 0051DBA8
Ще раз поясню, ми шукали опорні точки для злому, тобто якщо нам не вдасться знайти помилку по функції, то ми будемо використовувати знайдені за допомогою DASM'a.Танцуем далі, запускаємо олли. Просто для інтересу спробуємо знайти по функції:
bpx MessageBoxA
і нічого не знаходимо, отже не дарма ми шукали фрази в дасме) .Фраза нумбер один:
0051D4DF |. 75 1A JNZ SHORT QSetup.0051D4FB
Ця функція нам не цікава так як її призначення вивести:
0051D510 |. BA 70D65100 MOV EDX, QSetup.0051D670; ASCII "You must have ADMINISTRATOR rights to Register!"
=> Ми досліджуємо код вище:
  0051D47A |.  84DB TEST BL, BL
 0051D47C 74 57 JE SHORT QSetup.0051D4D5 0051D47E |.  E8 25B2FBFF CALL QSetup.004D86A8
 0051D483 |.  84C0 TEST AL, AL
 0051D485 74 0D JE SHORT QSetup.0051D494 0051D487 |.  8D45 FC LEA EAX, DWORD PTR SS: [EBP-4]
 0051D48A |.  BA 80D55100 MOV EDX, QSetup.0051D580;  ASCII "QSetup PRO Registered OK!"
 0051D48F |.  E8 0077EEFF CALL QSetup.00404B94
 0051D494 |> E8 A7B1FBFF CALL QSetup.004D8640
 0051D499 |.  84C0 TEST AL, AL
 0051D49B |.  74 0D JE SHORT QSetup.0051D4AA
 0051D49D |.  8D45 FC LEA EAX, DWORD PTR SS: [EBP-4]
 0051D4A0 |.  BA A4D55100 MOV EDX, QSetup.0051D5A4;  ASCII "QSetup LITE Registered OK!"
 0051D4A5 |.  E8 EA76EEFF CALL QSetup.00404B94
 0051D4AA |> 68 C8D55100 PUSH QSetup.0051D5C8;  ASCII "| & OK | & Cancel | & Yes | & No | & Abort | & Retry | & Ignore |"
 0051D4AF |.  6A 00 PUSH 0
 0051D4B1 |.  8D45 F8 LEA EAX, DWORD PTR SS: [EBP-8]
 0051D4B4 |.  8B4D FC MOV ECX, DWORD PTR SS: [EBP-4]
 0051D4B7 |.  BA 00D65100 MOV EDX, QSetup.0051D600;  ASCII "Congratulations
 

" 0051D4BC |. E8 4779EEFF CALL QSetup.00404E08 0051D4C1 |. 8B55 F8 MOV EDX, DWORD PTR SS: [EBP-8] 0051D4C4 |. B9 28D65100 MOV ECX, QSetup.0051D628; ASCII "Attention" 0051D4C9 |. B8 01000000 MOV EAX, 1 0051D4CE |. E8 39B1F7FF CALL QSetup.0049860C 0051D4D3 |. EB 61 JMP SHORT QSetup.0051D536 0051D4D5 |> 8B45 FC MOV EAX, DWORD PTR SS: [EBP-4] 0051D4D8 |. E8 2BACFBFF CALL QSetup.004D8108 0051D4DD |. 84C0 TEST AL, AL 0051D4DF 75 1A JNZ SHORT QSetup.0051D4FB 0051D4E1 |. 68 C8D55100 PUSH QSetup.0051D5C8; ASCII "| & OK | & Cancel | & Yes | & No | & Abort | & Retry | & Ignore |" 0051D4E6 |. 6A 00 PUSH 0 0051D4E8 |. B9 3CD65100 MOV ECX, QSetup.0051D63C; ASCII "Error" 0051D4ED |. BA 4CD65100 MOV EDX, QSetup.0051D64C; ASCII "Illegal Registration Code!"

Не знаю як вас, але мене зацікавили рядки:
 0051D47C 74 57 JE SHORT QSetup.0051D4D5
 0051D485 74 0D JE SHORT QSetup.0051D494
Розберемося куди вони ведуть, як відіv, що в 1 місце, а саме:
 0051D4D5 |> 8B45 FC MOV EAX, DWORD PTR SS: [EBP-4]
Можна зрозуміти, що цей перехід йде до фрази Illegal Registration Code!
Змінимо відразу 2 переходу, так як якщо ми змінимо 1, то ніякого ефекту не буде:
 0051D47C 74 57 JNE SHORT QSetup.0051D4D5
 0051D485 74 0D JNE SHORT QSetup.0051D494
Отже, змінивши висновки функцій, отримаємо:
QSetup PRO Registered OK!
Але радіти рано, оскільки 2 інші захисту не зламані, і якщо навіть ми будемо бачити веселе вікно про те, що програма зареєстрована, це буде не так, тому що 2 інші написи на місці.
Займемося ними, на черзі jmp 0051D369, що не будемо зволікати і одразу ж звернемо увагу на код вище цієї функції:
  0051D2F3 |.  84C0 TEST AL, AL
 0051D2F5 |.
  74 4F JE SHORT QSetup.0051D346 0051D2F7 |.  E8 ACB3FBFF CALL QSetup.004D86A8
 0051D2FC |.  84C0 TEST AL, AL
 0051D2FE |.
  74 0D JE SHORT QSetup.0051D30D

 0051D300 |.  8D45 FC LEA EAX, DWORD PTR SS: [EBP-4]
 0051D303 |.  BA 94D35100 MOV EDX, QSetup.0051D394;  ASCII "Registered Copy (PRO)"
 0051D308 |.  E8 8778EEFF CALL QSetup.00404B94
 0051D30D |> E8 2EB3FBFF CALL QSetup.004D8640
 0051D312 |.  84C0 TEST AL, AL
 0051D314 |.  74 0D JE SHORT QSetup.0051D323
 0051D316 |.  8D45 FC LEA EAX, DWORD PTR SS: [EBP-4]
 0051D319 |.  BA B4D35100 MOV EDX, QSetup.0051D3B4;  ASCII "Registered Copy (LITE)"
 0051D31E |.  E8 7178EEFF CALL QSetup.00404B94
 0051D323 |> 8B55 FC MOV EDX, DWORD PTR SS: [EBP-4]
 0051D326 |.  8B83 DC060000 MOV EAX, DWORD PTR DS: [EBX + 6DC]
 0051D32C |.  E8 6379F5FF CALL QSetup.00474C94
 0051D331 |.  8B83 DC060000 MOV EAX, DWORD PTR DS: [EBX + 6DC]
 0051D337 |.  8B40 68 MOV EAX, DWORD PTR DS: [EAX + 68]
 0051D33A |.  BA 180000FF MOV EDX, FF000018
 0051D33F |.  E8 989CF0FF CALL QSetup.00426FDC
 0051D344 |.  EB 23 JMP SHORT QSetup.0051D369
 0051D346 |> BA D4D35100 MOV EDX, QSetup.0051D3D4;  ASCII "Unregistered Copy (DEMO)"
Бачимо типову захист, але вже простіше, ця функція JE SHORT QSetup.0051D346, якщо введений СН буде не вірний, виведе нас вікно: Unregistered Copy (DEMO), і т.д.Поетому змінимо функції на:
 0051D2F5 75 4F JNZ SHORT QSetup.0051D346
 0051D2FE 75 0D JNZ SHORT QSetup.0051D30D
Тепер вже 2 простих алгоритму захисту програми зламано, залишився один. Йдемо на знайдену функцію в дасме: jne 0051DBA8.Смотрім код в сукупності, він відповідає за те, щоб вивести у вікні програми DEMO:
 0051DBCB |.  8D45 FC LEA EAX, DWORD PTR SS: [EBP-4]
 0051DBCE |.  BA C4DC5100 MOV EDX, QSetup.0051DCC4;  ASCII "QSetup Composer"
 0051DBD3 |.  E8 3072EEFF CALL QSetup.00404E08
 0051DBD8 |.  8B55 FC MOV EDX, DWORD PTR SS: [EBP-4]
 0051DBDB |.  A1 40E25400 MOV EAX, DWORD PTR DS: [54E240]
 0051DBE0 |.  8B00 MOV EAX, DWORD PTR DS: [EAX]
І їй байдужа петля йде раніше:
 0051DBA8 |> 6A 00 / PUSH 0
 0051DBAA |.  6A 00 | PUSH 0
 0051DBAC |.  49 | DEC ECX
 0051DBAD |. ^ 75 F9 \ JNZ SHORT QSetup.0051DBA8
Все йде до того, що є ще якийсь алгоритм перевірки який ми не помітили. Тепер нам потрібно знову відкрити програму в дасме.После відкриття знову ж шукаємо фразу QSetup Composer і відразу ж впадає в очі:
0051DBC3 |. E8 48ABFBFF CALL QSetup.004D8710
Виконаємо цей call, просто шляхом натискання на кнопку call в панелі інструментів.
Опиняємося тут:
  004D8710 / $ 53 PUSH EBX
 004D8711 |.  8BD8 MOV EBX, EAX
 004D8713 |.  8BC3 MOV EAX, EBX
 004D8715 |.  BA 54874D00 MOV EDX, QSetup.004D8754;  ASCII "DEMO"
 004D871A |.  E8 31C4F2FF CALL QSetup.00404B50
 004D871F |.  E8 84FFFFFF CALL QSetup.004D86A8
 004D8724 |.  84C0 TEST AL, AL
 004D8726 |.
  74 0C JE SHORT QSetup.004D8734

 004D8728 |.  8BC3 MOV EAX, EBX
 004D872A |.  BA 64874D00 MOV EDX, QSetup.004D8764;  ASCII "PRO"
 004D872F |.  E8 1CC4F2FF CALL QSetup.00404B50
 004D8734 |> E8 07FFFFFF CALL QSetup.004D8640
 004D8739 |.  84C0 TEST AL, AL
 004D873B |.  74 0C JE SHORT QSetup.004D8749
 004D873D |.  8BC3 MOV EAX, EBX
 004D873F |.  BA 70874D00 MOV EDX, QSetup.004D8770;  ASCII "LITE"
 004D8744 |.  E8 07C4F2FF CALL QSetup.00404B50
 004D8749 |> 5B POP EBX
 004D874A \.  C3 RETN
Знову ж знайома конструкція захисту, і тепер тільки залишається змінити JE 004D8734 на JNE 004D8734 і програмою з верхнього вікна пише PRO) Ось і вся проста захист. Тепер нам залишилося тільки пропатчити програму, можна з помощю hiew 'a.Патчіть потрібно функції за адресами:
0051D47C, 0051D485, 0051D2F5, 0051D2FE, 004D8726 все je потрібно змінити на jne і програма буде вічно вважати себе зареєстрованої.
Після пропатчіванія програми можна зробити патч за допомогою ТПЕ (про це я розповідав в попередніх статтях так що не буду повторюватися)
Програма зламана, патч створений ...