PDA

Просмотр полной версии : Исследование Registry Booster v1.1


ProTeuS
22.08.2006, 04:56
Пациент - программа 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:


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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%d Errors Found.</td></tr><tr><td height="40"><font color = #C60F0F><b>Trial Version Removal:</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This Trial Version will remove up to 15 errors.</font></td></tr><tr><td height="40"><font color = #C60F0F><b>Remaining Errors:</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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)

имеем едиственный вызов


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


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!