阅读:3232回复:20
关于Hook sysenter
写了段代码hook sysenter,hook好像能成功,但是驱动退出的时候unhook的时候出错了,吃了蓝玻璃。从dump文件看好像是说我的驱动已经退了,但是sysenter还要访问我驱动里面的Mysysenter,好像我的hook没有撤销。搞不明白,迷糊。。。难道在unhook的时候还要注意什么吗?
|
|
沙发#
发布于:2007-05-15 16:35
想问ksypy =老大,你是怎么解决这个问题的哦
![]() |
|
板凳#
发布于:2007-03-26 08:05
请尝试~反正打击都是在蓝屏中一路走过来的~
|
|
|
地板#
发布于:2007-03-26 03:54
关于Hook Sysenter在网上已经找到资料,里面的代码有部分应该是vxk和wow的,其中有两个地方不太明白,想请教下:
一. RawMSR_SYSENTER_EIP DD 0 lea ebx,[ebp+offset RawMSR_SYSENTER_EIP] push ebx Call [ebp+_MmLockPagableDataSection] lea ebx,[ebp+offset mySYSENTER_Proc] push ebx Call [ebp+_MmLockPagableCodeSection] Call GetMSR_EIP Call SetMSR_EIP;将mySYSENTER_Proc设置为SYSENTER的入口 这是Hook的流程,请问MmLockPagableDataSection和MmLockPagableCodeSection是必须的吗?我查了下这两个是锁内存,这个的实际用处是什么呢,我们要不要把他解锁呢? ---------------------------------------------------------------------------------------------- 二. mySYSENTER_Proc Proc ;系统发出SYSENTER指令后,进入mySYSENTER_Proc的入口 Local tr:word sgdt gdt ;设置内核RING0堆栈 str word ptr[tr] movzx ecx,tr add ecx,gdt.GdtBase mov esp,dword ptr[ecx+2] and esp,0ffffffh mov ecx,dword ptr[ecx+4] and ecx,0ff000000h or esp,ecx ;esp->tss mov esp,dword ptr[esp+4] pushad pushfd push fs mov bx,30h mov fs,bx push ds push es call TestProc; pop es pop ds pop fs popfd popad jmp [ebp+offset RawMSR_SYSENTER_EIP]; mySYSENTER_Proc Endp 如上在"设置内核RING0堆栈"这一段,作用是什么呢?是为了进入Ring0还是什么?也是必须的吗?对于我的程序来说这个MySYSENTER_Proc我只是想判断一下Sysenter的ID,也即是EAX的值,我这样写行吗: mySYSENTER_Proc Proc cmp eax,5 ;如果ID是5的话就把他改成11C jnz @@ mov eax,11Ch @@: jmp [ebp+offset RawMSR_SYSENTER_EIP]; mySYSENTER_Proc Endp |
|
地下室#
发布于:2007-03-26 01:46
万分感谢两位,版主说的inline hook是指Hook内核函数吗?我现在做的和Ksypy的一样的,是想伪造一个Sysenter ID出来,因为如果其它驱动Hook住了SSDT的话就要先经过他的Hook才能到我的,所以我要先手于他,所以我要Hook Sysenter的入口并判断传进来的ID,比如05这个ID我把他替换掉变成11C,而11C其实是直接跳到05这个函数的,就为了防止别的驱动过滤我的东西,另外Hook Sysenter的话我又头痛了,我是Hook Ntdll.dll里的呢还是应该Hook Ring0里的入口呢,Ring0的不好找,如果要Hook Ntdll.dll的话我又应该怎么办呢,是不是要先Hook掉进程创建的函数然逐一Hook呢,SSDT我已经可以Hook了,就不知道这个Sysenter怎么处理好
ksypy我发了短信给你,请看看,希望可以指点一下,成分感谢. |
|
5楼#
发布于:2007-03-25 22:59
确认是多核,超线程的问题.在sysdebug帮助下已解决
![]() |
|
6楼#
发布于:2007-03-25 18:38
引用第14楼killvxk于2007-03-25 18:36发表的“”: hook之后就不unhook了,只是用个lock表示是否先经过自己的过滤,还是直接放行~ 驱动加载后不再卸载——直到系统关闭~ |
|
|
7楼#
发布于:2007-03-25 18:36
应该采取inline hook,表面hook容易被恢复~
|
|
|
8楼#
发布于:2007-03-25 12:54
最近我也想Hook Sysenter想问下楼主,按我的想法我是给系统添加一个Sysenter的ID,比如说XP里添加一个0x11C那这样的话是不是要把SSDT复制一份出来,添加我的Sysenter,然后把KeServiceDescriptorTable的指针指向我复制出来的表呢~~ 我的也是双核机器~~就怕出现同样的问题~~按我的想法是先复制SSDT,然后修改指针,最后Hook Sysenter,Unhook的时候是先恢复Sysenter的Hook,然后恢复KeServiceDescriptorTable的指针,我这样的思路对吗??谢谢!!
|
|
9楼#
发布于:2007-03-21 11:28
我是hook了系统的sysenter,没法直接调用,我的mysysenter里面就一个jmp oldsysenter,没机会++,--.测试发现双核机器有问题,单核的还没问题,有点郁闷的说,真不知道该怎么解决了.....
|
|
10楼#
发布于:2007-03-21 10:17
一会事,只不过它直接++,--, 在内核需要用系统函数才能保证安全.
你没机会改变引用值,那..... |
|
|
11楼#
发布于:2007-03-21 07:51
测试了机台机器,可能跟双核有关系,还没最后确定,但是解决办法还是找不到....
|
|
12楼#
发布于:2007-03-20 20:25
七楼老大,我hook后mysysenter不是由我自己调用的,而是系统的sysenter转移过来了,好像没法加count吧.
8楼说的完全不懂,能给个示例吗? |
|
13楼#
发布于:2007-03-20 10:06
要用系统函数增加差少值,不能直接修改
|
|
|
14楼#
发布于:2007-03-20 09:56
引用第2楼znsoft于2007-03-19 21:57发表的“”: count++ mysysenter count-- unload() { while(count!=0) ... } |
|
|
15楼#
发布于:2007-03-20 09:13
:) hehe
|
|
|
16楼#
发布于:2007-03-20 08:53
又看了下,好像wrmsr这条指令执行完 并不是立即生效的....
|
|
17楼#
发布于:2007-03-19 22:48
还有就是我的那个hook里面直接搞了个jmp,好像没法搞计数器
|
|
18楼#
发布于:2007-03-19 22:46
怎么设置计数器?我在unhook的时候做了个判断,结果等待了8妙之久才真正unhook掉,晕一个,还望楼上大哥执教下
|
|
19楼#
发布于:2007-03-19 21:57
应该设置计数器,退出时等待所有引用完成
|
|
|
上一页
下一页