:D:浅谈系列之OBJECT_HOOK
1.首先说一下这个无数大牛玩烂的SSDT
在以前对抗当中无非就是 inline hook
我就SSDT 跳到新地址,判断白话名
:D:你 inline hook 下面 我就Hook 你上面 构建原函数,组件新 规则
——————————————————————————————————————————
不过呢? 如果一个游戏检测SSDT表 未知SSDT hook就爆非法怎么办~ 这不是肿了吗?
:cool:思路构建新SSDT表 增加新函数~
正题开始~
我们如何来构建新表呢?
2.首先:我们要保持原来函数表的样子
因为SSDT中的 Index 地址是从0号开始
在XP 系列中 SSDT一个有284号 0-283
所以我们要插入比 284大的序列
PS:简单看一下SSDT
接着写下面的代码:看上面就知道怎么做了不知道 拿windbg搞搞
:o:
对了还要去掉保护和开启保护
这里有一个问题
对于单核CPU来说 直接提升IRQL是没问题的
对于多核CPU 推荐采用 自旋锁
:D:如果你上面看明白了话一切都好办了~;):
见证努力的结果
附件 81658
:D:题目来了
临时会员只要写出KeServiceDescriptorTableShadow 新增几个函数就算完成作业就可以得到邀请码
:):参数分别为1,2,3,4
打印出 “看雪你好”:o:
附上源代码:
1.首先说一下这个无数大牛玩烂的SSDT
在以前对抗当中无非就是 inline hook
我就SSDT 跳到新地址,判断白话名
:D:你 inline hook 下面 我就Hook 你上面 构建原函数,组件新 规则
——————————————————————————————————————————
不过呢? 如果一个游戏检测SSDT表 未知SSDT hook就爆非法怎么办~ 这不是肿了吗?
:cool:思路构建新SSDT表 增加新函数~
正题开始~
我们如何来构建新表呢?
2.首先:我们要保持原来函数表的样子
因为SSDT中的 Index 地址是从0号开始
代码:
memcpy(NewSSDTServiceTableBase,KeServiceDescriptorTable->ServiceTableBase,(MyID-1)*4);
所以我们要插入比 284大的序列
PS:简单看一下SSDT
代码:
typedef struct ServiceDescriptorTable {
PVOID ServiceTableBase; //真正的系统服务地址表
PULONG ServiceCounterTable;//系统调用的记录,调用了多少次,在Check版本才有效
ULONG TableSize;//表的大小,Windows总共提供了多少个系统调用
PUCHAR ArgumentTable;//参数大小表
} ServiceDescriptorTable, *ServiceDescriptorTable;
代码:
memcpy(NewSSDTServiceTableBase,KeServiceDescriptorTable->ServiceTableBase,(MyID-1)*4); //Index Address=baseaddress+Index Number*4
memcpy(NewSSDTParamTableBase,KeServiceDescriptorTable->ParamTableBase,MyID-1); 1你要不要无所谓
NewSSDTServiceTableBase[MyID-1]=(ULONG)New_Funtion;
NewSSDTParamTableBase[MyID-1]=ParametersNumber;
KeServiceDescriptorTable->ServiceTableBase=NewSSDTServiceTableBase;
KeServiceDescriptorTable->ParamTableBase=NewSSDTParamTableBase;
KeServiceDescriptorTable->NumberOfServices=MyID;
对了还要去掉保护和开启保护
这里有一个问题
对于单核CPU来说 直接提升IRQL是没问题的
对于多核CPU 推荐采用 自旋锁
:D:如果你上面看明白了话一切都好办了~;):
见证努力的结果
附件 81658
:D:题目来了
临时会员只要写出KeServiceDescriptorTableShadow 新增几个函数就算完成作业就可以得到邀请码
:):参数分别为1,2,3,4
打印出 “看雪你好”:o:
附上源代码: