强制读写受保护的内存

某些时候我们需要读写别的进程的内存,某些时候别的进程已经对自己的内存读写做了保护,这里说四个思路(两个R3的,两个R0的)。

方案1(R3):直接修改别人内存

最基本的也最简单的就是直接通过WriteProcessMemory 和 ReadProcessMemory对没有进行保护的程序的内存进行修改,一些单机游戏辅助什么的可能会有这种简单方式修改其他进程内存。

方案2(R3): 注入

通过注入的方式想办法进入宿主进程,然后修改他的内存。这里的话姿势就很多了,远程代码注入,APC注入,输入法注入,LSP注入等等。最常用最省事的估计就是输入法注入,最不常用,但是效果最好的我个人感觉是LSP注入,这个之前用过一段时间。甚至直接可以在R3层做网络劫持了。不过LSP坑多,用者慎重。

方案3(R0):KeStackAttachProcess

在驱动里,直接附加到宿主进程内存,然后进行内存修改,强杀进程的时候也经常用这个姿势Attack进去,然后 进程虚拟地址空间擦除 直接干进程。

void KWriteProcessMemory(IN PEPROCESS Process, IN PVOID Address, IN UINT32 Length, IN PVOID Buffer)
{
PKAPC_STATE pKs = (PKAPC_STATE)ExAllocatePool(NonPagedPool, sizeof(PKAPC_STATE));
KeStackAttachProcess(Process, pKs);//Attach进程虚拟空间
if (MmIsAddressValid(Address))
{
RtlCopyMemory(Address, Buffer, Length);
DbgPrint("[x64Drv] Date wrote.");
}
KeUnstackDetachProcess(pKs);
}

方案4(R0):加强版方案3(也叫CR3大法,因为是操作了CR3)

可以理解成是反汇编了方案3的代码后,直接自己实现了方案3。不过这个设计到不同系统的结构不同问题,用的时候注意确定每个系统的相关数据结构偏移:

以下代码是Win7 64

#define DIRECTORY_TABLE_BASE	0x028

UINT32 idTarget=0;
PEPROCESS epTarget=NULL;
UINT32 idGame=0;
PEPROCESS epGame=NULL;
UINT32 rw_len=0;
UINT64 base_addr=0; ULONG64 Get64bitValue(PVOID p)
{
if(MmIsAddressValid(p)==FALSE)
return 0;
return *(PULONG64)p;
} ULONG32 Get32bitValue(PVOID p)
{
if(MmIsAddressValid(p)==FALSE)
return 0;
return *(PULONG32)p;
} void KReadProcessMemory(IN PEPROCESS Process, IN PVOID Address, IN UINT32 Length, OUT PVOID Buffer)
{
ULONG64 pDTB=0,OldCr3=0,vAddr=0;
//Get DTB
pDTB=Get64bitValue((UCHAR*)Process + DIRECTORY_TABLE_BASE);
if(pDTB==0)
{
DbgPrint("[x64Drv] Can not get PDT");
return;
}
//Record old cr3 and set new cr3
_disable();
OldCr3=__readcr3();
__writecr3(pDTB);
_enable();
//Read process memory
if(MmIsAddressValid(Address))
{
RtlCopyMemory(Buffer,Address,Length);
DbgPrint("[x64Drv] Date read: %ld", *(PDWORD)Buffer);
}
//Restore old cr3
_disable();
__writecr3(OldCr3);
_enable();
} void KWriteProcessMemory(IN PEPROCESS Process, IN PVOID Address, IN UINT32 Length, IN PVOID Buffer)
{
ULONG64 pDTB=0,OldCr3=0,vAddr=0;
//Get DTB
pDTB=Get64bitValue((UCHAR*)Process + DIRECTORY_TABLE_BASE);
if(pDTB==0)
{
DbgPrint("[x64Drv] Can not get PDT");
return;
}
//Record old cr3 and set new cr3
_disable();
OldCr3=__readcr3();
__writecr3(pDTB);
_enable();
//Read process memory
if(MmIsAddressValid(Address))
{
RtlCopyMemory(Address,Buffer,Length);
DbgPrint("[x64Drv] Date wrote.");
}
//Restore old cr3
_disable();
__writecr3(OldCr3);
_enable();
}

下面是方案4的执行结果。

Win64 驱动内核编程-27.强制读写受保护的内存的更多相关文章

  1. Win64 驱动内核编程-26.强制结束进程

    强制结束进程 依然已经走到驱动这一层了,那么通常结束掉一个进程不是什么难的事情.同时因为win64 位的各种保护,导致大家慢慢的已经不敢HOOK了,当然这指的是产品.作为学习和破解的话当然可以尝试各种 ...

  2. Win64 驱动内核编程-21.DKOM隐藏和保护进程

    DKOM隐藏和保护进程 主要就是操作链表,以及修改节点内容. DKOM 隐藏进程和保护进程的本质是操作 EPROCESS 结构体,不同的系统用的时候注意查下相关定义,确定下偏移,下面的数据是以win7 ...

  3. Win64 驱动内核编程-8.内核里的其他常用

    内核里的其他常用 1.遍历链表.内核里有很多数据结构,但它们并不是孤立的,内核使用双向链表把它们像糖 葫芦一样给串了起来.所以遍历双向链表能获得很多重要的内核数据.举个简单的例子,驱 动对象 Driv ...

  4. Win64 驱动内核编程-3.内核里使用内存

    内核里使用内存 内存使用,无非就是申请.复制.设置.释放.在 C 语言里,它们对应的函数是:malloc.memcpy.memset.free:在内核编程里,他们分别对应 ExAllocatePool ...

  5. Win64 驱动内核编程-2.基本框架(安装.通讯.HelloWorld)

    驱动安装,通讯,Hello World 开发驱动的简单流程是这样,开发驱动安装程序,开发驱动程序,然后安装程序(或者其他程序)通过通讯给驱动传命令,驱动接到之后进行解析并且执行,然后把执行结果返回. ...

  6. Win64 驱动内核编程-7.内核里操作进程

    在内核里操作进程 在内核里操作进程,相信是很多对 WINDOWS 内核编程感兴趣的朋友第一个学习的知识点.但在这里,我要让大家失望了,在内核里操作进程没什么特别的,就标准方法而言,还是调用那几个和进程 ...

  7. Win64 驱动内核编程-18.SSDT

    SSDT 学习资料:http://blog.csdn.net/zfdyq0/article/details/26515019 学习资料:WIN64内核编程基础 胡文亮 SSDT(系统服务描述表),刚开 ...

  8. Win64 驱动内核编程-20.UnHook SSDT

    UNHOOK SSDT 要恢复 SSDT,首先要获得 SSDT 各个函数的原始地址,而 SSDT 各个函数的原始地址,自然是存储在内核文件里的.于是,有了以下思路: 1.获得内核里 KiService ...

  9. Win64 驱动内核编程-31.枚举与删除映像回调

    枚举与删除映像回调 映像回调可以拦截 RING3 和 RING0 的映像加载.某些游戏保护会用此来拦截黑名单中的驱动加载,比如 XUETR.WIN64AST 的驱动.同理,在反游戏保护的过程中,也可以 ...

随机推荐

  1. 如何在Bash脚本中引入alias

    更多精彩内容,请关注微信公众号:后端技术小屋 alias的使用 在日常开发中,为了提高运维效率,我们会用alias(命令别名)来定义命令的简称.比如在~/.bash_profile中添加: alias ...

  2. 正则表达式-Python实现

    1.概述: Regular Expression.缩写regex,regexp,R等: 正则表达式是文本处理极为重要的工具.用它可以对字符串按照某种规则进行检索,替换. Shell编程和高级编程语言中 ...

  3. css实现京东顶部导航条

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  4. IPFS矿机封装原理解释

    近期无论是从媒体.新闻的高度曝光,还是市场拓展的覆盖度来看,IPFS 俨然成为今年最值得关注的行业话题与入场趋势.对于许多刚了解 IPFS 的小白来说,矿机的「封装」.「有效算力」和「原值算力」这些概 ...

  5. Paperfolding HDU - 6822

    传送门:https://vjudge.net/problem/HDU-6822 题意:给你一张无限的纸有四种折叠方式,并且在n次折叠后减两刀问最后纸张数量的数学期望. 思路:我们要得到一个通项公式对于 ...

  6. P1422小玉家的电费(JAVA语言)

    package 顺序与分支; /* * 题目描述 夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了. 小玉家今天收到了一份电费通知单.小玉看到上面写:据闽价电[2006]27号规定, 月 ...

  7. [Fundamental of Power Electronics]-PART I-5.不连续导电模式-5.3 Boost变换器实例

    5.3 Boost变换器实例 作为第二个示例,考虑图5.12的Boost变换器.让我们来确定不同模式的边界并且求解DCM下的电压变换比.此前在2.3节中分析了在CCM工作的Boost变换器的特性,并确 ...

  8. Java生鲜电商平台-API接口设计之token、timestamp、sign 具体架构与实现(APP/小程序,传输安全)

    Java生鲜电商平台-API接口设计之token.timestamp.sign 具体设计与实现 说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃 ...

  9. OO电梯系列优化分享

    目录 前言 HW5 HW6 第二次作业uml协作图 HW7 第三次作业uml协作图 前言 本单元作业在优化方面确实有一些想法值得分享,故单开一篇博客分享一下三次作业的优化以及架构. 三次作业的共同之处 ...

  10. [shell脚本]在Linux终端可视化输出表格数据

    最终效果 1. 自定义表格样式 2. 自定义主题颜色 支持三系普通颜色 支持16色彩虹色 支持单颜色 回顾一下shell语法 1. shell传递参数 我们可以在执行shell脚本时实时传递参数从而指 ...