動態跟蹤分析VB程式
說明:本文寫的時間較早,如果用OD來跟蹤,就不需要相關的設定了。
一、SOFTICE配製
二、VB dll
常用函式
1
、字元處理函式
2
、警告視窗函式
三、VB字串格式
四、oleaut32.dll簡介
五、Visual Basic
程式比較方法
雖然大部分 VB 程式仍呼叫 Win32 API 函式,但如想在 VB dll 執行庫中設斷的話,你就必須把 VB dll 執行庫加入 SOFTICE 配製裡去。具體你可參考第五課中的《 SOFTICE 安裝及使用》。
下例是在 win95/98 下你把相關的 VB DLL 執行庫加入 winice.dat 配製檔案裡。 ( 部分 )
; 注意分號後是描述語言,不被執行。每次只裝載需要的一種 VB dll ,最好不要同時裝載兩個以上,把要裝載那種 VB dll 那一行的分號去掉,重新啟動即可。另外,判斷軟體是何種 VB dll 有幾種方法,最直接一種用 WDasm89 檢視,還有一種方法是用十六進位制工具開啟程式觀察。或用 SOFTICE 跟進去(用 bpx hmemcpy) ,稍轉一圈,你觀察一下除錯視窗領空處會出現何種 VB DLL 即可。
; EXP=c:\windows\system\msvbvm60.dll ; Visual Basic 6
|
這樣配製好後,重新啟動,就可設 VB 執行庫中各函式的斷點了。
--------------------------------------------------------------------------------
二、VB dll 常用函式
MultiByteToWideChar, rtcR8ValFromBstr, WideCharToMultiByte, __vbaStrCmp, __vbaStrComp, __vbaStrCopy, __vbaStrMove, __vbaVarTstNe .
注意:這些函式前的下劃線 __ 是由兩根短線 _ 組成的,不要弄錯。 如果你是 crack VB6 程式,你應在斷點前增加 msvbvm60! 。 如: bpx msvbvm60!__vbastrcomp
一些常用字串函式:
Val() | 轉換字串為數字 | Rtrim$() | 去除字串左邊空格 |
Str$() | 轉換數字為字串 | Trim$() | 去除字串兩邊空格 |
Left$() | 按要求從左取字元。例如: Left$(Theodolite, 4) = "Theo" | Asc() | 轉換字元為 ANSI 編碼 . 例如: Asc("A") = 65 注:65是ASCII碼的十進位制 |
Ltrim$() | 去除字串左邊空格例如: Ltrim$ (" Hello ") = "Hello " | Chr$() | 轉換 ANSI 編碼為字元 . 例如 Chr$(65) = "A" |
Right$() | 按要求從右取字元 |
幾個常用函式簡介:
1、 __vbavartstne 進去後在0F04E351你將看到: 下命令:d
ebp+0c |
2、 __vbaR8Str 在這行fcomp qword ptr [00401028] Type: DL 00401028 將看到*real* serial #. DL 是顯示 Long/real 型,SOFTICE預設時是DB狀態。 |
3、 __vbastrcmp :005BDC32
CALL [MSVBVM50!__VbaFreeVar] |
rtcBeep, rtcGetPresentDate (time API), rtcMsgBox
--------------------------------------------------------------------------------
在大部分
VB 程式中,我們能用
bpx Hmemcpy 命令設斷,但是你將發現自己不久進入
VBRUNxxx.DLL 執行庫,很快陷入
Vb dll 中,在大多數情況下,你很難到達其
EXE 檔案中的真正比較核心。你通常是依靠字串的線索來跟蹤程式,你們還應記得
VB (
VB4 以上)
程式儲存和比較字元是用
wide character 格式(本質是中在各字元間填
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
);
如:
原來字串 : 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).
這時在 SOFTICE 下檢視記憶體中的字串時看到情況有可能是: C R A C K Z
有些情況下應該用 DL (長實型)命令,才能看到正確數字序號。( SOFTICE 預設時為 DB (位元組型))
在多數情況下,在 VB 中設定正確斷點是較困難的。斷點設定好後,嘗試輸入序列號,執行後,應返回 VBRUNxxx.DLL 裡,現在查詢暫存器 (EAX & EBX) 中的值,那裡放有你輸入字串長度,如果沒發現什麼,你應按 ctrl+D 再次返回到 VB dll 中另一處 ,繼續檢視,一直重複。
一但當你在暫存器中發現字串長度時,你應一步一步注意觀察,如果你幸運的話,你會發現輸入字串躺在暫存器或其顯示附近記憶體裡。這時你在 SOFTICE 裡的資料視窗中用 ALT+ 游標鍵滾動查詢,說不定會發現正確序列號懶洋洋躺在那附近。
--------------------------------------------------------------------------------
破解VB程式時,對vbrun*.dll(VB4、VB3版本)和msvbvm*.dll(VB5、VB6)強調得比較多,實際上VB程式的很多運算是在oleaut32.dll中完成的,這個dll提供了很多對VB中的Variant型別的變數進行操作的函式,主要是一系列VarXXX(
),其中有幾個是用來比較字串和數值的,如下:
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
這裡有個小程式RAMQuota(www.stepnet.com.au),是用VB6寫的,它使用上述函式中的VarBstrCmp( )比較註冊碼。該函式的關鍵指令如下:
:77A12A03 8B7D0C
mov edi, dword ptr [ebp+0C]
:77A12A06 8B7508
mov esi, dword ptr [ebp+08]
:77A12A09
8B4D10 mov 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 83D8FF
sbb eax, FFFFFFFF
:77A12A18 85C0
test eax, eax
:77A12A1A
7F45 jg 77A12A61
:77A12A1C 7D16
jge 77A12A34
:77A12A1E 33C0
xor eax, eax
看來有必要仔細看一下oleaut32.dll
在 Visual Basic 裡有 8 種以上的方法檢測正確的序列號 / 密碼。我這裡將談談這 8 種方法,它們都是較容易並用得較多。首先是最普通的 3 種:
1) 串(string) 比較
在這比較方法裡,正確密碼串如: "Correct Password" 和你輸入的密碼串如: "Entered Password" 比較。
串是由相鄰的字元按順序排列組成,一個串包括字母、數字、空格和標點符號。一個固定長度的串可儲存 0 到 63K 字元。如是動態的串其儲存字元個數可達 20 億字元。
VB 串比較程式碼一般格式:
If "Correct Password" = "Entered Password" then <-- 直接比較兩個串字元
GoTo Correct Message
Else
GoTo Wrong Message
End if
這是一種簡單保護方案,如果程式者用這種函式保護,用 SOFTICE 很容易攔截。
可用到的斷點:
i) __vbastrcomp or __vbastrcmp (下劃線是兩短線 _ 組成) <-- 串比較函式
注意:如果你是 crack VB6 程式,你應在兩斷點前增加 msvbvm60! 。
如: bpx msvbvm60!__vbastrcomp or bpx msvbvm60!__vbastrcmp
ii) 搜尋特殊比較程式碼(具體參考下一節)
如: 56,57,8b,7c,24,10,8b,74,24,0c,8b,4c,24,14,33,c0,f3,66,a7
2) 變數(Variant)比較
在這方法中,兩個變數(變數資料型別)互相比較。變數資料型別是一種特殊資料型別,包括數字、字串或日期資料及一些使用者定義的型別。這種型別儲存數字長度是 16 位元組或字元 22 位元組(加上串長度)。
一個範例程式碼:
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 型資料型別是 4 位元組( 32 位)整數,其範圍 -2,147,483,648 到 2,147,483,647 。因此該種方法存在只能比較數字的侷限性。
一個此型別範例:
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
對這種型別沒有專門的斷點函式,因為其資料比較是在主程式裡而不是在 VB dll 中。
--------------------------------------------------------------------------------
另外還有其它的 5 種方法,如果下面的方法你聽起來有點怪或不太可能,你可忽略它們,但記得 VB 保護方式不限於上述三種。
4) 單精度實數(Single)比較
5) 雙精度(Double)比較
6) 整型(Integer)比較
7) 位元組(Byte)比較
8) CURRENCY 型比較
上述8個比較方式是不是意味著我們每次能中斷在其單個某一型別的比較程式裡?回答是否定的。這是因為程式有可能同時採用兩種方法來比較,如Currency和String, Variant 和 Long 等...
一些可能用上的斷點
1) 資料型別轉換
i) 字串( String )轉換位元組( 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) 移動資料
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
=============================
看雪2000/2/21
整理
相關文章
- 例項動態註冊跟蹤2016-01-07
- 【轉】動態位元組碼技術跟蹤Java程式2017-07-03Java
- 淺談用Ollydbg跟蹤vb程式---soli
兄弟的問題2015-11-15
- 程式碼效能分析-Dottrace跟蹤程式碼執行時間2011-12-22
- tkprof: 分析ORACLE跟蹤檔案2013-05-06Oracle
- 聊聊跟蹤監聽器動態註冊(Dynamic Register)方法2015-09-01
- 二進位制入門--動態跟蹤原始碼和反彙編程式碼2018-03-08原始碼
- 【Longkin】ASP.NET應用程式跟蹤---(一)跟蹤頁面2008-06-02ASP.NET
- 【TRACE】如何設定或動態跟蹤Oracle net偵聽器2022-02-18Oracle
- 使用logon trigger完成動態的session跟蹤2015-02-24GoSession
- 演算法分析__遞迴跟蹤2019-03-05演算法遞迴
- 使用 Tkprof 分析 ORACLE 跟蹤檔案2017-05-06Oracle
- 跟蹤session 與 trace檔案分析2013-10-11Session
- 用strace跟蹤分析oracle 10.2.0.1 rac lmd程式系列二2015-11-11Oracle
- HP下對程式的跟蹤2009-02-27
- jivejdon程式碼跟蹤問題2013-05-30
- 跟蹤你的手指輸入動態竊取你的密碼2017-07-03密碼
- 【Longkin】ASP.NET應用程式跟蹤 --- (三) 在程式碼裡訪問跟蹤資訊2008-06-02ASP.NET
- 轉:使用 Tkprof 分析 ORACLE 跟蹤檔案2020-12-10Oracle
- 被動路由跟蹤工具InTrace2017-01-16路由
- [zt] oracle跟蹤檔案與跟蹤事件2008-09-10Oracle事件
- oracle跟蹤檔案與跟蹤事件(zt)2007-03-16Oracle事件
- oracle跟蹤檔案和跟蹤事件(zt)2007-09-18Oracle事件
- 啟用使用者程式跟蹤2011-07-29
- oracle 10g 程式跟蹤命令2009-12-22Oracle 10g
- [原始碼分析] OpenTracing之跟蹤Redis2020-09-12原始碼Redis
- KCF目標跟蹤方法分析與總結2016-09-30
- 運動目標檢測與跟蹤2015-02-13
- ORACLE開啟自動跟蹤SQL 功能。2010-08-04OracleSQL
- [Q]如果設定自動跟蹤 zt2005-03-15
- 如何追蹤laravel動態2021-09-10Laravel
- 如何追蹤Java動態2021-09-16Java
- 如何追蹤vue動態2021-09-16Vue
- 如何追蹤Go動態2021-09-13Go
- VB呼叫C程式的方法—動態連結庫法 (轉)2007-12-06C程式
- 使用應用程式跟蹤對效能改變進行量化分析(轉)2007-08-10
- sqlnet跟蹤2016-12-04SQL
- ORACLE 跟蹤工具2014-05-27Oracle