人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 辦公軟件教程 > 詳細頁面

excel API Hook 的應用 繞過 VBA 密碼保護

excel API Hook 的應用 繞過 VBA 密碼保護

更新時間:2024-01-23 文章作者:未知 信息來源:網絡 閱讀次數:

Microsoft Excel是Microsoft為使用Windows和Apple Macintosh操作系統的電腦編寫的一款電子表格軟件。直觀的界面、出色的計算功能和圖表工具,再加上成功的市場營銷,使Excel成為最流行的個人計算機數據處理軟件。

這是一段從網絡收集的代碼, 代碼運用 API Hook 來繞過 VBA 的密碼保護機制,在 VBE 中可以直接查看加密的 VBA 工程而不需要密碼驗證。網絡轉載,非原創,感謝作者提供的強大代碼。注意:本代碼不能用于 64 位 Office, 有時間我會把它修改一下,使其可以用于 64 位 Office。

excel API Hook 的應用 繞過 VBA 密碼保護

'***************************************************************************
'*
'* MODULE NAME: Protected VBA project Picklock(PVP)
'*
'* Usage: 運行FrmHookMain窗口,點補丁,然后雙擊工程窗口中有密碼保護的模塊
'* 應該能夠直接打開了:)
'*
'*
'* DESCRIPTION: 在寫中文字符串轉換為拼音函數(HzToPy)過程中,第一次發現VBA功能的強大.
'* 于是這次嘗試將其他語言中比較好寫的API HOOK移植成VBA代碼,
'* 正好順便把VBA密碼保護去掉,喜歡加密碼的朋友不要生氣啊:)
'* 總的來說VBA的寫法和其他語言區別不大,但VBA畢竟不太方便,代碼必須放在標準模塊中.
'* 再有就是對指針的支持實在有限,于是最后選擇了一種寫起來最簡單的API hook方法,
'* 就是所謂的陷阱法.如果你不太清楚什么是API HOOK,請求助于google.
'*
'* Theory: 這里就不說API hook的方法了,都是傳統方法沒什么可說的,這里只
'* 簡單說下VBA模塊密碼破解.其實這些我也不是很了解,畢竟知道加密過程
'* 用處不大,這個問題上我比較關心結果:)
'* 判斷有密碼以及提示輸入密碼都是VBE6.dll干得好事.如果有密碼,
'* VBE6.dll會調用DialogBoxParamA顯示VB6INTL.dll資源中的第4070號
'* 對話框(就是那個輸入密碼的窗口),若DialogBoxParamA返回值非0,
'* 則VBE會認為密碼正確,然后乖乖展開加密模塊的資源.很顯然其中存在很大
'* 漏洞,就像給日記本加上了鎖,但里面全是活頁,我們不需要打開鎖,只要從側面
'* 取出活頁就可以了.這個從側面取活頁的過程就是hook住DialogBoxParamA函數,
'* 若程序調用DialogBoxParamA裝入4070號對話框,我們就直接返回1,讓
'* VBE以為密碼正確.
'*
'* PS: PVP是在一個叫Advanced VBA Password Recovery (AVPR)的軟件啟發下
'* 作出來的,AVPR提供了一個VBA Backdoor功能就是跳過密碼直接查看工程資源.
'* 它的原理和PVP一樣,但用了通用性比較差的方法,適用系統比較有限,而PVP的方法
'* 理論上適用于所有采用第4070號對話框錄入密碼的Office系統.
'* 經測試PVP適用于Office 2002, 2003, 2007,其他版本尚未測試,但估計依然有效.
'* 在2000和XP系統上測試通過,但條件限制沒有在Vista系統上測試,聽說Vista有些機制
'* 可能影響API hook,暫時沒機會測試就先這樣吧~
'*
'* *64位操作系統下面的API hook代碼肯定運行出錯,就不要測試了
'*
'***************************************************************************

Option Explicit

Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Long, Source As Long, ByVal Length As Long)
Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Long, _
ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long

Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long

Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _
ByVal lpProcName As String) As Long

Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" _
(ByVal hInstance As Long, ByVal pTemplateName As Long, ByVal hWndParent As Long, _
ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer

Dim HookBytes(0 To 5) As Byte
Dim OriginBytes(0 To 5) As Byte
Dim pFunc As Long
Dim Flag As Boolean

Private Function GetPtr(ByVal Value As Long) As Long
'獲得函數的地址
GetPtr = Value
End Function

Public Sub RecoverBytes()
'若已經hook,則恢復原API開頭的6字節,也就是恢復原來函數的功能
If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
End Sub

Public Function Hook() As Boolean
Dim TmpBytes(0 To 5) As Byte
Dim p As Long
Dim OriginProtect As Long

Hook = False

'VBE6.dll 調用 DialogBoxParamA 顯示 VB6INTL.dll 資源中的第 4070 號對話框(就是輸入密碼的窗口)
'若 DialogBoxParamA 返回值非 0,則 VBE 會認為密碼正確,所以我們要 hook DialogBoxParamA 函數
pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")

'標準 api hook 過程之一: 修改內存屬性,使其可寫
If VirtualProtect(ByVal pFunc, 6, &H40, OriginProtect) <> 0 Then
'標準api hook過程之二: 判斷是否已經hook,看看API的第一個字節是否為&H68,
'若是則說明已經Hook
MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
If TmpBytes(0) <> &H68 Then
'標準 api hook 過程之三: 保存原函數開頭字節,這里是6個字節,以備后面恢復
MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6
'用 AddressOf 獲取 MyDialogBoxParam 的地址
'因為語法不允許寫成p = AddressOf MyDialogBoxParam,這里我們寫一個函數
'GetPtr,作用僅僅是返回 AddressOf MyDialogBoxParam 的值,從而實現將
'MyDialogBoxParam 的地址付給p的目的
p = GetPtr(AddressOf MyDialogBoxParam)

'標準api hook過程之四: 組裝API入口的新代碼
'HookBytes 組成如下匯編
'push MyDialogBoxParam的地址
'ret
'作用是跳轉到MyDialogBoxParam函數
HookBytes(0) = &H68
MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
HookBytes(5) = &HC3

'標準api hook過程之五: 用HookBytes的內容改寫API前6個字節
MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
'設置hook成功標志
Flag = True
Hook = True
End If
End If
End Function

Private Function MyDialogBoxParam(ByVal hInstance As Long, _
ByVal pTemplateName As Long, _
ByVal hWndParent As Long, _
ByVal lpDialogFunc As Long, _
ByVal dwInitParam As Long) As Integer
If pTemplateName = 4070 Then
'有程序調用DialogBoxParamA裝入4070號對話框,這里我們直接返回1,讓
'VBE以為密碼正確了
MyDialogBoxParam = 1
Else
'有程序調用DialogBoxParamA,但裝入的不是4070號對話框,這里我們調用
'RecoverBytes函數恢復原來函數的功能,在進行原來的函數
RecoverBytes
MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
hWndParent, lpDialogFunc, dwInitParam)
'原來的函數執行完畢,再次hook
Hook
End If
End Function

1文件名稱 1下載鏈接
VBA 免密查看.zip http://pan.baidu.com/s/1eQCGYlk


Excel整體界面趨于平面化,顯得清新簡潔。流暢的動畫和平滑的過渡,帶來不同以往的使用體驗。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 砚山县| 长白| 米林县| 吴川市| 榆中县| 武山县| 宜兴市| 阿尔山市| 石景山区| 视频| 惠来县| 河源市| 宿州市| 文水县| 云安县| 泽普县| 大冶市| 新闻| 胶州市| 嘉峪关市| 杨浦区| 双峰县| 昆明市| 容城县| 武陟县| 大新县| 浦城县| 咸宁市| 敦化市| 郑州市| 宿松县| 平顶山市| 庆安县| 常山县| 莱州市| 天祝| 三亚市| 黄浦区| 长顺县| 呼伦贝尔市| 涪陵区|