- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
读写被保护进程内存的NNN种方法
以下纯手工码字.辛苦分有木有?
看到有童鞋大过年的还被人骗了600..
突然才意识到自己免费扔群共享几个月的东西居然值1000么。。
首先是常识:
远程读写进程内存的,通常是用
readprocessmemory
writeprocessmemory
这两个函数都需要进程句柄
当ntopenprocess被hook无法获得进程句柄时.
或者这两个函数对应的ntreadvirtualmemory ntwritexxxxx被hook的时候.
就无法实现.
以下是N种实现方法(属于立刻马上就能想到.并且实现的)
1.
驱动pass被hook的这3个函数
这个不用多解释..ssdt hook已经是很低级的话题.
2.
如果说上面的方法.每次游戏驱动要更新很麻烦.
那就基于上面的原理来个一劳永逸的
直接针对上面3个ssdt函数自己封装/模拟
把封装后的函数地址添加到新的ssdt链表
再把r3进程里ntdll里的Zw函数的index修改成新链表index的。
这个东西可以全部做在dll里
然后什么程序需要无视保护.只需要loadlibrary这个dll就可以了
SOD的内核模式就是这个原理.
当然它对openprocess的处理仅仅只是头部.
所以TP在内部hook就没有跳过了
3.
直接模拟ntreadvirtualmemory ntwritexxxxx的核心
其实并不是很复杂
ntreadvirtualmemory第一个参数是进程句柄
实际上读写内存的时候.进程句柄.最终是用来取eprocess的
我们知道readprocessmemory被叫做debugapi(调试api)
它的实现过程简单描述如下:
通过进程句柄遍历到被写进程的eprocess
KeStackAttachProcess(eprocess,apc)//附加
这时候直接调用
memcpy(目标进程虚拟地址,缓冲区指针,长度)
就把内存传出来了
读和写没有区别.
无非是目标地址和源地址交换一下
取eprocess本质上是不需要什么进程句柄.
也就不需要什么ntopenprocess.
PsLookupProcessByProcessId (PID, EProcess)--直接就能把EP传址回来
然后附加 再调用memcpy就可以了。
4.
基于第3种方法.
如果KeStackAttachProcess被hook.
就会导致无效
那么我们简单看看读写内存为啥需要KeStackAttachProcess?
通过调试就可以知道实际上附加本质.只是为了获取cr3进而获得内存分页而已
那其实我们就可以完全不需要去附加.这样就不会被hook干掉
因为eprocess的第一个结构kprocess+0x18保存的就是cr3.
当然.这里需要说明的是.
开启pae的情况下cr3的结构不一样.
这个我们可以通过读cr4 第5位是否置位获得
或者通过注册表
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PhysicalAddressExtension
1开 0关
然后是遍历页表或者继续抄附加原本的映射都随意.
5.
MmGetSystemAddressForMdlSafe直接将进程虚拟内存地址映射到内核态上.然后mov.
6.
偷梁换柱法
还是kprocess.记得前面说的的页表指针么.
任找一个记事本或者计算器这种单线程的进程,把主线程暂停了
(或者写一个简单的小程序.Main(启动子程序)就把自己的主线程暂停了)
然后取的这个程序的eprocess 取页表指针.备份之
取目标进程的页表指针,覆盖
这时候read/write processmemory 这个被暂停线程的程序.就访问/写入了被保护进程了
除了hook分页机制.任何ssdthook都过滤不了这货.
必须强调一点
关闭这个挂起进程前.必须把原来备份的页表指针写回去。不然会蓝。 |
|