Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   Исследование HomeAudiometer v1.83 (https://forum.antichat.xyz/showthread.php?t=23843)

ProTeuS 12.09.2006 14:22

Исследование HomeAudiometer v1.83
 
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!

SladerNon 12.09.2006 16:23

Мощно!. %)

Чувствую, что написанно с любовью,

жаль тока что ничего не понимаю :)


Время: 03:31