ksypy
驱动牛犊
驱动牛犊
  • 注册日期2005-08-20
  • 最后登录2012-05-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:3230回复:20

关于Hook sysenter

楼主#
更多 发布于:2007-03-19 16:38
  写了段代码hook sysenter,hook好像能成功,但是驱动退出的时候unhook的时候出错了,吃了蓝玻璃。从dump文件看好像是说我的驱动已经退了,但是sysenter还要访问我驱动里面的Mysysenter,好像我的hook没有撤销。搞不明白,迷糊。。。难道在unhook的时候还要注意什么吗?
ksypy
驱动牛犊
驱动牛犊
  • 注册日期2005-08-20
  • 最后登录2012-05-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-03-19 21:49
实在搞不定,没人管,自己再顶下
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
板凳#
发布于:2007-03-19 21:57
应该设置计数器,退出时等待所有引用完成
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
ksypy
驱动牛犊
驱动牛犊
  • 注册日期2005-08-20
  • 最后登录2012-05-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-03-19 22:46
怎么设置计数器?我在unhook的时候做了个判断,结果等待了8妙之久才真正unhook掉,晕一个,还望楼上大哥执教下
ksypy
驱动牛犊
驱动牛犊
  • 注册日期2005-08-20
  • 最后登录2012-05-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-03-19 22:48
还有就是我的那个hook里面直接搞了个jmp,好像没法搞计数器
ksypy
驱动牛犊
驱动牛犊
  • 注册日期2005-08-20
  • 最后登录2012-05-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-03-20 08:53
又看了下,好像wrmsr这条指令执行完 并不是立即生效的....
linestyle
驱动小牛
驱动小牛
  • 注册日期2004-01-28
  • 最后登录2010-01-05
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望139点
  • 贡献值0点
  • 好评度135点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-03-20 09:13
:) hehe
loading is waiting ...
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2007-03-20 09:56
引用第2楼znsoft2007-03-19 21:57发表的“”:
应该设置计数器,退出时等待所有引用完成


count++
mysysenter
count--


unload()
{
while(count!=0)
...
}
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
8楼#
发布于:2007-03-20 10:06
要用系统函数增加差少值,不能直接修改
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
ksypy
驱动牛犊
驱动牛犊
  • 注册日期2005-08-20
  • 最后登录2012-05-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-03-20 20:25
七楼老大,我hook后mysysenter不是由我自己调用的,而是系统的sysenter转移过来了,好像没法加count吧.
8楼说的完全不懂,能给个示例吗?
ksypy
驱动牛犊
驱动牛犊
  • 注册日期2005-08-20
  • 最后登录2012-05-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-03-21 07:51
测试了机台机器,可能跟双核有关系,还没最后确定,但是解决办法还是找不到....
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
11楼#
发布于:2007-03-21 10:17
一会事,只不过它直接++,--, 在内核需要用系统函数才能保证安全.


你没机会改变引用值,那.....
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
ksypy
驱动牛犊
驱动牛犊
  • 注册日期2005-08-20
  • 最后登录2012-05-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-03-21 11:28
我是hook了系统的sysenter,没法直接调用,我的mysysenter里面就一个jmp oldsysenter,没机会++,--.测试发现双核机器有问题,单核的还没问题,有点郁闷的说,真不知道该怎么解决了.....
Samfung
驱动牛犊
驱动牛犊
  • 注册日期2007-03-22
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-03-25 12:54
最近我也想Hook Sysenter想问下楼主,按我的想法我是给系统添加一个Sysenter的ID,比如说XP里添加一个0x11C那这样的话是不是要把SSDT复制一份出来,添加我的Sysenter,然后把KeServiceDescriptorTable的指针指向我复制出来的表呢~~ 我的也是双核机器~~就怕出现同样的问题~~按我的想法是先复制SSDT,然后修改指针,最后Hook Sysenter,Unhook的时候是先恢复Sysenter的Hook,然后恢复KeServiceDescriptorTable的指针,我这样的思路对吗??谢谢!!
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
14楼#
发布于:2007-03-25 18:36
应该采取inline hook,表面hook容易被恢复~
没有战争就没有进步 X3工作组 为您提供最好的军火
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
15楼#
发布于:2007-03-25 18:38
引用第14楼killvxk2007-03-25 18:36发表的“”:
应该采取inline hook,表面hook容易被恢复~


hook之后就不unhook了,只是用个lock表示是否先经过自己的过滤,还是直接放行~
驱动加载后不再卸载——直到系统关闭~
没有战争就没有进步 X3工作组 为您提供最好的军火
ksypy
驱动牛犊
驱动牛犊
  • 注册日期2005-08-20
  • 最后登录2012-05-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-03-25 22:59
确认是多核,超线程的问题.在sysdebug帮助下已解决
Samfung
驱动牛犊
驱动牛犊
  • 注册日期2007-03-22
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
17楼#
发布于: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我发了短信给你,请看看,希望可以指点一下,成分感谢.
Samfung
驱动牛犊
驱动牛犊
  • 注册日期2007-03-22
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
18楼#
发布于: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
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
19楼#
发布于:2007-03-26 08:05
请尝试~反正打击都是在蓝屏中一路走过来的~
没有战争就没有进步 X3工作组 为您提供最好的军火
上一页
游客

返回顶部