我是靠谱客的博主 从容蜻蜓,最近开发中收集的这篇文章主要介绍HOOK ntopenprocess,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

先来说一下我对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,&regionsize,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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部