DKOM隐藏和保护进程 主要就是操作链表,以及修改节点内容. DKOM 隐藏进程和保护进程的本质是操作 EPROCESS 结构体,不同的系统用的时候注意查下相关定义,确定下偏移,下面的数据是以win7 64为例. 关 注 两 个 成 员 : ActiveProcessLinks 和 Flag . ActiveProcessLinks 把各个EPROCESS 结构体连接成"双向链表",ZwQuerySystemInformation枚举进程时就是枚举这条链表,如果将某个 EPROCESS…
强制读写受保护的内存 某些时候我们需要读写别的进程的内存,某些时候别的进程已经对自己的内存读写做了保护,这里说四个思路(两个R3的,两个R0的). 方案1(R3):直接修改别人内存 最基本的也最简单的就是直接通过WriteProcessMemory 和 ReadProcessMemory对没有进行保护的程序的内存进行修改,一些单机游戏辅助什么的可能会有这种简单方式修改其他进程内存. 方案2(R3): 注入 通过注入的方式想办法进入宿主进程,然后修改他的内存.这里的话姿势就很多了,远程代码注入,A…
在内核里操作进程 在内核里操作进程,相信是很多对 WINDOWS 内核编程感兴趣的朋友第一个学习的知识点.但在这里,我要让大家失望了,在内核里操作进程没什么特别的,就标准方法而言,还是调用那几个和进程相关的 NATIVE API 而已(当然了,本文所说的进程操作,还包括对线程和 DLL 模块的操作).本文包括 10 个部分:分别是:枚举进程.暂停进程.恢复进程.结束进程.枚举线程.暂停线程.恢复线程.结束线程.枚举 DLL 模块.卸载 DLL 模块. 1.枚举进程.进程就是活动起来的程序.每一个…
内核里使用内存 内存使用,无非就是申请.复制.设置.释放.在 C 语言里,它们对应的函数是:malloc.memcpy.memset.free:在内核编程里,他们分别对应 ExAllocatePool.RtlMoveMemory. RtlFillMemory.ExFreePool.它们的原型分别是: 需要注意的是,RtlFillMemory 和 memset 的原型不同.ExAllocatePool 和 malloc 的原型也不同.前者只是参数前后调换了一下位置,但是后者则多了一个参数:Pool…
内核里的其他常用 1.遍历链表.内核里有很多数据结构,但它们并不是孤立的,内核使用双向链表把它们像糖 葫芦一样给串了起来.所以遍历双向链表能获得很多重要的内核数据.举个简单的例子,驱 动对象 DriverObject 就是使用双向链表给串起来的,遍历这个链表就可以枚举内核里所有的驱动.示例代码如下 //传入驱动自身的 DriverObject VOID EnumDriver(PDRIVER_OBJECT pDriverObject) { PKLDR_DATA_TABLE_ENTRY entry…
驱动安装,通讯,Hello World 开发驱动的简单流程是这样,开发驱动安装程序,开发驱动程序,然后安装程序(或者其他程序)通过通讯给驱动传命令,驱动接到之后进行解析并且执行,然后把执行结果返回. 驱动程序Hello World 之前总结了驱动环境的搭建,这里就直接继续之前搭建好的环境创建项目,打开vs2015创建一个驱动项目: 写代码之前先配置下编译选项: 然后添加一个项目文件main.c(注意后缀是.c,前面名字无所谓可以不叫main),里面的内容如下(下面模板代码来源于网络,作者:胡文亮…
Ring0 InLineHook 和UnHook 如果是要在R0里hook,作者的建议是InLine HOOK,毕竟SSDT HOOK 和 SHADOW SSDT HOOK比较麻烦,不好修改.目前R3的InLine HOOK 我比较喜欢的是 MINI HOOK ENGINE,但是今天要解决的是R0的InLine HOOK问题. 下面说下InLine HOOK的思路: 一 . 实现  RING0 INLINE HOOK 无论是用户态 Inline Hook 还是内核级 Inline Hook,都要…
SSDT 学习资料:http://blog.csdn.net/zfdyq0/article/details/26515019 学习资料:WIN64内核编程基础 胡文亮 SSDT(系统服务描述表),刚开始接触什么进程保护XXX啥的,都是看到在说SSDT(虽然说目前很多杀软都已经采用稳定简单的回调姿势了).这次就弄清楚两个问题: 如何在内核里动态获得 SSDT 的基址: 如何在内核里动态获得 SSDT 函数的地址: 在 WIN32 下,第一个问题就根本不是问题,因为 KeServiceDescrip…
UNHOOK SSDT 要恢复 SSDT,首先要获得 SSDT 各个函数的原始地址,而 SSDT 各个函数的原始地址,自然是存储在内核文件里的.于是,有了以下思路: 1.获得内核里 KiServiceTable 的地址(变量名称:KiServiceTable) 2.获得内核文件在内核里的加载地址(变量名称:NtosBase) 3.获得内核文件在 PE32+结构体里的映像基址(变量名称:NtosImageBase) 4.在自身进程里加载内核文件并取得映射地址(变量名称:NtosInProcess)…
枚举与删除映像回调 映像回调可以拦截 RING3 和 RING0 的映像加载.某些游戏保护会用此来拦截黑名单中的驱动加载,比如 XUETR.WIN64AST 的驱动.同理,在反游戏保护的过程中,也可以拦截游戏驱动的加载. 跟进程/线程回调类似,映像回调也存储在数组里.这个数组的"符号名"是PspLoadImageNotifyRoutine.我们可以在 PsSetLoadImageNotifyRoutine 中找到它: 实现的代码如下: ULONG64 FindPspLoadImageN…