豪*超級解*別V8+SP1版 怒而解之全過程(新手教程、高手莫入)

看雪資料發表於2004-06-08

[標題]  豪*超級解*別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     eaxdword 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     eaxdword 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     eaxdword 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     ecxdword 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     edxdword 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     eaxdword ptr ss:[esp+C]
004017A7  |.  50 push    eax                                      ; /壓入動態連線庫的名稱
004017A8  |.  FF>call    near dword ptr ds:[<&KERNEL32.LoadLibraryA>]  ; \LoadLibraryA調入記憶體
004017AE  |.  85>test    eaxeax                                 ;
004017B0  |.  A3>mov     dword ptr ds:[40CD64], eax               ;儲存DLL控制程式碼到ds:[40CD64]
004017B5  |. /75>jnz     short AUTHREG.004017C8                   ;如果調入成功就跳轉
004017B7  |. |8B>mov     ecxdword 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     eaxdword ptr ss:[esp]
004017DD  |.  85>test    eaxeax                                           ;  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     ecxdword ptr ss:[esp+4]
004017EF  |.  A3>mov     dword ptr ds:[40F838], eax          ; 儲存得到的當前啟用視窗的控制程式碼
004017F4  |.  85>test    ecxecx
004017F6  |.  6A>push    0
004017F8  |.  74>je      short AUTHREG.0040180B
004017FA  |.  8B>mov     edxdword 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     eaxdword 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     eaxdword ptr ds:[40CD64]
00401824  |.  8B>mov     ecxdword ptr ds:[40CC2C]                         ;  AUTHREG.00400000
0040182A  |.  3B>cmp     eaxecx
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     eaxdword 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     ebpdword ptr ss:[esp+2B0]
00401868   .  56 push    esi
00401869   .  8B>mov     esidword 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     ediebp                     ;  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     eaxdword ptr ds:[40F83C]   ;  Case 3F4 of switch 00401886
004018B7   .  8D>lea     ecxdword 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     eaxdword ptr ds:[40CC30]     ;
00402355  |.  56 push    esi                            ;
00402356  |.  8B>mov     esidword ptr ds:[<&USER32.GetWindowTextLengthA>] ;將GetWindowTextLengthA函式地址複製給ESI
0040235C  |.  50 push    eax                            ; /hWnd = NULL壓入“註冊碼”編輯框的控制程式碼,
0040235D  |.  FF>call    near esi                       ; \GetWindowTextLengthA 
0040235F  |.  85>test    eaxeax                       ;  得到註冊名的長度
00402361  |.  75>jnz     short AUTHREG.00402380         ; 如果有註冊名就跳跳轉
00402363  |.  8B>mov     eaxdword ptr ss:[esp+C]
00402367  |.  85>test    eaxeax
00402369  |.  75>jnz     short AUTHREG.004023D3        
0040236B  |.  8B>mov     ecxdword 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     eaxeax
0040237E  |.  5E pop     esi                                                ;  AUTHREG.004019A3
0040237F  |.  C3 retn
00402380  |>  8B>mov     edxdword 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     edieax                                           ;  edi中是長度
0040238E  |.  A1>mov     eaxdword ptr ds:[40CC34]
00402393  |.  50 push    eax
00402394  |.  FF>call    near esi                                           ;  得到第二段註冊碼的長度
00402396  |.  8B>mov     ecxdword ptr ds:[40CC40]
0040239C  |.  8B>mov     ebxeax                                           ;  ebx 中是長度
0040239E  |.  51 push    ecx
0040239F  |.  FF>call    near esi                                           ;  得到第三段註冊碼的長度
004023A1  |.  8B>mov     edxdword ptr ds:[40CC3C]
004023A7  |.  8B>mov     ebpeax                                           ;  ebp中是長度
004023A9  |.  52 push    edx
004023AA  |.  FF>call    near esi              ;得到第四段註冊碼的長度
004023AC  |.  23>and     eaxebp                                           ;eax中是長度
004023AE  |.  23>and     eaxebx              ;檢查長度
004023B0  |.  23>and     eaxedi              ;檢查長度
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     eaxdword ptr ss:[esp+C]
004023BE  |.  85>test    eaxeax
004023C0  |.  75>jnz     short AUTHREG.004023D3
004023C2  |.  8B>mov     eaxdword 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     eaxeax
004023D5  |>  5E pop     esi                                                ;  AUTHREG.004019A3
004023D6  \.  C3 retn

看來這個函式只是進行基本檢查,不是關鍵!

004019A3   .  83>add     esp, 8
004019A6   .  85>test    eaxeax                       
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    eaxeax
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     ecxdword ptr ds:[40CC38]
00402489  |.  56 push    esi
0040248A  |.  8B>mov     esidword ptr ds:[<&USER32.GetWindowTextA>]
00402490  |.  8D>lea     eaxdword 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     eaxdword ptr ds:[40CC34]                     ;  得到註冊碼中的第一段
0040249F  |.  8D>lea     edxdword 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     edxdword ptr ds:[40CC40]                     ;  得到註冊碼中的第二段
004024AF  |.  8D>lea     ecxdword 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     ecxdword ptr ds:[40CC3C]                     ;  得到註冊碼中的第三段
004024BF  |.  8D>lea     eaxdword 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     edxdword 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     eaxdword ptr ds:[40C758]                     ;  得到註冊名
004024F4  |.  5E pop     esi                                            ;  AUTHREG.004019B4
004024F5  |.  85>test    eaxeax
004024F7  |. /74>je      short AUTHREG.00402507              ;如果取值成功就跳轉
004024F9  |. |8D>lea     ecxdword 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     edxdword 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     ebpdword ptr ss:[esp+58]
00403A84  |.  8B>mov     ebxdword ptr ss:[esp+9C]
00403A8B  |.  8D>lea     edxdword ptr ss:[esp+14]
00403A8F  |.  83>add     esp, 4
00403A92  |.  8D>lea     ecxdword ptr ds:[eax+ebp]
00403A95  |.  0F>imul    eaxdword ptr ss:[esp+50]
00403A9A  |.  0F>imul    ecxdword ptr ss:[esp+58]
00403A9F  |.  03>add     ecxebp
00403AA1  |.  33>xor     esiesi
00403AA3  |.  33>xor     ecxeax
00403AA5  |.  0F>imul    ecxdword ptr ss:[esp+6C]
00403AAA  |.  89>mov     dword ptr ss:[esp+10], ecx
00403AAE  |.  2B>sub     ebxedx
00403AB0  |>  8D>/lea     edidword ptr ss:[esp+esi+10]
00403AB4  |.  0F>|movsx   eaxbyte 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     edxedx                            ;以上是第一段正確註冊碼的運算

00403AD8  |>  8D>/lea     ecxdword ptr ss:[esp+edx+10]     ;  第一段註冊碼比較
00403ADC  |.  0F>|movsx   eaxbyte 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   ecxbyte ptr ds:[ecx]
00403AF0  |.  3B>|cmp     eaxecx                            
00403AF2  |.  0F>|jnz     AUTHREG.00403C6E               ;如果不相同就跳走了,不要跳走!除錯的時候不要讓它跳走
00403AF8  |.  42 |inc     edx
00403AF9  |.  83>|cmp     edx, 4
00403AFC  |.^ 7C>\jl      short AUTHREG.00403AD8

********************************第二段**********************************
00403AFE  |.  8B>mov     ecxdword ptr ss:[esp+10]
00403B02  |.  8B>mov     eaxecx
00403B04  |.  0F>imul    eaxdword ptr ss:[esp+60]
00403B09  |.  03>add     eaxebp
00403B0B  |.  0F>imul    eaxecx
00403B0E  |.  0F>imul    ecxdword ptr ss:[esp+6C]
00403B13  |.  0F>imul    eaxdword ptr ss:[esp+68]
00403B18  |.  03>add     eaxecx
00403B1A  |.  33>xor     esiesi
00403B1C  |.  89>mov     dword ptr ss:[esp+14], eax
00403B20  |>  8A>/mov     dlbyte 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     ecxecx                                   ;以上是第二段正確註冊碼的運算

00403B45  |>  8B>/mov     edidword ptr ss:[esp+98]               ;  第二段註冊碼比較
00403B4C  |.  0F>|movsx   eaxbyte 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   edxbyte ptr ss:[esp+ecx+14]
00403B63  |.  3B>|cmp     eaxedx                            
00403B65      0F>|jnz     AUTHREG.00403C6E             ;如果不相同就跳走了,不要跳走!除錯的時候不要讓它跳走
00403B6B  |.  41 |inc     ecx
00403B6C  |.  83>|cmp     ecx, 4
00403B6F  |.^ 7C>\jl      short AUTHREG.00403B45

********************************第三段**********************************
00403B71  |.  8B>mov     ecxdword ptr ss:[esp+14]
00403B75  |.  8B>mov     edxdword ptr ss:[esp+10]
00403B79  |.  8B>mov     eaxecx
00403B7B  |.  8B>mov     esidword ptr ss:[esp+78]
00403B7F  |.  33>xor     eaxedx
00403B81  |.  0F>imul    ecxdword ptr ss:[esp+74]
00403B86  |.  0F>imul    eaxdword ptr ss:[esp+70]
00403B8B  |.  03>add     eaxesi
00403B8D  |.  0F>imul    eaxedx
00403B90  |.  03>add     eaxecx
00403B92  |.  0F>imul    eaxdword ptr ss:[esp+7C]
00403B97  |.  89>mov     dword ptr ss:[esp+18], eax
00403B9B  |.  33>xor     esiesi
00403B9D  |>  0F>/movsx   eaxbyte 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     ecxecx

00403BB7  |>  0F>/movsx   eaxbyte 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   edxbyte ptr ss:[esp+ecx+18]
00403BCE  |.  3B>|cmp     eaxedx                            
00403BD0      0F>|jnz     AUTHREG.00403C6E                         ;如果不相同就跳走了,不要跳走!除錯的時候不要讓它跳走
00403BD6  |.  41 |inc     ecx
00403BD7  |.  83>|cmp     ecx, 4
00403BDA  |.^ 7C>\jl      short AUTHREG.00403BB7

********************************第四段**********************************
00403BDC  |.  8B>mov     ecxdword ptr ss:[esp+18]
00403BE0  |.  8B>mov     esidword ptr ss:[esp+14]
00403BE4  |.  8B>mov     eaxecx
00403BE6  |.  8B>mov     edxdword ptr ss:[esp+10]
00403BEA  |.  0F>imul    eaxesi
00403BED  |.  0F>imul    eaxedx
00403BF0  |.  0F>imul    eaxdword ptr ss:[esp+80]
00403BF8  |.  8D>lea     ebxdword ptr ds:[ecx+edx]
00403BFB  |.  03>add     ecxesi
00403BFD  |.  0F>imul    ebxdword ptr ss:[esp+84]
00403C05  |.  03>add     eaxebx
00403C07  |.  03>add     ecxedx
00403C09  |.  0F>imul    ecxdword ptr ss:[esp+8C]
00403C11  |.  0F>imul    eaxdword ptr ss:[esp+88]
00403C19  |.  03>add     ecxeax
00403C1B  |.  33>xor     esiesi
00403C1D  |.  89>mov     dword ptr ss:[esp+1C], ecx
00403C21  |>  0F>/movsx   eaxbyte 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     ecxecx

00403C3B  |>  0F>/movsx   eaxbyte 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   edxbyte ptr ss:[esp+ecx+1C]
00403C52  |.  3B>|cmp     eaxedx                     
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     eaxeax
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     ecxecx
00402518  |.  8D>lea     edxdword ptr ss:[esp]
0040251C  |.  85>test    eaxeax
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     ecxdword ptr ss:[esp+4C]
00402536  |.  8B>mov     edxdword ptr ds:[40CD64]           ;  AUTH936.00C90000
0040253C  |.  83>add     esp, 8
0040253F  |.  8D>lea     eaxdword 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     eaxdword 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

相關文章