首页
社区
课程
招聘
[原创]一个宏的理解
发表于: 2011-12-10 23:57 5605

[原创]一个宏的理解

2011-12-10 23:57
5605

#define SYSCALL_INDEX(_Function)  *(PULONG)( (PUCHAR)_Function +1 )
这个宏折腾了半天,我说下我的理解吧,大家帮忙纠正下
1000 0000 0XAA
1000 0001 0XBB
1000 0002 0XBB
1000 0003 0XBB
1000 0004 0XBB

//获得函数在SSDT中的索引宏
#define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)

*(PULONG)((PUCHAR)_Function+1)保存了索引,是个DWORD(32)   
(PULONG)((PUCHAR)_Function+1)        存放索引(DWORD)的地址
(PUCHAR)_Function+1存放索引的地址
用(PULONG)使得指针指向的类型变成DWORD,否则的话,索引就是个 AA,是个一个字节的值

_Function     1000 0000 0XAA (PUCHAR)强制转化是为了让_Function+1变成1000 0001,而不是1000 0000 +__cdecl(当然这种情况编译不通过啦)。。
这里理解还是有点偏差。。_Function+1指向的是_Function+sizeof(指针指向的类型),因为强制转化了(UCHAR *),
所以,指针指向的类型是UCHAR,所以_Function+1 是地址0001,如果不加(UCHAR *),那么_Function+1应该是指针指向的类型(函数) +1,到底实际地址加了多少,
经过测试,可以直接输出函数的地址,但是如果函数的地址+1的话,出现下面错误,也就是说函数指针的类型是__cdecl *,无法用XX+sizeof(__cdecl)来计算 +1 后的地址
error C2296: '+' : illegal, left operand has type 'int (__cdecl *)(void)'

_Function+1   1000 0001 0XBB
(PULONG)将指针指向的类型强制成ULONG,4个字节的,在用*也就是变成了指向的类型是ULONG的一个ULONG值,这里理解不知道对不对。。(PULONG)到底强制转换了是地址还是地址里面的内容??应该是地址里面的内容吧,
这种情况下*((PUCHAR)_Function+1) 的值是0XBB
*(PULONG)((PUCHAR)_Function+1)的值是0XBB BB BB BB
不知道理解的对不对,感觉还是有点偏差,大大们帮忙纠正下把,。。关键是2个强制转化的问题

当然对于这个宏的本意,是把函数的第二个字节取出来作为索引,而查看函数原型的话,如果索引是A0的话,函数开头是XX A0 00 00 00 ,那么如果把(PULONG)去掉是不是也可以达到同样的效果呢????


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (7)
雪    币: 239
活跃值: (133)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
我测试了下,去掉PULONG强制转化也可以
但是仍然需要大手们解释下上面的
2011-12-11 00:22
0
雪    币: 239
活跃值: (133)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
相信自己了,hoho
2011-12-11 00:37
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
看不懂楼主什么意思。
2011-12-11 02:04
0
雪    币: 239
活跃值: (133)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
简单来说,就是把#define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1) 分布详细解释下
2011-12-11 08:55
0
雪    币: 2559
活跃值: (176)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
微软在这些个函数做了个特殊处理的,所以能这样用,你看下所有那些函数的头几个字节的反汇编,就明白了!
2011-12-16 10:52
0
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
pulong 就是个指针  32位
pvoid  也可以
puchar pchar都可以 你只确认是个32位的就可以了
不过PUCHAR的指针+1 和PULONG指针+1 就不一样

#define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)

首先看(PUCHAR)_Function+1
就是函数地址偏移一个CHAR的字节 看看每个函数的反汇编就知道了  函数地址的偏移一个字节后就是索引的指针

刚才的结果 = result
*(PULONG)(result)  就是把函数偏移一个字节的那个位置的32位拿出来 作为ULONG的指针(PULONG)
看看他指向哪里(*操作)  就是函数的索引
2011-12-16 14:51
0
雪    币: 239
活跃值: (133)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
我理解了,还是谢谢啦
2011-12-16 23:57
0
游客
登录 | 注册 方可回帖
返回
//