首页
社区
课程
招聘
[原创]VT调试BluePill的心得
2014-9-13 21:52 38131

[原创]VT调试BluePill的心得

2014-9-13 21:52
38131
收藏
点赞1
打赏
分享
最新回复 (46)
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
Naylon 2 2014-9-14 18:50
26
0
为何都在吐槽第一张图╮(╯▽╰)╭
那个板子就是把两个脚交叉接了一下而已
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
Naylon 2 2014-9-14 19:15
27
0
才发现你加红的字,然后感觉你说了这么多其实自己都未必调过BluePill吧。

你说我这样调试只能进入退出vmm无实际意义,这显然不是,既然产生了vmexit那自然是有指令触发的,这些指令往往跟系统资源密不可分。简单来说,VmxDispatchIoAccess实现了对io口in/out指令的处理。此函数原版有bug,我就是一步步跟进后找到问题的,改好后可以作为键盘记录器使用,也可以屏蔽按键。其它的如cpuid,rdmsr,wrmsr什么的也都可以跟进分析。

经过跟你的讨论我有所思考,的确到现在我也没彻底搞明白vmm,windbg,内核调试引擎三者之间的相互影响,欢迎拿事实继续吐槽,如果能把其中细节讲清楚,给出验证,我洗耳恭听。要是纯理论党就算了吧
雪    币: 1
活跃值: (1174)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SdKfz 2014-9-14 19:40
28
0
直接用WinDbg调试Nbp的root代码有时候是可以,其实这是个假象。Nbp的VMM直接用了Guest的CR3, 这样VM-Exit时root“看到的”就是那个CR3能看到的,如果你传递的是DriverEntry的那个就是system进程。

能调试的前提是VM-Exit时windows的调试支持相关的代码(及其访问的数据)未被换出。除此之外还可能有别的问题,想象下列情况:

你要调试VMM代码,如果VMM借用CR3而看到的代码,需要请求某个锁,而这个锁恰好被触发VM-Exit的guest代码持有,那肯定整个锁死(别忘了此时Guest处于冻结状态)。

其实只要想想VT究竟是用来干什么的就明白了。想象下,你的VMM同时支持2个Guest, 分别为32位和64位windows的情况。这么说吧: 在VMM内借用Guest的CR3,就象在内核里去跑用户层代码。VMM不应直接使用Guest的任何东西,如果要访问Guest内存,应该解析Guest分页结构,并将物理页面映射到VMM的虚拟地址空间(还要考虑是否开启EPT)。

如果确实想用WinDbg调试VMM,VMM应该使用自己的分页机制,也使用自己的IDT,监管中断。你要做的是自己实现调试支持,包括异常分发,以及通信部分比如KdCom什么的,都在你的VMM内实现。否则一定会出现莫名其秒锁死的问题。

我没用过VMware10,我的机器不支持EPT,不知道VMWare是否能模拟这功能。我就用的BOCHS加print,郁闷的是BOCHS有些VT功能没实现,现在也面临问题了。以后干脆弄2台物理机。
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
Naylon 2 2014-9-14 20:31
29
0
听你这么说我明白为什么带内存隐藏的nbp无法下断了,因为GuestOS用的是自己的页表,而且在离开抹去了自身的信息。我进入non-root后下断,是不会影响vmm的内存的,所以即使产生vmexit也会无响应。我修改的代码把GuestOS的CR3设置为跟vmm相同,所以可以下断,只不过这样好像也失去了虚拟机的涵义…但我想要实现的功能仅仅是第一时间拦截某些指令,所以这也恰好满足我的需求。

你说的其它几点也很有道理,涨姿势了~
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
exediy 1 2014-9-14 20:51
30
0
我调试过,甚至还跟Superymk交流过这个NBP,顺便说下你调试的版本是放出去的版本,中断,完整的隐藏内存等等都是被阉割掉的.在Superymk书中有提过.

VMM的设计是可以维护多个GUESTOS.WINDBG又依赖krcom,krcom又依赖调试中断来实现调试!
在正常模式下  int1  ->krcom->windbg
可是vmm下 多了个vmm 在中间,触发int 1 ->vmm ->guest int1 ->  krcom->windbg
这情况下windbg所依赖krcom已经被隔离在vmm 外了!
然后最要命的是如SdKfz说的那样,guest跟vmm根本是两世界.
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
exediy 1 2014-9-14 20:56
31
0
vmware是嵌套方式,所以只要实体机器CPU支持什么指令 虚拟机就可以用什么.而且最重要是调试这块vmware已经把全部障碍都清除了,唯一一个问题就是多CPU调试同步的问题.GDB自己的BUG!.
就目前而言 ida + gdb + vmware是最好的选择.
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
Naylon 2 2014-9-14 20:58
32
0
明白了,也谢谢你,改天我去试试ida+gdb
雪    币: 1487
活跃值: (955)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
仙果 19 2014-9-14 21:17
33
0
你不觉得很高大上么?
雪    币: 1
活跃值: (1174)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SdKfz 2014-9-14 21:24
34
0
也就是说,我的物理机不支持EPT,那VMware是无法以软件形式模拟这个特性来支持带EPT的VMM

BOCHS对VT的支持不完整,比如Monitor Trag Flag,郁闷。我怀疑还有别的Bug,有时候出的错莫名其秒。
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
exediy 1 2014-9-14 21:34
35
0
好像不行,毕竟是依赖实体机器的指令.不过好像现在新的CPU 都支持吧!BOCHS对硬件虚化是直接模拟,跟实体CPU没啥关系!
雪    币: 615
活跃值: (445)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
ugvjewxf 2014-9-15 10:35
36
0
每年的VT文章都会引发争议,就好像说地球是圆的一样,
雪    币: 471
活跃值: (59)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
三寸法师 1 2014-9-15 11:22
37
0
以前家里穷买不起带vt的cpu只能用用bochs调试
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MysteryMOP 2014-9-29 18:22
38
0
VT资料够多了吧。。。。。
雪    币: 222
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
IceExt 2014-10-3 08:23
39
0
首先这个方法确实可以调试,跟踪到NBP的一些问题。
第二不用焊什么板子啊,只需要直接焊2个com口的连接线而已。lz第一张图六个指头抓痒了,呵呵。
雪    币: 293
活跃值: (239)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cavan 2014-11-11 20:14
40
0
同36楼 每年的VT文章都会引发争议,就好像说地球是圆的一样,
雪    币: 169
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
superleft 2014-12-15 15:11
41
0
别提Bochs的VT了, BUG 多得受不了, 虽然也很想去帮助改进, 但是现在更多的是拿来主义。 前段时间搞过一段嵌套VT , 苦于调试问题,也就放下了。
雪    币: 12
活跃值: (220)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
水上心 2015-8-6 13:13
42
0
兄弟,不用理楼上的,这人就是个二货,不懂装懂
我支持你,你这种奉献精神让我尊敬
雪    币: 346
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
OnlyForU 2015-12-15 20:15
43
0
好贴!  学习! 正想研究VT!
雪    币: 346
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
OnlyForU 2016-2-18 18:02
44
0
好贴!!!!!! 再次拜读!
雪    币: 49
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ravenhu 2016-5-17 01:25
45
0
请问楼主,用你的NBP在vmware的WIN2K3里面加载时候,提示HVM:() vmx is not supported,物理机加载确提示成功?
环境:主机win 7 x64 ,vmware 10 - 处理器只开启了VT-X/amd v。无法开启你说的那个EPT选项,提示平台不支持。
cpu指令集EM64T,vt-x
是我的vmware设置不对吗?
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
Naylon 2 2016-5-17 12:08
46
0
看起来像是你VMWare没设置好。看图2,要在处理器选项里勾上虚拟化Vt那个选项,也就是让VMWare虚拟出一套VT。
雪    币: 49
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ravenhu 2016-5-17 13:50
47
0
图2没办法勾选,一勾选启动后提示平台不支持EPT,会不会是因为我的CPU不支持EPT导致的?所以无法嵌套?只能在首选模式选择intel VT-x。
游客
登录 | 注册 方可回帖
返回