看流星社区

 找回密码
 注册账号
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
查看: 77|回复: 0

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

[复制链接]

该用户从未签到

发表于 2020-3-23 09:20:42 | 显示全部楼层 |阅读模式

某些时候我们需要读写别的进程的内存,某些时候别的进程已经对自己的内存读写做了保护,这里说四个思路(两个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. }
复制代码

点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2020-3-31 00:19

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表