supercleaner註冊演算法分析
【破解作者】 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
總結一下,這個註冊碼演算法比較簡單,這裡獻醜了!時間倉湊,不管了,過年去了先!大家新年快樂!萬事如意!!!!!!!
--------------------------------------------------------------------------------
【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝
相關文章
- SuperCleaner 2.31註冊碼演算法分析 - OCG (13千字)2002-04-02演算法
- SpeedFlash註冊演算法分析(VB)2015-11-15演算法
- 財智老闆通3.04註冊版---註冊演算法分析2003-03-16演算法
- Instant Source 註冊演算法分析+註冊器原始碼2015-11-15演算法原始碼
- Screen Demo Maker 3.0 註冊演算法分析2003-07-15演算法
- <<Anti-Hack>> 2.0註冊演算法分析2003-06-06演算法
- Personal Antispy 1.14 註冊演算法分析2015-11-15演算法
- 冰盾濾鏡註冊演算法分析2015-11-15演算法
- SuperCleaner演算法分析----菜鳥級
(12千字)2015-11-15演算法
- DLL Show V4.4 註冊演算法分析2015-11-15演算法
- Disk
Chief 1.2 簡單註冊演算法分析2015-11-15演算法
- E族百變桌面6.0註冊演算法分析2015-11-15演算法
- FolderView 1.7
註冊演算法分析 (14千字)2015-11-15View演算法
- ffmpeg分析系列之一(註冊該註冊的)2010-11-04
- LanSee 註冊演算法2015-11-15演算法
- 新狐傳真群發2.0註冊演算法分析2003-06-29演算法
- 網路精確時鐘 2.25註冊演算法分析2003-07-30演算法
- 重新貼過註冊演算法分析 (16千字)2001-10-23演算法
- 長沙vod點歌系統(註冊演算法分析)2015-11-15演算法
- Netscan pro 3.3 註冊演算法分析全過程2015-11-15演算法
- 公務員之路3.0註冊分析2015-11-15
- 東晨庫管網路版 6.5註冊演算法分析2003-08-14演算法
- EffeTech HTTP Sniffer 3.2註冊演算法分析 (5千字)2002-06-24HTTP演算法
- Green Tea 2.60註冊碼演算法分析 (3千字)2000-07-17演算法
- VB控制元件21Hex DockIt註冊演算法分析2015-11-15控制元件演算法
- [原創]Focus
Magic V3.01 註冊演算法分析2015-11-15演算法
- 海嘯錄音機Ver2.1註冊演算法分析2015-11-15演算法
- 財智家庭理財V3.30註冊演算法分析2003-08-19演算法
- Registry Crawler 4.0註冊碼演算法分析 - OCG
(20千字)2002-04-07演算法
- UltraEdit-32
10註冊碼演算法分析 (19千字)2003-05-17演算法
- AZR註冊流程分析及疑問(BlowFish演算法) (699字)2001-11-03演算法
- 完美解除安裝6.0註冊演算法分析 (2千字)2002-02-27演算法
- Directory Scanner v1.5 註冊演算法分析 (6千字)2015-11-15演算法
- 海月圖片獵手(SeaMoon Pic Hunter) 1.52 註冊演算法分析2015-11-15演算法
- MouseStar V3.01註冊演算法分析 (18千字)2015-11-15演算法
- **********.exe註冊碼演算法分析--高手莫笑 (31千字)2015-11-15演算法
- Theme Builder註冊碼分析2015-11-15UI
- ShadowDefender 註冊碼 分析2024-08-17