Пациент - программа Registry Booster v1.1. Думаю, все функции понятны по названию и особого представления делать не нужно. В триал-версии наложено ограни4ение на удаление всего 15 ошибок в реестре. Попытавшись сразу закейгенить\подсмотреть валидный клю4 для сабжа, я обнаружил виртуальные функции, большую захламленность кода в районе проверки клю4ей и решил не тратить много времени попусту и просто пропат4ить нежалаемое ограни4ение (и был прав, ибо в дальнейшем обнаружится, 4то именно тут находится огромнейшая дырища в защите). При проверке реестра и попытке вы4истить все ошибки выдается окно "Thank You for your interest in Registry Booster!" с надписью об ограни4ениях. Я сразу взялся за Resource Explorer (перед этим исполняемый файл был распакован до Microsoft Visual C++ 7.0 [Debug]) и нашел вот такой броский ресурс с идентификатором 241: Code: 241 <body bgcolor=WHITE><font face="MS SANS SERIF" size="8pt" color = BLUE><b>Thank You for your interest in Registry Booster!<br><br></b></Font>To Purchase Registry Booster and repair all System Errors, please click on the "Purchase Online" button below. <br><br> <table border="0" id="table1" cellspacing="0" cellpadding="0"><tr><td height="40"> <b>Total Errors Found:</b> %d Errors Found.</td></tr><tr><td height="40"><font color = #C60F0F><b>Trial Version Removal:</b> This Trial Version will remove up to 15 errors.</font></td></tr><tr><td height="40"><font color = #C60F0F><b>Remaining Errors:</b> To remove the remaining errors purchase the full version.</font></td></tr></table></font></body> Он служит для вывода HTML-нага в окне об превышении найденых ошибок 15 Поищем обращения к ресурсу с заданым идентификатором Ищем в ольке "Search for -> All commands" push 0F1 (поскольку 241 = 0F1h) имеем едиственный вызов Code: 004220F2 |. E8 E4AF0500 CALL Registry.0047D0DB ; \Registry.0047D0DB 004220F7 |. 803D 529B4C00 >CMP BYTE PTR DS:[4C9B52],0 004220FE |. 8DB7 E8020000 LEA ESI,DWORD PTR DS:[EDI+2E8] 00422104 |. 74 14 JE SHORT Registry.0042211A 00422106 |. 6A 00 PUSH 0 00422108 |. 8BCE MOV ECX,ESI 0042210A |. E8 0AB00500 CALL Registry.0047D119 0042210F |. 6A 00 PUSH 0 00422111 |. 8BCE MOV ECX,ESI 00422113 |. E8 3DB00500 CALL Registry.0047D155 00422118 |. EB 20 JMP SHORT Registry.0042213A 0042211A |> 68 F1000000 PUSH 0F1 ; /Arg1 = 000000F1 0042211F |. E8 64A6FEFF CALL Registry.0040C788 ; \Registry.0040C788 00422124 |. 53 PUSH EBX ; /Arg5 00422125 |. 6A 1D PUSH 1D ; |Arg4 = 0000001D 00422127 |. 6A 6E PUSH 6E ; |Arg3 = 0000006E 00422129 |. 68 64010000 PUSH 164 ; |Arg2 = 00000164 0042212E |. 68 17020000 PUSH 217 ; |Arg1 = 00000217 00422133 |. 8BCE MOV ECX,ESI ; | 00422135 |. E8 A1AF0500 CALL Registry.0047D0DB ; \Registry.0047D0DB 0042213A |> 53 PUSH EBX ; /Arg5 0042213B |. 6A 0F PUSH 0F ; |Arg4 = 0000000F 0042213D |. 6A 2D PUSH 2D ; |Arg3 = 0000002D 0042213F |. 6A 49 PUSH 49 ; |Arg2 = 00000049 00422141 |. 68 90010000 PUSH 190 ; |Arg1 = 00000190 00422146 |. 8D8F E4040000 LEA ECX,DWORD PTR DS:[EDI+4E4] ; | 0042214C |. C787 4C050000 >MOV DWORD PTR DS:[EDI+54C],0E8A02B ; | 00422156 |. C787 48050000 >MOV DWORD PTR DS:[EDI+548],0FF0000 ; | 00422160 |. E8 76AF0500 CALL Registry.0047D0DB ; \Registry.0047D0DB 00422165 |. 5E POP ESI 00422166 |. 5D POP EBP 00422167 |. 5B POP EBX 00422168 |. 83C4 10 ADD ESP,10 0042216B \. C3 RETN В глаза сразу бросается проверка 004220F7 |. 803D 529B4C00 >CMP BYTE PTR DS:[4C9B52],0 004220FE |. 8DB7 E8020000 LEA ESI,DWORD PTR DS:[EDI+2E8] 00422104 |. 74 14 JE SHORT Registry.0042211A и я4ейка памяти, которая имеет в нашем слу4ае нулевое зна4ение. Опыт подсказывает, 4то это может быть глобальная переменная BOOL is_registered, отве4ающая за статус прохождения\провала регистрации. Проверим, может она где-нибудь еще употребляется. Find References to -> All address constant Code: References in Registry:.text to 004C9B52 Address Disassembly Comment 00418FA3 CMP BYTE PTR DS:[4C9B52],0 DS:[004C9B52]=00 0041B13C CMP BYTE PTR DS:[4C9B52],0 DS:[004C9B52]=00 0041E05F CMP BYTE PTR DS:[4C9B52],0 DS:[004C9B52]=00 0041F200 CMP BYTE PTR DS:[4C9B52],0 DS:[004C9B52]=00 00421801 MOV AL,BYTE PTR DS:[4C9B52] [004C9B52]=00 00421BE2 MOV AL,BYTE PTR DS:[4C9B52] [004C9B52]=00 00421EA2 CMP BYTE PTR DS:[4C9B52],0 DS:[004C9B52]=00 004220F7 CMP BYTE PTR DS:[4C9B52],0 (Initial CPU selection) 0042566B CMP BYTE PTR DS:[4C9B52],BL 00426C3D CMP BYTE PTR DS:[4C9B52],BL 0042740A CMP BYTE PTR DS:[4C9B52],BL 00427469 CMP BYTE PTR DS:[4C9B52],BL 00427704 CMP BYTE PTR DS:[4C9B52],0 DS:[004C9B52]=00 Стало быть, имеем 11 проверок переменной и 2 операции присваивания ей зна4ения. Это только подтверждает нашу теорию. По природной лени, не желая для подмены зна4ения переменной (в 1) искать место ее инициализации, добавлять код ее перезаписи, я наугад попытался сделать модификацю по адресу .004220F7 в надежде, 4то проверка флага зарегистрированности в других 4астях будет проходить позднее. И я не ошибся =) Правим: 004220F7 803D 529B4C00 >CMP BYTE PTR DS:[4C9B52],0 004220FE 8DB7 E8020000 LEA ESI,DWORD PTR DS:[EDI+2E8] 00422104 74 14 JE SHORT Registry.0042211A 004220F7 C605 529B4C00 >MOV BYTE PTR DS:[4C9B52],1 004220FE 8DB7 E8020000 LEA ESI,DWORD PTR DS:[EDI+2E8] 00422104 90 NOP 00422105 90 NOP и имеем полность зарегистрированную версию безо всяких ограни4ений на коли4ество удаляемых ошибок. gl hl!