看流星社区

 找回密码
 注册账号
查看: 2141|回复: 0

普及X64 ssdtshadow inline HOOK

[复制链接]

该用户从未签到

发表于 2017-6-3 11:03:53 | 显示全部楼层 |阅读模式
序:
我只想说~~再不发帖老大就 不搭理我了~~~
原因:玩保护玩到了 XINGCODE3 就他的各种检测就让我不得不重视这个问题了:


各种窗口 各种X 我的工具 让我忍无可忍,就决定先HOOK了在说其他 最开始我用TA 的代码里面的 HOOK 方法 在 挂钩 NT 内核中的函数算是无往不利 在SHADOWSSDT中就蛋疼菊花紧了~~
于是 开始自己搞:mad::mad:


我们要做的就是
得到KeServiceDescriptorTableShadow的地址 然后根据这个玩意儿得到函数地址 再inline hook!




大家要说了为什么不直接利用表HOOK 我就像说一句 太麻烦 要找一个在同一4GB 的内存空间做代理函数 还要二级跳 何必呢:::




HOOK 方式 使用汇编引擎得到一个不截断的大于等于14字节的可存放JMP 的长度


然后COPY 这个一片内存 复制到代理函数的开头 我用的汇编文件 给他30 个NOP 怎么都够了


然后 进入过滤函数 最后决定是跳回去执行还是这里就返回了


下面这个函数是获取 指定shadowssdt中指定index的项的函数地址




ULONG64 ssdt_GetSSDTShaDowFuncX64(ULONG serviceID){
PKSERVICE_TABLE_DESCRIPTOR SSDTShadow;
PULONG     W32pServiceTable;
KAPC_STATE   ApcState;
PULONG g_Guiprocess;
ULONG64 funcAddress;
SSDTShadow = (PKSERVICE_TABLE_DESCRIPTOR)KeServiceDescriptorTableShadow;
serviceID &= 0x0FFF;
if (!SSDTShadow)
{
return 0;
}




g_Guiprocess = Search64Process("csrss", 0);


W32pServiceTable = SSDTShadow[1].Base;
KeStackAttachProcess(g_Guiprocess, &ApcState);
funcAddress = (LONGLONG)(W32pServiceTable[serviceID] >> 4)
+ (ULONGLONG)W32pServiceTable;


KeUnstackDetachProcess(&ApcState);
funcAddress &= 0xfffffff0ffffffff;
return funcAddress;






}


:3:代码略丑不要见怪
上面一些调用自己补充~~很简单~~




下面开始HOOK~、






这次目标程序函数是NtUserWindowFromPoint~
g_NtUserWindowFromPoint = ssdt_GetSSDTShaDowFuncX64(20);这样就得到了这个函数的地址
X64 = g_NtUserWindowFromPoint;保存一下一会儿HOOK 用
g_NtUserWindowFromPoint = g_NtUserWindowFromPoint+ 15;//十五字节
这里一会儿代理函数跳回去 跨过15个字节用到




下面编写.asm 文件
这里这个函数的前15个字节不截断的
EXTERN g_NtUserWindowFromPointWORD //汇编中调用C里面申明的跳转地址
.CODE
FromPoint MACRO
BYTE 048h ,089h ,05Ch ,024h ,018h ,048h, 089h ,04Ch ,024h ,008h ,057h ,048h ,083h ,0ECh ,060h
ENDM
proxy_NtUserWindowFromPoint PROC
FromPoint //实现开头15字节
JMP QWORD ptr [g_NtUserWindowFromPoint] //跳回去
proxy_NtUserWindowFromPoint ENDP







一切准备就绪我们实现的功能就是跳到代理函数再跳回去~


DbgPrint("proxy_NtUserWindowFromPoint:%p", &proxy_NtUserWindowFromPoint);
tmpv = (UINT64)&proxy_NtUserWindowFromPoint;


memcpy(jmp_code + 6, &tmpv, 8);
attach(&ApcState);


DbgPrint("X64:%p", X64);
irql = WPOFFx64();
RtlFillMemory((void*)X64, 15, 0x90);
memcpy(X64, &jmp_code, 14);
WPONx64(irql);
deach(&ApcState);
// HOOK好了


语文是生物老师教的不好意思献丑了~~~
看一下效果图


每次发帖都有些纠结【 【排版也不好~~~
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 18:43

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表