与SSDT有关,但本质应该是C++指针问题

蒙飞鸿 2013-02-22 10:47:28
一般SSDT HOOK的代码如下
#pragma pack(1)
typedef struct ServiceDescriptorEntry {
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase; //Used only in checked build
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry, *PServiceDescriptorTableEntry;
#pragma pack()

extern "C" ServiceDescriptorTableEntry KeServiceDescriptorTable;

现在已经验证如下代码(HOOK1)能够成功HOOK:
ULONG index = *(PUCHAR)((PUCHAR)ZwOpenProcess+1);
ULONG ulBaseAddr = *(KeServiceDescriptorTable.ServiceTableBase);
PULONG SSDT_NTOpenProcess = (PULONG)(ulBaseAddr + index*4);
OldZwOpenProcess = (ZWOPENPROCESS)(*SSDT_NTOpenProcess) ;
*SSDT_NTOpenProcess = (unsigned long)NewZwOpenProcess;

index就是表索引,用SB代替KeServiceDescriptorTable.ServiceTableBase,那么HOOK1代码里通过对SB使用*取值获得表地址。

但很多SSDT HOOK的代码并不是这么计算的,而是用一个这样的宏#define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[*(PUCHAR)((PUCHAR)_function+1)]

该宏的中心应该是通过对SB[index]来获得表元素。


我的问题是不能理解SB既可以*SB取得表地址,又可以SB[index]获得表元素。想做一个简单的模拟都不成功,比如int Table[3] = {1,2,3};PUING pt = Table;那么pt[x]可以取表元素没有错,但*pt则不是表地址。如果是二级指针的话,*能得到表地址,但[]却不是表元素。
...全文
163 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
StarsunYzL 2013-02-22
按照C++的语法标准,SB[index] 和 *(SB + index) 是等价的,也就是说后者的SB表示的就是表地址,如果再按照你的说法,*SB也取得表地址,那么 *SB == SB,这个表达式成立的唯一情况就是SB[0]元素的值(也就是 *SB )刚好等于SB表地址
  • 打赏
  • 举报
回复
蒙飞鸿 2013-02-22
能做个简单例子既可以*SB取得表地址,又可以SB[index]获得表元素吗?
  • 打赏
  • 举报
回复
jimette 2013-02-22
一级的时候*p 是不可以取到地址的!
  • 打赏
  • 举报
回复
蒙飞鸿 2013-02-22
最后找到问题的根源了,出在extern和__declspec(dllimport)导入变量的区别上。 我用前者,只能*SB+index,后者就可以[]了。
  • 打赏
  • 举报
回复
蒙飞鸿 2013-02-22
引用 3 楼 StarsunYzL 的回复:
按照C++的语法标准,SB[index] 和 *(SB + index) 是等价的,也就是说后者的SB表示的就是表地址,如果再按照你的说法,*SB也取得表地址,那么 *SB == SB,这个表达式成立的唯一情况就是SB[0]元素的值(也就是 *SB )刚好等于SB表地址
我认为也是这个情况,不知道怎么实现这个情况。汇编下应该好办,C呢?
  • 打赏
  • 举报
回复
相关推荐
发帖
VC/MFC
加入

1.6w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2013-02-22 10:47
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……