軟件漢化2010-07-08 16:25:23 閱讀76評論0 ??字號:大中小?訂閱
bpx hmemcpy??? 破解萬能斷點,攔截內存拷貝動作
bpx Lockmytask 當你用其它斷點都無效時可以試一下,這個斷點攔截按鍵的動作
bmsg handle wm_gettext 攔截注冊碼(handle為對應窗口的句柄)
bmsg handle wm_command 攔截OK按鈕(handle為對應窗口的句柄)
攔截窗口:
bpx CreateWindow????? 創建窗口
bpx CreateWindowEx(A) 創建窗口
bpx ShowWindow??????? 顯示窗口
bpx UpdateWindow????? 更新窗口
bpx GetWindowText(A)? 獲取窗口文本
攔截消息框:
bpx MessageBox(A) 創建消息框
bpx MessageBoxExA 創建消息框
bpx MessageBoxIndirect(A) 創建定制消息框
攔截警告聲:
bpx MessageBeep 發出系統警告聲(如果沒有聲卡就直接驅動系統喇叭發聲)
攔截對話框:
bpx DialogBox???????? 創建模態對話框
bpx DialogBoxParam(A) 創建模態對話框
bpx DialogBoxIndirect 創建模態對話框
bpx DialogBoxIndirectParam(A) 創建模態對話框
bpx CreateDialog???????? 創建非模態對話框
bpx CreateDialogParam(A) 創建非模態對話框
bpx CreateDialogIndirect 創建非模態對話框
bpx CreateDialogIndirectParam(A) 創建非模態對話框
bpx GetDlgItemText(A)??? 獲取對話框文本
bpx GetDlgItemInt??????? 獲取對話框整數值
攔截剪貼板:
bpx GetClipboardData 獲取剪貼板數據
攔截注冊表:
bpx RegOpenKey(A)??? 打開子健 ( 例:bpx RegOpenKey(A) if *(esp+8)=='****' )
bpx RegOpenKeyEx???? 打開子健?( 例:bpx RegOpenKeyEx if *(esp+8)=='****' )
bpx RegQueryValue(A) 查找子健 ( 例:bpx RegQueryValue(A) if *(esp+8)=='****' )
bpx RegQueryValueEx? 查找子健 ( 例:bpx RegQueryValueEx if *(esp+8)=='****' )
bpx RegSetValue(A)?? 設置子健 ( 例:bpx RegSetValue(A) if *(esp+8)=='****' )
bpx RegSetValueEx(A) 設置子健 ( 例:bpx RegSetValueEx(A) if *(esp+8)=='****' )
“****”為指定子鍵名的前4個字符,如子鍵為“Regcode”,則“****”= “Regc”
功能限制攔截斷點:
bpx EnableMenuItem 禁止或允許菜單項
bpx EnableWindow 禁止或允許窗口
bmsg hMenu wm_command 攔截菜單按鍵事件,其中hMenu為菜單句柄
bpx K32Thk1632Prolog 配合bmsg hMenu wm_command使用,可以通過這個斷點進入菜單處理程序
應用示例:
CALL [KERNEL32!K32Thk1632Prolog]
CALL [......]????? <-- 由此跟蹤進入菜單處理程序
CALL [KERNEL32!K32Thk1632Epilog]
攔截時間:
bpx GetLocalTime? 獲取本地時間
bpx GetSystemTime 獲取系統時間
bpx GetFileTime?? 獲取文件時間
bpx GetTickCount? 獲得自系統成功啟動以來所經歷的毫秒數
bpx GetCurrentTime 獲取當前時間(16位)
bpx SetTimer????? 創建定時器
bpx TimerProc???? 定時器超時回調函數
攔截文件:
bpx CreateFileA? 創建或打開文件 (32位)
bpx OpenFile???? 打開文件 (32位)
bpx ReadFile???? 讀文件 (32位)
bpx WriteFile? ? 寫文件 (32位)
bpx _lcreat??? ?創建或打開文件 (16位)
bpx _lopen???? ?打開文件 (16位)
bpx _lread????? 讀文件 (16位)
bpx _lwrite??? ?寫文件 (16位)
bpx _hread????? 讀文件 (16位)
bpx _hwrite???? 寫文件 (16位)
攔截驅動器:
bpx GetDrivetype(A) 獲取磁盤驅動器類型
bpx GetLogicalDrives 獲取邏輯驅動器符號
bpx GetLogicalDriveStringsA 獲取當前所有邏輯驅動器的根驅動器路徑
攔截狗:
bpio -h 378(或278、3BC) R 378、278、3BC是并行打印端口
bpio -h 3F8(或2F8、3E8、2E8) R 3F8、2F8、3E8、2E8是串行端口
VB程序專用斷點:
bpx msvbvm50!__vbaStrCmp?? 比較字符串是否相等
bpx msvbvm50!__vbaStrComp ?比較字符串是否相等
bpx msvbvm50!__vbaVarTstNe 比較變量是否不相等
bpx msvbvm50!__vbaVarTstEq 比較變量是否相等
bpx msvbvm50!__vbaStrCopy? 復制字符串
bpx msvbvm50!__vbaStrMove? 移動字符串
bpx MultiByteToWideChar??? ANSI字符串轉換成Unicode字符串
bpx WideCharToMultiByte??? Unicode字符串轉換成ANSI字符串
上面的斷點對應VB5程序,如果是VB6程序則將msvbvm50改成msvbvm60即可
VB程序的破解
記住VB常用的一些函數:
MultiByteToWideChar???將ANSI字符串轉換成UNICODE字符
WideCHatToMultiByte 將UNICODE字符轉換成ANSI字符
rtcT8ValFromBstr 把字符轉換成浮點數
vbaStrCmp 比較字符串(常用斷點)
vbaStrComp 字符串比較(常用斷點)
vbaStrCopy 復制字符串
StrConv 轉換字符串
vbaStrMove 移動字符串
__vbaVarCat???????? ?連接字符串
rtcMidCharVar??????? 在字符串中取字符或者字符串!
__vbaLenBstr???????? 取字符串的長度
vbaVarTstNe 變量比較
vbaVarTstEq 變量比較
rtcMsgBox 顯示對話框
VarBstrCmp 比較字符串
VarCyCmp 比較字符串
用OD載入脫殼后的程序,在命令行輸入:bpx hmemcpy,然后回車,會彈出程序運行調用的所有的函數,在每個函數上設置好斷點!
說明:我破VB程序喜歡用這個斷點設置方法,通過一步步跟蹤,基本可以把握程序保護的思路,所以我破VB程序基本用這個斷點,當然你可以用其它的斷點,只要能找到關鍵,任何斷點都是有意義的。
關于VB的程序,注冊沒有提示的二個辦法:
第一(提示錯誤):用GetVBRes來替換里面的提示串,一般是以‘111111’,‘222222’之類的替換
因為:VB,用的字來存放提示還有加了點東東,我們用的工具一般是字節分析。換成‘22222’之類的就是字節了,用靜態分析,就有你該的串了。GetVBRes(網上很多,自己下吧)
第二(沒有提示):用vbde這個工具(不知道,有沒有用過DEDE,是一樣思路),主要是找出破解的按鈕窗口的位置,來進行跟蹤。
先給出修改能正確反編譯VB程序的W32DASM的地址:
======================
offsets 0x16B6C-0x16B6D
修改機器碼為: 98 F4
======================
VB程序的跟蹤斷點:?
MultiByteToWideChar,
rtcR8ValFromBstr,
WideCharToMultiByte,
__vbaStrCmp
__vbaStrComp
__vbaStrCopy
__vbaStrMove
__vbaVarTstNe
rtcBeep
rtcGetPresentDate (時間API)
rtcMsgBox
=========
時間限制斷點:
CompareFileTime
GetLocalTime
GetSystemTime
GetTimeZoneInformation
msvcrt.diffTime()
msvcrt.Time()
================
VB斷點查找方法
1.VB6.0編寫,OD載入程序調出注冊窗口,alt+e調出可執行模塊窗口找到X:\WINDOWS\system32\MSVBVM60.DLL雙擊,在ctrl+n調出窗口找到,名稱XXXXXXE區段=ENGINE 導出__vbaVarMove雙擊來到下面地址(可以直接在命令行 bp __vbaVarMove),回到程序注冊窗口點注冊被攔斷在剛才下斷的地址,斷后在ctrl+F9,F8回
2.OD載入程序,命令行下斷點:bp rtcMsgBox
堆棧友好提示
確定注冊失敗按鈕返回。接著向上找出點注冊按鈕執行的代碼第一句,可以嗎?當然行,根據我們知道程序員寫一個事件執行的代碼是如這種,各種語言都差不多。
3.OD載入程序,命令行下斷點:bp rtcMsgBox
任意填入偽注冊碼 9999999999999999999,確定后中斷
堆棧友好提示
確定注冊失敗按鈕返回。
W32Dasm反匯編程序,Shiht+F12
4.VB中的messagebox是一個消息框,匯編中用rtcMsgBox下斷點.用olldbg載入程序,Alt+e,在可執行文件模塊中找到Msvbvm60.dll,雙擊它,在代碼窗口點右鍵-搜索-當前模塊中的名稱中的rtcMsgBox函數,雙擊它,在6A362F29 55 PUSH EBP這一句雙擊下斷點,關掉多余的窗口,只留下cpu調試主窗口,F9運行程序,點?號按鈕,隨便輸入987654321后,回車后立即中斷,然后Ctrt+f9執行到返回地址,因為這是msvbvm60的領空,我們要回到程序領空.秘密記事本彈出message錯誤提示信息,點確定,向上看,再按F8就回到
5.為Microsoft Visual Basic 6.0,先用SmartCheck找到程序比較注冊碼點
6.用vb常用比較斷點
vbastrcmp
vbastrcomp
vbavartsteq
在od中設斷點找注冊碼
7.用Od載入程序,運行,填入上面的注冊碼和順序號。在Od中下斷點,Alt+E,雙擊Msvbvm60運行庫,右鍵-搜索當前模塊中的名稱,找到Vbastrcmp,雙擊下斷點。
楊航收集技術資料,分享給大家