作为一个热爱汇编的人被迫使用C或者C++写驱动是一件很难受的事情,特别是在做一些邪恶的事情的时候,你总会发现汇编就是一只恶魔之手,而C或者C++总是缺乏那么一点魔力,还好,VC支持内联汇编,那么我们用VC的优势给我们写驱动搭一个平台,使用他们丰富的资源,然后用我们的汇编编写核心代码,做我们想做的事情,虽然我的最终目标是全部用汇编解决一切问题,但在目前汇编资源越来越少的情况下我们不得不做一些屈服。
废话说了很多,下面我就奉上一个估计很多同学都学过的一个例子,《郁金香驱动教程》的032课-自写驱动保护XX进程,原理郁金香老师已经讲得很清楚了,C++的代码教程里也有,我就不重复了。我的任务是采用内联汇编改写其中关键的代码,当然,作为一个汇编的热爱者,客户端exe文件我用汇编写的,同时对郁金香的客户端和驱动端代码都进行了完善,同时将客户端编写改为Windows界面,使界面更加友好。
软件运行后界面如下:
下面开始解释一下代码,没什么技术含量,汇编按自己的风格写的,高手直接无视
先说说用户端:
里面有一个DDKDriver.inc的文件,这里面主要是定义了一个汇编常用的宏,还有几个驱动用的宏和一些字符定义(- -汇编的资源太缺乏,只能从VC里整点用用),写界面的部分我就不说了,源代码里有。
invoke CreateFile, addr szDriverLinkName,\
GENERIC_READ or GENERIC_WRITE ,\
0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
mov hDevice, eax
.if eax == INVALID_HANDLE_VALUE
invoke GetLastError
invoke wsprintf, addr szMsgBuffer, CTXT("打开设备失败,错误码=%d"), eax
invoke Nt_MsgBox, addr szMsgBuffer
invoke SendMessage, hDlgmain, WM_CLOSE, NULL, NULL
.endif
szDriverLinkName db "\\.\SSDTHook_NtOpenProcess",0
;名称:Nt_SSDTHook
;功能:Hook指定进程PID的程序
;参数:_hDevice=设备句柄
;参数:_HookProcessID=要Hook进程的PID
;返回:eax,eax=1表示成功,eax=0表示失败
Nt_SSDTHook proc _hDevice:DWORD, _HookProcessID:DWORD
local @InputBuffer:DWORD
local @RetNum:DWORD
push esi
push ebx
mov eax, _HookProcessID
mov @InputBuffer, eax
lea esi, @InputBuffer
lea ebx, @RetNum
invoke DeviceIoControl, _hDevice, SSDTHook_code, esi, 4, NULL, 0, ebx, NULL
mov eax, @RetNum
pop ebx
pop esi
ret
Nt_SSDTHook endp
;名称:Nt_SSDTUnHook
;功能:卸载Hook
;参数:_hDevice=设备句柄
;返回:eax
Nt_SSDTUnHook proc _hDevice:DWORD
local @RetNum:DWORD
push ebx
lea ebx, @RetNum
invoke DeviceIoControl, _hDevice, SSDTUnHook_code, NULL, 0, NULL, 0, ebx, NULL
mov eax, @RetNum
pop ebx
ret
Nt_SSDTUnHook endp
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)