HomeAudiometer v1.83
Грузим программу в PEID и наблюдаем, что она скомпилена в Borland Delphi 6.0 - 7.0. Тогда загрузим ее в декомпилятор DeDe и попытаемся найти код, проверяющий вводимый регистрационный код в окне "О программе".
Для этого щелкаем в DeDe Unit5 -> OkButtonClick (это метод, срабатывающий при событии щелчка мыши на кнопке проверки введенного ключа ОК).
Видим, что функция не отрабатывает до конца, если содержимое ячейки памяти $0048C558 нулевое (оно нулевео и в нашем случае).
Если попытаться заменить его на 1 (mov eax, dword ptr [$0048C558], mov byte ptr [eax], $01), то после ввода любого ключа выведется сообщение о
правильности его ввода. Но это придется делать каждый раз при запуске программы, что неудобно. Поэтому патч нужно сделать сразу же после старта программы.
Для этого поищем пустое\ненужное место в округе точки входа файла (.004885A8). Я выбрал такой кусок кода, выполняющий лишнюю проверку на лицензию по стране.
Весь код я заменил командами nop, и добавил наш патч:
Запускаем наше приложение. Все функции разблокированы и приложение считает себя полностью зарегистрированным. Вот только во время закрытия каждый раз внезапно происходит
деиснталляция продукта (из-за дублирующей проверки с дополнительной переменной-флагом регистрации). Не будем ковырять весь код, а просто предположим, что деинсталляционный модуль вызывает файл
unins000.exe из папки проги с помощью апи ShellExecute. Ставим на нее бряк и присотанавливаемся тут:
состоянии стека на момент вызова
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!
Грузим программу в 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!