龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课 9 [已完结] C++零基础开发DXF内存脚本辅助教程 32课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 7417|回复: 0

C++强制读写进程内存 R0与R3法

[复制链接]

11

主题

1

回帖

23

积分

编程入门

Rank: 1

龙马币
114

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


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

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


方案2(R3): 注入

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


方案3(R0):KeStackAttachProcess

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

  1. void KWriteProcessMemory(IN PEPROCESS Process, IN PVOID Address, IN UINT32 Length, IN PVOID Buffer)
  2. {
  3. PKAPC_STATE pKs = (PKAPC_STATE)ExAllocatePool(NonPagedPool, sizeof(PKAPC_STATE));
  4. KeStackAttachProcess(Process, pKs);//Attach进程虚拟空间
  5. if (MmIsAddressValid(Address))
  6. {
  7. RtlCopyMemory(Address, Buffer, Length);
  8. DbgPrint("[x64Drv] Date wrote.");
  9. }
  10. KeUnstackDetachProcess(pKs);
  11. }
复制代码



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

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


以下代码是Win7 64

  1. #define DIRECTORY_TABLE_BASE    0x028

  2. UINT32 idTarget=0;
  3. PEPROCESS epTarget=NULL;
  4. UINT32 idGame=0;
  5. PEPROCESS epGame=NULL;
  6. UINT32 rw_len=0;
  7. UINT64 base_addr=0;

  8. ULONG64 Get64bitValue(PVOID p)
  9. {
  10. if(MmIsAddressValid(p)==FALSE)
  11. return 0;
  12. return *(PULONG64)p;
  13. }

  14. ULONG32 Get32bitValue(PVOID p)
  15. {
  16. if(MmIsAddressValid(p)==FALSE)
  17. return 0;
  18. return *(PULONG32)p;
  19. }

  20. void KReadProcessMemory(IN PEPROCESS Process, IN PVOID Address, IN UINT32 Length, OUT PVOID Buffer)
  21. {
  22. ULONG64 pDTB=0,OldCr3=0,vAddr=0;
  23. //Get DTB
  24. pDTB=Get64bitValue((UCHAR*)Process + DIRECTORY_TABLE_BASE);
  25. if(pDTB==0)
  26. {
  27. DbgPrint("[x64Drv] Can not get PDT");
  28. return;
  29. }
  30. //Record old cr3 and set new cr3
  31. _disable();
  32. OldCr3=__readcr3();
  33. __writecr3(pDTB);
  34. _enable();
  35. //Read process memory
  36. if(MmIsAddressValid(Address))
  37. {
  38. RtlCopyMemory(Buffer,Address,Length);
  39. DbgPrint("[x64Drv] Date read: %ld", *(PDWORD)Buffer);
  40. }
  41. //Restore old cr3
  42. _disable();
  43. __writecr3(OldCr3);
  44. _enable();
  45. }

  46. void KWriteProcessMemory(IN PEPROCESS Process, IN PVOID Address, IN UINT32 Length, IN PVOID Buffer)
  47. {
  48. ULONG64 pDTB=0,OldCr3=0,vAddr=0;
  49. //Get DTB
  50. pDTB=Get64bitValue((UCHAR*)Process + DIRECTORY_TABLE_BASE);
  51. if(pDTB==0)
  52. {
  53. DbgPrint("[x64Drv] Can not get PDT");
  54. return;
  55. }
  56. //Record old cr3 and set new cr3
  57. _disable();
  58. OldCr3=__readcr3();
  59. __writecr3(pDTB);
  60. _enable();
  61. //Read process memory
  62. if(MmIsAddressValid(Address))
  63. {
  64. RtlCopyMemory(Address,Buffer,Length);
  65. DbgPrint("[x64Drv] Date wrote.");
  66. }
  67. //Restore old cr3
  68. _disable();
  69. __writecr3(OldCr3);
  70. _enable();
  71. }
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表