与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则不是表地址。如果是二级指针的话,*能得到表地址,但[]却不是表元素。
...全文
192 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
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呢?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧