Programming 版 (精华区)
: 看了好些VXD的例子,发现如下的东东很相似,
: exec_vxd_int,exec_pm_int,exec_int,Simulate_Int
: 都搞糊涂了,哪位大侠给讲一讲呀。
我就这么点本事,还都叫你给问着了。呵呵。
(1)先说说simulate_XXXX。
simulate即仿真之意。
比如说simulate_push,这条语句在VXD中出现,并不是对VXD的堆栈
进行操作 ,而是对当前VM的堆栈进行操作。
所有的simulate_XXXX服务都是在为当前VM准备堆栈,只等着Resume_Exec
便开始执行simulate_far_call或是simulate_int准备好的操作。
simulate_int在准备堆栈之前还要调用所有的Hook Procedure。
值得一提的是simulate_iret,这个服务是很有用的。
比如说你用Allocate_PM_Call_Back建立回调函数iNumCallBack,
接着用Set_PM_Int_Vector使IDT的某个中断号Num指向该回调函数。
mov esi , offset32 iNumCallBack
VMMCall Allocate_PM_Call_Back
jc error
movzx edx , ax
mov ecx , eax
shr ecx , 16
mov eax , Num
VMMCall Set_PM_Int_Vector
然后在WINAPP中通过
int Num
来调用该回调函数iNumCallBack。
一般说来,很多人把iNumCallBack写成如下的形式:
BeginProc iNumCallBack , pageable
.......
EndProc iNumCallBack
这里有一个很严重的问题。
实际上,Allocate_PM_Call_Back只是在3Bh段中放了一条指令:
int 30h。
再由这条指令通过IDT gate跳到iNumCallBack。
上面的iNumCallBack返回时就回到了int 30h,这样的话,
就又会执行iNumCallBack,没完没了了。
所以上面的iNumCallBack得改写一下 ,加一条语句就可以了:
BeginProc iNumCallBack , pageable
VMMCall Simulate_Iret //自己体会一下吧
.......
EndProc iNumCallBack
这样的话,iNumCallBack返回时就回到了int Num的下一条语句了,而不是
int 30h。
(2)exec_int这个你见得很多了。我们用Begin_Nest_Exec和
End_Nest_Exec来配合它把中断调用映射到VM中去。
(3)exec_Vxd_int,大多数时候我们调用real mode中断处理程序,可以
不在Nest execution中进行。而是直接用exec_vxd_int。
我抄一段VTOOLSD的HELP,你就明白了。
ALLREGS Registers; // structure definition in vtoolsd.h
BYTE osMajor, osMinor;
Registers.REAX = 0x3000;
Exec_VxD_Int(0x21, &Registers);
osMajor = Registers.REAX & 0xFF;
osMinor = (Registers.REAX >> 8) & 0xFF;
这个服务隐藏着很多操作,用起来简单,其实讲究
很多,我也讲不清楚。只是建议你小心使用啦。
(4)exec_pm_int ,这个服务与exec_vxd_int极相似,唯一的
不同就是它使用当前VM的寄存器,而不是ALLREGS。
--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: hs5.hit.edu.cn]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.118.239.237]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:6.656毫秒