supercleaner註冊演算法分析

看雪資料發表於2015-11-15

【破解作者】 mejy【BCG】【DFCG】【FCG】
【作者郵箱】 yjychao@sohu.com
【使用工具】 OD,FI,W32ASM
【破解平臺】 Win9x/NT/2000/XP
【軟體名稱】 supercleaner
【下載地址】 http://www.southbaypc.com/download/CleanSetup.exe
【軟體簡介】 一款系統清理軟體
註冊演算法較為簡單,獻醜了!
【軟體大小】 386
【加殼方式】 無
【破解宣告】 我是一隻小菜鳥,偶得一點心得,願與大家分享:)
--------------------------------------------------------------------------------
【破解內容】


這是一個國外軟體,下載安裝後用FI檢測,是VC作品,沒有加殼。我們先執行一下看看註冊方式,程式啟動進入NAG,30天限制,然後點選ENTER Registration,輸入試練碼
NAME:mejy
CODE:888888888888888888888888
點確定後提示,"sorry,you have enter an incorrect registration code!"好了,這是線索,我們再用W32ASM反彙編,看看大體的程式流程,檢視字串參考,找到上面的內容,雙擊來到這裡姑且不表,先看利用OD直接找程式註冊關鍵位置,
操作步驟:
用OD載入目標程式;F9執行程式,點選Enter Registration,輸入試練資訊,先別點選"OK",返回OD,點選滑鼠右鍵,選擇"搜尋DD當前模組中的名稱",查詢GetDlgItemTextA函式,這個是Windows的常用斷點,然後在此函式上右鍵選擇"查詢匯入參考",可以看見有幾個地方對他進行了呼叫,不管他因為我們尚且不知具體是哪一個與註冊碼有關,於是用在每個命令中設定斷點,好了之後,點選來到目標程式,點選"OK"按鈕,程式回到OD,斷在下面的地方:
0041912E   . 8B3D CCA34200  MOV EDI,DWORD PTR DS:[<&USER32.GetDlgIte>;  USER32.GetDlgItemTextA
00419134   . 8D8C24 0801000>LEA ECX,DWORD PTR SS:[ESP+108]
0041913B   . 68 00010000    PUSH 100                   ; /Count = 100 (256.)
00419140   . 51             PUSH ECX                         ; |Buffer
00419141   . 68 17040000    PUSH 417                      ; |ControlID = 417 (1047.)
00419146   . 56             PUSH ESI                                 ; |hWnd
00419147   . FFD7           CALL EDI                 ; GetDlgItemTextA
00419149   . 8D5424 08      LEA EDX,DWORD PTR SS:[ESP+8]
0041914D   . 68 00010000    PUSH 100            ; /Count = 100 (256.)
00419152   . 52             PUSH EDX                        ; |Buffer
00419153   . 68 F3030000    PUSH 3F3                   ; |ControlID = 3F3 (1011.)
00419158   . 56             PUSH ESI                         ; |hWnd
00419159   . FFD7           CALL EDI                ; GetDlgItemTextA
0041915B   . E8 A0ECFFFF    CALL SuperCle.00417E00
00419160   . 85C0           TEST EAX,EAX
00419162   . 5F             POP EDI
00419163   . 75 5C          JNZ SHORT SuperCle.004191C1
00419165   . 8D4424 04    LEA EAX,DWORD PTR SS:[ESP+4]  資料傳送指令取CODE
00419169   . 8D8C24 0401000>LEA ECX,DWORD PTR SS:[ESP+104] 取使用者名稱NAME
00419170   . 50             PUSH EAX將試練碼入棧Code
00419171   . 51             PUSH ECX將使用者名稱入棧Name
00419172   . E8 89050000    CALL SuperCle.00419700 
 這個call應該是對使用者名稱和註冊碼進行比較或者變形的關鍵函式,當然或許你第一次並不知道,但是走過一遍之後,你就應該鎖定該目標,對於一般的軟體我現在認為只要你能找到關鍵CALL,那麼應該成功了一半,那些BT的演算法,還是留給高手把,我們跟進這個CALL見後面
00419177   . 83C4 08        ADD ESP,8
0041917A   . 85C0           TEST EAX,EAX  測試是否是正確的註冊碼
0041917C   . 74 43          JE SHORT SuperCle.004191C1  跳走則失敗!交錢!^_^
0041917E   . 8D5424 04      LEA EDX,DWORD PTR SS:[ESP+4]
00419182   . 8D8424 0401000>LEA EAX,DWORD PTR SS:[ESP+104]
00419189   . 52             PUSH EDX
0041918A   . 50             PUSH EAX
0041918B   . 68 78184300    PUSH SuperCle.00431878                   ;  ASCII "SoftwareSuperCleanerRegistration"   將正確地註冊資訊寫入登錄檔
00419190   . 68 01000080    PUSH 80000001
00419195   . E8 E6050000    CALL SuperCle.00419780
0041919A   . 68 78184300    PUSH SuperCle.00431878                   ;  ASCII "SoftwareSuperCleanerRegistration"
0041919F   . 68 01000080    PUSH 80000001
004191A4   . E8 A7030000    CALL SuperCle.00419550
004191A9   . 83C4 18        ADD ESP,18
004191AC   . 6A 01          PUSH 1                                   ; /Result = 1
004191AE   . 56             PUSH ESI                                 ; |hWnd
004191AF   . FF15 68A34200  CALL DWORD PTR DS:[<&USER32.EndDialog>]  ; EndDialog
004191B5   . 33C0           XOR EAX,EAX
004191B7   . 5E             POP ESI
004191B8   . 81C4 00020000  ADD ESP,200
004191BE   . C2 1000        RETN 10
※  ※※※※※※※※※※※※關鍵註冊碼計算函式※※※※※※※※※※※※※※※※
00419700  /$ 81EC 00010000  SUB ESP,100
00419706  |. 53             PUSH EBX
00419707  |. 8B9C24 0801000>MOV EBX,DWORD PTR SS:[ESP+108]
0041970E  |. 53             PUSH EBX
0041970F  |. E8 FCEFFFFF    CALL SuperCle.00418710
00419714  |. 83C4 04        ADD ESP,4
00419717  |. 85C0           TEST EAX,EAX
00419719  |. 74 0A          JE SHORT SuperCle.00419725
0041971B  |. 33C0           XOR EAX,EAX
0041971D  |. 5B             POP EBX
0041971E  |. 81C4 00010000  ADD ESP,100
00419724  |. C3             RETN
00419725  |> A0 18554300    MOV AL,BYTE PTR DS:[435518]
0041972A  |. 56             PUSH ESI
0041972B  |. 57             PUSH EDI
0041972C  |. 884424 0C      MOV BYTE PTR SS:[ESP+C],AL
00419730  |. B9 3F000000    MOV ECX,3F
00419735  |. 33C0           XOR EAX,EAX
00419737  |. 8D7C24 0D      LEA EDI,DWORD PTR SS:[ESP+D]
0041973B  |. 33F6           XOR ESI,ESI
0041973D  |. F3:AB          REP STOS DWORD PTR ES:[EDI]
0041973F  |. 66:AB          STOS WORD PTR ES:[EDI]
00419741  |. 8D4C24 0C      LEA ECX,DWORD PTR SS:[ESP+C]
00419745  |. 51             PUSH ECX
00419746  |. 53             PUSH EBX
00419747  |. AA             STOS BYTE PTR ES:[EDI]
00419748  |. E8 B3000000    CALL SuperCle.00419800  該call是計算註冊碼的關鍵
怎麼來得,呵呵多跟幾次就知道了!看下面※※※※※
0041974D  |. 8B8424 1C01000>MOV EAX,DWORD PTR SS:[ESP+11C]
00419754  |. 8D5424 14      LEA EDX,DWORD PTR SS:[ESP+14]
00419758  |. 52             PUSH EDX 正確地註冊碼
00419759  |. 50             PUSH EAX 你輸入的錯誤註冊碼
0041975A  |. E8 51FFFFFF    CALL SuperCle.004196B0  這個call應該就是比較了,可跟進看一下,大體是先比較長度,若試練碼長度和正確註冊碼長度相等再,逐位比較!
0041975F  |. 83C4 10        ADD ESP,10
00419762  |. 85C0           TEST EAX,EAX
00419764  |. 74 05          JE SHORT SuperCle.0041976B
00419766  |. BE 01000000    MOV ESI,1
0041976B  |> 8BC6           MOV EAX,ESI
0041976D  |. 5F             POP EDI
0041976E  |. 5E             POP ESI
0041976F  |. 5B             POP EBX
00419770  |. 81C4 00010000  ADD ESP,100
00419776  . C3             RETN
※  ※※※※※計算註冊碼的關鍵call※※※※※※※※※※※※※※※※※※※
00419800  /$ 81EC 00010000  SUB ESP,100
00419806  |. A0 18554300    MOV AL,BYTE PTR DS:[435518]
0041980B  |. 53             PUSH EBX   NAME入棧
0041980C  |. 55             PUSH EBP  
0041980D  |. 56             PUSH ESI
0041980E  |. 57             PUSH EDI
0041980F  |. 884424 10      MOV BYTE PTR SS:[ESP+10],AL
00419813  |. B9 3F000000    MOV ECX,3F
00419818  |. 33C0           XOR EAX,EAX
0041981A  |. 8D7C24 11      LEA EDI,DWORD PTR SS:[ESP+11]
0041981E  |. F3:AB          REP STOS DWORD PTR ES:[EDI]
00419820  |. 66:AB          STOS WORD PTR ES:[EDI]
00419822  |. AA             STOS BYTE PTR ES:[EDI]
00419823  |. 8BBC24 1401000>MOV EDI,DWORD PTR SS:[ESP+114]
0041982A  |. 57             PUSH EDI                                 ; /String
0041982B  |. FF15 CCA24200  CALL DWORD PTR DS:[<&KERNEL32.lstrlenA>] ; lstrlenA
這裡是得到註冊使用者名稱的長度,作為下面的迴圈次數;
00419831  |. 8BF0           MOV ESI,EAX
00419833  |. 33C9           XOR ECX,ECX
00419835  |. 33C0           XOR EAX,EAX
00419837  |. 85F6           TEST ESI,ESI
00419839  |. 7E 13          JLE SHORT SuperCle.0041984E
0041983B  |. 8B15 141D4300  MOV EDX,DWORD PTR DS:[431D14]
這裡將程式固定的資料0x26入棧,註冊碼的第一部分利用這個進行變換
00419841  |> 0FBE1C38       /MOVSX EBX,BYTE PTR DS:[EAX+EDI
 取使用者名稱的第I個字元 ,ECX初始值為0;
00419845  |. 03DA           |ADD EBX,EDX 將NAMe每一個字元與EDX=0x26相加
00419847  |. 03CB           |ADD ECX,EBX  ECX中儲存計算結果
00419849  |. 40             |INC EAX          ++I;
0041984A  |. 3BC6           |CMP EAX,ESI
0041984C  |.^7C F3          JL SHORT SuperCle.00419841  
上面那個迴圈是計算註冊碼的第一部分
上面迴圈對應的C++語言表達為:
for(i=0;I<strlen(name);I++)//sum=0,temp=0;edx=0x26;*name={輸入的使用者名稱}
{
 temp=edx+name[i];
 sum+=temp;
}
0041984E  |> 8B9C24 1801000>MOV EBX,DWORD PTR SS:[ESP+118]
00419855  |. 51             PUSH ECX                                 ; /<%ld>
00419856  |. 68 34224300    PUSH SuperCle.00432234               ; |Format = "%ld-"
格式化字串將上面的結果轉化為十進位制並轉化為字串形式,並在其後面加上字元"-"
0041985B  |. 53             PUSH EBX                                 ; |s
0041985C  |. FF15 80A34200  CALL DWORD PTR DS:[<&USER32.wsprintfA>]  ; wsprintfA
00419862  |. 83C4 0C        ADD ESP,0C
00419865  |. 33C9           XOR ECX,ECX  將ECX中清零
00419867  |. 33C0           XOR EAX,EAX
00419869  |. 85F6           TEST ESI,ESI
0041986B  |. 7E 14          JLE SHORT SuperCle.00419881
下面開始計算註冊碼的第二部分
0041986D  |. 8B15 181D4300  MOV EDX,DWORD PTR DS:[431D18]
431D18中存的是0x34,第二部分註冊碼變換的基礎  
00419873  |> 0FBE2C38       /MOVSX EBP,BYTE PTR DS:[EAX+EDI]依次取每一位註冊碼
00419877  |. 0FAFEA         |IMUL EBP,EDX  將每一位註冊碼和EDX=0x34相乘
0041987A  |. 03CD           |ADD ECX,EBP  上面的計算結果累加
0041987C  |. 40             |INC EAX
0041987D  |. 3BC6           |CMP EAX,ESI  看取完沒有
0041987F  |.^7C F2          JL SHORT SuperCle.00419873
這一段對應的C++語言程式碼
for(I=0;I<strlen(name);I++)  註釋初始條件//edx=0x34,ECX=0;
{
temp=edx*name[i];
ECX+=temp;
}
00419881  |> 51             PUSH ECX                                 ; /<%ld>
00419882  |. 8D4C24 14      LEA ECX,DWORD PTR SS:[ESP+14]            ; |
00419886  |. 68 34224300    PUSH SuperCle.00432234         ; |Format = "%ld-"
0041988B  |. 51             PUSH ECX                                 ; |s
0041988C  |. FF15 80A34200  CALL DWORD PTR DS:[<&USER32.wsprintfA>]  ; wsprintfA        //同樣轉化字串
00419892  |. 83C4 0C        ADD ESP,0C
00419895  |. 8D5424 10      LEA EDX,DWORD PTR SS:[ESP+10]
00419899  |. 52             PUSH EDX                    ; /StringToAdd
0041989A  |. 53             PUSH EBX                  ; |ConcatString
0041989B  |. FF15 B4A24200  CALL DWORD PTR DS:[<&KERNEL32.lstrcatA>] ; lstrcatA
連線上面的三部分字串
004198A1  |. 33C9           XOR ECX,ECX   清零
004198A3  |. 33C0           XOR EAX,EAX 
004198A5  |. 85F6           TEST ESI,ESI
004198A7  |. 7E 13          JLE SHORT SuperCle.004198BC
下面計算註冊碼的第三部分
004198A9  |. 8B15 1C1D4300  MOV EDX,DWORD PTR DS:[431D1C]
431D1C中儲存的是0xC作為第三部分計算的基礎,
004198AF  |> 0FBE2C38   /MOVSX EBP,BYTE PTR DS:[EAX+EDI] 依次取使用者名稱的每位
004198B3  |. 03EA           |ADD EBP,EDX  每一位和0xC相加
004198B5  |. 03CD           |ADD ECX,EBP  儲存累加結果
004198B7  |. 40             |INC EAX
004198B8  |. 3BC6           |CMP EAX,ESI
004198BA  |.^7C F3          JL SHORT SuperCle.004198AF
004198BC  |> 51             PUSH ECX                                 ; /<%ld>
004198BD  |. 8D4424 14      LEA EAX,DWORD PTR SS:[ESP+14]            ; |
004198C1  |. 68 34224300    PUSH SuperCle.00432234              ; |Format = "%ld-"
格式化字串
004198C6  |. 50             PUSH EAX                                 ; |s
004198C7  |. FF15 80A34200  CALL DWORD PTR DS:[<&USER32.wsprintfA>]  ; wsprintfA
004198CD  |. 83C4 0C        ADD ESP,0C
004198D0  |. 8D4C24 10      LEA ECX,DWORD PTR SS:[ESP+10]
004198D4  |. 51             PUSH ECX                   ; /StringToAdd
004198D5  |. 53             PUSH EBX                    ; |ConcatString
004198D6  |. FF15 B4A24200  CALL DWORD PTR DS:[<&KERNEL32.lstrcatA>] ; lstrcatA
將上面三部分連線起來
004198DC  |. 33C9           XOR ECX,ECX    清零
004198DE  |. 33C0           XOR EAX,EAX
004198E0  |. 85F6           TEST ESI,ESI
004198E2  |. 7E 14          JLE SHORT SuperCle.004198F8
004198E4  |. 8B15 201D4300  MOV EDX,DWORD PTR DS:[431D20]
431D20中的資料為0xE,作為註冊碼第四部分變換的基礎
004198EA  |> 0FBE2C38    /MOVSX EBP,BYTE PTR DS:[EAX+EDI]依次取使用者名稱每一位
004198EE  |. 0FAFEA         |IMUL EBP,EDX   ebp=ebp*edx
004198F1  |. 03CD           |ADD ECX,EBP     ecx+=ebp;
004198F3  |. 40             |INC EAX
004198F4  |. 3BC6           |CMP EAX,ESI
004198F6  |.^7C F2          JL SHORT SuperCle.004198EA   迴圈結束
004198F8  |> 51             PUSH ECX                                 ; /<%ld>
004198F9  |. 8D5424 14      LEA EDX,DWORD PTR SS:[ESP+14]            ; |
004198FD  |. 68 30224300    PUSH SuperCle.00432230                   ; |Format = "%ld"  最後一個後面不加"-"
00419902  |. 52             PUSH EDX                                 ; |s
00419903  |. FF15 80A34200  CALL DWORD PTR DS:[<&USER32.wsprintfA>]  ; wsprintfA            格式化字串
00419909  |. 83C4 0C        ADD ESP,0C
0041990C  |. 8D4424 10      LEA EAX,DWORD PTR SS:[ESP+10]
00419910  |. 50             PUSH EAX                     ; /StringToAdd
00419911  |. 53             PUSH EBX                      ; |ConcatString
00419912  |. FF15 B4A24200  CALL DWORD PTR DS:[<&KERNEL32.lstrcatA>] ; lstrcatA
連線上面計算的四個部分。形成註冊碼
00419918  |. 5F             POP EDI
00419919  |. 5E             POP ESI
0041991A  |. 5D             POP EBP
0041991B  |. 5B             POP EBX
0041991C  |. 81C4 00010000  ADD ESP,100
00419922  . C3             RETN    
計算結束註冊資訊儲存在:HKEY_CURRENT_USER softwareSuperCleaner egistration裡面。


--------------------------------------------------------------------------------
【破解總結】
NAME: mejy
Code:589-22724-485-6118


總結一下,這個註冊碼演算法比較簡單,這裡獻醜了!時間倉湊,不管了,過年去了先!大家新年快樂!萬事如意!!!!!!!

--------------------------------------------------------------------------------
【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝

相關文章