• XSS.stack #1 – первый литературный журнал от юзеров форума

Исследование HomeAudiometer v1.83

ProTeuS

RAID-массив
Пользователь
Регистрация
22.07.2006
Сообщения
54
Реакции
1
HomeAudiometer v1.83

Грузим программу в PEID и наблюдаем, что она скомпилена в Borland Delphi 6.0 - 7.0. Тогда загрузим ее в декомпилятор DeDe и попытаемся найти код, проверяющий вводимый регистрационный код в окне "О программе".
Для этого щелкаем в DeDe Unit5 -> OkButtonClick (это метод, срабатывающий при событии щелчка мыши на кнопке проверки введенного ключа ОК).

Код:
0047F1EC   55                     push    ebp
0047F1ED   8BEC                   mov     ebp, esp
0047F1EF   33C9                   xor     ecx, ecx
0047F1F1   51                     push    ecx
0047F1F2   51                     push    ecx
0047F1F3   51                     push    ecx
0047F1F4   51                     push    ecx
0047F1F5   51                     push    ecx
0047F1F6   53                     push    ebx
0047F1F7   56                     push    esi
0047F1F8   8BD8                   mov     ebx, eax
0047F1FA   33C0                   xor     eax, eax
0047F1FC   55                     push    ebp

* Possible String Reference to: 'éšOøÿëÞ^[‹å]Ã'
|
0047F1FD   6821F34700             push    $0047F321

***** TRY
|
0047F202   64FF30                 push    dword ptr fs:[eax]
0047F205   648920                 mov     fs:[eax], esp
0047F208   A158C54800             mov     eax, dword ptr [$0048C558]
0047F20D   803800                 cmp     byte ptr [eax], $00
0047F210   0F85DC000000           jnz     0047F2F2
0047F216   8BC3                   mov     eax, ebx

* Reference to : TfrmAbout._PROC_0047ECC8()
|
0047F218   E8ABFAFFFF             call    0047ECC8
0047F21D   8B1558C54800           mov     edx, [$0048C558]
0047F223   8802                   mov     [edx], al
0047F225   A158C54800             mov     eax, dword ptr [$0048C558]
0047F22A   803801                 cmp     byte ptr [eax], $01
0047F22D   0F859E000000           jnz     0047F2D1

* Reference to TfrmMain instance
|
0047F233   A1C0C64800             mov     eax, dword ptr [$0048C6C0]
0047F238   8B00                   mov     eax, [eax]

* Reference to : TfrmMain.ReadRegistry()
|
0047F23A   E8554F0000             call    00484194
0047F23F   68D0070000             push    $000007D0

Видим, что функция не отрабатывает до конца, если содержимое ячейки памяти $0048C558 нулевое (оно нулевео и в нашем случае).
Если попытаться заменить его на 1 (mov eax, dword ptr [$0048C558], mov byte ptr [eax], $01), то после ввода любого ключа выведется сообщение о
правильности его ввода. Но это придется делать каждый раз при запуске программы, что неудобно. Поэтому патч нужно сделать сразу же после старта программы.
Для этого поищем пустое\ненужное место в округе точки входа файла (.004885A8). Я выбрал такой кусок кода, выполняющий лишнюю проверку на лицензию по стране.

Код:
004885FC     75 26          JNZ SHORT HomeAudi.00488624
004885FE     6A 00          PUSH 0
00488600     0FB70D C087480>MOVZX ECX,WORD PTR DS:[4887C0]
00488607     B2 01          MOV DL,1                                ; |
00488609     B8 CC874800    MOV EAX,HomeAudi.004887CC              ; |ASCII "This Software is not licensed for use in your country."
0048860E     E8 056CFBFF    CALL HomeAudi.0043F218                  ; \HomeAudi.0043F218
00488613     E8 A4C1F7FF    CALL HomeAudi.004047BC
00488618     8B06           MOV EAX,DWORD PTR DS:[ESI]
0048861A     E8 01F2FDFF    CALL HomeAudi.00467820
0048861F     E9 5F010000    JMP HomeAudi.00488783

Весь код я заменил командами nop, и добавил наш патч:

Код:
004885FC     A1 58C54800    MOV EAX,DWORD PTR DS:[48C558]
00488601     C600 01        MOV BYTE PTR DS:[EAX],1
00488604     90             NOP
00488605     90             NOP
00488606     90             NOP
00488607     90             NOP                                    ; |
00488608     90             NOP
00488609     90             NOP                                    ; |
0048860A     90             NOP
0048860B     90             NOP
0048860C     90             NOP
0048860D     90             NOP
0048860E     90             NOP                                    ; \HomeAudi.0043F218
0048860F     90             NOP
00488610     90             NOP
00488611     90             NOP
00488612     90             NOP
00488613     90             NOP
00488614     90             NOP
00488615     90             NOP
00488616     90             NOP
00488617     90             NOP
00488618     90             NOP
00488619     90             NOP
0048861A     90             NOP
0048861B     90             NOP
0048861C     90             NOP
0048861D     90             NOP
0048861E     90             NOP
0048861F     90             NOP
00488620     90             NOP
00488621     90             NOP
00488622     90             NOP
00488623     90             NOP

Запускаем наше приложение. Все функции разблокированы и приложение считает себя полностью зарегистрированным. Вот только во время закрытия каждый раз внезапно происходит
деиснталляция продукта (из-за дублирующей проверки с дополнительной переменной-флагом регистрации). Не будем ковырять весь код, а просто предположим, что деинсталляционный модуль вызывает файл
unins000.exe из папки проги с помощью апи ShellExecute. Ставим на нее бряк и присотанавливаемся тут:

Код:
00487C18  /. 55             PUSH EBP
00487C19  |. 8BEC           MOV EBP,ESP
00487C1B  |. 6A 00          PUSH 0
00487C1D  |. 6A 00          PUSH 0
00487C1F  |. 6A 00          PUSH 0
00487C21  |. 6A 00          PUSH 0
00487C23  |. 6A 00          PUSH 0
00487C25  |. 6A 00          PUSH 0
00487C27  |. 53             PUSH EBX
00487C28  |. 56             PUSH ESI
00487C29  |. 8BF0           MOV ESI,EAX
00487C2B  |. 33C0           XOR EAX,EAX
00487C2D  |. 55             PUSH EBP
00487C2E  |. 68 F57C4800    PUSH HomeAudi.00487CF5
00487C33  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
00487C36  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
00487C39  |. 8D55 F0        LEA EDX,DWORD PTR SS:[EBP-10]
00487C3C  |. A1 F8C74800    MOV EAX,DWORD PTR DS:[48C7F8]
00487C41  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]
00487C43  |. E8 4C02FEFF    CALL HomeAudi.00467E94
00487C48  |. 8B45 F0        MOV EAX,DWORD PTR SS:[EBP-10]
00487C4B  |. 8D55 FC        LEA EDX,DWORD PTR SS:[EBP-4]
00487C4E  |. E8 6118F8FF    CALL HomeAudi.004094B4
00487C53  |. 8D45 F8        LEA EAX,DWORD PTR SS:[EBP-8]
00487C56  |. BA 0C7D4800    MOV EDX,HomeAudi.00487D0C              ;  ASCII " /Silent"
00487C5B  |. E8 E8CCF7FF    CALL HomeAudi.00404948
00487C60  |. 803D 7CC34800 >CMP BYTE PTR DS:[48C37C],1
00487C67  |. 75 6A          JNZ SHORT HomeAudi.00487CD3
00487C69  |. 813D 88EF4800 >CMP DWORD PTR DS:[48EF88],263D9
00487C73  |. 74 5E          JE SHORT HomeAudi.00487CD3
00487C75  |. 33DB           XOR EBX,EBX
00487C77  |> 68 207D4800    /PUSH HomeAudi.00487D20                ;  ASCII "unins00"
00487C7C  |. 8D55 E8        |LEA EDX,DWORD PTR SS:[EBP-18]
00487C7F  |. 8BC3           |MOV EAX,EBX
00487C81  |. E8 1E11F8FF    |CALL HomeAudi.00408DA4
00487C86  |. FF75 E8        |PUSH DWORD PTR SS:[EBP-18]
00487C89  |. 68 307D4800    |PUSH HomeAudi.00487D30                ;  ASCII ".exe"
00487C8E  |. 8D45 EC        |LEA EAX,DWORD PTR SS:[EBP-14]
00487C91  |. BA 03000000    |MOV EDX,3
00487C96  |. E8 95CFF7FF    |CALL HomeAudi.00404C30
00487C9B  |. 8B45 EC        |MOV EAX,DWORD PTR SS:[EBP-14]
00487C9E  |. E8 CDD0F7FF    |CALL HomeAudi.00404D70
00487CA3  |. 8BD0           |MOV EDX,EAX
00487CA5  |. 8D45 F4        |LEA EAX,DWORD PTR SS:[EBP-C]
00487CA8  |. E8 FBCDF7FF    |CALL HomeAudi.00404AA8
00487CAD  |. 6A 05          |PUSH 5
00487CAF  |. 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]
00487CB2  |. 50             |PUSH EAX
00487CB3  |. 8B45 F8        |MOV EAX,DWORD PTR SS:[EBP-8]
00487CB6  |. 50             |PUSH EAX
00487CB7  |. 8B45 F4        |MOV EAX,DWORD PTR SS:[EBP-C]
00487CBA  |. 50             |PUSH EAX
00487CBB  |. 68 387D4800    |PUSH HomeAudi.00487D38                ;  ASCII "open"
00487CC0  |. 8BC6           |MOV EAX,ESI
00487CC2  |. E8 D94CFCFF    |CALL HomeAudi.0044C9A0
00487CC7  |. 50             |PUSH EAX                              ; |hWnd
00487CC8  |. E8 DF1CFBFF    |CALL <JMP.&shell32.ShellExecuteA>      ; \ShellExecuteA
00487CCD  |. 43             |INC EBX
00487CCE  |. 83FB 0A        |CMP EBX,0A
00487CD1  |.^75 A4          \JNZ SHORT HomeAudi.00487C77
00487CD3  |> C605 6CE24800 >MOV BYTE PTR DS:[48E26C],1
00487CDA  |. 33C0           XOR EAX,EAX
00487CDC  |. 5A             POP EDX
00487CDD  |. 59             POP ECX
00487CDE  |. 59             POP ECX
00487CDF  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
00487CE2  |. 68 FC7C4800    PUSH HomeAudi.00487CFC
00487CE7  |> 8D45 E8        LEA EAX,DWORD PTR SS:[EBP-18]
00487CEA  |. BA 06000000    MOV EDX,6
00487CEF  |. E8 E0CBF7FF    CALL HomeAudi.004048D4
00487CF4  \. C3             RETN

состоянии стека на момент вызова
Код:
0012F1D0   001D029E  |hWnd = 001D029E ('Home Audiometer 1.83 licensed...',class='TfrmMain')
0012F1D4   00487D38  |Operation = "open"
0012F1D8   00ACD014  |FileName = "unins000.exe"
0012F1DC   00487D0C  |Parameters = " /Silent"
0012F1E0   00AC8BF0  |DefDir = "C:\Program Files\Home Audiometer\"
0012F1E4   00000005  \IsShown = 5
0012F1E8   0012F3AC  Pointer to next SEH record
0012F1EC   00487CF5  SE handler
0012F1F0   0012F214
0012F1F4   0045F994  HomeAudi.0045F994


00487C60 |. 803D 7CC34800 >CMP BYTE PTR DS:[48C37C],1
00487C67 |. 75 6A JNZ SHORT HomeAudi.00487CD3

Вот это и есть наша дополнительная проверка. Для отломки этой части защиты достаточно заменить
00487C67 |. 75 6A JNZ SHORT HomeAudi.00487CD3
на
00487C67 |. EA 6A JMP SHORT HomeAudi.00487CD3


gl hf!
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх