豪*超級解*別V8+SP1版 怒而解之全過程(新手教程、高手莫入)
[標題] 豪*超級解*別V8+SP1版 怒而解之全過程(新手教程、高手莫入)
[難度] 低
[軟體簡介] 《豪*超級解*V8》是豪*公司在2004年精心製作的解*系列的最新版本!
1、多年專注的DVD糾錯防讀死技術。
2、全格式,全相容--影碟機VCD,無檔案VCD光碟格式支援。
3、新增支援格式MOV、SWF、VQF、DAC、MP3PRO。
4、數字家庭的播放選擇-DV,DC,攝像頭都可以支援播放及截圖。
[軟體來源] 網上下載
[破解工具] olldbg1.10 、Peid0.92、eXeScope 6.00。
[注意事項] 本文繫個人經驗所得,內部交流,不得用於商業用途,否則後果自負!切記,切記!
[作者] chenjiwl
[email]chenjiwl@sina.com
昨日為一好友裝機,非要裝超級解*。然手中無有此軟體,上網查之,有最新版+SP1補丁的
安裝包,下載安裝後執行才知需註冊方可。查註冊碼不得,臉面甚是無光,今日怒而解之。解後
心有所感,遂得此文。
開工!
作戰手冊第一條:收集情報
凡事預則立,不預則廢。先執行軟體,如果沒有註冊將會出現提示註冊的視窗。關閉軟體
開啟軟體安裝目錄,先找可執行檔案:
Directory of D:\HEROSOFT\HeroV8
SYSEXPLR EXE 89,088 06-06-04 20:19 SysExplr.exe
STHSDVD EXE 757,760 06-06-04 20:19 STHSDVD.exe
MOBILE~1 EXE 53,248 06-06-04 20:19 MobilePhoto.exe
WEBPHOTO EXE 53,248 06-06-04 20:19 WebPhoto.exe
JMVKT EXE 102,400 06-06-04 20:19 JmvKT.exe
AUTHREG EXE 61,496 06-06-04 20:19 AuthReg.exe ---->就是這個了!
MMXADO EXE 655,360 06-06-04 20:19 Mmxado.exe
REGEXPLR EXE 94,208 06-06-04 20:19 RegExplr.exe
UNINST32 EXE 150,528 06-06-04 20:19 UNINST32.exe
一眼就看出AuthReg.exe是註冊程式,執行試之果然如此。由此基本上可以確定此軟體註冊成
功後,一定會在登錄檔或INI檔案中留下記號!果然在軟體目錄中發現了AuthReg.Ini,一定要
開啟看看了,查儲存註冊碼的欄位,沒有發現。但是發現,這個檔案儲存了三種語言(英語、
簡體中文、繁體中文)的提示資訊,看來這個軟體應該支援三種語言的介面。
――――――――――――――――――――――――――
[ABOUTINF]
APPICON=
VERSION=看到精彩你就發
VERYEAR=1997-2004
//名冊
//WU
SOFTNAME=Her* Sup*r Player V8 ---> 英文
SOFTNAME936=豪傑超級解霸V8 SP1 ---> 簡體中文
SOFTNAME950=花NW稈QV8 ---> 繁體中文
:
:
:
――――――――――――――――――――――――――
不知大家有沒有注意三種語言之間的標誌區別:
1、英文沒有特殊標誌---SOFTNAME
2、簡體中文在名稱後加了936----SOFTNAME936
3、繁體中文在名稱後加了950----SOFTNAME950
此處放下,暫且不表!
-----------------------------------------------------
確定目標後,立刻用Peid查殼,結果大喜,無殼。
********************************************************
* Peid查殼-------->Microsoft Visual C++ 6.0 [Debug] *
********************************************************
而且可知此程式用VC編寫,很好,很好!
================================================================
進一步分析,再用eXeScope將AuthReg.exe載入分析。
發現問題了,在程式資源中,只有英文對話方塊和字串,沒有中文的?但我們執行的程
序是中文介面啊?
可能程式從AuthReg.ini檔案中讀取中文字串嗎?
先試著把AuthReg.ini檔案改名為AuthReg.ini1。再執行程式,介面依然是中文的!這說
明程式從另一個地方得到了中文資源,最有可能的地方就是DLL檔案了,在目錄中查詢DLL
檔案,很快就發現了二個可疑的檔案。
Auth936.dll ------>簡體中文的資原始檔
Auth950.dll ------>繁體中文的資原始檔
還記得上面我對三種語言之間的標誌區別進行的分析嗎?很清楚了吧。
再用eXeScope將這兩個檔案載入進行分析,果然在Auth936.dll中儲存了簡體中文的界
面資源。
***************************************************************************
一個常識請大家記一下:windows的語言定義中936代表簡體中文,950代表繁體中文
***************************************************************************
到此,對程式的情報收集已經告一段落!下面要動手了!呵呵
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
¥ 人生不如意,十常八九! ¥
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
作戰手冊第二條:打入敵方
現代戰爭,武器的強大往往決定了戰爭的成敗!Olldbg大家都知道吧,絕世好劍啊!
最好用最新版本的,我用1.10版。
武器是好啊,不會用也是白搭。在正式使用Olldbg之前,讓我們先坐下來冷靜的分
析一下:
1、程式如果要使用DLL動態連結庫中的資源,要使用什麼API函式?
2、程式如果要使用對話方塊,應該使用什麼API函式?
3、程式要取得你輸入的註冊資訊,應該使用什麼API函式?
4、程式要取得你所使用的語言,應該使用什麼API函式?
5、程式要儲存你的註冊資訊,應該使用什麼API函式?
在這五個問題沒有得到答案之前,我建議你不要衝動的進行破解。真的!當然,這裡
我先給出答案。至於為什麼?這些函式是什麼意思?請參閱看雪大哥的《加密與解密》第
二版或羅雲彬大哥的《Windows環境32位組合語言程式設計》。兩本書是我輩案頭必備品,
實乃居家旅行之長備良藥啊!!!!!
……………………………………………………………………………………………………
答案:
1、LoadLibraryA-->載入指定的動態連結庫,並將它對映到當前程式使用的地址空間
2、DialogBoxParamA-->從資源模板建立一模態對話窗
備選還有:DialogBox、CreateDialog、CreateDialogParam
3、GetWindowTextA--->從指定控制程式碼的視窗控制元件中讀出字串
備選還有:GetDlgItemText 得指定輸入框輸入字串
4、GetACP------>得到你當前使用的字元內碼表!
5、RegSetValueExA--->設定指定項或子項的值
備選還有:RegSetValue 。。。。。。
……………………………………………………………………………………………………
OK!萬是俱備,只欠東風,你是不是已經很激動了!出發了
……………………………………………………………………………………………………
作戰手冊第三條:勇敢向前
兵熊熊一個,將熊熊一窩!前進的號角已經吹響!各位請拿起武器!
先用olldbg將AutoReg.exe載入,分析程式!
1、在CPU視窗處點右鍵,選擇Search for->Name (Lable) in current module或者直接
按ctrl+N。很快就會出現程式所呼叫的所有API函式,在裡面找出上面我所說的那些函式:
DialogBoxParamA,
GetACP,
GetWindowsTextA,
LoadLibraryA,
RegSetValueExA
可能大家只能找到這五個函式,OK,已經足夠了!請在每一個上面點右鍵並選擇
"Set breakpoint on every reference",這樣當這些函式被呼叫程式會被中斷。按ALT+C回到
CPU視窗,再按F9執行程式。戰爭開始了
很快,程式就斷下來了:004058d7呼叫了GetACP函式。
004058A8 /$ 8B>mov eax, dword ptr ss:[esp+4]
004058AC |. 83>and dword ptr ds:[40CC0C], 0
004058B3 |. 83>cmp eax, -2 ; Switch (cases FFFFFFFC..FFFFFFFE)
004058B6 |. 75>jnz short AUTHREG.004058C8
004058B8 |. C7>mov dword ptr ds:[40CC0C], 1 ; Case FFFFFFFE of switch 004058B3
004058C2 |.- FF>jmp near dword ptr ds:[<&KERNEL32.GetOEMCP>]
004058C8 |> 83>cmp eax, -3
004058CB |. 75>jnz short AUTHREG.004058DD
004058CD |. C7>mov dword ptr ds:[40CC0C], 1 ; Case FFFFFFFD of switch 004058B3
004058D7 |.- FF>jmp near dword ptr ds:[<&KERNEL32.GetACP>] ;***斷在這裡
004058DD |> 83>cmp eax, -4
004058E0 |. 75>jnz short AUTHREG.004058F1
004058E2 |. A1>mov eax, dword ptr ds:[40CC00] ; Case FFFFFFFC of switch 004058B3
004058E7 |. C7>mov dword ptr ds:[40CC0C], 1
004058F1 \> C3 retn ; Default case of switch 004058B3
檢查程式碼,上下都沒什麼可疑之處,不理它,再按F9執行!很快又斷下了。
在00401779處,又是GetACP函式,再看看下面的程式碼,出現了LoadLibraryA函式,可能是要
調入DLL檔案了,小心按F8跟下去!呼叫GetACP後停下,EAX中就是你使用的語言程式碼,我這裡是0x3A8(936)。
看來下面的wsprintfa將會生成dll的檔名了!(如果你將EAX中的值改成0x3B6(950)一定會出現繁體介面)
當你按F8執行到004017A0時在堆疊中就可以看到DLL的檔名了:Auth936.dll
00401771 |. /74>je short AUTHREG.00401779
00401773 |. |8B>mov eax, dword ptr ss:[esp+8]
00401777 |. |EB>jmp short AUTHREG.0040177F
00401779 |> \FF>call near dword ptr ds:[<&KERNEL32.GetACP>] ; [GetACP**斷在這裡
0040177F |> 50 push eax ; / EAX中就是語言程式碼:3A8H(936)
00401780 |. 8D>lea ecx, dword ptr ss:[esp+10] ; |
00401784 |. 68>push AUTHREG.0040A07C ; |Format = "Auth%d.dll"
00401789 |. 51 push ecx ; |/String = NULL**字串緩衝區的地址
0040178A |. A3>mov dword ptr ds:[40F83C], eax ; ||
0040178F |. FF>call near dword ptr ds:[<&KERNEL32.lstrlenA>] ; |\lstrlenA
00401795 |. 8D>lea edx, dword ptr ss:[esp+eax+14] ; |
00401799 |. 52 push edx ; |s = 815DD1E0
0040179A |. FF>call near dword ptr ds:[<&USER32.wsprintfA>] ; \wsprintfA
004017A0 |. 83>add esp, 0C ;你可以看到堆疊中已經出現了DLL檔案的名稱
004017A3 |. 8D>lea eax, dword ptr ss:[esp+C]
004017A7 |. 50 push eax ; /壓入動態連線庫的名稱
004017A8 |. FF>call near dword ptr ds:[<&KERNEL32.LoadLibraryA>] ; \LoadLibraryA調入記憶體
004017AE |. 85>test eax, eax ;
004017B0 |. A3>mov dword ptr ds:[40CD64], eax ;儲存DLL控制程式碼到ds:[40CD64]
004017B5 |. /75>jnz short AUTHREG.004017C8 ;如果調入成功就跳轉
004017B7 |. |8B>mov ecx, dword ptr ds:[40CC2C] ;調入失敗,則使用英文介面
004017BD |. |A3>mov dword ptr ds:[40F83C], eax ;
004017C2 |. |89>mov dword ptr ds:[40CD64], ecx ;將英文資源控制程式碼儲存到ds:[40CD64]
004017C8 |> \C6>mov byte ptr ds:[40CD80], 0 ; 執行到這裡時,Auth936.dll已經調入記憶體了
如下。接著就出現了一個CALL,而且之後就呼叫DialogBoxParamA顯示對話方塊了,裡面一定有問題,
先在004017CF處按F2下一個斷點,下次除錯時再跟進去。按F8繼續走。
004017CF |. E8>call AUTHREG.004020F0 ; **事實證明這裡面就是註冊碼生成和比較的地方
004017D4 |. A3>mov dword ptr ds:[40F840], eax
004017D9 |. 8B>mov eax, dword ptr ss:[esp]
004017DD |. 85>test eax, eax ; AUTH936.00C90000
004017DF |. 75>jnz short AUTHREG.004017EB
注意了:下面這一招很有意思的!可以做為反除錯的一個小技巧!先用GetForegroundWindows
函式得到當前桌面上啟用的視窗控制程式碼,這時這個控制程式碼就是我們的Olldbg視窗的控制程式碼,不信請你執行
到004017E7後停下來,記住EAX中的值。然後用windowJuggler外掛檢視Olldbg主視窗的控制程式碼,比較
一下是不是一樣的。看來它針對我們的olldbg做些什麼事情!?果然在00401810處將這個控制程式碼壓入,
原來它是想用前景視窗做它的父視窗,而它又是一個模態的對話方塊,當對話方塊建立之後,這個父窗
口將會被暫時凍結,直到對話方塊結束才解凍,如果父視窗是偵錯程式的話,對不起,在它結束之前調
試器將會被系統凍結而失去作用!這裡它的父視窗就是我們的Olldbg了,看來敵人想要凍結我們。
沒關係,你可以停在00401810處將EAX中的值改為00000000就可以不被凍結了。但是我不想這樣做,
我按了F9(千萬不要按F8執行下去了,不然你會死得很慘,Win9x系統會因此而掛機的,原因自己
分析)。果然我們的Olldbg光榮了。如果你不強行關閉AuthReg.exe的話,還可以儲存資料重啟計
算機。在下就是掛機重啟了!在WIN2000/xp上不會掛機,但olldbg一定死了。看來這個技巧對防
olldbg這一類ring-3級的偵錯程式是很有用的!*****
004017E1 |. FF>call near dword ptr ds:[<&USER32.GetForegroundWindow>] ; [GetForegroundWindow
004017E7 |. 89>mov dword ptr ss:[esp], eax ; 儲存得到的當前啟用視窗的控制程式碼
004017EB |> 8B>mov ecx, dword ptr ss:[esp+4]
004017EF |. A3>mov dword ptr ds:[40F838], eax ; 儲存得到的當前啟用視窗的控制程式碼
004017F4 |. 85>test ecx, ecx
004017F6 |. 6A>push 0
004017F8 |. 74>je short AUTHREG.0040180B
004017FA |. 8B>mov edx, dword ptr ds:[40CD64] ; AUTH936.00C90000
00401800 |. 68>push AUTHREG.00401CF0
00401805 |. 50 push eax ; AUTH936.00C90000
00401806 |. 6A>push 68
00401808 |. 52 push edx
00401809 |. EB>jmp short AUTHREG.00401819
0040180B |> 68>push AUTHREG.00401850 ; |對話方塊的處理函式******
00401810 |. 50 push eax ; 壓入前景視窗的控制程式碼,做對話方塊的父視窗
00401811 |. A1>mov eax, dword ptr ds:[40CD64] ; |
00401816 |. 6A>push 67 ; |pTemplate = 67
00401818 |. 50 push eax ; |hInst = 00C90000
00401819 |> FF>call near dword ptr ds:[<&USER32.DialogBoxParamA>] ; \顯示對話方塊
0040181F |. A1>mov eax, dword ptr ds:[40CD64]
00401824 |. 8B>mov ecx, dword ptr ds:[40CC2C] ; AUTHREG.00400000
0040182A |. 3B>cmp eax, ecx
0040182C |. 74>je short AUTHREG.00401835
0040182E |. 50 push eax ; /hLibModule = 00C90000
0040182F |. FF>call near dword ptr ds:[<&KERNEL32.FreeLibrary>] ; \FreeLibrary,釋放DLL檔案
00401835 |> B8>mov eax, 1
0040183A |. 81>add esp, 8C
00401840 \. C2>retn 10 ;退出
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
作戰手冊第四條:屢敗屢戰
只不過是從頭在來!OK,當機了!沒關係,關鍵是要總結經驗教訓。血的事實告訴我們,
破解不能有一點失誤。看來如果不在00401810處修改EAX的值,Olldbg將不能正常發揮作用。
沒事,olldbg給了我們另一個選擇,這就是Attath(掛接)。請先執行authreg.exe,再開啟olldbg。
在olldbg的File選單中選擇Attach,並在彈出的視窗中選擇AuthReg.exe檔案。OK!敵人再次進入了
我們的包圍圈!很快olldbg完成分析並停在了Kernel.dll中,按F9執行,還在Kernel.dll中,沒關係
按ALT+E,選擇AuthReg.exe檔案,雙擊就可以回到Authreg.exe的程式碼中了,記得再按ctrl+A,對程式
進行分析,這樣程式會好看得多!
由於對話方塊已經執行了,上面的分析已經沒有太多作用了,不過請大家看到0040180B這個位置
就在上面的程式碼中,我做了註釋:push AUTHREG.00401850這個指令就是將這個對話方塊的處理函式壓入
堆疊。簡單的說,從00401850開始就是處理這個對話方塊的各種資訊和指令的位置。這就好說了!
按ctrl+G輸入00401850,跳轉到這裡:
00401850 . 8B>mov eax, dword ptr ss:[esp+8] ;處理函式的入口
00401854 . 81>sub esp, 29C
0040185A . 2D>sub eax, 110 ; Switch (cases 110..111)各種訊息的分支
0040185F . 53 push ebx
00401860 . 55 push ebp
00401861 . 8B>mov ebp, dword ptr ss:[esp+2B0]
00401868 . 56 push esi
00401869 . 8B>mov esi, dword ptr ss:[esp+2AC]
00401870 . 57 push edi
00401871 . 0F>je AUTHREG.00401B0B
00401877 . 48 dec eax
00401878 . 0F>jnz AUTHREG.00401C7A
0040187E . 8B>mov edi, ebp ; Case 111 of switch 0040185A 處理WM_COMMAND訊息的入口
00401880 . 81>and edi, 0FFFF ; 請記住,111代表WM_COMMAND訊息
00401886 . 81>cmp edi, 9C41 ; Switch (cases 1..9C45)
0040188C . 0F>jg AUTHREG.00401A0D ;先下斷點
00401892 . 0F>je AUTHREG.004019D2 ; 先下斷點
00401898 . 4F dec edi
00401899 . 0F>je AUTHREG.0040199B ; 先下斷點;這個地方跳到處理“確定”按鈕的程式碼
0040189F . 4F dec edi
004018A0 . 0F>je AUTHREG.004019BF ; 先下斷點
004018A6 . 81>sub edi, 3F2
004018AC . 0F>jnz AUTHREG.00401C7A ; 先下斷點
004018B2 . A1>mov eax, dword ptr ds:[40F83C] ; Case 3F4 of switch 00401886
004018B7 . 8D>lea ecx, dword ptr ss:[esp+2C]
由於Windows是基於訊息驅動的,所有的動作都會產生訊息,同時根據訊息進行不同的處理!
請觀察程式執行的對話窗,其中有兩個按鈕,“確定”按鈕和“繼續試用”按鈕,可以推測當按下
“確定”按鈕的時候,程式將進行註冊碼的判斷。所以要捕獲按鈕的訊息。而按鈕的訊息程式碼是
WM_COMMAND其值就是111。很容易看到,在對話方塊訊息處理函式入口處下面不遠就是處理WM_COMMAND
訊息的程式碼(請看上面的註釋)。從0040187E到004018AC都是處理WM_COMMAND訊息的程式碼,其中有
五處跳轉,不知跳到什麼地方。不管它,先對這五個地方都按F2下斷點,一個一個試就知道了。
下斷點後,轉到註冊對話方塊,馬上就斷下了。停在0040188C處,看來這個斷點不是處理“確定”按鈕
的,按F2取消這個斷點,再按F9到執行。又停在00401892處,這個斷點也不是處理“確定”按鈕的,
按F2取消這個斷點,再按F9執行。對話方塊出現了,輸入註冊名:ILOVEYOU,註冊碼:4321-5678-0987-1234
,點“確定”按鈕。呵呵,斷下來了在00401899這個位置,一步一步的跟吧!按F8走到0040199B。
0040199B > \6A>push 0 ; 按下“確定”按鈕後就到這裡了; Case 1 of switch 00401886
0040199D . 56 push esi
0040199E . E8>call AUTHREG.00402350 ; 對你輸入的註冊名和註冊碼的長度進行檢查
步步為營,按F7進入0040199e的CALL AUTHREG.00402350中:
00402350 /$ A1>mov eax, dword ptr ds:[40CC30] ;
00402355 |. 56 push esi ;
00402356 |. 8B>mov esi, dword ptr ds:[<&USER32.GetWindowTextLengthA>] ;將GetWindowTextLengthA函式地址複製給ESI
0040235C |. 50 push eax ; /hWnd = NULL壓入“註冊碼”編輯框的控制程式碼,
0040235D |. FF>call near esi ; \GetWindowTextLengthA
0040235F |. 85>test eax, eax ; 得到註冊名的長度
00402361 |. 75>jnz short AUTHREG.00402380 ; 如果有註冊名就跳跳轉
00402363 |. 8B>mov eax, dword ptr ss:[esp+C]
00402367 |. 85>test eax, eax
00402369 |. 75>jnz short AUTHREG.004023D3
0040236B |. 8B>mov ecx, dword ptr ss:[esp+8]
0040236F |. 6A>push 2
00402371 |. 6A>push 3
00402373 |. 51 push ecx
00402374 |. E8>call AUTHREG.004022B0 ; 如果是註冊名空就提示錯誤資訊,並返回
00402379 |. 83>add esp, 0C
0040237C |. 33>xor eax, eax
0040237E |. 5E pop esi ; AUTHREG.004019A3
0040237F |. C3 retn
00402380 |> 8B>mov edx, dword ptr ds:[40CC38] ; 得到註冊碼文字框的控制程式碼!
00402386 |. 53 push ebx ; 儲存計數器
00402387 |. 55 push ebp ; 儲存計數器
00402388 |. 57 push edi ; 儲存計數器
00402389 |. 52 push edx ; 壓入控制程式碼
0040238A |. FF>call near esi ; 得到第一段註冊碼的長度
0040238C |. 8B>mov edi, eax ; edi中是長度
0040238E |. A1>mov eax, dword ptr ds:[40CC34]
00402393 |. 50 push eax
00402394 |. FF>call near esi ; 得到第二段註冊碼的長度
00402396 |. 8B>mov ecx, dword ptr ds:[40CC40]
0040239C |. 8B>mov ebx, eax ; ebx 中是長度
0040239E |. 51 push ecx
0040239F |. FF>call near esi ; 得到第三段註冊碼的長度
004023A1 |. 8B>mov edx, dword ptr ds:[40CC3C]
004023A7 |. 8B>mov ebp, eax ; ebp中是長度
004023A9 |. 52 push edx
004023AA |. FF>call near esi ;得到第四段註冊碼的長度
004023AC |. 23>and eax, ebp ;eax中是長度
004023AE |. 23>and eax, ebx ;檢查長度
004023B0 |. 23>and eax, edi ;檢查長度
004023B2 |. 5F pop edi ; 恢復計數器
004023B3 |. 5D pop ebp ; 恢復計數器
004023B4 |. 83>and eax, 4 ;檢查長度
004023B7 |. 5B pop ebx ; 恢復計數器
004023B8 |. 75>jnz short AUTHREG.004023D5 ; 如果都正確輸入四位密碼就返回
004023BA |. 8B>mov eax, dword ptr ss:[esp+C]
004023BE |. 85>test eax, eax
004023C0 |. 75>jnz short AUTHREG.004023D3
004023C2 |. 8B>mov eax, dword ptr ss:[esp+8]
004023C6 |. 6A>push 2
004023C8 |. 6A>push 4
004023CA |. 50 push eax
004023CB |. E8>call AUTHREG.004022B0 ;提示錯誤資訊
004023D0 |. 83>add esp, 0C
004023D3 |> 33>xor eax, eax
004023D5 |> 5E pop esi ; AUTHREG.004019A3
004023D6 \. C3 retn
看來這個函式只是進行基本檢查,不是關鍵!
004019A3 . 83>add esp, 8
004019A6 . 85>test eax, eax
004019A8 . 0F>je AUTHREG.00401C7A ; 如果輸入不正確就跳回,再次輸入
又出現一個CALL了,而且後面就呼叫EndDialog退出程式了!一定要F7進入,
004019AE . 56 push esi ;壓入對話方塊控制程式碼
004019AF . E8>call AUTHREG.00402480 ;關鍵呼叫啊!!!F7進入
004019B4 . 83>add esp, 4
004019B7 . 85>test eax, eax
004019B9 . 0F>je AUTHREG.00401C7A
004019BF > E8>call AUTHREG.00401500 ; Case 2 of switch 00401886
004019C4 . 6A>push 0 ; /Result = 0
004019C6 . 56 push esi ; |hWnd = 00000A50 ('註冊',class='#32770',wndproc=801E6DCA,parent=00000970)
004019C7 . FF>call near dword ptr ds:[<&USER32.EndDialog>] ; \EndDialog
004019CD . E9>jmp AUTHREG.00401C7A
出現了,關鍵呼叫出現了!
00402480 /$ 83>sub esp, 40
00402483 |. 8B>mov ecx, dword ptr ds:[40CC38]
00402489 |. 56 push esi
0040248A |. 8B>mov esi, dword ptr ds:[<&USER32.GetWindowTextA>]
00402490 |. 8D>lea eax, dword ptr ss:[esp+4]
00402494 |. 6A>push 8 ; /Count = 8
00402496 |. 50 push eax ; |Buffer = 00000004
00402497 |. 51 push ecx ; |hWnd = C159E320
00402498 |. FF>call near esi ; \GetWindowTextA
0040249A |. A1>mov eax, dword ptr ds:[40CC34] ; 得到註冊碼中的第一段
0040249F |. 8D>lea edx, dword ptr ss:[esp+9]
004024A3 |. 6A>push 8 ; /Count = 8
004024A5 |. 52 push edx ; |Buffer = 815D0000
004024A6 |. 50 push eax ; |hWnd = 00000004
004024A7 |. FF>call near esi ; \GetWindowTextA
004024A9 |. 8B>mov edx, dword ptr ds:[40CC40] ; 得到註冊碼中的第二段
004024AF |. 8D>lea ecx, dword ptr ss:[esp+E]
004024B3 |. 6A>push 8 ; /Count = 8
004024B5 |. 51 push ecx ; |Buffer = C159E320
004024B6 |. 52 push edx ; |hWnd = 815D0000
004024B7 |. FF>call near esi ; \GetWindowTextA
004024B9 |. 8B>mov ecx, dword ptr ds:[40CC3C] ; 得到註冊碼中的第三段
004024BF |. 8D>lea eax, dword ptr ss:[esp+13]
004024C3 |. 6A>push 8 ; /Count = 8
004024C5 |. 50 push eax ; |Buffer = 00000004
004024C6 |. 51 push ecx ; |hWnd = C159E320
004024C7 |. FF>call near esi ; \GetWindowTextA
004024C9 |. 8B>mov edx, dword ptr ds:[40CC30] ; 得到註冊碼中的第四段
004024CF |. 68>push 100 ; /Count = 100 (256.)
004024D4 |. B0>mov al, 2D ; |
004024D6 |. 68>push AUTHREG.0040CD80 ; |Buffer = AUTHREG.0040CD80
004024DB |. 52 push edx ; |hWnd = 815D0000
004024DC |. 88>mov byte ptr ss:[esp+1E], al ; |
004024E0 |. 88>mov byte ptr ss:[esp+19], al ; |
004024E4 |. 88>mov byte ptr ss:[esp+14], al ; |
004024E8 |. C6>mov byte ptr ss:[esp+23], 0 ; |
004024ED |. FF>call near esi ; \GetWindowTextA
004024EF |. A1>mov eax, dword ptr ds:[40C758] ; 得到註冊名
004024F4 |. 5E pop esi ; AUTHREG.004019B4
004024F5 |. 85>test eax, eax
004024F7 |. /74>je short AUTHREG.00402507 ;如果取值成功就跳轉
004024F9 |. |8D>lea ecx, dword ptr ss:[esp]
004024FD |. |51 push ecx
004024FE |. |68>push AUTHREG.0040CD80 ; ASCII "ILOVEYOU"
00402503 |. |FF>call near eax
00402505 |. |EB>jmp short AUTHREG.00402516
00402507 |> \8D>lea edx, dword ptr ss:[esp] ; 注意了,下面壓入了註冊名和註冊碼
0040250B |. 52 push edx ; /Arg2 = 80005140
0040250C |. 68>push AUTHREG.0040CD80 ; |Arg1 = 0040CD80 ASCII "ILOVEYOU"
00402511 |. E8>call AUTHREG.004039F0 ; \關鍵的呼叫,F7進入!
上面兩句push程式碼分別壓入註冊名和註冊碼,看來Call AUTHREG.004039F0一定是註冊比較過程了,
F7進入後按F8一直走到00403A80,發現隨後有四段類似的運算與比較
********************************第一段**********************************
00403A80 |. 8B>mov ebp, dword ptr ss:[esp+58]
00403A84 |. 8B>mov ebx, dword ptr ss:[esp+9C]
00403A8B |. 8D>lea edx, dword ptr ss:[esp+14]
00403A8F |. 83>add esp, 4
00403A92 |. 8D>lea ecx, dword ptr ds:[eax+ebp]
00403A95 |. 0F>imul eax, dword ptr ss:[esp+50]
00403A9A |. 0F>imul ecx, dword ptr ss:[esp+58]
00403A9F |. 03>add ecx, ebp
00403AA1 |. 33>xor esi, esi
00403AA3 |. 33>xor ecx, eax
00403AA5 |. 0F>imul ecx, dword ptr ss:[esp+6C]
00403AAA |. 89>mov dword ptr ss:[esp+10], ecx
00403AAE |. 2B>sub ebx, edx
00403AB0 |> 8D>/lea edi, dword ptr ss:[esp+esi+10]
00403AB4 |. 0F>|movsx eax, byte ptr ds:[ebx+edi]
00403AB8 |. 83>|cmp eax, 41
00403ABB |. 7C>|jl short AUTHREG.00403AC5
00403ABD |. 83>|cmp eax, 5A
00403AC0 |. 7F>|jg short AUTHREG.00403AC5
00403AC2 |. 83>|add eax, 20
00403AC5 |> 50 |push eax
00403AC6 |. E8>|call AUTHREG.00403D70
00403ACB |. 83>|add esp, 4
00403ACE |. 46 |inc esi
00403ACF |. 83>|cmp esi, 4
00403AD2 |. 88>|mov byte ptr ds:[edi], al
00403AD4 |.^ 7C>\jl short AUTHREG.00403AB0
00403AD6 |. 33>xor edx, edx ;以上是第一段正確註冊碼的運算
00403AD8 |> 8D>/lea ecx, dword ptr ss:[esp+edx+10] ; 第一段註冊碼比較
00403ADC |. 0F>|movsx eax, byte ptr ds:[ebx+ecx]
00403AE0 |. 83>|cmp eax, 41
00403AE3 |. 7C>|jl short AUTHREG.00403AED
00403AE5 |. 83>|cmp eax, 5A
00403AE8 |. 7F>|jg short AUTHREG.00403AED
00403AEA |. 83>|add eax, 20
00403AED |> 0F>|movsx ecx, byte ptr ds:[ecx]
00403AF0 |. 3B>|cmp eax, ecx
00403AF2 |. 0F>|jnz AUTHREG.00403C6E ;如果不相同就跳走了,不要跳走!除錯的時候不要讓它跳走
00403AF8 |. 42 |inc edx
00403AF9 |. 83>|cmp edx, 4
00403AFC |.^ 7C>\jl short AUTHREG.00403AD8
********************************第二段**********************************
00403AFE |. 8B>mov ecx, dword ptr ss:[esp+10]
00403B02 |. 8B>mov eax, ecx
00403B04 |. 0F>imul eax, dword ptr ss:[esp+60]
00403B09 |. 03>add eax, ebp
00403B0B |. 0F>imul eax, ecx
00403B0E |. 0F>imul ecx, dword ptr ss:[esp+6C]
00403B13 |. 0F>imul eax, dword ptr ss:[esp+68]
00403B18 |. 03>add eax, ecx
00403B1A |. 33>xor esi, esi
00403B1C |. 89>mov dword ptr ss:[esp+14], eax
00403B20 |> 8A>/mov dl, byte ptr ss:[esp+esi+14]
00403B24 |. 52 |push edx
00403B25 |. 56 |push esi
00403B26 |. E8>|call AUTHREG.00403C80
00403B2B |. 25>|and eax, 0FF
00403B30 |. 50 |push eax
00403B31 |. E8>|call AUTHREG.00403D70
00403B36 |. 83>|add esp, 0C
00403B39 |. 88>|mov byte ptr ss:[esp+esi+14], al
00403B3D |. 46 |inc esi
00403B3E |. 83>|cmp esi, 4
00403B41 |.^ 7C>\jl short AUTHREG.00403B20
00403B43 |. 33>xor ecx, ecx ;以上是第二段正確註冊碼的運算
00403B45 |> 8B>/mov edi, dword ptr ss:[esp+98] ; 第二段註冊碼比較
00403B4C |. 0F>|movsx eax, byte ptr ds:[edi+ecx+5]
00403B51 |. 83>|cmp eax, 41
00403B54 |. 7C>|jl short AUTHREG.00403B5E
00403B56 |. 83>|cmp eax, 5A
00403B59 |. 7F>|jg short AUTHREG.00403B5E
00403B5B |. 83>|add eax, 20
00403B5E |> 0F>|movsx edx, byte ptr ss:[esp+ecx+14]
00403B63 |. 3B>|cmp eax, edx
00403B65 0F>|jnz AUTHREG.00403C6E ;如果不相同就跳走了,不要跳走!除錯的時候不要讓它跳走
00403B6B |. 41 |inc ecx
00403B6C |. 83>|cmp ecx, 4
00403B6F |.^ 7C>\jl short AUTHREG.00403B45
********************************第三段**********************************
00403B71 |. 8B>mov ecx, dword ptr ss:[esp+14]
00403B75 |. 8B>mov edx, dword ptr ss:[esp+10]
00403B79 |. 8B>mov eax, ecx
00403B7B |. 8B>mov esi, dword ptr ss:[esp+78]
00403B7F |. 33>xor eax, edx
00403B81 |. 0F>imul ecx, dword ptr ss:[esp+74]
00403B86 |. 0F>imul eax, dword ptr ss:[esp+70]
00403B8B |. 03>add eax, esi
00403B8D |. 0F>imul eax, edx
00403B90 |. 03>add eax, ecx
00403B92 |. 0F>imul eax, dword ptr ss:[esp+7C]
00403B97 |. 89>mov dword ptr ss:[esp+18], eax
00403B9B |. 33>xor esi, esi
00403B9D |> 0F>/movsx eax, byte ptr ss:[esp+esi+18]
00403BA2 |. 50 |push eax
00403BA3 |. E8>|call AUTHREG.00403D70
00403BA8 |. 83>|add esp, 4
00403BAB |. 88>|mov byte ptr ss:[esp+esi+18], al
00403BAF |. 46 |inc esi
00403BB0 |. 83>|cmp esi, 4
00403BB3 |.^ 7C>\jl short AUTHREG.00403B9D
00403BB5 |. 33>xor ecx, ecx
00403BB7 |> 0F>/movsx eax, byte ptr ds:[edi+ecx+A] ; 第三段比較
00403BBC |. 83>|cmp eax, 41
00403BBF |. 7C>|jl short AUTHREG.00403BC9
00403BC1 |. 83>|cmp eax, 5A
00403BC4 |. 7F>|jg short AUTHREG.00403BC9
00403BC6 |. 83>|add eax, 20
00403BC9 |> 0F>|movsx edx, byte ptr ss:[esp+ecx+18]
00403BCE |. 3B>|cmp eax, edx
00403BD0 0F>|jnz AUTHREG.00403C6E ;如果不相同就跳走了,不要跳走!除錯的時候不要讓它跳走
00403BD6 |. 41 |inc ecx
00403BD7 |. 83>|cmp ecx, 4
00403BDA |.^ 7C>\jl short AUTHREG.00403BB7
********************************第四段**********************************
00403BDC |. 8B>mov ecx, dword ptr ss:[esp+18]
00403BE0 |. 8B>mov esi, dword ptr ss:[esp+14]
00403BE4 |. 8B>mov eax, ecx
00403BE6 |. 8B>mov edx, dword ptr ss:[esp+10]
00403BEA |. 0F>imul eax, esi
00403BED |. 0F>imul eax, edx
00403BF0 |. 0F>imul eax, dword ptr ss:[esp+80]
00403BF8 |. 8D>lea ebx, dword ptr ds:[ecx+edx]
00403BFB |. 03>add ecx, esi
00403BFD |. 0F>imul ebx, dword ptr ss:[esp+84]
00403C05 |. 03>add eax, ebx
00403C07 |. 03>add ecx, edx
00403C09 |. 0F>imul ecx, dword ptr ss:[esp+8C]
00403C11 |. 0F>imul eax, dword ptr ss:[esp+88]
00403C19 |. 03>add ecx, eax
00403C1B |. 33>xor esi, esi
00403C1D |. 89>mov dword ptr ss:[esp+1C], ecx
00403C21 |> 0F>/movsx eax, byte ptr ss:[esp+esi+1C]
00403C26 |. 50 |push eax
00403C27 |. E8>|call AUTHREG.00403D70
00403C2C |. 83>|add esp, 4
00403C2F |. 88>|mov byte ptr ss:[esp+esi+1C], al
00403C33 |. 46 |inc esi
00403C34 |. 83>|cmp esi, 4
00403C37 |.^ 7C>\jl short AUTHREG.00403C21
00403C39 |. 33>xor ecx, ecx
00403C3B |> 0F>/movsx eax, byte ptr ds:[edi+ecx+F] ; 第四段比較
00403C40 |. 83>|cmp eax, 41
00403C43 |. 7C>|jl short AUTHREG.00403C4D
00403C45 |. 83>|cmp eax, 5A
00403C48 |. 7F>|jg short AUTHREG.00403C4D
00403C4A |. 83>|add eax, 20
00403C4D |> 0F>|movsx edx, byte ptr ss:[esp+ecx+1C]
00403C52 |. 3B>|cmp eax, edx
00403C54 75>|jnz short AUTHREG.00403C6E ;如果不相同就跳走了,不要跳走!除錯的時候不要讓它跳走
00403C56 |. 41 |inc ecx
00403C57 |. 83>|cmp ecx, 4
00403C5A |.^ 7C>\jl short AUTHREG.00403C3B
00403C5C |. 5F pop edi
00403C5D |. 5E pop esi
00403C5E |. 5D pop ebp
00403C5F |. B8>mov eax, 1
00403C64 |. 5B pop ebx
00403C65 |. 81>add esp, 80 ; ESP中就是正確的註冊碼
00403C6B |. C2>retn 8
00403C6E |> 5F pop edi ;如果不相同就跳到這裡了
00403C6F |. 5E pop esi
00403C70 |. 5D pop ebp
00403C71 |. 33>xor eax, eax
00403C73 |. 5B pop ebx
00403C74 |. 81>add esp, 80
00403C7A \. C2>retn 8
執行到00403c65時請停下來,在ESP中你看到什麼了?呵呵,我這裡是:4321lqh25ts1535s
4321lqh25ts1535s----->>>> 4321-lqh2-5ts1-535s (正確的註冊碼)
還等什麼?用筆記下來啊!好吧,我們繼續走返回到00402516
00402516 |> 33>xor ecx, ecx
00402518 |. 8D>lea edx, dword ptr ss:[esp]
0040251C |. 85>test eax, eax
0040251E |. 0F>setne cl
00402521 |. 52 push edx
00402522 |. 68>push AUTHREG.0040CD80 ; ASCII "ILOVEYOU"
00402527 |. 89>mov dword ptr ds:[40F840], ecx
0040252D |. E8>call AUTHREG.00402560 ; 這裡將註冊碼儲存到登錄檔中!
上面這個CALL將你的註冊資訊儲存到登錄檔,各位請自己分析。
00402532 |. 8B>mov ecx, dword ptr ss:[esp+4C]
00402536 |. 8B>mov edx, dword ptr ds:[40CD64] ; AUTH936.00C90000
0040253C |. 83>add esp, 8
0040253F |. 8D>lea eax, dword ptr ss:[esp]
00402543 |. 50 push eax ; /lParam = NULL
00402544 |. 68>push AUTHREG.004023E0 ; |DlgProc = AUTHREG.004023E0
00402549 |. 51 push ecx ; |hOwner = 800050B8
0040254A |. 6A>push 69 ; |pTemplate = 69
0040254C |. 52 push edx ; |hInst = 80005140
0040254D |. FF>call near dword ptr ds:[<&USER32.DialogBo>; \DialogBoxParamA:這裡將顯示我們成功的資訊!
00402553 |. A1>mov eax, dword ptr ds:[40F840]
00402558 |. 83>add esp, 40
0040255B \. C3 retn ;成功返回
作戰手冊第五條:成功永遠屬於我們
你記住剛才的那段數字了嗎?OK!按F9回到主對話方塊,點“繼續試用”退出程式,然後再關閉olldbg,
記住先後順序不要搞反了,不然你很麻煩。
關閉你所有的程式,然後開啟豪*超級解*V8的程式,很自然又會彈出請你註冊的資訊,沒關係我們已經
有了正確的註冊碼,輸入吧!然後享受影音快樂吧!成功永遠屬於我們
總結:
關鍵要頭腦冷靜,認真分析和觀察,瞭解常用API函式的使用途徑、使用方法。
******************************
* 註冊名:ILOVEYOU *
* 註冊碼:4321-lqh2-5ts1-535s *
******************************
作者:chenjiwl
chenjiwl@sina.com
相關文章
- 桌面鋼筆v2.0破解過程,入門級,高手莫入。2015-11-15
- MDK編譯過程及檔案型別全解2019-03-15編譯型別
- crackme破解教程(續) (高手莫入) (2千字)2001-03-17
- innobackupex命令備份全過程圖解2018-11-30圖解
- shellcode教程從新手到高手2020-08-19
- 向真真正正的EJB高手求救!(初級者莫入)2003-05-22
- vue-cli 3.0 使用全過程講解2019-03-03Vue
- vue-cli3.0使用全過程講解2018-06-13Vue
- 爆解windows程式管理大師!V3.0.1(高手莫入) (6千字)2015-11-15Windows
- 圖解逆序單向連結串列全過程2018-01-26圖解
- 最近很忙,剛寫了一篇Uedit32 8.0破解過程(高手莫入)! (12千字)2001-05-07
- 詳細瞭解 synchronized 鎖升級過程2022-03-08synchronized
- 超詳細講解頁面載入過程2021-11-09
- httpd使用systemctl啟動超時解決過程2024-03-06httpd
- Mysql加鎖過程詳解(6)-資料庫隔離級別(1)2017-09-13MySql資料庫
- 詳解MeterSphere 配置外部Mysql5.7的全過程2022-09-27MySql
- AE新手基礎入門教程50套從新手到高手2014-10-24
- jQuery星級評分實現過程詳解2017-03-25jQuery
- 麻將遊戲開發全過程步驟瞭解2019-03-30遊戲開發
- 運維必備-解決鎖問題的全過程2018-12-05運維
- 5分鐘瞭解Ashley Madison被黑事件全過程2015-08-25事件
- 詳解Oracle建立使用者許可權全過程2011-06-13Oracle
- 新手入門AMF協議基礎全解2013-10-24協議
- Mysql加鎖過程詳解(6)-資料庫隔離級別(2)-通過例子理解事務的4種隔離級別2017-09-13MySql資料庫
- MapReduce過程詳解2019-04-29
- iOS10開發者預覽版透過OTA方式升級iOS10教程詳解2016-06-15iOS
- Data Pump Import速度問題之解決過程2007-02-10Import
- 理解 Android 程式啟動之全過程2021-09-09Android
- Java註解最全詳解(超級詳細)2022-08-16Java
- 超詳細的ArrayList擴容過程(配合原始碼詳解)2024-11-19原始碼
- 升級RH9.0到2.6.5核心全過程(轉)2007-08-11
- 微信公眾號支付開發全過程(Java 版)2018-07-08Java
- MySQL 連線查詢超全詳解2020-07-08MySql
- DataGuard之switchover_status狀態not allowed解決過程2014-09-25
- 樂視超級手機明日正式開賣 搶購攻略教程詳解2015-05-21
- 簡約而不簡單的Django新手圖文教程2017-03-08Django
- PHP 協程實現過程詳解2017-04-29PHP
- 蘋果iOS9.3.3正式版升級教程(圖文詳解)2016-07-19蘋果iOS