軟件破解之“動(dòng)態(tài)跟蹤分析”
發(fā)布日期:2022-01-04 02:16 | 文章來(lái)源:腳本之家
一、SOFTICE 配制
雖然大部分 VB 程序仍調(diào)用 Win32 API 函數(shù),但如想在 VB dll 運(yùn)行庫(kù)中設(shè)斷的話,你就必須把 VB dll 運(yùn)行庫(kù)加入 SOFTICE 配制里去。 下例是在 win95/98 下你把相關(guān)的 VB DLL 運(yùn)行庫(kù)加入 winice.dat 配制文件里。 ( 部分 )
; 注意分號(hào)后是描述語(yǔ)言,不被執(zhí)行。每次只裝載需要的一種 VB dll ,最好不要同時(shí)裝載兩個(gè)以上,把要裝載那種 VB dll 那一行的分號(hào)去掉,重新啟動(dòng)即可。另外,判斷軟件是何種 VB dll 有幾種方法,最直接一種用 WDasm89 查看,還有一種方法是用十六進(jìn)制工具打開(kāi)程序觀察?;蛴?SOFTICE 跟進(jìn)去(用 bpx hmemcpy) ,稍轉(zhuǎn)一圈,你觀察一下調(diào)試窗口領(lǐng)空處會(huì)出現(xiàn)何種 VB DLL 即可。 ; EXP=c:\windows\system\msvbvm60.dll ; Visual Basic 6
; EXP=c:\windows\system\msvbvm50.dll ; Visual Basic 5
; EXP=c:\windows\system\vb40032.dll ; Visual Basic 4(32-bit)
; EXP=c:\windows\system\vb40016.dll ;Visual Basic 4(16-bit) 較少見(jiàn)
; EXP=c:\windows\system\vbrun300.dll ; Visual Basic 3
這樣配制好后,重新啟動(dòng),就可設(shè) VB 運(yùn)行庫(kù)中各函數(shù)的斷點(diǎn)了。 --------------------------------------------------------------------------------
二、VB dll 常用函數(shù) 1 、字符處理函數(shù) MultiByteToWideChar, rtcR8ValFromBstr, WideCharToMultiByte, __vbaStrCmp, __vbaStrComp, __vbaStrCopy, __vbaStrMove, __vbaVarTstNe .
注意:這些函數(shù)前的下劃線 __ 是由兩根短線 _ 組成的,不要弄錯(cuò)。 如果你是 crack VB6 程序,你應(yīng)在斷點(diǎn)前增加 msvbvm60! 。 如: bpx msvbvm60!__vbastrcomp
一些常用字符串函數(shù):
Val() 轉(zhuǎn)換字符串為數(shù)字 Rtrim$() 去除字符串左邊空格
Str$() 轉(zhuǎn)換數(shù)字為字符串 Trim$() 去除字符串兩邊空格
Left$() 按要求從左取字符。例如: Left$(Theodolite, 4) = "Theo" Asc() 轉(zhuǎn)換字符為 ANSI 編碼 . 例如: Asc("A") = 65 注:65是ASCII碼的十進(jìn)制
Ltrim$() 去除字符串左邊空格例如: Ltrim$Content$nbsp;(" Hello ") = "Hello " Chr$() 轉(zhuǎn)換 ANSI 編碼為字符 . 例如 Chr$(65) = "A"
Right$() 按要求從右取字符 幾個(gè)常用函數(shù)簡(jiǎn)介:
1、 __vbavartstne 如是在VB5中CALL MSVBVM50!___vbavartstne
進(jìn)去后在0F04E351你將看到:
push dword ptr [ebp 0c] ;Push address *真* serial 的地址
push dword ptr [ebp 10] ;Push address 你輸入的serial地址 下命令:d ebp 0c
你將在數(shù)據(jù)窗口看到 4字節(jié)地址倒序排列,你再次D 地址(己糾正順序的), 就可看到序列號(hào)了。
2、 __vbaR8Str 在 VB5中是如下情況:
Push ebp-20
Call MSVBUM50.__vbaR8Str ;轉(zhuǎn)換 string 到 Integer/Real
fcomp qword ptr [00401028] ;數(shù)據(jù)比較 在這行fcomp qword ptr [00401028] Type: DL 00401028 將看到*real* serial #.
O
DL 是顯示 Long/real 型,SOFTICE默認(rèn)時(shí)是DB狀態(tài)。
3、 __vbastrcmp
例:
:005BDC32 CALL [MSVBVM50!__VbaFreeVar]
:005BDC38 MOV ESI,[EBP 08]
:005BDC3B PUSH ESI
:005BDC3E CALL [ECX 00000790] <-- 值返回到 EDX.
:005BDC44 MOV EDX,[ESI 4C] <-- 輸入的號(hào)碼,但倒轉(zhuǎn)
:005BDC47 MOV EAX,[005E0078] <-- 正確號(hào)碼
:005BDC4C PUSH EDX
:005BDC4D PUSH EAX <-- Push參數(shù)給 __vbaStrCmp.
:005BDC4E CALL [MSVBVM50!__vbaStrCmp] <-- Visual Basic 字符串比較
:005BDC54 TEST EAX,EAX <-- 測(cè)試比較結(jié)果
:005BDC56 JNZ 005BDC64 <-- 不相等跳走
2 、警告窗口函數(shù) rtcBeep, rtcGetPresentDate (time API),
--------------------------------------------------------------------------------
三、VB字串格式 在大部分 VB 程序中,我們能用 bpx Hmemcpy 命令設(shè)斷,但是你將發(fā)現(xiàn)自己不久進(jìn)入 VBRUNxxx.DLL 運(yùn)行庫(kù),很快陷入 Vb dll 中,在大多數(shù)情況下,你很難到達(dá)其 EXE 文件中的真正比較核心。你通常是依靠字符串的線索來(lái)跟蹤程序,你們還應(yīng)記得 VB ( VB4 以上) 程序儲(chǔ)存和比較字符是用 wide character 格式(本質(zhì)是中在各字符間填 0x00)。
The MultiByteToWideChar( ) function maps a character string to a wide-character (Unicode) string. The character string mapped by this function is not necessarily from a multibyte character set.
int MultiByteToWideChar(
UINT CodePage, // code page
DWORD dwFlags, // character-type options
LPCSTR lpMultiByteStr, // string to map
int cbMultiByte, // number of bytes in string
LPWSTR lpWideCharStr, // wide-character buffer
int cchWideChar // size of buffer
); 如:
原來(lái)字符串 : CRACKZ (43h 52h 41h 43h 4Bh 5Ah). Wide 字符串格式 : C R A C K Z (43h 00h 52h 00h 41h 00h 43h 00h 4Bh 00h 5Ah). 這時(shí)在 SOFTICE 下查看內(nèi)存中的字符串時(shí)看到情況有可能是: 有些情況下應(yīng)該用 DL (長(zhǎng)實(shí)型)命令,才能看到正確數(shù)字序號(hào)。( SOFTICE 默認(rèn)時(shí)為 DB (字節(jié)型))
在多數(shù)情況下,在 VB 中設(shè)置正確斷點(diǎn)是較困難的。斷點(diǎn)設(shè)置好后,嘗試輸入序列號(hào),運(yùn)行后,應(yīng)返回 VBRUNxxx.DLL 里,現(xiàn)在查找寄存器 (EAX & EBX) 中的值,那里放有你輸入字符串長(zhǎng)度,如果沒(méi)發(fā)現(xiàn)什么,你應(yīng)按 ctrl D 再次返回到 VB dll 中另一處 ,繼續(xù)查看,一直重復(fù)。 一但當(dāng)你在寄存器中發(fā)現(xiàn)字符串長(zhǎng)度時(shí),你應(yīng)一步一步注意觀察,如果你幸運(yùn)的話,你會(huì)發(fā)現(xiàn)輸入字符串躺在寄存器或其顯示附近內(nèi)存里。這時(shí)你在 SOFTICE 里的數(shù)據(jù)窗口中用 ALT 光標(biāo)鍵滾動(dòng)查找,說(shuō)不定會(huì)發(fā)現(xiàn)正確序列號(hào)懶洋洋躺在那附近。
--------------------------------------------------------------------------------
四、oleaut32.dll簡(jiǎn)介 (作者:dr0)
破解VB程序時(shí),對(duì)vbrun*.dll(VB4、VB3版本)和msvbvm*.dll(VB5、VB6)強(qiáng)調(diào)得比較多,實(shí)際上VB程序的很多運(yùn)算是在oleaut32.dll中完成的,這個(gè)dll提供了很多對(duì)VB中的Variant類(lèi)型的變量進(jìn)行操作的函數(shù),主要是一系列VarXXX( ),其中有幾個(gè)是用來(lái)比較字符串和數(shù)值的,如下: Addr:77A11AAE Ord: 176 (00B0h) Name: VarCmp
Addr:77A0E5D1 Ord: 311 (0137h) Name: VarCyCmp
Addr:77A0E5F8 Ord: 312 (0138h) Name: VarCyCmpR8
Addr:77A129CD Ord: 314 (013Ah) Name: VarBstrCmp
Addr:77A12958 Ord: 316 (013Ch) Name: VarR4CmpR8
Addr:77A13697 Ord: 204 (00CCh) Name: VarDecCmp
Addr:77A1298B Ord: 298 (012Ah) Name: VarDecCmpR8 這里有個(gè)小程序RAMQuota(www.stepnet.com.au),是用VB6寫(xiě)的,它使用上述函數(shù)中的VarBstrCmp( )比較注冊(cè)碼。該函數(shù)的關(guān)鍵指令如下:
:77A12A03 8B7D0Cmov edi, dword ptr [ebp 0C]
:77A12A06 8B7508mov esi, dword ptr [ebp 08]
:77A12A09 8B4D10mov ecx, dword ptr [ebp 10]
:77A12A0C 33C0 xor eax, eax
:77A12A0E F3 repz ;
:77A12A0F 66A7 cmpsw
:77A12A11 7405 je 77A12A18
:77A12A13 1BC0 sbb eax, eax
:77A12A15 83D8FFsbb eax, FFFFFFFF
:77A12A18 85C0 test eax, eax _2
:77A12A1A 7F45 jg 77A12A61
:77A12A1C 7D16 jge 77A12A34
:77A12A1E 33C0 xor eax, eax
看來(lái)有必要仔細(xì)看一下oleaut32.dll
五、Visual Basic 程序比較方法 在 Visual Basic 里有 8 種以上的方法檢測(cè)正確的序列號(hào) / 密碼。我這里將談?wù)勥@ 8 種方法,它們都是較容易并用得較多。首先是最普通的 3 種:
1) 串(string) 比較
在這比較方法里,正確密碼串如: "Correct Password" 和你輸入的密碼串如: "Entered Password" 比較。
串是由相鄰的字符按順序排列組成,一個(gè)串包括字母、數(shù)字、空格和標(biāo)點(diǎn)符號(hào)。一個(gè)固定長(zhǎng)度的串可儲(chǔ)存 0 到 63K 字符。如是動(dòng)態(tài)的串其儲(chǔ)存字符個(gè)數(shù)可達(dá) 20 億字符。
VB 串比較代碼一般格式: If "Correct Password" = "Entered Password" then <-- 直接比較兩個(gè)串字符
GoTo Correct Message Else
GoTo Wrong Message End if 這是一種簡(jiǎn)單保護(hù)方案,如果程序者用這種函數(shù)保護(hù),用 SOFTICE 很容易攔截。
可用到的斷點(diǎn):
i) __vbastrcomp or __vbastrcmp (下劃線是兩短線 _ 組成)<-- 串比較函數(shù) 注意:如果你是 crack VB6 程序,你應(yīng)在兩斷點(diǎn)前增加 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)比較
在這方法中,兩個(gè)變量(變量數(shù)據(jù)類(lèi)型)互相比較。變量數(shù)據(jù)類(lèi)型是一種特殊數(shù)據(jù)類(lèi)型,包括數(shù)字、字符串或日期數(shù)據(jù)及一些用戶定義的類(lèi)型。這種類(lèi)型儲(chǔ)存數(shù)字長(zhǎng)度是 16 字節(jié)或字符 22 字節(jié)(加上串長(zhǎng)度)。
一個(gè)范例代碼:
Dim correct As Variant, entered As Variant <-- 定義 "correct" and "entered" 作為變量 correct = Correct Password <-- 設(shè)置 "correct" 放置 "Correct Password" entered = Text1.Text <-- 設(shè)置 "entered" 作為你輸入密碼
If correct = entered Then <-- 用變量方法比較
GoTo Correct Message Else GoTo Wrong Message
End If 在這方法里, 1 中的兩個(gè)斷點(diǎn)將不起作用,因?yàn)槌绦虿辉儆? __vbastrcomp 等 ...
有用斷點(diǎn) :
i) __vbavartsteq<-- 測(cè)試變量是否相等 %
注意:如果你是 crack VB6 程序,你應(yīng)在兩斷點(diǎn)前增加 。 例: bpx msvbvm60!__vbavartsteq 3) 長(zhǎng)整型( long) 比較 ; 這也是一個(gè)普通的方法。兩個(gè)變量(長(zhǎng)整型)互相比較。 long 型數(shù)據(jù)類(lèi)型是 4 字節(jié)( 32 位)整數(shù),其范圍 -2,147,483,648 到 2,147,483,647 。因此該種方法存在只能比較數(shù)字的局限性。 一個(gè)此類(lèi)型范例: Dim correct As Long, entered As Long <-- 定義 "correct" 和 "entered" 作為長(zhǎng)整型 correct = 12345 <-- 設(shè)置 "correct" 為正確密碼
entered = Text1.Text <-- 設(shè)置 "entered" 為輸入密碼
If entered = correct Then <-- 用長(zhǎng)整型方法比較
GoTo Correct Message Else GoTo Wrong Message End If
對(duì)這種類(lèi)型沒(méi)有專門(mén)的斷點(diǎn)函數(shù),因?yàn)槠鋽?shù)據(jù)比較是在主程序里而不是在 VB dll 中。
-------------------------------------------------------------------------------- 另外還有其它的 5 種方法,如果下面的方法你聽(tīng)起來(lái)有點(diǎn)怪或不太可能,你可忽略它們,但記得 VB 保護(hù)方式不限于上述三種。 4) 單精度實(shí)數(shù)(Single)比較 5) 雙精度(Double)比較
6) 整型(Integer)比較
7) 字節(jié)(Byte)比較 8) CURRENCY 型比較 上述8個(gè)比較方式是不是意味著我們每次能中斷在其單個(gè)某一類(lèi)型的比較程序里?回答是否定的。這是因?yàn)槌绦蛴锌赡芡瑫r(shí)采用兩種方法來(lái)比較,如Currency和String, Variant 和 Long 等... 一些可能用上的斷點(diǎn)
1) 數(shù)據(jù)類(lèi)型轉(zhuǎn)換
i) 字符串( String )轉(zhuǎn)換字節(jié)( Byte )或整型( Integer ) : __vbai2str
ii) 字符串( String )轉(zhuǎn)長(zhǎng)型( Long ) : __vbai4str iii) 字符串( String )轉(zhuǎn)換單精度型( Single ) : __vbar4str
iv) 字符串( String )轉(zhuǎn)換雙精度型( Double ) : __vbar8str
v) 字符串( String )轉(zhuǎn) Currency 型 : VarCyFromStr ( 適合 VB6. 你的 WINICE.DAT 必須有 OLEAUT32.DLL) vi) 整型( Integer )轉(zhuǎn)字符串型( String ) : VarBstrFromI2 ( 適合 VB6. 你的 WINICE.DAT 必須 OLEAUT32.DLL) 2) 移動(dòng)數(shù)據(jù)
i) 字符串( String )到內(nèi)存 : __vbaStrCopy ii) 變量( Variant )到內(nèi)存 : __vbaVarCopy or __vbaVarMove
3) 運(yùn)算符
i) 加法 : __vbavaradd <-- 增加變量
ii) 減法 : __vbavarsub <-- 減去變量 iii) 乘法 : __vbavarmul<-- 乘以變量
iv) 除法 : __vbavaridiv <--Dividing Variant to get answer in Integer
v) XOR: __vbavarxor<--XOR 4) 其它類(lèi) 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
雖然大部分 VB 程序仍調(diào)用 Win32 API 函數(shù),但如想在 VB dll 運(yùn)行庫(kù)中設(shè)斷的話,你就必須把 VB dll 運(yùn)行庫(kù)加入 SOFTICE 配制里去。 下例是在 win95/98 下你把相關(guān)的 VB DLL 運(yùn)行庫(kù)加入 winice.dat 配制文件里。 ( 部分 )
; 注意分號(hào)后是描述語(yǔ)言,不被執(zhí)行。每次只裝載需要的一種 VB dll ,最好不要同時(shí)裝載兩個(gè)以上,把要裝載那種 VB dll 那一行的分號(hào)去掉,重新啟動(dòng)即可。另外,判斷軟件是何種 VB dll 有幾種方法,最直接一種用 WDasm89 查看,還有一種方法是用十六進(jìn)制工具打開(kāi)程序觀察?;蛴?SOFTICE 跟進(jìn)去(用 bpx hmemcpy) ,稍轉(zhuǎn)一圈,你觀察一下調(diào)試窗口領(lǐng)空處會(huì)出現(xiàn)何種 VB DLL 即可。 ; EXP=c:\windows\system\msvbvm60.dll ; Visual Basic 6
; EXP=c:\windows\system\msvbvm50.dll ; Visual Basic 5
; EXP=c:\windows\system\vb40032.dll ; Visual Basic 4(32-bit)
; EXP=c:\windows\system\vb40016.dll ;Visual Basic 4(16-bit) 較少見(jiàn)
; EXP=c:\windows\system\vbrun300.dll ; Visual Basic 3
這樣配制好后,重新啟動(dòng),就可設(shè) VB 運(yùn)行庫(kù)中各函數(shù)的斷點(diǎn)了。 --------------------------------------------------------------------------------
二、VB dll 常用函數(shù) 1 、字符處理函數(shù) MultiByteToWideChar, rtcR8ValFromBstr, WideCharToMultiByte, __vbaStrCmp, __vbaStrComp, __vbaStrCopy, __vbaStrMove, __vbaVarTstNe .
注意:這些函數(shù)前的下劃線 __ 是由兩根短線 _ 組成的,不要弄錯(cuò)。 如果你是 crack VB6 程序,你應(yīng)在斷點(diǎn)前增加 msvbvm60! 。 如: bpx msvbvm60!__vbastrcomp
一些常用字符串函數(shù):
Val() 轉(zhuǎn)換字符串為數(shù)字 Rtrim$() 去除字符串左邊空格
Str$() 轉(zhuǎn)換數(shù)字為字符串 Trim$() 去除字符串兩邊空格
Left$() 按要求從左取字符。例如: Left$(Theodolite, 4) = "Theo" Asc() 轉(zhuǎn)換字符為 ANSI 編碼 . 例如: Asc("A") = 65 注:65是ASCII碼的十進(jìn)制
Ltrim$() 去除字符串左邊空格例如: Ltrim$Content$nbsp;(" Hello ") = "Hello " Chr$() 轉(zhuǎn)換 ANSI 編碼為字符 . 例如 Chr$(65) = "A"
Right$() 按要求從右取字符 幾個(gè)常用函數(shù)簡(jiǎn)介:
1、 __vbavartstne 如是在VB5中CALL MSVBVM50!___vbavartstne
進(jìn)去后在0F04E351你將看到:
push dword ptr [ebp 0c] ;Push address *真* serial 的地址
push dword ptr [ebp 10] ;Push address 你輸入的serial地址 下命令:d ebp 0c
你將在數(shù)據(jù)窗口看到 4字節(jié)地址倒序排列,你再次D 地址(己糾正順序的), 就可看到序列號(hào)了。
2、 __vbaR8Str 在 VB5中是如下情況:
Push ebp-20
Call MSVBUM50.__vbaR8Str ;轉(zhuǎn)換 string 到 Integer/Real
fcomp qword ptr [00401028] ;數(shù)據(jù)比較 在這行fcomp qword ptr [00401028] Type: DL 00401028 將看到*real* serial #.
O
DL 是顯示 Long/real 型,SOFTICE默認(rèn)時(shí)是DB狀態(tài)。
3、 __vbastrcmp
例:
:005BDC32 CALL [MSVBVM50!__VbaFreeVar]
:005BDC38 MOV ESI,[EBP 08]
:005BDC3B PUSH ESI
:005BDC3E CALL [ECX 00000790] <-- 值返回到 EDX.
:005BDC44 MOV EDX,[ESI 4C] <-- 輸入的號(hào)碼,但倒轉(zhuǎn)
:005BDC47 MOV EAX,[005E0078] <-- 正確號(hào)碼
:005BDC4C PUSH EDX
:005BDC4D PUSH EAX <-- Push參數(shù)給 __vbaStrCmp.
:005BDC4E CALL [MSVBVM50!__vbaStrCmp] <-- Visual Basic 字符串比較
:005BDC54 TEST EAX,EAX <-- 測(cè)試比較結(jié)果
:005BDC56 JNZ 005BDC64 <-- 不相等跳走
2 、警告窗口函數(shù) rtcBeep, rtcGetPresentDate (time API),
--------------------------------------------------------------------------------
三、VB字串格式 在大部分 VB 程序中,我們能用 bpx Hmemcpy 命令設(shè)斷,但是你將發(fā)現(xiàn)自己不久進(jìn)入 VBRUNxxx.DLL 運(yùn)行庫(kù),很快陷入 Vb dll 中,在大多數(shù)情況下,你很難到達(dá)其 EXE 文件中的真正比較核心。你通常是依靠字符串的線索來(lái)跟蹤程序,你們還應(yīng)記得 VB ( VB4 以上) 程序儲(chǔ)存和比較字符是用 wide character 格式(本質(zhì)是中在各字符間填 0x00)。
The MultiByteToWideChar( ) function maps a character string to a wide-character (Unicode) string. The character string mapped by this function is not necessarily from a multibyte character set.
int MultiByteToWideChar(
UINT CodePage, // code page
DWORD dwFlags, // character-type options
LPCSTR lpMultiByteStr, // string to map
int cbMultiByte, // number of bytes in string
LPWSTR lpWideCharStr, // wide-character buffer
int cchWideChar // size of buffer
); 如:
原來(lái)字符串 : CRACKZ (43h 52h 41h 43h 4Bh 5Ah). Wide 字符串格式 : C R A C K Z (43h 00h 52h 00h 41h 00h 43h 00h 4Bh 00h 5Ah). 這時(shí)在 SOFTICE 下查看內(nèi)存中的字符串時(shí)看到情況有可能是: 有些情況下應(yīng)該用 DL (長(zhǎng)實(shí)型)命令,才能看到正確數(shù)字序號(hào)。( SOFTICE 默認(rèn)時(shí)為 DB (字節(jié)型))
在多數(shù)情況下,在 VB 中設(shè)置正確斷點(diǎn)是較困難的。斷點(diǎn)設(shè)置好后,嘗試輸入序列號(hào),運(yùn)行后,應(yīng)返回 VBRUNxxx.DLL 里,現(xiàn)在查找寄存器 (EAX & EBX) 中的值,那里放有你輸入字符串長(zhǎng)度,如果沒(méi)發(fā)現(xiàn)什么,你應(yīng)按 ctrl D 再次返回到 VB dll 中另一處 ,繼續(xù)查看,一直重復(fù)。 一但當(dāng)你在寄存器中發(fā)現(xiàn)字符串長(zhǎng)度時(shí),你應(yīng)一步一步注意觀察,如果你幸運(yùn)的話,你會(huì)發(fā)現(xiàn)輸入字符串躺在寄存器或其顯示附近內(nèi)存里。這時(shí)你在 SOFTICE 里的數(shù)據(jù)窗口中用 ALT 光標(biāo)鍵滾動(dòng)查找,說(shuō)不定會(huì)發(fā)現(xiàn)正確序列號(hào)懶洋洋躺在那附近。
--------------------------------------------------------------------------------
四、oleaut32.dll簡(jiǎn)介 (作者:dr0)
破解VB程序時(shí),對(duì)vbrun*.dll(VB4、VB3版本)和msvbvm*.dll(VB5、VB6)強(qiáng)調(diào)得比較多,實(shí)際上VB程序的很多運(yùn)算是在oleaut32.dll中完成的,這個(gè)dll提供了很多對(duì)VB中的Variant類(lèi)型的變量進(jìn)行操作的函數(shù),主要是一系列VarXXX( ),其中有幾個(gè)是用來(lái)比較字符串和數(shù)值的,如下: Addr:77A11AAE Ord: 176 (00B0h) Name: VarCmp
Addr:77A0E5D1 Ord: 311 (0137h) Name: VarCyCmp
Addr:77A0E5F8 Ord: 312 (0138h) Name: VarCyCmpR8
Addr:77A129CD Ord: 314 (013Ah) Name: VarBstrCmp
Addr:77A12958 Ord: 316 (013Ch) Name: VarR4CmpR8
Addr:77A13697 Ord: 204 (00CCh) Name: VarDecCmp
Addr:77A1298B Ord: 298 (012Ah) Name: VarDecCmpR8 這里有個(gè)小程序RAMQuota(www.stepnet.com.au),是用VB6寫(xiě)的,它使用上述函數(shù)中的VarBstrCmp( )比較注冊(cè)碼。該函數(shù)的關(guān)鍵指令如下:
:77A12A03 8B7D0Cmov edi, dword ptr [ebp 0C]
:77A12A06 8B7508mov esi, dword ptr [ebp 08]
:77A12A09 8B4D10mov ecx, dword ptr [ebp 10]
:77A12A0C 33C0 xor eax, eax
:77A12A0E F3 repz ;
:77A12A0F 66A7 cmpsw
:77A12A11 7405 je 77A12A18
:77A12A13 1BC0 sbb eax, eax
:77A12A15 83D8FFsbb eax, FFFFFFFF
:77A12A18 85C0 test eax, eax _2
:77A12A1A 7F45 jg 77A12A61
:77A12A1C 7D16 jge 77A12A34
:77A12A1E 33C0 xor eax, eax
看來(lái)有必要仔細(xì)看一下oleaut32.dll
五、Visual Basic 程序比較方法 在 Visual Basic 里有 8 種以上的方法檢測(cè)正確的序列號(hào) / 密碼。我這里將談?wù)勥@ 8 種方法,它們都是較容易并用得較多。首先是最普通的 3 種:
1) 串(string) 比較
在這比較方法里,正確密碼串如: "Correct Password" 和你輸入的密碼串如: "Entered Password" 比較。
串是由相鄰的字符按順序排列組成,一個(gè)串包括字母、數(shù)字、空格和標(biāo)點(diǎn)符號(hào)。一個(gè)固定長(zhǎng)度的串可儲(chǔ)存 0 到 63K 字符。如是動(dòng)態(tài)的串其儲(chǔ)存字符個(gè)數(shù)可達(dá) 20 億字符。
VB 串比較代碼一般格式: If "Correct Password" = "Entered Password" then <-- 直接比較兩個(gè)串字符
GoTo Correct Message Else
GoTo Wrong Message End if 這是一種簡(jiǎn)單保護(hù)方案,如果程序者用這種函數(shù)保護(hù),用 SOFTICE 很容易攔截。
可用到的斷點(diǎn):
i) __vbastrcomp or __vbastrcmp (下劃線是兩短線 _ 組成)<-- 串比較函數(shù) 注意:如果你是 crack VB6 程序,你應(yīng)在兩斷點(diǎn)前增加 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)比較
在這方法中,兩個(gè)變量(變量數(shù)據(jù)類(lèi)型)互相比較。變量數(shù)據(jù)類(lèi)型是一種特殊數(shù)據(jù)類(lèi)型,包括數(shù)字、字符串或日期數(shù)據(jù)及一些用戶定義的類(lèi)型。這種類(lèi)型儲(chǔ)存數(shù)字長(zhǎng)度是 16 字節(jié)或字符 22 字節(jié)(加上串長(zhǎng)度)。
一個(gè)范例代碼:
Dim correct As Variant, entered As Variant <-- 定義 "correct" and "entered" 作為變量 correct = Correct Password <-- 設(shè)置 "correct" 放置 "Correct Password" entered = Text1.Text <-- 設(shè)置 "entered" 作為你輸入密碼
If correct = entered Then <-- 用變量方法比較
GoTo Correct Message Else GoTo Wrong Message
End If 在這方法里, 1 中的兩個(gè)斷點(diǎn)將不起作用,因?yàn)槌绦虿辉儆? __vbastrcomp 等 ...
有用斷點(diǎn) :
i) __vbavartsteq<-- 測(cè)試變量是否相等 %
注意:如果你是 crack VB6 程序,你應(yīng)在兩斷點(diǎn)前增加 。 例: bpx msvbvm60!__vbavartsteq 3) 長(zhǎng)整型( long) 比較 ; 這也是一個(gè)普通的方法。兩個(gè)變量(長(zhǎng)整型)互相比較。 long 型數(shù)據(jù)類(lèi)型是 4 字節(jié)( 32 位)整數(shù),其范圍 -2,147,483,648 到 2,147,483,647 。因此該種方法存在只能比較數(shù)字的局限性。 一個(gè)此類(lèi)型范例: Dim correct As Long, entered As Long <-- 定義 "correct" 和 "entered" 作為長(zhǎng)整型 correct = 12345 <-- 設(shè)置 "correct" 為正確密碼
entered = Text1.Text <-- 設(shè)置 "entered" 為輸入密碼
If entered = correct Then <-- 用長(zhǎng)整型方法比較
GoTo Correct Message Else GoTo Wrong Message End If
對(duì)這種類(lèi)型沒(méi)有專門(mén)的斷點(diǎn)函數(shù),因?yàn)槠鋽?shù)據(jù)比較是在主程序里而不是在 VB dll 中。
-------------------------------------------------------------------------------- 另外還有其它的 5 種方法,如果下面的方法你聽(tīng)起來(lái)有點(diǎn)怪或不太可能,你可忽略它們,但記得 VB 保護(hù)方式不限于上述三種。 4) 單精度實(shí)數(shù)(Single)比較 5) 雙精度(Double)比較
6) 整型(Integer)比較
7) 字節(jié)(Byte)比較 8) CURRENCY 型比較 上述8個(gè)比較方式是不是意味著我們每次能中斷在其單個(gè)某一類(lèi)型的比較程序里?回答是否定的。這是因?yàn)槌绦蛴锌赡芡瑫r(shí)采用兩種方法來(lái)比較,如Currency和String, Variant 和 Long 等... 一些可能用上的斷點(diǎn)
1) 數(shù)據(jù)類(lèi)型轉(zhuǎn)換
i) 字符串( String )轉(zhuǎn)換字節(jié)( Byte )或整型( Integer ) : __vbai2str
ii) 字符串( String )轉(zhuǎn)長(zhǎng)型( Long ) : __vbai4str iii) 字符串( String )轉(zhuǎn)換單精度型( Single ) : __vbar4str
iv) 字符串( String )轉(zhuǎn)換雙精度型( Double ) : __vbar8str
v) 字符串( String )轉(zhuǎn) Currency 型 : VarCyFromStr ( 適合 VB6. 你的 WINICE.DAT 必須有 OLEAUT32.DLL) vi) 整型( Integer )轉(zhuǎn)字符串型( String ) : VarBstrFromI2 ( 適合 VB6. 你的 WINICE.DAT 必須 OLEAUT32.DLL) 2) 移動(dòng)數(shù)據(jù)
i) 字符串( String )到內(nèi)存 : __vbaStrCopy ii) 變量( Variant )到內(nèi)存 : __vbaVarCopy or __vbaVarMove
3) 運(yùn)算符
i) 加法 : __vbavaradd <-- 增加變量
ii) 減法 : __vbavarsub <-- 減去變量 iii) 乘法 : __vbavarmul<-- 乘以變量
iv) 除法 : __vbavaridiv <--Dividing Variant to get answer in Integer
v) XOR: __vbavarxor<--XOR 4) 其它類(lèi) 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
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
相關(guān)文章