首页
社区
课程
招聘
[已解决]一个SSDT HOOK中的疑惑(谢谢帮助我的兄弟们)
发表于: 2009-12-24 15:24 5323

[已解决]一个SSDT HOOK中的疑惑(谢谢帮助我的兄弟们)

2009-12-24 15:24
5323
[LEFT][/LEFT]我SSDT HOOK  NtOpenProcess函数 用下面这个没有问题

我定义的是 UCHAR  MYNtOpenProcess [300]  ,然后把原始地址代码重定位复制到
MYNtOpenProcess 。
KeServiceDescriptorTableShadow[0].Base[122] = MYNtOpenProcess;

然而 我想用 下面这种方法替代上面的 始终不成功。

*(PULONG)SaveSSDT[122]=(ULONG)MYNtOpenProcess; 用这个就进程停止响应,不过
能点右键刷新切换程序过一会蓝屏或等很长时间在XXX,不经意的发现360真Txx强大,我虚拟机上
装的360 我把它卸载了,然后试验立即就蓝了,难道360有延缓蓝屏功效!

*((ULONG*)SaveSSDT[122])=(ULONG)MYNtOpenProcess;直接蓝屏
为什么第一能成功 ,下面两种方法都不行呢
用了楼下的方法 没有HOOK 上
弱弱的在问个问题,向KiAttachProcess这个函数 只能INLINE HOOK 吗 ,能不能向 SSDT
HOOK 那样。谢谢了

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
2
自己顶下 。。。。
2009-12-24 16:00
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
3
帮帮忙 大哥们 给点鼓励吧
2009-12-24 20:33
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
4
你的图像太无敌了
2009-12-24 20:40
0
雪    币: 284
活跃值: (106)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
5
PULONG p=&(SaveSSDT[122]);
*p=XXXXXX;
*((PULONG)(&SaveSSDT[122]))=XXXXXX;

强烈推荐去LZ看谭老爷子的C语言
2009-12-24 21:44
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
6
谢谢老兄  我是看了 别人的HOOK 是这样 未能了解别人的正常 我的不正常。
用你给的方法还是不行。。。。
2009-12-24 22:41
0
雪    币: 445
活跃值: (25)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
楼主是不是没有关系内存保护?
2009-12-24 23:52
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
8
弄了 这个东西早弄了 ,试验了N种方法也不能XX
2009-12-25 00:00
0
雪    币: 284
活跃值: (106)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
9
道理没有错,因为base就是第一项,我的赋值语句绝对正确

那就不是赋值上的问题了

可以写一个简单的ring3代码来印证
#include"stdio.h"
#define ULONG unsigned long 
#define PULONG unsigned long *
void __stdcall  testfun(void)
{
	printf("test!\n");
	return ;
}
typedef struct DDD
{	ULONG Pointer;
	char sss;
	unsigned short bbs;
}DATA;
DATA Data[10]={0};
typedef void (__stdcall* FUN)(void);
void main()
{
	*((PULONG)(&Data[4]))=(ULONG)testfun;	
	FUN p=(FUN)(Data[4].Pointer);
	p();
	getchar();	
}
2009-12-25 00:03
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
10
实在没有办法了,我估计是参数的问题了,原先我自定义函数 比如
NTSTATUS  MyNtOpenProcess(
   OUT PHANDLE ProcessHandle,
   IN ACCESS_MASK DesiredAccess,
   IN POBJECT_ATTRIBUTES ObjectAttributes,
   IN PCLIENT_ID ClientId OPTIONAL)
自定义函数字节大小问题我没有想到好办法搞定,有一个笨方法就是90 懒得弄,
为了省事 直接定义 UCHAR MyNtOpenProcess[0X300]
然后把原始代码复制重定位到 MyNtOpenProcess里
经过试验 不管 SSDT 和INLINE 都很正常
在试验下吧
有没有好方法 让自定义函数 空间大点
2009-12-25 00:14
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
11
真晕了。。。。又试验了用
NTSTATUS  MyNtOpenProcess(
   OUT PHANDLE ProcessHandle,
   IN ACCESS_MASK DesiredAccess,
   IN POBJECT_ATTRIBUTES ObjectAttributes,
   IN PCLIENT_ID ClientId OPTIONAL)
也不行 哇哇哇。。。
2009-12-25 02:05
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
12
好4点了 终于弄明白了 期待高手解答
*((ULONG*)SaveSSDT[122]) 这个是正确的 唯一的是 地址不对 我这个地址确实是 NTOPENPROCESS
的地址,上次没办法了,重新编写了一个驱动 ,通过分析发现 要HOOK NTOPENPROCESS 并不是把MYNTOPENPROCESS 赋值给NTOPENPROCESS
那样的 而是nt!KiServiceTable+0x1e8 这个地址
流程是
ULONG address;
address=nt!KiServiceTable+0x1e8 ;
MemOpen();
*((ULONG*)address)=MYNtOpenProcess;
MemClose();
这样一点问题也没有,呜呜呜.
期待高手帮忙解答下。
2009-12-25 03:48
0
雪    币: 392
活跃值: (89)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
13
分析:
ULONG address;
address=nt!KiServiceTable+0x1e8

这个address是指向NtOpenProcess地址的指针,也就是说 *address的内容才是NtOpenProcess的地址;
那么,现在一切都明白了吧,你要HOOK  NtOpenProcess,其实就是要用你的自定义函数地址替换掉:
*address, 如:
*((ULONG*)address)=MYNtOpenProcess;

LZ要的是这个答案吗...
要深刻理解指针的含义啊,如果懂汇编,那么结合内存寻址更能帮助理解指针...
2009-12-25 14:55
0
雪    币: 392
活跃值: (89)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
14
更加简单点,可以这样说:
你先前的写法,仅仅是替换掉了NtOpenProcess的函数地址的内容;然而,系统调用通过SSDT计算
NtOpenProcess的服务号偏移+基址,得出一个地址,然后取这个地址的内容才是NtOpenProcess的调用入口,这个地址你是没有改变的。相反,却改了一些不该改的东西...所以蓝屏了
2009-12-25 15:03
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
15
谢谢了楼上 终于明白了。
2009-12-25 17:16
0
游客
登录 | 注册 方可回帖
返回
//