概述
先来说一下我对SSDT的体会把
我感觉SSDT 就是一张表 这个表里面 有很多数组 然后 算是 内核层的 导入表只不过 他是整个操作系统的导入表
然后里面有很多数组 然后当我们 调用 api的时候 应用层的api 会经过封装 可能会多传出一些 参数 比如 那张表 表的 地址 那个数组 然后 进去调用就好了
听群里的大佬说 x86 的ssdt 好像是固定的 但是 x64 好像就是会变化的 这就是有些大手子 喜欢写 硬编码 而导致 驱动程序不稳定的 原因了吧
然后我们先说一下 cmd的操作
先用 tasklist 来看进程
Taskkill /pid [进程码] -t(结束该进程) -f(强制结束该进程以及所有子进程)
然后 我今天才知道 vs 的大块注释
注释: 先CTRL+K,然后CTRL+C
取消注释: 先CTRL+K,然后CTRL+U
然后我们先看下面这个 因为 系统不一样 可能ssdt的 数组 顺序不一样 先写一个程序 看看 具体是在哪一个组
这里我们 以 ntopenprocess 为例子 那么 我们写以下代码看看 那个是 ntopenprocess
#include <ntddk.h>
//zwallocatevirtualmemory(hprocess,&allocateaddress,0,®ionsize,mem_commit,page_execute_readwrite);
#pragma pack(1) //写这个内存以一字节对齐 如果不写是以4字节的对齐的
typedef struct servicedescriptorentry {//这个结构就是为了管理这个数组而来的 内核api所在的数组 才有这个结构的 这个是ssdt
unsigned int *servicetablebase;//就是servicetable ssdt数组
unsigned int *servicecountertablebase; //仅适用于checked build版本 无用
unsigned int numberofservices;//(servicetablebase)数组中有多少个元素 有多少个项
unsigned char *paramtablebase;//参数表基址 我们层传过来的api的参数 占用多少字节 多大
} servicedescriptortableentry_t, *pservicedescriptortableentry_t;
#pragma pack()
_declspec(dllimport) servicedescriptortableentry_t keservicedescriptortable;//导出ssdt
void printssdt()
{
NTSTATUS status;
ULONG i;
status = STATUS_SUCCESS;
for (i = 0; i < keservicedescriptortable.numberofservices; i++)
{
//0x805cc486
if (keservicedescriptortable.servicetablebase[i]==0x805cc486)
kdprint(("severtablebase[%d] %x",i,keservicedescriptortable.servicetablebase[i]));
}
}
然后发现是122 然后
完成了 hook
最后
以上就是从容蜻蜓为你收集整理的HOOK ntopenprocess的全部内容,希望文章能够帮你解决HOOK ntopenprocess所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复