Авторские статьи Исследование HomeAudiometer v1.83

Discussion in 'Статьи' started by ProTeuS, 12 Sep 2006.

  1. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    HomeAudiometer v1.83

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

    Code:
    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). Я выбрал такой кусок кода, выполняющий лишнюю проверку на лицензию по стране.

    Code:
    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, и добавил наш патч:

    Code:
    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. Ставим на нее бряк и присотанавливаемся тут:

    Code:
    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
    
    состоянии стека на момент вызова
    Code:
    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!
     
    6 people like this.
  2. SladerNon

    SladerNon Адам

    Joined:
    6 Mar 2005
    Messages:
    1,636
    Likes Received:
    938
    Reputations:
    355
    Мощно!. %)

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

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