不知道我理解的對否,關於SuperBpm...的 (10千字)
comment /*
你知道SuperBpm的erase和monitor的區別嗎?如果不知道,可以往下看.
最近看了一點老掉牙的VxD,才看明白superBpm的工作原理,我用masm改寫了一下,未經充分測試,只是比EliCZ這win32
ASM Pioneer更煩瑣了寫可能好理解點,有興趣的看看.Loader部分十分簡單,主要是根據使用者選擇用deviceIoControl向驅動VxD發出命令,VxD則執行相應動作.
對於VxD部分,則是透過攔截_VWIN32_Set_Thread_Context服務(即所謂的hook)來實現對程式擦除或改變Drx暫存器的監視和恢復,Erase模式僅僅是禁止應用程式用context改寫Drx暫存器,這樣Seh或者用SetThreadContext等把戲就不好用了,因為VxD工作在最地層,這種攔截是有效的.Monitor模式是為了阻止那些比如直接修改中斷等進入ring0修改暫存器的把戲的(我想是這樣的...可能錯誤).
但是這個版本明顯對Cr4沒有進行處理,因為BPIO指令是否有效與CR4的DE位有關,如果你聰明應該知道如何利用這一點.而且在monitor模式下對Dr7為0才恢復這一判斷也是有問題的,等你的改進了.EliCZ源程式中用到的從VWIN32服務函式表來直接查詢_VWIN32_Set_Thread_Context地址的方法我也沒有找到詳細資料,反正VxD快死了,我想知道也就足夠了.
VxD部分我改寫了一下,沒有處理TERMINATE_THREAD訊息,但有問題,如果不怕當機,可以試試.僅供理解關鍵點參考.
錯誤難免,如有發現,請指出:QQ:8709369(經常線上)
*/
;===============================Rc檔案
#include <d:\masm32\include\resource.h>
100 DIALOG DISCARDABLE 0, 0, 113, 17
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU |DS_CENTER
CAPTION "SuperBPM,Rewrite in Masm32,hume"
FONT 9, "System"
BEGIN
CONTROL "擦除恢復",101,"Button",BS_AUTORADIOBUTTON
| WS_GROUP,
2,3,45,10
CONTROL "監視恢復",102,"Button",BS_AUTORADIOBUTTON,58,3,50,10
END
;===============================superBpm.exe.asm
.586
.model flat, stdcall
option casemap :none ; case sensitive
include c:\hd\hd.h
include c:\hd\mac.h
DlgP proto :DWORD,:DWORD,:DWORD,:DWORD
CallDriver proto :DWORD
;;--------------
.DATA
DrxUnHook equ 800h
DrxHook equ 801h
DrxMonitor equ 802h
SuperbpmDevice db "\\.\superbpm.vxd",0
Traceflg dd 0
.DATA?
hVxD dd ?
hResume dd ?
hStop dd ?
;;-----------------------------------------
.CODE
__Start:
hTemplate EQU 0
invoke CreateFile,addr SuperbpmDevice,GENERIC_READ+GENERIC_WRITE,\
FILE_SHARE_READ+FILE_SHARE_WRITE,\
0,\
OPEN_EXISTING,FILE_FLAG_DELETE_ON_CLOSE,\
hTemplate
inc eax
jne CrSuccess
;開啟驅動(.vxd)失敗,出錯
invoke MessageBox,0,CTEXT("Can't
Load superbpm.vxd"),CTEXT("Err report:"),30h+1000h
jmp __Quit
;-----------------------------------------
CrSuccess:
dec eax
mov hVxD,eax
;儲存控制程式碼
invoke GetModuleHandle,0
invoke DialogBoxParam,eax,100,0,offset
DlgP,0
invoke CloseHandle,hVxD
;要關閉
;-----------------------------------------
__Quit:
invoke ExitProcess,0
;################################################################################
DlgP proc uses esi edi ebx hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD
mov eax,wMsg
.IF eax==WM_INITDIALOG
invoke GetDlgItem,hWnd,101
mov hResume,eax
invoke SendMessage,eax,BM_SETCHECK,BST_CHECKED,0
invoke SendMessage,hResume,WM_COMMAND,101,0
invoke GetDlgItem,hWnd,102
mov hStop,eax
invoke SetWindowPos,hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE
or SWP_NOSIZE
;以上是初始化
.ELSEIF eax==WM_CLOSE
invoke EndDialog,hWnd,0
invoke CallDriver,DrxUnHook
.ELSEIF eax==WM_COMMAND
mov edx,wParam
.if dx==101
test Traceflg,1
jnz @f
mov Traceflg,1
invoke
CallDriver,DrxHook ;擦除及恢復drx功能開啟
@@:
.elseif dx==102
cmp Traceflg,0
je @f
mov Traceflg,0
invoke
CallDriver,DrxMonitor ;監視及恢復Drx 功能
@@:
.endif
.ELSE
sub eax,eax
ret
.ENDIF
mov eax,1
ret
DlgP endp
;;------------------------------------------------_
CallDriver PROC DrvFunc:DWORD
;DeviceIoControl包裝
mov edx,DrvFunc
sub eax,eax
invoke DeviceIoControl, hVxD,
edx, eax, eax, eax,eax,eax,eax
ret
CallDriver ENDP
END __Start
;==========================superbpm.vxd.asm僅供參考,執行當機別找我
.586p
include C:\98DDK\inc\win98\vmm.inc
include C:\98DDK\inc\win98\vwin32.inc
DrxUnHook equ 800h
DrxErase equ 801h
DrxMonitor equ 802h
CmdUnhook EQU 0
CmdErase EQU 1
CmdMonit EQU 2
;------------------------------------
VxD_LOCKED_DATA_SEG
orgEntry dd 0
orgSTC dd 0
TheThread DWORD 0
SavedDRx DWORD 6 DUP (?)
PreserveMode BYTE CmdErase
Saved BYTE 0
installed db 0
VxD_LOCKED_DATA_ENDS
VxD_LOCKED_CODE_SEG
DECLARE_VIRTUAL_DEVICE SUPERBPM,1,0, MESSAGE_Control, UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER
Begin_Control_Dispatch MESSAGE
Control_Dispatch W32_DEVICEIOCONTROL , OnDeviceIoControl
;處理相應發來的訊息
End_Control_Dispatch MESSAGE
;-----------------------------------------DeviceIoControl
BeginProc OnDeviceIoControl
Assume esi:ptr DIOCParams
.IF [esi].dwIoControlCode==DIOC_OPEN
sub eax,eax
clc
.ELSEIF [esi].dwIoControlCode==DrxUnHook ;退出解除安裝恢復原來的入口
mov ecx,orgEntry
mov dword ptr [ecx],OFFSET32 HookedSTC
@@:
and TheThread,0
and Saved,0
sub eax,eax
clc
.ELSEIF [esi].dwIoControlCode==DrxErase
cmp installed,1
je @f
mov eax, VWIN32_DEVICE_ID
VMMCall Get_DDB
;VWIn32的DDB
mov ecx, [ecx+38H] ;得到引出服務表的地址
add ecx, 8+8*15H
;第16項?我沒找到詳細資料,但確實是
cmp byte ptr [ecx+4],2 ;後面儲存的引數個數為2?
jnz @f
mov eax,[ecx]
mov orgSTC,eax
mov dword ptr [ecx],OFFSET32 HookedSTC
mov orgEntry,ecx
;替換入口,實現hook功能
mov installed,1
@@:
mov PreserveMode, CmdErase ;模式是CmdErase
;-----------------------------------------
xor eax,eax
clc
.ELSEIF [esi].dwIoControlCode==DrxMonitor
mov PreserveMode, CmdMonit
@@:
xor eax,eax
clc
.ENDIF
ret
EndProc OnDeviceIoControl
HookedSTC PROC
PUSHFD
PUSH EAX
PUSH ECX
PUSH ESI
PUSH EDI
MOV ECX, [ESP+5*4 +4 +3*4]
;ecx->CONTEXT
CMP PreserveMode, CmdErase
JE HackContext
@@:
VMMCall Get_Cur_Thread_Handle
;如果是Monitor模式就得到當前有非法企圖的Thread控制程式碼
;看看dr7,dr7是第7項
CMP BYTE PTR [ECX+4*5+4], 0
;dr7=0?看看Seh資料的Context結構
JE Restore
;就恢復?
CMP Saved, 1
JE Done
MOV TheThread, EDI
;儲存控制程式碼
CLD
MOV EDI, OFFSET SavedDRx
;儲存Drx
MOV EAX, DR0
STOSD
MOV EAX, DR1
STOSD
MOV EAX, DR2
STOSD
MOV EAX, DR3
STOSD
MOV EAX, DR6
STOSD
MOV EAX, DR7
STOSD
MOV Saved, 1
JMP Done
Restore:
CMP EDI, TheThread
JNE Done
CMP Saved, 1
JE HackContext
CLD
MOV ESI, OFFSET SavedDRx
;恢復Drx....
LODSD
MOV DR0, EAX
LODSD
MOV DR1, EAX
LODSD
MOV DR2, EAX
LODSD
MOV DR3, EAX
LODSD
MOV DR6, EAX
LODSD
MOV DR7, EAX
MOV Saved, 1
HackContext:
AND BYTE PTR [ECX], NOT 10H
;這個標誌是不更新除Drx系列暫存器外
;恢復所有的暫存器,以此有些Seh把戲就無效了
Done:
POP EDI
POP ESI
POP ECX
POP EAX
POPFD
JMP orgSTC
HookedSTC ENDP
VxD_LOCKED_CODE_ENDS
end
;-----------------Over-------------------
; Hume 2002.3
相關文章
- 關於我對於寫部落格寫文章的理解2017-12-20
- 關於對Host的理解2018-03-28
- 關於react我的理解與總結2017-12-20React
- 關於 Java 你不知道的 10 件事2017-04-29Java
- 關於OPcache對Swoole影響的理解2021-04-08opcache
- 我對抽象的理解2020-04-04抽象
- 我對引擎的理解2017-09-21
- 我對SNS的理解2008-08-12
- 關於面試,那些我完全不知道的知識2019-05-10面試
- 關於我對可迭代物件,迭代器,生成器的一些理解2021-04-27物件
- 關於對健壯性程式碼的理解2020-06-06
- 我對JavaScript物件的理解2019-03-04JavaScript物件
- 我對聚合根的理解2013-09-29
- 對於BFC的理解2019-04-16
- 對於MVVM的理解2018-08-11MVVM
- 我理解的關於Vue.nextTick()的正確使用2017-03-04Vue
- 我的理解——關於“ERP過時論”的探討(轉)2007-08-01
- 關於 DOM 的理解2019-04-10
- 關於Vuex的理解2019-05-08Vue
- 關於servlet的理解2019-04-22Servlet
- 關於-this指向的理解2021-01-19
- 關於DCI的理解2012-02-01
- 我對註冊中心的理解2021-01-14
- 說說我對 WSGI 的理解2020-09-20
- 我對smarter planet的理解2008-11-25
- 我對事件驅動的理解2006-07-10事件
- 關於我對c#的一些看法2013-03-09C#
- 個人對於vue的理解2018-08-11Vue
- 對於button元素的理解2020-11-07
- 對於Database recovery的理解2007-12-17Database
- 關於對MySQL的SQL_NO_CACHE的理解和用法舉例2017-04-11MySql
- 關於我對Spring迴圈依賴的思考2022-05-29Spring
- 關於GAN的個人理解2019-02-11
- 關於協程的理解2020-10-22
- 關於SCN的理解(全面)2010-04-02
- 關於scn的理解 (zt)2007-07-21
- 我對Kosaraju演算法的理解2019-12-11演算法
- 我對部落格的理解和看法2019-03-28