VB 程序簡介 現(xiàn)在不少程序是用 VB 寫的,,你通過反匯編或跟蹤調試時很容易鑒別某個程序是否為 VB 程序,,VB 的 EXE 文件并不是真正的編譯可執(zhí)行文件,它們需其動態(tài)鏈接庫才能正常運行,,各版本的鏈接庫如下: VB3 鏈接庫為 vbrun300.dll ,; VB4 鏈接庫為 vb40016.dll ; - 16 位,,較少見,; VB4 鏈接庫為 vb40032.dll ; - 32 位,; VB5 鏈接庫為 msvbvm50.dll ,; VB6 鏈接庫為 msvbvm60.dll ; VB 程序執(zhí)行時從本質上講是解釋執(zhí)行,,它們只是調用 VBRUNxxx.DLL 中的函數(shù) ,,這樣可使程序員不需寫大量的程序代碼就可編寫出較好的圖形界面的 windows 程序,不過 VB 是真正的程序嗎,? 當然 VB 程序大大方便了程序編寫者,,但對我們來說, VB 程序向來是誰見誰頭痛,,一般用 VB 做的程序無論注冊碼也好,, 30 天到期也好,如果用常規(guī)方法都很難有被破解的可能,。原因很簡單,, VB 的 exe 是偽代碼,程序都在 vbXXX.dll 里面執(zhí)行,,你只能在 vbdll 里面用 sice 打轉轉,,什么都改不成,而且代碼質量不高,,結構還頗復雜,。 不過你學完這一課,你就不用怕 Vb 程序,,在這里我就談談兩種常用方法,,一、用 SOFTICE 對付,;二,、用 SmartCheck 。這一節(jié)就講講 SOFTICE 破解 VB 程序,。 -------------------------------------------------------------------------------- SOFTICE 配制 雖然大部分 VB 程序仍調用 Win32 API 函數(shù),,但如想在 VB dll 運行庫中設斷的話,你就必須把 VB dll 運行庫加入 SOFTICE 配制里去,。具體你可參考第五課中的《 SOFTICE 安裝及使用》,。 下例是在 win95/98 下你把相關的 VB DLL 運行庫加入 winice.dat 配制文件里,。 ( 部分 ) ; 注意分號后是描述語言,不被執(zhí)行,。每次只裝載需要的一種 VB dll ,,不要同時裝載兩個以上,把要裝載那種 VB dll 那一行的分號去掉,,重新啟動即可,。另外,判斷軟件是何種 VB dll 有幾種方法,,最直接一種用 WDasm89 查看,,還有一種方法是用十六進制工具打開程序,觀察,?;蛴?/font> SOFTICE 跟進去(用 bpx hmemcpy) ,稍轉一圈,,你觀察一下調試窗口領空處會出現(xiàn)何種 VB DLL 即可,。
這樣配制好后,重新啟動,,就可設 VB 運行庫中各函數(shù)的斷點了,。 -------------------------------------------------------------------------------- VB dll 常用函數(shù) 1 、字符處理函數(shù) MultiByteToWideChar, rtcR8ValFromBstr, WideCharToMultiByte, __vbaStrCmp, __vbaStrComp, __vbaStrCopy, __vbaStrMove, __vbaVarTstNe . 注意:這些函數(shù)前的下劃線 __ 是由兩根短線 _ 組成的,,不要弄錯,。 如果你是 crack VB6 程序,你應在斷點前增加 msvbvm60! ,。 如: bpx msvbvm60!__vbastrcomp VB5以前版本就沒此限制 ,。如 bpx __vbaStrCmp 一些常用字符串函數(shù) Val() - 轉換字符串為數(shù)字 . Str$() - 轉換數(shù)字為字符串 . Left$() - 按要求從左取字符。例如: Left$(Theodolite, 4) = "Theo". Right$() - 按要求從右取字符 . Ltrim$() - 去除字符串左邊空格例如: Ltrim$ (" Hello ") = "Hello ". Rtrim$() - 去除字符串左邊空格 . Trim$() - 去除字符串兩邊空格 . Asc() - 轉換字符為 ANSI 編碼 . 例如: Asc("A") = 65. (注:65是ASCII碼的十進制) Chr$() - 轉換 ANSI 編碼為字符 . 例如 Chr$(65) = "A". 幾個常用函數(shù)簡解:
2 ,、警告窗口函數(shù) rtcBeep, rtcGetPresentDate (time API), rtcMsgBox -------------------------------------------------------------------------------- VB 序列號破解技巧 在大部分 VB 程序中,我們能用 bpx Hmemcpy 命令設斷,,但是你將發(fā)現(xiàn)自己不久進入 VBRUNxxx.DLL 運行庫,,很快陷入 Vb dll 中,,在大多數(shù)情況下,你很難到達其 EXE 文件中的真正比較核心,。你通常是依靠字符串的線索來跟蹤程序,,你們還應記得 VB ( VB4 以上) 程序儲存和比較字符是用 wide character 格式(本質是中在各字符間填 20h )。如: 原來字符串 : CRACKZ (43h 52h 41h 43h 4Bh 5Ah). Wide 字符串格式 : C R A C K Z (43h 20h 52h 20h 41h 20h 43h 20h 4Bh 20h 5Ah). 這時在 SOFTICE 下查看內存中的字符串時看到情況有可能是: C R A C K Z 有些情況下應該用 DL (長實型)命令,,才能看到正確數(shù)字序號,。( SOFTICE 默認時為 DB (字節(jié)型)) 在多數(shù)情況下,在 VB 中設置正確斷點是較困難的,。斷點設置好后,,嘗試輸入序列號,運行后,,應返回 VBRUNxxx.DLL 里,,現(xiàn)在查找寄存器 (EAX & EBX) 中的值,那里放有你輸入字符串長度,,如果沒發(fā)現(xiàn)什么,,你應按 ctrl+D 再次返回到 VB dll 中另一處 ,繼續(xù)查看,,一直重復,。 一但當你在寄存器中發(fā)現(xiàn)字符串長度時,你應一步一步注意觀察,,如果你幸運的話,,你會發(fā)現(xiàn)輸入字符串躺在寄存器或其顯示附近內存里。這時你在 SOFTICE 里的數(shù)據(jù)窗口中用 ALT+ 光標鍵滾動查找,,說不定會發(fā)現(xiàn)正確序列號懶洋洋躺在那附近,。 -------------------------------------------------------------------------------- Visual Basic 程序比較方法 在 Visual Basic 里有 8 種以上的方法檢測正確的序列號 / 密碼。我這里將談談這 8 種方法,,它們都是較容易并用得較多,。首先是最普通的 3 種: 1) 串(string) 比較 在這比較方法里,正確密碼串如: "Correct Password" 和你輸入的密碼串如: "Entered Password" 比較,。 串是由相鄰的字符按順序排列組成,,一個串包括字母、數(shù)字,、空格和標點符號,。一個固定長度的串可儲存 0 到 63K 字符。如是動態(tài)的串其儲存字符個數(shù)可達 20 億字符,。
VB 串比較代碼一般格式: If "Correct Password" = "Entered Password" then <-- 直接比較兩個串字符 GoTo Correct Message Else GoTo Wrong Message End if 這是一種簡單保護方案,,如果程序者用這種函數(shù)保護,用 SOFTICE 很容易攔截,。 可用到的斷點: i) __vbastrcomp or __vbastrcmp (下劃線是兩短線 _ 組成) <-- 串比較函數(shù) 注意:如果你是 crack VB6 程序,,你應在兩斷點前增加 msvbvm60! ,。 如: bpx msvbvm60!__vbastrcomp or bpx msvbvm60!__vbastrcmp ii) 搜索特殊比較代碼(具體參考下一節(jié)) 如: 56,57,8b,7c,24,10,8b,74,24,0c,8b,4c,24,14,33,c0,f3,66,a7
2) 變量(Variant)比較 在這方法中,兩個變量(變量數(shù)據(jù)類型)互相比較,。變量數(shù)據(jù)類型是一種特殊數(shù)據(jù)類型,,包括數(shù)字、字符串或日期數(shù)據(jù)及一些用戶定義的類型,。這種類型儲存數(shù)字長度是 16 字節(jié)或字符 22 字節(jié)(加上串長度),。 一個范例代碼: Dim correct As Variant, entered As Variant <-- 定義 "correct" and "entered" 作為變量 correct = Correct Password <-- 設置 "correct" 放置 "Correct Password" entered = Text1.Text <-- 設置 "entered" 作為你輸入密碼 If correct = entered Then <-- 用變量方法比較 GoTo Correct Message Else GoTo Wrong Message End If 在這方法里, 1 中的兩個斷點將不起作用,,因為程序不再用 __vbastrcomp 等 ... 有用斷點 : i) __vbavartsteq <-- 測試變量是否相等 注意:如果你是 crack VB6 程序,,你應在兩斷點前增加 msvbvm60! 。 例: bpx msvbvm60!__vbavartsteq
3) 長整型( long) 比較 這也是一個普通的方法,。兩個變量(長整型)互相比較,。 long 型數(shù)據(jù)類型是 4 字節(jié)( 32 位)整數(shù),其范圍 -2,147,483,648 到 2,147,483,647 ,。因此該種方法存在只能比較數(shù)字的局限性,。 一個此類型范例: Dim correct As Long, entered As Long <-- 定義 "correct" 和 "entered" 作為長整型 correct = 12345 <-- 設置 "correct" 為正確密碼 entered = Text1.Text <-- 設置 "entered" 為輸入密碼 If entered = correct Then <-- 用長整型方法比較 GoTo Correct Message Else GoTo Wrong Message End If 對這種類型沒有專門的斷點函數(shù),因為其數(shù)據(jù)比較是在主程序里而不是在 VB dll 中,。 -------------------------------------------------------------------------------- 我再簡要談談其它的 5 種方法,,如果下面的方法你聽起來有點怪或不太可能,你可忽略它們,,但記得 VB 保護方式不限于上述三種,。 4) 單精度實數(shù)(Single)比較 這個方法用兩單精度實數(shù)數(shù)據(jù)彼此比較。 它的數(shù)據(jù)類型是單精度浮點實數(shù),,在內存中占 4 字節(jié)( 32 位),,數(shù)值范圍 -3.402823E38 到 -1.401298E-45 為負值, 1.401298E-45 到 3.402823E38 為正值,。 因此這方法一個限制是僅僅能比較數(shù)字,,但是有時,程序能把我們的姓名和序列號轉換成實數(shù)比較,。 這種類型格式 : Dim correct As Single, entered As Single <-- 定義 "correct" 和 "entered" 單精度型 correct = Correct Password <-- 設置 "correct" 為 "Correct Password" entered = Text1.Text <-- 設置 "entered" 為你輸入密碼 If correct = entered Then <-- 在此比較 GoTo Correct Message Else GoTo Wrong Message End If 對這種類型沒有專門的斷點函數(shù),,因為其數(shù)據(jù)比較是在主程序里而不是在 VB dll 中。 5) 雙精度(Double)比較 這個方法是用兩個雙精度數(shù)據(jù)比較,。 它的數(shù)據(jù)類型是雙精度浮點實數(shù),,在內存占 8 個字節(jié)( 64 位), -1.79769313486232E308 到 -4.94065645841247E-324 是正數(shù),, 4.94065645841247E-324 到 1.79769313486232E308 是負數(shù),。 你可能發(fā)現(xiàn)雙精度比較非常類似單精度比較。因此這方法一個限制是僅僅能比較數(shù)字,,但是有時,,程序能把我們的姓名和序列號轉換成實數(shù)比較,。 這種類型格式 : Dim correct As Double, entered As Double <-- 定義 "correct" 和 "entered" 為雙精度型 correct = Correct Password <-- 設置 "correct" 為 "Correct Password" entered = Text1.Text <-- 設置 "entered" 為你輸入的密碼 If correct = entered Then <-- 在此比較 GoTo Correct Message Else GoTo Wrong Message End If 對這種類型沒有專門的斷點函數(shù),,因為其數(shù)據(jù)比較是在主程序里而不是在 VB dll 中。
6) 整型(Integer)比較 這方法是用兩個整型數(shù)據(jù)進行彼此比較,。 它的數(shù)據(jù)在內存是以 2 個字節(jié)存放,。范圍 -32,768 到 32,767 ,。同樣這方法一個限制是僅僅能比較數(shù)字,但是有時,,程序能把我們的姓名和序列號轉換成實數(shù)比較。
這種類型格式 : Dim correct As Integer, entered As Integer <-- 定義 "correct" 和 "entered" 為整型 correct = Correct Password <-- 設置 "correct" 為 "Correct Password" entered = Text1.Text <-- 設置 "entered" 為你輸入的密碼 If correct = entered Then <-- 在此比較 GoTo Correct Message Else GoTo Wrong Message End If 對這種類型沒有專門的斷點函數(shù),,因為其數(shù)據(jù)比較是在主程序里而不是在 VB dll 中。 7) 字節(jié)(Byte)比較 這個方法是兩個字節(jié)數(shù)據(jù)進行比較,。 它是 0-255 范圍的整數(shù),,其通常存儲是 1 字節(jié)( 8 位)。 其限制不超過 255, 但有時它通過計算把你姓名轉換成數(shù)字,,以此比較,。 這種類型格式 : Dim correct As Byte, entered As Byte <-- 定義 "correct" 和 "entered" 為字節(jié)型 correct = Correct Password <-- 設置 "correct" 為 "Correct Password" entered = Text1.Text <-- 設置 "entered" 為你輸入的密碼 If correct = entered Then <-- 在此比較 GoTo Correct Message Else GoTo Wrong Message End If 對這種類型沒有專門的斷點函數(shù),因為其數(shù)據(jù)比較是在主程序里而不是在 VB dll 中,。
8) CURRENCY 型比較 這個方法是用兩個 Currency 數(shù)據(jù)類型進行比較,。是的,它聽起來是怪,,但確實存在,! 它的數(shù)據(jù)范圍: -922,337,203,685,477.5808 到 922,337,203,685,477.5807. 用這數(shù)據(jù)類型進行貨幣和一些需高精度的場合上很重用。 因此此種方法局限性也是只能比較數(shù)字,,但有時它通過計算把你姓名轉換成數(shù)字,,以此比較。 這種類型格式 : Dim correct As Currency, entered As Currency <-- 定義 "correct" 和 "entered" 為 Currency 型 correct = Correct Password <-- 設置 "correct" 為 "Correct Password" entered = Text1.Text <-- 設置 "entered" 為你輸入的密碼 If correct = entered Then <-- 在此比較 GoTo Correct Message Else GoTo Wrong Message End If 對這種類型沒有專門的斷點函數(shù),,因為其數(shù)據(jù)比較是在主程序里而不是在 VB dll 中,。 -------------------------------------------------------------------------------- 上述8個比較方式是不是意味著我們每次能中斷在其單個某一類型的比較程序里?回答是否定的。這是因為程序有可能同時采用兩種方法來比較,,如Currency和String, Variant 和 Long 等... 比較類型列表
V = Variant 型比較 SD = 在比較前字符串( String )轉換成雙精度型( Doubl ) SC = 在比較前字符串( String )轉換成 Currency 型 SS = 在比較前字符串( String )轉換成雙單精度型( Single ) Sin to D = 在比較前單精度型轉換成雙精度型( Double ) DC = 直接比較 __vbaFpCmpCy =Currency 型浮點比較 從這里你將會明白,,如沒用其它工具直接用 SOFTICE ,你將花費大量的精力和時間找出 VB 程序真正的比較代碼程序,。不過幸好 SmartCheck 的出現(xiàn)使我們走出這惡夢,,我們如用SOFTICE找不到序列號,此時可用SmartCheck幫我們快速找到關鍵斷點函數(shù),。 -------------------------------------------------------------------------------- 一些可能用上的斷點 1) 數(shù)據(jù)類型轉換 i) 字符串( String )轉換字節(jié)( Byte )或整型( Integer ) : __vbai2str ii) 字符串( String )轉長型( Long ) : __vbai4str iii) 字符串( String )轉換單精度型( Single ) : __vbar4str iv) 字符串( String )轉換雙精度型( Double ) : __vbar8str v) 字符串( String )轉 Currency 型 : VarCyFromStr ( 適合 VB6. 你的 WINICE.DAT 必須有 OLEAUT32.DLL) vi) 整型( Integer )轉字符串型( String ) : VarBstrFromI2 ( 適合 VB6. 你的 WINICE.DAT 必須 OLEAUT32.DLL) 2) 移動數(shù)據(jù) i) 字符串( String )到內存 : __vbaStrCopy ii) 變量( Variant )到內存 : __vbaVarCopy or __vbaVarMove 3) 運算符 i) 加法 : __vbavaradd <-- 增加變量 ii) 減法 : __vbavarsub <-- 減去變量 iii) 乘法 : __vbavarmul <-- 乘以變量 iv) 除法 : __vbavaridiv <--Dividing Variant to get answer in Integer v) XOR: __vbavarxor <--XOR 4) 其它類 i) __vbavarfornext <--Used in codes where there is a For... Next... Statement (Loop) ii) __vbafreestr iii) __vbafreeobj iv) __vbastrvarval <--Get the value from a specific location in a String v) multibytetowidechar vi) rtcMsgBox vii) __vbavarcat <--Joining 2 Variants together viii) __vbafreevar ix) __vbaobjset ============================= crack VB程序的一些建議 1 )用SmartCheck配合,。 首先:運行 SmartCheck 后,點擊 Program -> Settings. 在 Error Detection 這一欄中選中所有的 ERROR 報告,。Report errors immedietly 可不選,。在 Advanced 中僅僅頂部 3 個 Report 必須選上。 其次:在 Reporting 這一欄中:除了 Report MouseMove events from OCX controls 這項外把其它各項全選上,。 2 )在用 SmartCheck 中打開被 crack 文件之前,,你最好多運行需被 CRACK 的文件幾次,以了解其一些保護方法,。 3 )用 SmartCheck 裝載程序后,,按 program → start 運行程序,運行好后,,輸入序列號,,按 OK 。選擇 "Show All Events" ,,然后整個相關信息列出在上左部分主框中,。在這里非常容易發(fā)現(xiàn)你需要的一行,如: xxxxxx_Click. xxxxxx ,,你可點擊在右框中看到其相關信息,。 3) 一般首先尋找 __vbastrcomp, __vbastrcmp or __vbavartsteq 如果你幸運的話,你可能會發(fā)現(xiàn)序列號碼,。其具體的一些技巧參看下一節(jié),。 4) 如果不能發(fā)現(xiàn)上述 3 個函數(shù),可能是用其它的一些比較方法?,F(xiàn)在通過這一行,,尋找一些程序注冊出錯的信息。你一般會發(fā)現(xiàn)幾個我在第一部分《 VB 介紹》這課末尾處列出的幾個 __vba 函數(shù),,先找出一個離出錯信息最近的一個,。你這時可能需 SOFTICE 配合了,在 SOFTICE 中可用此函數(shù)設斷,,你可在 SmartCheck 中觀察一下會中斷幾次,,以便知在 SOFTICE 下按多少下 F5. 例如:你設置 __vbafreestr 斷點,,在你點擊 OK 后,有很多次中斷,。如果你在 SmartCheck 下查看是在第 10 處: 10th __vbafreestr 離出錯信息最近,,在 SOFTICE 下你可按 F5 九次來到 __vbafreestr 。 記得在 VB6, 設斷時前面加上 msvbvm60! ,。 5) 運行程序輸入序列號,,按 OK,SOFTICE 將會中斷,除非你斷點沒找對,。有一點需注意:在 VB6 下有可能需在運行程序前設置斷點,,才能中斷,。 6) 開始跟蹤每一個 CALL 并查看每一懷疑的注冊號,。它不會花費你許多時間就能來到錯誤信息處。如果沒發(fā)現(xiàn)任何懷疑地方,,返回 SmartCheck 尋找下一個斷點,,剛才的斷點有可能在比較程序后面。 |
|
來自: 戰(zhàn)神之家 > 《我的圖書館》