VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 26567|回复: 28

[原创] VB写驱动第二季之VB驱动完整版(包括创建设备和应用层通信)原理代码大公开~~~~~~~~~~~~

  [复制链接]
 楼主| 发表于 2011-9-17 01:08:37 | 显示全部楼层 |阅读模式
本帖最后由 菜鸟学飞 于 2011-9-17 18:18 编辑

自从以前研究过download发现的VB写驱后觉得VB写功能完善的驱动是可能的,但是一直懒得研究。另外今年简直是倒霉透了,最近还大病一场,因为病工作也没了,现在家养病两三个月了,真的是闲的蛋疼,然后就研究起了这个东西~~~
另外本人顺带求职,本人除了vb VC也会还有其他一些杂七杂八的  
如果有成都公司不嫌弃的话 给个投简历的机会~~~(外省的就算了)



思路在这里http://www.vbgood.com/thread-89797-1-1.html VBlink.EXE VC的是一样的,所以说是肯定可以link一个驱动出来的(关于link出驱动,我已经写了一个简单的自动化插件,可以编译出来的驱动,然后自动删除MSVBVM60.DLL导入表和修正校验和,如果校验和不正确将无法加载驱动 切记)link出驱动是可以,但是不一定能运行,因为VB的某些代码或者语法会隐含调用很多MSVBVM60.DLL里面的函数(比如a=”hello world” 这一句就会调用__strXXX),我这里列举了一部分能使VB生成干净代码的规则.
a)
所有定义的函数必须严格定义参数和返回值,每个函数必须都有返回值,绝对不能用字符串或者数组做参数和返回值,在非必要情况下尽量使用long做参数和返回,可以使用自定义类型,但是类型里面不能包含字符串或者数组(可以利用SafeArray做指针 另说)
b)
在程序中绝对不能使用字符串变量,可以使用字符串常量直接传给Dbgpint(但是变量绝对不行),不能直接使用数组 切记~
c)
可以利用SafeArray做指针,但是这个指针必须定义为全局变量,不能做局部变量(具体怎么使用后面讲).
d)
VB中的Lenb类似于C的宏,不会隐含调用VB内部函数,可以直接使用
e)
Lenb以为只能使用vbddklib里面的函数,vbddklib里面包含了部分基本的函数(其他的内核函数自行添加),绝对不能使用val,strVB自带函数.
要想实现具体的功能还必须调用内核api,但是直接Declare的API也是不行的,得用TLB封装,这样才不会产生vbaSetSystemError调用(关于这个tlb以及odl原文件后面会提供).
要写驱动那必然离不开指针,要用指针就离不开vb自带函数varptr,但是要进内核这个东西绝对是不允许的,但是不用又不行.最经典的来了,我翻遍内核的各种函数,我终于发现了VarPtr的内核版:RtlConvertUlongToLargeInteger.其汇编代码为
.text:00404E0C mov eax, [esp+4]
.text:00404E10 xor edx, edx
.text:00404E12 retn 4
代码仅仅比VarPtr多了一条xor edx, edx指令,功能完全和varptr一样,我已经把这个函数封装在了VBDDK里面重命名为KernelVarPtr,ring3下的各种常用函数(RtlMoveMemory之类的)内核里面都有,有了地址和RtlMoveMemory基本上我们就无所不能了.
到了这个地步VB驱动在内核做一些基本操作是没有问题了,但是我们还看不到驱动的运行状态,最重要的是我们有时候希望输出一些调试信息。我翻遍ddk发现只有DbgPrint是做这个事的,杯具的是这个函数的调用方式是cdecl而stdcall,我苦恼两天后我又想了招经典的方法,将RtlConvertUlongToLargeInteger定义为无参数的Pop4b(),DbgPrint有多少个参数就调用多少次pop4b,完美无错~~~比如:

DbgPrint DBGPRINT_UCHAR, "Helloworld! i'm VB programmer!"
Pop4B
Pop4B

自此VB驱动有了指针,有了调试信息,理想的状况下驱动就能运行了.但是往往有时候不是这么理想,写驱动动不动就是蓝屏,而且VB写驱动蓝的更厉害。所以强烈推荐安装的工具有如下:
虚拟机+windbg:进行双机调试,在驱动调试问题上,VB这里比用delphi写驱动强一点,因为VB可以进行源码级调试(delphi似乎只能调试汇编),要源码调试需在编译的时候设置产生符号化调试信息并在windbg设置好符号路径.还有断点,如果要下断点,那就就指定的地方调用DbgBreakPoint就可以了,只能在调试状态下 不然就蓝屏.

IDA:静态反汇编工具,可以看看生成的代码里面有没有问题,有没有调用隐含的函数。
Dbgview:查看输出的调试字符串(DbgPrint输出的内容)
各种驱动加载工具
另关于如何双机调试,如何IDA的各种教程和信息,网络上已经是发烂的东西.请自行搜索
关于使用safearray实现指针访问:
在代码里面可以看到如下结构
Public TypePDRIVER_OBJECT
pData() As DRIVER_OBJECT
safearray As rawSAFEARRAY
End Type
这是一个定义的DRIVER_OBJECT指针类型,指针类型必须用InitSafeArray2初始化如:
InitSafeArray2KernelVarPtr(pDriver), pDriver.safearray, 60

Public FunctionInitSafeArray2(ByVal pArray As Long, ByRef safearray As rawSAFEARRAY, ByValitemSize As Long) As Long
Dim tmp As Long
safearray.cDims = 1
safearray.cbElements = itemSize
safearray.rgsabound.cElements = 1
tmp = KernelVarPtr(safearray)
RtlMoveMemory ByVal pArray, tmp, 4
End Function

初始化后是一个空指针,空指针是不能用的,必须指向一个地址
pDriver.safearray.pvData= DriverObject’ DriverObject是地址

然后就可以通过pDriver.pData(0)访问数据,比如:
pDriver.pData(0).DriverUnload= ReturnValue(AddressOf DriverUnload)

注意的是这种类型不能定义为局部变量,否则会因为有数组的原因导致有隐含的VB内部函数导入.定义为全局变量就没有问题

最后 放代码和编译插件


Link是编译插件 把VB的命名为link2.exe
DrverTest是VB驱动的代码,里面有创建设备对象,ring0和ring3通信,输出调试信息等基本操作
vbntDDK.tlb就是VB的ddk 需引用
其他的就是小工具.
由于本人比较马虎,所以可能有某些错误,本代码仅供研究学习使用,由此代码和工具引发的一切问题后果本人概不负责


补充内容 (2011-11-4 14:17):
无权限下载的请去http://www.vbgood.com/thread-107772-1-1.html(包含最新编译插件以及所有内容)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

无权限下载的请去http://www.vbgood.com/thread-107772-1-1.html(包含最新编译插件以及所有内容)  发表于 2011-11-2 22:03

评分

参与人数 15威望 +129 金钱 +48 人气 +35 收起 理由
KusoSoft + 20 + 20 + 5 很给力!
reker + 20 + 20 + 5 辛苦了,支持研究
新林 + 4 + 8 + 2 我很赞同
zzyong00 + 8 + 1 精品文章
whtmp + 1 很好
a2si + 10 + 2 精品文章
Inndy + 1 + 1 牛B!
acme_pjz + 9 + 3 精品文章
h907308901 + 1 没威望了,加人气
JuncoJet + 10 + 3 lz真闲的蛋疼啊
boyqiang520 + 3 + 2 精品东西
inat + 10 + 2 太有才了,不给不行
flash + 8 + 1 哈哈,第三位,广告位招租!
19900603 + 10 + 3 精品文章
Apple_0 + 16 + 3 恶意灌水

查看全部评分

本帖被以下淘专辑推荐:

发表于 2011-9-17 01:08:38 | 显示全部楼层
O(∩_∩)O哈哈~,沙发是我的啦
acme_pjz 于 2011-9-17 14:58 使用 抢沙发 抢夺本帖沙发

点评

晕  发表于 2011-9-21 22:06
.... 一个沙发. 好玩不..  发表于 2011-9-20 15:35
回复 支持 反对

使用道具 举报

发表于 2011-9-17 02:02:34 | 显示全部楼层
Nice Stuff m8
Will study and bit  and try to understand this code  
Why not have the possibility to use this Driver .
thanks  

点评

Now you can use VB write driver do anything~Include kernel Rootkit.  发表于 2011-9-17 12:11
回复 支持 反对

使用道具 举报

发表于 2011-9-17 03:29:50 | 显示全部楼层
瞻仰神帖 驻足留念 广告位招商 顶起来
回复 支持 反对

使用道具 举报

发表于 2011-9-17 09:32:47 | 显示全部楼层
ddddddddddddddddd
回复 支持 反对

使用道具 举报

发表于 2011-9-17 10:24:42 | 显示全部楼层
可以将简历发送到lipy.hz@qq.com
公司名称:杭州奔浪信息技术有限公司
地址:杭州文一西路75号数字娱乐产业园2号楼5楼
电话:13858043447

点评

非常感谢~忘了说我在成都,去外省的话不太方便...  发表于 2011-9-17 18:11
哦,我看到LZ帖子的内容了  发表于 2011-9-17 14:50
??难道你们公司想用VB写驱动???  发表于 2011-9-17 14:49
回复 支持 反对

使用道具 举报

发表于 2011-9-17 13:59:31 | 显示全部楼层
哥在学校,手头没工具不好做评论了,纯帮顶
回复 支持 反对

使用道具 举报

发表于 2011-9-17 20:30:48 | 显示全部楼层
所以说工作不能太猛,要注意身体啊,没有好身体,工作再好(工资高)又有什么用?

点评

嗯,看新闻说前段时间工作太猛又挂一个  发表于 2011-9-20 20:01
回复 支持 反对

使用道具 举报

发表于 2011-9-17 20:46:25 | 显示全部楼层
我们公司刚招了一个qt c++...现在不招了.
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2011-9-18 06:24:25 | 显示全部楼层
^_^

点评

嘎嘎 10楼就很好..  发表于 2011-9-21 09:49
沙发是用道具抢的,你也可以买一个,哈哈  发表于 2011-9-20 20:01
^_^ 占个 10楼...嘎嘎  发表于 2011-9-20 15:00
o_O  发表于 2011-9-18 20:49
-_-||  发表于 2011-9-18 20:49
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-6-29 11:29

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表