解除DLSupCBT的NAG窗和KEY檔案製作(一)
解除DLSupCBT的NAG窗和KEY檔案製作(一)
OLLYDBG初級教程,給初學者
作者:囚童[FCG][BCG]
課題:解除DLSupCBT的NAG窗和30天時間限制,製作KEY檔案
物件:DLSuperCBT - Byte Compare Differences 2.1e
平臺:win95/98/ME, winNT/2000/XP
尺寸:743,936
作者:Don Ludlow
背景:Borland's Delphi 5,無殼
下載:http://www.dlsuperc.com/dlsupcbtni.zip
工具:OllyDbg v1.09 修正漢化版
Ultraedit-32
透過這篇文章我們將向你介紹在OllyDbg中:
●如何設定/取消斷點
●如何設定/取消硬體斷點
●如何修改和永久儲存程式碼
●如何用“回溯法”來跟蹤資料來源。
●如何修改主視窗標題欄
●如何查詢KEY檔案的關鍵項
在示例中我們還用到了一種頗有新意的演示跟蹤過程的表達方法[首創]。
DLSupCBT 是一個按位元組進行再同步比較的檔案處理工具。它比較二進位制檔案之間的不同,在
不匹配的位元組中進行再同步。在相鄰行中以ASCII方式報告十六進位制程式碼的不同。允許使用偏
移值在兩個檔案中進行區域性比較。兩個檔案之間的變化可以新增到新的檔案或從舊的檔案刪
除。在檔案之間出現資料移位時,它具有與大多數其它按位元組進行比較的檔案處理工具不同的
特色,它顯示具有指導意義的結果。換句話說,當位元組數增加或減少時,大多數其它按位元組進
行比較的檔案處理工具不能夠使自己再同步,而DLSupCBT可以再同步這種變化。
個人和非盈利組織在作者網站上可以免費註冊。但我註冊後,收到作者兩封回信,聲稱:
“Attached is your registered package containing the DLSuperCBT program.”實際什
麼也沒有。
即便這樣,我們在研究它時也不再有什麼擔心了。
下面的內容按由淺入深分層次來講:
如果你是一個初學者,你只需要看**一樓**裡的內容.
如果你是一個有心的初學者,你可以看一下**二樓**裡的內容.
如果你是一個有耐心的初學者,你最好看一下**三樓**裡的內容.
我們開始。
解除NAG窗
先試執行下載來的DLSupCBT,顯示是一個30天試用版本。調整一下時間,只有一個NAG窗,好
象沒有什麼時間制。時間限制版本的意思是講,超過時間限制,繼續擁有時間限制版本將是違
法的。但有可能作者並沒有採取技術措施來限制。
**一樓(入門)**
啟動OLLYDBG,點選單“檔案/開啟(或按F3)”將DLSupCBT裝入OLLYDBG,按F9執行。
等到NAG窗出現,點OLLYDBG,使OLLYDBG成為活動視窗。
按F12暫停,按CTRL+F9(執行到返回),OLLYDBG將停留在返回指令RETN處,連續按CTRL+F9,
直到OLLYDBG不再響應。
點DLSupCBT,使DLSupCBT成為活動視窗。點“YES USE”按鈕,此時OLLYDBG被啟用,我們來
到OLLYDBG的CPU視窗:
00449A59 |. CALL DLSupCBT.004497D8
00449A5E \. RETN
//游標停在這裡,按F8單步跳過
00449A5F .^JMP DLSupCBT.0040372C
00449A64 .^JMP SHORT DLSupCBT.00449A56
00449A66 . XOR EAX,EAX
//上面按F8後,游標停在這裡
00449A68 . POP EDX
00449A69 . POP ECX
向上看,沒有發現可疑的條件跳轉。
繼續按CTRL+F9,來到:
00449AED > MOV EAX,DWORD
PTR SS:[EBP-10]
00449AF0 . MOV DWORD PTR DS:[480950],EAX
00449AF5 . MOV EAX,DWORD PTR SS:[EBP-4]
00449AF8 . AND BYTE PTR DS:[EAX+2CC],0F7
00449AFF . RETN
//游標停在這裡,按F8
00449B00 .^JMP DLSupCBT.0040372C
00449B05 .^JMP DLSupCBT.00449A73
00449B0A . XOR EAX,EAX
//上面按F8後,游標停在這裡。
00449B0C . POP EDX
//向上看,沒有發現可疑的條件跳轉,
00449B0D . POP ECX
//繼續按CTRL+F9
00449B0E . POP ECX
00449B0F . MOV DWORD PTR FS:[EAX],EDX
00449B12 . PUSH DLSupCBT.00449B27
00449B17 > LEA EAX,DWORD PTR SS:[EBP-20]
00449B1A . CALL DLSupCBT.00403C94
00449B1F . RETN
//游標停在這裡,按F8
00449B20 .^JMP DLSupCBT.0040372C
00449B25 .^JMP SHORT DLSupCBT.00449B17
00449B27 . MOV EAX,DWORD PTR SS:[EBP-8]//上面按F8後,游標停在這裡。
00449B2A . POP ESI
//向上看,沒有發現可疑的條件跳轉,繼續按CTRL+F9
00449B2B . POP EBX
00449B2C . MOV ESP,EBP
00449B2E . POP EBP
00449B2F . RETN
//游標停在這裡,按F8
按F8後,來到:
00478357 > MOV EAX,DWORD
PTR SS:[EBP-4]
0047835A . CMP BYTE PTR DS:[EAX+6AF],0 //可疑的條件跳轉,雙擊設斷
00478361 JE DLSupCBT.004783EE
00478367 . MOV EAX,DWORD PTR DS:[5A2F8C]
0047836C . MOV EAX,DWORD PTR DS:[EAX+2E0]
00478372 . MOV EDX,DLSupCBT.00478B40 ; ASCII "DLSuperCBT
30 Day Trial Version"
.
.
.
004783D3 . MOV EAX,DWORD PTR DS:[4813CC]
004783D8 . MOV EAX,DWORD PTR DS:[EAX]
004783DA . MOV EDX,DWORD PTR DS:[EAX]
004783DC . CALL DWORD PTR DS:[EDX+D8] //這是顯示NAG的CALL
004783E2 . MOV EAX,DWORD PTR DS:[4813CC] //游標停在這裡,向上看
004783E7 . MOV EAX,DWORD PTR DS:[EAX]
004783E9 . CALL DLSupCBT.00449874
向上看47835A處是一個可疑的條件跳轉,雙擊47835A左邊第二欄設斷(或按F2),0047835A將
變為紅色,表示這裡是一個斷點。
仔細看下面的程式,4783DC是顯示NAG的CALL,如果47835A處跳,顯然NAG不會再顯示。
強制跳轉的方法很簡單:重啟後按F9執行,OLLYDBG將中斷在47835A。將游標指向478361,按
空格鍵,OLLYDBG彈出一個彙編視窗,先把“用NOP填充”打上勾,然後將編輯框中的JE改寫為
JMP,點“彙編”,看到什麼?JE DLSupCBT.004783EE變成了紅色的JMP DLSupCBT.004783EE,
後面不足的部分還自動補上了NOP。試著按一下F9執行,NAG窗不見了,DLSupCBT主視窗左下角
的一行字“DLSuperCBT 30 Day Trial Version”也不見了。
如果改好了以後,右鍵選“複製到可執行檔案”,可以將改變永久儲存。
我們已經知道,可以透過直接修改程式碼來解除NAG窗。
**一樓(結束)**
**二樓(更上一層樓)**
但我們不這樣做,因為解除軟體的限制可能要修改多處程式碼。
重新執行DLSupCBT,OLLYDBG將中斷在47835A。
看OLLYDBG左邊反彙編窗和DUMP窗中間夾著的部分,顯示:DS:[00E72143]=01。
這是什麼?這是告訴你[EAX+6AF]中的具體值為1,怪不得不跳呢。
如果你將游標指向這一行,按右鍵並選“修改資料”,你可以在修改資料視窗將01改為00,
再執行下去,NAG窗同樣消失。
但我們不這樣改。我們要找到它的根。
在OLLYDBG的CPU視窗的左下方是DUMP視窗,在DUMP視窗點一下HEX跟隨欄,然後按CTL+G,在彈
出的轉存跟隨視窗中輸入E72143,點“確定”。下面的DUMP窗將顯示E72143起始的資料段。
用游標將DUMP視窗字串第一個十六進位制字“01”加亮,右擊,在右鍵選單上選“斷點/硬體
寫入/BYTE”,這樣,我們就在E72143設定了一個硬體斷點。
本來我們也可以設定記憶體寫入斷點來完成同樣的工作,但它有很多缺點:
①該段資料處於非活動狀態時,無法設定斷點。
②為了觀察資料段的活動狀態,必須單獨開啟一個資料轉存視窗。
③程式重啟時斷點自動清除,無法長時間儲存。
④無法瀏覽記憶體斷點列表。
順手在上面CPU窗47835A處雙擊左邊第二欄(或按F2),0047835A將變回原來的顏色,表示斷
點已清除。
按CTRL+F2,重新開始DLSuperCBT。
按F9,OLLYDBG中斷在
按F9執行,OLLYDBG第一次中斷在:
0040302A . REP STOS DWORD
PTR ES:[EDI] //EDI=E72140
//EAX=0
這是一個清空記憶體操作,不理它。
按F9執行,OLLYDBG第二次中斷在:
004780EA > MOV EAX,DWORD
PTR DS:[4815C0] //=408D01
004780EF . MOV AL,BYTE PTR DS:[EAX]
//試用版標誌來自這裡,雙擊設斷
004780F1 . MOV EDX,DWORD PTR SS:[EBP-4]
//
004780F4 . MOV BYTE PTR DS:[EDX+6AF],AL
//游標停在這裡,向上看
004780FA . MOV EBX,1B
原來E72143中的值01來自[4815C0],這是一個常量,可以在4780EF設斷來驗證,得知來源地
址為481310,初始值為408D01。驗證的方法算作一道作業,你自己去做。
按ALT+B(或在工具欄上點藍色的方形“B”按鈕)調出斷點視窗,將游標指向00478336處,按
右鍵並選“DISABLE”(或直接按空格鍵)使斷點處於非啟用狀態。
事實上,408D01是未註冊版標誌,408D00是註冊版標誌。用ULTRAEDIT很容易將408D01改為
408D00(在7FB10),NAG窗消失。我們不這樣做。
或許你要問:DLSupCBT主視窗左下角的一行字“DLSuperCBT 30 Day Trial Version”不見
了,但原地還留有一個“a”,是不是沒有解乾淨?
問得好。我們來查驗一下。
當游標指向這個“a”時,出現“Registered User for Program”的黃色提示。
就是說,有了這個'a',恰恰意味著當前是正版。
不過,當游標指向“DLSuperCBT 30 Day Trial
Version”時,也同樣會出現“Registered
User for Program”的黃色提示。這與“DLSuperCBT 30 Day Trial Version”實際並沒有時
間限制一樣自相矛盾。
我們現在知道了從註冊標誌著手,比簡單地改跳轉要可靠,而且可能有較少的工作量。
剩下的問題是主視窗的標題欄還有"(UnRegistered)
DLSuperCBT Resynchronizing Byte
Compare Program"的字樣。它與'a'顯得格格不入。
嘗試了一些辦法,比如記憶體搜尋、資源分析,都沒有找到上面的字串。也沒有發現有從檔案
或登錄檔之類的地方讀出。
或許是拼接?有道理。上面字串的片斷確實存在。
試著在記憶體中搜尋"(UnRegistered)",倒是有一個,但跟蹤下去就沒有了結果。"DLSuperCBT"
也有不少,也沒跟出什麼結果。
好,我們盯上" Resynchronizing Byte Compare Program"了。
按CTRL+F2,重新開始DLSuperCBT。
按CTL+B,調出二進位制搜尋視窗,先將“整個段塊”勾上,
在ASCII欄內鍵入“ Resynchronizing”,點“確定”,來到:
00478984 . 20 52 65 73 79>ASCII
" Resynchronizing"
00478994 . 20 42 79 74 65>ASCII " Byte Compare Pr"
004789A4 . 6F 67 72 61 6D>ASCII "ogram",0
用游標將478984這一行加亮,右鍵選“在轉存中跟隨數值”,在OLLYDBG的CPU視窗的左下方的DUMP
窗將顯示478984起始的程式碼段。
用游標將DUMP視窗字串第一個十六進位制字“20”加亮,右擊,在右鍵選單上選“斷點/硬體
訪問/BYTE”。
按F9,OLLYDBG中斷在:
00402990 |. FD
STD
00402991 |. F3:A5 REP MOVS DWORD PTR
ES:[EDI],DWORD PTR DS:[ESI]
00402993 |. 89C1 MOV ECX,EAX
00402995 |. 83E1 03 AND ECX,3
00402998 |. 83C6 03 ADD ESI,3
0040299B |. 83C7 03 ADD EDI,3
0040299E |. F3:A4 REP MOVS BYTE PTR
ES:[EDI],BYTE PTR DS:[ESI]
004029A0 |. FC CLD
//游標停在這裡
REP MOVS是一個資料傳送指令,按指定的長度將資料由DS:ESI傳送到DS:EDI。STD意味著從
後向前傳送。
看看右面暫存器窗中的EDI,它指向字串" Resynchronizing
Byte Compare Program"前面的
一個值"T"。這個"T"隱含著什麼?我們來看一下。
用游標將右面暫存器窗中的EDI的值00E8EE71加亮,右鍵選“在轉存中跟隨數值”,下面的
DUMP窗將顯示E8EE71起始的資料段。
向上調整DUMP窗的滑塊,我們看見什麼?
00E8EE51
20
00E8EE59 28 55 6E 52 65 67 69 73 (UnRegis
00E8EE61 74 65 72 65 64 29 20 44 tered) D
00E8EE69 4C 53 75 70 65 72 43 42 LSuperCB
00E8EE71 54 20 52 65 73 79 6E 63 T Resync
00E8EE79 68 72 6F 6E 69 7A 69 6E hronizin
00E8EE81 67 20 42 79 74 65 20 43 g Byte C
00E8EE89 6F 6D 70 61 72 65 20 50 ompare P
00E8EE91 72 6F 67 72 61 6D rogram
哈,剛拼接出來的視窗標題!那麼,標題的前半部分又是從哪裡來的呢?
仔細看一下右面暫存器窗中的EBX,它指向字串" (UnRegistered)
DLSuperCBT",恰恰就是
那前半部分。
用游標將右面暫存器窗中的EBX的值00E8EBA0加亮,右鍵選“在轉存中跟隨數值”,下面的
DUMP窗將顯示E8EBA0起始的資料段。
我們嘗試使用“回溯法”來找到它的來源。
用我們前面用過的老辦法,用游標將DUMP視窗字串第一個十六進位制字“20”加亮,右擊,在
右鍵選單上選“斷點/硬體寫入/BYTE”。
點選單“除錯/硬體斷點”調出“硬體斷點”窗,可以看到已經有了兩個硬體斷點。將478984
的斷點刪除。
按CTRL+F2,重新開始DLSuperCBT。
按F9,OLLYDBG產生一箇中斷。我們看到右面暫存器窗中ECX的值為E8EBA0,這表明E8EBA0所在的段
已經是活動段,我們可以跟隨了。如果它是非活動的,可以繼續按F9,直到它處於活動狀態。
用游標將右面暫存器窗中的ECX的值00E8EBA0加亮,右鍵選“在轉存中跟隨數值”,下面的
DUMP窗將顯示E8EBA0起始的資料段。
盯著CPU視窗左下方的DUMP視窗,連續按動F9,直到DUMP視窗中出現"
Resynchronizing Byte
Compare Program"。
從CPU視窗可以看出,當前仍然是REP MOVS資料傳送指令,看一下ESI-1的值,是0012FA8C,處
於堆疊中。堆疊的使用是相當頻繁的,繼續用原來的方法回溯,耗時費力。
我們可以這樣:
點選單“除錯/硬體斷點”調出“硬體斷點”窗。將E8EBA0的斷點刪除。
連續按兩下CTRL+F9,再按一下F8,來到:
00478165 . 8D55 81
LEA EDX,DWORD PTR SS:[EBP-7F]
00478168 . 8D85 74FCFFFF LEA EAX,DWORD PTR SS:[EBP-38C]
0047816E . E8 E9A9F8FF CALL DLSupCBT.00402B5C
00478173 . BA 508A4700 MOV EDX,DLSupCBT.00478A50
; ASCII 0B," DLSuperCBT"
00478178 . 8D85 74FCFFFF LEA EAX,DWORD PTR SS:[EBP-38C]
0047817E . B1 65 MOV CL,65
00478180 . E8 A7A9F8FF CALL DLSupCBT.00402B2C
00478185 . 8D95 74FCFFFF LEA EDX,DWORD PTR SS:[EBP-38C]
//在這裡設斷
0047818B . 8D85 DCFCFFFF LEA EAX,DWORD PTR SS:[EBP-324]
00478191 . E8 22BDF8FF CALL DLSupCBT.00403EB8
00478196 . 8B95 DCFCFFFF MOV EDX,DWORD PTR SS:[EBP-324]
//游標停在這裡
我們將這稱作“向上回溯兩級”。本來我們想把將新的斷點設在478185。但向上一看,478173
引用了" DLSuperCBT",這種字串前面加空格的做法顯然是為了拼接。於是我們根據478191
的CALL的處理結果,推斷478173之前,記憶體中應該已經有了“(UnRegistered)”。於是我們嘗
試將新的斷點設在478165。
重啟DLSuperCBT,OLLYDBG中斷在478165。
看OLLYDBG左邊CPU窗和DUMP窗中間夾著的部分,顯示:
Stack Address=0012FD99, (ASCII 0F, " (UnRegistered)")
如果再向上回溯,我們會發現,12FD99中的字串"
(UnRegistered)",是由另一個串
")XdXe8rXe2t4sXiXgXe2R4n6U8("(怎麼樣?似曾見過?在跟E8EBA0時?)經過4780E8至
478165的程式解密而來的。
此時只要將12FD99改為ASCII 0D, " (Registered)",標題欄將顯示:
"(Registered) DLSuperCBT Resynchronizing Byte Compare Program"
由於我們的指導思想是:“不打菩薩”--不改動原作。所以我們另外編了一個小小的
LOADER(“再塑金身”),在入口處將4815C0的值408D01改為408D00,在4780E8將12FD99的值
ASCII 0F," (UnRegistered)"改為ASCII 0D, " (Registered)",然後直接跳到478165,不再
執行中間那一段解密程式。編寫LOADER不是本文要討論的內容,不再贅述。
大功告成,儼然一個正版。
解除DLSupCBT的NAG窗和KEY檔案製作(二)
KEY檔案製作
根據我們的“不打菩薩”的指導思想,能不能在主程式之外找到解決問題的辦法呢?
有,甚至都可以不“再塑金身”。那就是KEY檔案。
分析一下我們走過的路:
因為在47835A有DS:[EAX+6AF]=1才出現了NAG。我們人為地使DS:[EAX+6AF]=0成功地消除了
NAG。那註冊版本一定在47835A之前有行動使DS:[EAX+6AF]=0。順著這個思路我們從47835A
向上看,哇,這裡似曾相識:
0047830F > MOV EAX,DWORD
PTR DS:[48146C] //=408D00
00478314 . MOV AL,BYTE PTR DS:[EAX]
00478316 . MOV EDX,DWORD PTR SS:[EBP-4]
00478319 . MOV BYTE PTR DS:[EDX+6AF],AL
是不是長得與4780EA那一段象一對雙胞胎?哪裡不同呢?哈,第一行的地址常量不同,一個是
[4815C0]=01,一個是[48146C]=00(做過作業了麼?)。顯然,[48146C]裡放的是正版標誌。
那麼,程式是怎樣啟動這個正版標誌的呢?
下面我們給出啟動這個正版標誌的一段程式示例:
我們認為你是已經具有相應能力的讀者,所以沒有給出具體是怎樣跟蹤的,註釋也不完整,相
信透過你自己的努力,完全可以看懂。
*******************************************************************
示例中用到的表達方法[首創]:
=>:跟進當前CALL
<=(XXXXXX):從XXXXXX的CALL中返回
<= 暫存器=值:從上一行的CALL返回的暫存器的值
行地址前面的0的個數和縮排可以區分該行所在的呼叫層次
********************************************************************
=>000445CE9 . CALL DWORD PTR DS:[EBX+2B8]=00476C38
/004780EA > MOV EAX,DWORD
PTR DS:[4815C0]
|004780EF . MOV AL,BYTE PTR DS:[EAX]
|004780F1 . MOV EDX,DWORD PTR SS:[EBP-4]
|004780F4 . MOV BYTE PTR DS:[EDX+6AF],AL//=01,來自[481310]=01
| .
00E72143 00//置未註冊版標誌
| .
| .
| .
|0047812E . MOV EDX,DLSupCBT.00481384 //=")XdXe8rXe2t4sX"
| ||
// "iXgXe2R4n6U8("
| \||/
解密視窗標題
| \/
|00478189 . LEA EDX,DWORD PTR SS:[EBP-7F]=" (UnRegistered)"
|
|=>004781F9 . CALL DLSupCBT.00408934
0408934 /$
PUSH EBX
0408935 |. MOV EBX,EAX
0408937 |. MOV EAX,EBX
=>0408939 |. CALL DLSupCBT.004088CC
4088D8 |. LEA EAX,DWORD PTR SS:[EBP-14C][0012F8F8]=00E917F4
4088DE |. PUSH EAX
//DLSupCBT.lic
4088DF |. MOV EAX,EBX
4088E1 |. CALL DLSupCBT.004040D8
4088E6 |. PUSH EAX
; |FileName
4088E7 |. CALL <JMP.&kernel32.FindFirstFileA>;
\FindFirstFileA
4088EC |. CMP EAX,-1
<= ax=0013E240(A4)(REG) ax=ffffffff(2.1E)
4088EF |. JE SHORT DLSupCBT.00408925//跳(UNREG)
4088F1 |. PUSH EAX
; /hSearch//不跳(REG)
4088F2 |. CALL <JMP.&kernel32.FindClose>;
\FindClose
4088F7 |. TEST BYTE PTR SS:[EBP-14C],10
//[0012F8F0]=20(REG)
4088FE |. JNZ SHORT DLSupCBT.00408925
408900 |. LEA EAX,DWORD PTR SS:[EBP-C]
//[12FA30]=E711EC(REG)
408903 |. PUSH EAX
;/pLocalFileTime
408904 |. LEA EAX,DWORD PTR SS:[EBP-138];|[12F904]=36FBD300(REG)
40890A |. PUSH EAX
;|pFileTime
40890B |. CALL <JMP.&kernel32.FileTimeT>;\FileTimeToLocalFileTime
408910 |. LEA EAX,DWORD PTR SS:[EBP-4]
//[12FA38]=00476FA4(REG)
408913 |. PUSH EAX
;/pDOSTime
408914 |. LEA EAX,DWORD PTR SS:[EBP-2];|[12FA3A]=FE180047(REG)
408917 |. PUSH EAX
;|pDOSDate
408918 |. LEA EAX,DWORD PTR SS:[EBP-C];|[12FA30]=451F1300(REG)
40891B |. PUSH EAX
;|pFileTime
40891C |. CALL <JMP.&kernel32.FileTim>;\FileTimeToDosDateTime
408921 |. TEST EAX,EAX <=EAX=01 [12FA38]=2ED6887D(REG)
408923 |. JNZ SHORT DLSupCBT.0040892C
408925 |> MOV DWORD PTR SS:[EBP-4],-1
//[0012FA44]<=FFFFFFFF(UNREG)
40892C \> MOV EAX,DWORD PTR SS:[EBP-4]
//[12FA38]=2ED6887D(REG)
<=(408939) eax=ffffffff(UNREG無DLSupCBT.lic) eax=2ED6887D(REG
有DLSupCBT.lic)
040893E |. INC EAX
//eax=0 Zf=1(UNREG) eax=2ED6887E(REG) Zf=0
040893F |. SETNE AL
//ZF取反 AL=0(UNREG) AL=01(REG)
|<=(4781F9) AL=0(UNREG) AL=1(REG)
|
|004781FE . TEST AL,AL 《 AL=01(REG)<= AL=00(UNREG)
|00478200 . JE DLSupCBT.00478357
|
|=>0047825F . CALL DWORD PTR DS:[EBX+40]
; DLSupCBT.00453114
=>0453167 |. CALL DWORD PTR DS:[EBX+38]
; DLSupCBT.0045300C
453067 |.
MOV EAX,DWORD PTR DS:[EBX+4][E91AF4] //="DLSupCBT.lic"
45306A |. CALL DLSupCBT.004040D8
45306F |. PUSH EAX
//<= EAX=E91AF4
"DLSupCBT.lic"
453070 |. PUSH 4000
//允許字串值的最大長度
453075 |. MOV EAX,DWORD PTR SS:[EBP-8]
453078 |. PUSH EAX
//ReturnBuffer=00E935C8
453079 |. PUSH 0
//出錯返回預設值
45307B |. PUSH 0
//讀取的的鍵 (Key)
名稱
45307D |. MOV EAX,ESI
45307F |. CALL DLSupCBT.004040D8
453084 |. PUSH EAX
; |讀取Section="DLSupCBT"
453085 |. CALL <JMP.&kernel32.GetPrivateProfil>;
\GetPrivateProfileStringA
|.
//讀取私有檔案DLSupCBT.lic中的資訊
45308A |. TEST EAX,EAX
<=
eax=d讀到位元組數(REG)
45308C |. JE SHORT DLSupCBT.004530B7
45308E |. MOV EBX,DWORD PTR SS:[EBP-8]
453091 |. JMP SHORT DLSupCBT.004530B2
453093 |> /LEA EAX,DWORD PTR SS:[EBP-C]
453096 |. |MOV EDX,EBX
453098 |. |CALL DLSupCBT.00403E4C
45309D |. |MOV EDX,DWORD PTR SS:[EBP-C]
4530A0 |. |MOV EAX,DWORD PTR SS:[EBP-4]
4530A3 |. |MOV ECX,DWORD PTR DS:[
=>4530A5 |. |CALL DWORD PTR DS:[ECX+34]=4117FA
=>411844 . CALL DLSupCBT.00411B24//呼叫2次
411B7C
|. INC DWORD PTR DS:[EBX+10]//執行2次,為45318B不跳做準備
++E91B58(REG)
<=(411844)
<=(4530A5)
<=(0453167)
=>0453185 |. CALL DWORD PTR DS:[EDX+14] ; DLSupCBT.00411A44 //++E91B58
411A44
. MOV EAX,DWORD PTR DS:[EAX+10]
E91B58 02(REG)
<=(0453185) eax=0(UNREG) EAX=2(REG)
0453188 |. MOV ESI,EAX
045318A |. DEC ESI
045318B |. TEST ESI,ESI ESI
//=FFFFFFFF(UNREG)
045318D |. JL SHORT DLSupCBT.004531D3
//跳(UNREG)
045318F |. INC ESI
//不跳(REG) EAX=2
=>04531CA |. |CALL
DLSupCBT.00411678 //呼叫2次
=>4116B6 |. FF51 34 CALL
DWORD PTR DS:[ECX+34] ; DLSupCBT.004117FC
=>411844 . CALL DLSupCBT.00411B24
//呼叫2次
411B7C
|. INC DWORD PTR DS:[EBX+10] //執行2次,為47829F不跳做準備
++E8F1CC
<=(411844)
<=(4116B6)
<=(4531CA)呼叫2次EAX=12F9F4(REG)
|<=(47825F) [E8F1CC]=2|
|00478262 . MOV EAX,DWORD PTR SS:[EBP-1C]
|00478265 . PUSH EAX
|00478266 . LEA EAX,DWORD PTR SS:[EBP-398]
|0047826C . PUSH EAX
|0047826D . MOV ECX,DLSupCBT.00478A98 ;
ASCII "PgmId"
|00478272 . MOV EDX,DLSupCBT.00478690 ;
ASCII "DLSupCBT"
|00478277 . MOV EAX,DWORD PTR SS:[EBP-10]
|0047827A . MOV EBX,DWORD PTR DS:[EAX]
|=>0047827C . CALL DWORD PTR DS:[EBX]
; DLSupCBT.00452E40
0452E5A |. PUSH EAX
//[E91AF4]="DLSupCBT.lic"
0452E5B |. PUSH 800
0452E60 |. LEA EAX,DWORD PTR SS:[EBP-800]
0452E66 |. PUSH EAX
0452E67 |. MOV EAX,DWORD PTR SS:[EBP+C]
0452E6A |. CALL DLSupCBT.004040D8
0452E6F |. PUSH EAX
; EAX=0
0452E70 |. MOV EAX,EDI
0452E72 |. CALL DLSupCBT.004040D8
0452E77 |. PUSH EAX
; EAX=00478A98,KEY指向"PgmId"
0452E78 |. MOV EAX,ESI
0452E7A |. CALL DLSupCBT.004040D8
0452E7F |. PUSH EAX
; |Section = "DLSupCBT"
0452E80 |. CALL <JMP.&kernel32.GetPrivateProf>;
\GetPrivateProfileStringA
//讀KEY
0452E85 |. MOV ECX,EAX
0452E87 |. LEA EDX,DWORD PTR SS:[EBP-800]
0452E8D |. MOV EAX,DWORD PTR SS:[EBP+8]
0452E90 |. CALL DLSupCBT.00403D7C
|<=(47827C)
|0047827E . MOV EDX,DWORD PTR SS:[EBP-398]
|00478284 . LEA EAX,DWORD PTR SS:[EBP-1C]
|00478287 . CALL DLSupCBT.00403D2C
|0047828C . XOR EAX,EAX
|0047828E . PUSH EBP
|0047828F . PUSH DLSupCBT.0047834D
|00478294 . PUSH DWORD PTR FS:[EAX]
|00478297 . MOV DWORD PTR FS:[EAX],ESP
|0047829A . MOV EAX,DWORD PTR SS:[EBP-14]
|0047829D . MOV EDX,DWORD PTR DS:[EAX]
|0047829F . CALL DWORD PTR DS:[EDX+14]
|0047829F . CALL DWORD PTR DS:[EDX+14][E8F1CC]=2
|004782A2 . CMP EAX,2 <= EAX=02(REG) <= EAX=00(UNREG)
|004782A5 . JNZ DLSupCBT.00478343
//跳(UNREG)
|
|004782AB . LEA EAX,DWORD PTR SS:[EBP-39C]
|004782B1 . MOV EDX,DLSupCBT.004813A0 ; 指向"(D4DCE3E0D3E2E6)攢汔逾?"
|004782B6 . MOV ECX,7
|004782BB . CALL DLSupCBT.00403EC4
|004782C0 . MOV EDX,DWORD PTR SS:[EBP-39C]//[4813A0]=(D4DCE3E0D3E2E6)攢汔逾?
|004782C6 . MOV EAX,DWORD PTR SS:[EBP-1C]
|004782C9 . CALL DLSupCBT.00404024
|004782CE . JNZ SHORT DLSupCBT.00478343
<= FZ=1(REG)
|004782D0 . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
|004782D3 . 50 PUSH EAX
|004782D4 . 8D85 60FCFFFF LEA EAX,DWORD PTR SS:[EBP-3A0]
|004782DA . 50 PUSH EAX
|004782DB . B9 A88A4700 MOV ECX,DLSupCBT.00478AA8
; ASCII "UserId"
|004782E0 . BA 90864700 MOV EDX,DLSupCBT.00478690
; ASCII "DLSupCBT"
|004782E5 . 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
|004782E8 . 8B18 MOV EBX,DWORD PTR
DS:[EAX]
|004782EA . FF13 CALL DWORD PTR
DS:[EBX] ; DLSupCBT.00452E40 讀KEY
|
|00478333 > MOV EAX,DWORD PTR DS:[48146C]
//[00481314]=00408D00
|00478338 . MOV AL,BYTE PTR DS:[EAX]
|0047833A . MOV EDX,DWORD PTR SS:[EBP-4]
|0047833D . MOV BYTE PTR DS:[EDX+6AF],AL=0
//置註冊版標誌
\
00E72143 01
<=(000445CE9)
這個示例展示了REG和UNREG的兩條路線:
REG:置未註冊版標誌/解密視窗標題/在當前目錄查詢DLSupCBT.lic檔案+轉換檔案的時間格式
/兩者都成功,退出4781F9時置成功標誌AL=01/執行47825F以保證在執行47829F時返回
EAX=02+執行4782C9時返回FZ=1/置註冊版標誌/到478357去判斷是否顯示NAG窗(不顯示)
UNREG:置未註冊版標誌/解密視窗標題/在當前目錄查詢DLSupCBT.lic檔案+轉換檔案的時間格
式/其中一項不成功,退出4781F9時置失敗標誌AL=0/帶著未註冊版標誌到478357去判斷
是否顯示NAG窗(當然是顯示NAG窗嘍)
看起來是KEY檔案DLSupCBT.lic在決定是否啟動註冊版標誌的。
如果你什麼也沒有做,程式將按UNREG的路線走。
如果你在當前目錄中生成一個長度為0的檔案,將它命名為DLSupCBT.lic,你就可以沿著REG的
路線走到47829F。
如果你在SupCBT.lic檔案中加入以下內容:
[DLSupCBT]
//在453084你可以看到Section="DLSupCBT"
User=囚童 //隨便寫的
Password=8765432 //隨便寫的
你就可以沿著REG的路線走到4782C9。
或許你要問:你怎麼知道DLSupCBT要加方括號呢?
我們只能告訴你:積累。在ini檔案中,Section是用方括號括起來的段名。
那為什麼隨便寫的KEY寫了兩條,而不是三條,比如還有COMPANY=呢?
因為在4782A2的條件是2。
因為你還無法走到478333,結果還是和UNREG一樣。不過不要氣餒,畢竟你已經看到了希望。
我們現在停在4782C9,我們是不是無事可做了呢?來看一下SS:[EBP-39C]指向哪裡?
[4813A0]="(D4DCE3E0D3E2E6)攢汔逾?"這是一堆什麼東西?老外在什麼情況下才用這樣的
碼?怎麼?還是個常量?不會就是PASSWORD吧?
好,不妨試一試。到ULTRAEDIT-32中搜尋一下"D4DCE3E0D3E2E6",把它複製到.lic檔案的
PASSWORD=後面,代替隨便寫的“8765432”。
如果你跟進了47827C,你會發現Section(DLSupCBT)的兩個KEY中,有一個是"PgmId",我們隨
便寫的KEY中,哪一個會是"PgmId"呢,應該是"PASSWORD"。好,把它換成"PgmId"。
那麼,由於4782EA呼叫的是相同的CALL(452E40),在呼叫前引用的字串變數"UserId"就一定
是另一個KEY了。好,把"User"換成"UserId"。
試執行。哈,NAG窗不見了,主視窗標題變成了"(Registered)
DLSuperCBT Resynchronizing
Byte Compare Program"。主視窗左下角的一行字“DLSuperCBT 30 Day Trial Version”不見
了,代替它的是“囚童”。怎麼樣?不錯吧。只是“囚童”顯得單調了些。來,我們動手把
KEY檔案DLSuperCBT.lic再潤色一下:
[DLSupCBT]
UserId=This copy of DLSupCBT is licensed to : 囚童
PgmId=攢汔逾?
//D4DCE3E0D3E2E6
再執行一次,好多了。
啊哈,這篇文章剛剛寫上最後的句號,收到作者的來信:
Sorry. I forgot the attachment.
Don Ludlow
隨信附來已註冊版本。檔案尺寸為743,936,與未註冊版本大小相同,只是檔案包中多了一個
檔案DLSuperCBT.lic。開啟來看一下:
[DLSupCBT]
UserId=Registered to 囚童
PgmId=攢汔逾?
哈,作者到底比我強,表達得即精煉又不單調,佩服。
相關文章
- 解除DLSupCBT的NAG窗和KEY檔案製作[原創] OLLYDBG初級教程,給初學者 (13千字)2015-11-15
- 製作ISO檔案2014-03-01
- 製作URL檔案的方法2015-03-29
- 如何製作一個 RPM 檔案2020-01-20
- 檔案補丁製作2015-11-15
- patch檔案的製作與使用2012-07-01
- 製作ISO檔案 與 提取ISO檔案2018-04-13
- Matlab製作shp檔案2024-03-16Matlab
- word製作聯合檔案頭的方法2017-01-14
- 網頁製作加入空的script檔案2010-05-07網頁
- rootfs -根檔案系統製作2021-09-15
- 輕鬆製作PDF檔案(轉)2007-08-09
- Luxion KeyShot Pro(3D渲染和動畫製作)2022-03-22UX3D動畫
- ^L00P's SmartBrainForce 演算法分析 - 怎樣製作一個KEY檔案
(2千字)2002-09-19AI演算法
- Python製作egg檔案包2019-02-15Python
- nginx製作檢查配置bat檔案2020-09-25NginxBAT
- DMG檔案格式製作:DMG Canvas for Mac2024-01-12CanvasMac
- Windows XP 映像檔案製作指南(轉)2007-08-11Windows
- 簡述grub啟動載入程式和製作kickstart檔案2018-11-12
- Linux 環境下 Makefile 檔案製作淺談(一)(轉)2007-08-11Linux
- 湃兔更新映象檔案的製作與燒寫2021-07-06
- 製作ASM裝置下的多個控制檔案2010-05-01ASM
- Luxion KeyShot Pro(3D渲染和動畫製作)Mac/Windows2022-10-26UX3D動畫MacWindows
- KeyShot Pro for mac3D渲染和動畫製作軟體2022-06-01Mac3D動畫
- KeyShot Pro for mac 3D渲染和動畫製作軟體2022-06-23Mac3D動畫
- KeyShot Pro for mac(3D渲染和動畫製作軟體)2023-03-27Mac3D動畫
- KVM場景製作qcow2檔案2021-08-07
- 使用ISE軟體製作網表檔案2020-12-28
- 使用WPS製作紅標頭檔案2016-06-21
- 製作tld檔案及應用詳解2014-07-10
- 如何製作ISO映象檔案?專業級ISO映象檔案製作工具AnyToISO Pro2022-06-22
- Mac 3D渲染和動畫製作軟體:KeyShot Pro for mac2022-05-05Mac3D動畫
- 怎樣製作證書請求檔案CSR2022-05-30
- python程式碼製作configure檔案2014-07-22Python
- 利用DOTNETBAR製作圓角窗體和圓角控制元件2012-11-27控制元件
- 使用Unity製作起霧的窗戶效果著色器2019-09-20Unity
- QNX 如何製作目標系統,製作系統映象,燒寫系統檔案2017-07-08
- iOS 製作靜態庫(.a檔案)(Xcode9)2018-02-24iOSXCode