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!