广海社区

 找回密码
 立即注册
搜索
查看: 149|回复: 10

两种强力读写内存的方法

[复制链接]
累计签到:16 天
连续签到:1 天

27

主题

28

帖子

215

积分

小有名气 Rank: 3Rank: 3

威望
0
热心值
0
贡献
172
交易币
0
发表于 2019-6-11 12:48:35 | 显示全部楼层 |阅读模式

两种强力读写内存的方法
目前网上流传的两种驱动强力读写内存方法,都能被大部分游戏代理商防范了。其实强力读写内存的方法太多,今天决定分享另外两种。这两种方法其实网上也早就有了,只不过知道的人不多而已。

一、“借用”目标线程来实现读写
给目标进程的线程插入APC,在APC例程里读写内存。

  1. #define MALLOC_NPP(_s)        ExAllocatePool(NonPagedPool, _s)
  2. #define FREE(_p)        ExFreePool(_p)

  3. typedef struct _RWPM_INFO
  4. {
  5.         void* Address;
  6.         void* Buffer;
  7.         SIZE_T Length;
  8.         SIZE_T Type;//0=read;1=write
  9.         KEVENT Event;
  10. }RWPM_INFO, *PRWPM_INFO;

  11. VOID ReadWriteProcessMemoryApc(PKAPC pApc,PKNORMAL_ROUTINE *NormalRoutine,PVOID *NormalContext,PVOID *SystemArgument1,PVOID *SystemArgument2)
  12. {
  13.         PRWPM_INFO pInfo = (PRWPM_INFO)(pApc->NormalContext);
  14.         if(pInfo->Type==0)
  15.         {
  16.                 _try
  17.                 {
  18.                         RtlCopyMemory(pInfo->Buffer,pInfo->Address,pInfo->Length);
  19.                 }
  20.                 _except(1)
  21.                 {
  22.                         ;
  23.                 }
  24.         }
  25.         else
  26.         {
  27.                 _try
  28.                 {
  29.                         _disable();        
  30.                         __writecr0(__readcr0() & 0xfffffffffffeffff);        
  31.                         RtlCopyMemory(pInfo->Address,pInfo->Buffer,pInfo->Length);
  32.                         __writecr0(__readcr0() | 0x10000);        
  33.                         _enable();        
  34.                 }
  35.                 _except(1)
  36.                 {
  37.                         ;
  38.                 }
  39.         }
  40.         pInfo->Type=2;
  41.         KeSetEvent(&(pInfo->Event), IO_NO_INCREMENT, FALSE);
  42.         ExFreePool(pApc);
  43. }

  44. NTSTATUS InsertReadWriteProcessMemoryApc(PETHREAD Thread, PRWPM_INFO pInfo)
  45. {
  46.         NTSTATUS st = STATUS_UNSUCCESSFUL;
  47.         PKAPC pApc = 0;
  48.         if( MmIsAddressValid(Thread) )
  49.         {
  50.                 pApc = MALLOC_NPP( sizeof(KAPC));
  51.                 if (pApc)
  52.                 {
  53.                         LARGE_INTEGER interval={0};
  54.                         KeInitializeApc(pApc, Thread, OriginalApcEnvironment, ReadWriteProcessMemoryApc, 0, 0, KernelMode, 0);
  55.                         pApc->NormalContext = pInfo;
  56.                         KeInitializeEvent(&(pInfo->Event),NotificationEvent,TRUE);
  57.                         KeClearEvent(&(pInfo->Event));
  58.                         if(KeInsertQueueApc(pApc, 0, 0, 0))
  59.                         {
  60.                                 interval.QuadPart = -10000;//DELAY_ONE_MILLISECOND;
  61.                                 interval.QuadPart *= 1000;
  62.                                 st = KeWaitForSingleObject(&(pInfo->Event),Executive,KernelMode,0,&interval);
  63.                         }
  64.                         else
  65.                         {
  66.                                 ExFreePool(pApc);
  67.                         }
  68.                 }
  69.         }
  70.         return st;
  71. }

  72. BOOLEAN ForceReadProcessMemory2(IN PEPROCESS Process, IN PVOID Address, IN UINT32 Length, OUT PVOID Buffer)
  73. {
  74.         ULONG i;
  75.         BOOLEAN b = 0;
  76.         for(i=4; i<1048576; i=i+4)
  77.         {
  78.                 PETHREAD ethrd=LookupThread((HANDLE)i);
  79.                 if(ethrd!=NULL)
  80.                 {
  81.                         PEPROCESS eproc=IoThreadToProcess(ethrd);
  82.                         ObDereferenceObject(ethrd);
  83.                         if(eproc==Process)
  84.                         {
  85.                                 PRWPM_INFO pInfo = MALLOC_NPP(sizeof(RWPM_INFO));
  86.                                 pInfo->Address = Address;
  87.                                 pInfo->Buffer = Buffer;
  88.                                 pInfo->Length = Length;
  89.                                 pInfo->Type = 0;
  90.                                 if(NT_SUCCESS(InsertReadWriteProcessMemoryApc(ethrd, pInfo)))
  91.                                 {
  92.                                         FREE(pInfo);
  93.                                         b=1;break;
  94.                                 }
  95.                         }
  96.                 }
  97.         }
  98.         return b;
  99. }

  100. BOOLEAN ForceWriteProcessMemory2(IN PEPROCESS Process, IN PVOID Address, IN UINT32 Length, IN PVOID Buffer)
  101. {
  102.         ULONG i;
  103.         BOOLEAN b = 0;
  104.         for(i=4; i<1048576; i=i+4)
  105.         {
  106.                 PETHREAD ethrd=LookupThread((HANDLE)i);
  107.                 if(ethrd!=NULL)
  108.                 {
  109.                         PEPROCESS eproc=IoThreadToProcess(ethrd);
  110.                         ObDereferenceObject(ethrd);
  111.                         if(eproc==Process)
  112.                         {
  113.                                 PRWPM_INFO pInfo = MALLOC_NPP(sizeof(RWPM_INFO));
  114.                                 pInfo->Address = Address;
  115.                                 pInfo->Buffer = Buffer;
  116.                                 pInfo->Length = Length;
  117.                                 pInfo->Type = 1;
  118.                                 if(NT_SUCCESS(InsertReadWriteProcessMemoryApc(ethrd, pInfo)))
  119.                                 {
  120.                                         FREE(pInfo);
  121.                                         b=1;break;
  122.                                 }
  123.                         }
  124.                 }
  125.         }
  126.         return b;
  127. }
复制代码
两点说明:
1、如果想支持32位系统,需要修改两处__writecr0的代码。
2、类似LookupProcess、LookupThread这种顾名思义的函数没有提供,需要自己实现(代码不超过20行)。

二、利用内存映射来瞒天过海

  1. NTSTATUS MMCopyProcessMemory(PEPROCESS tagetProcess,PVOID addr,SIZE_T size,PVOID data)
  2. {
  3.         KAPC_STATE ApcState;
  4.         SIZE_T tosize;
  5.         PMDL mdl=NULL;
  6.         PVOID MappedAddress=NULL;
  7.         BOOLEAN attach = FALSE;
  8.         BOOLEAN lockpage = FALSE;
  9.         BOOLEAN maplockpage = FALSE;
  10.         BOOLEAN havemdl = FALSE;
  11.         if (size<PAGE_SIZE)
  12.         {
  13.                 tosize = PAGE_SIZE;
  14.         }
  15.         else
  16.         {
  17.                 tosize = size;
  18.         }
  19.         if (!MmIsAddressValid(data))
  20.         {
  21.                 return STATUS_NOT_MAPPED_DATA;
  22.         }
  23.         __try
  24.         {
  25.                 KeStackAttachProcess(tagetProcess, &ApcState);
  26.                 attach = TRUE;
  27.                 mdl=IoAllocateMdl(addr, tosize, FALSE, FALSE, NULL);
  28.                 if (mdl==NULL)
  29.                 {
  30.                         KeUnstackDetachProcess(&ApcState);
  31.                         return STATUS_NOT_MAPPED_DATA;
  32.                 }
  33.                 havemdl = TRUE;
  34.                 MmProbeAndLockPages(mdl, KernelMode, IoReadAccess);
  35.                 lockpage = TRUE;
  36.                 MappedAddress = MmMapLockedPagesSpecifyCache(mdl, KernelMode, MmCached, NULL, FALSE, HighPagePriority);
  37.                 maplockpage = TRUE;
  38.                 RtlCopyMemory(data, MappedAddress, size);
  39.                 MmUnmapLockedPages(MappedAddress, mdl);
  40.                 maplockpage = FALSE;
  41.                 MmUnlockPages(mdl);
  42.                 lockpage = FALSE;
  43.                 IoFreeMdl(mdl);
  44.                 havemdl = FALSE;
  45.                 KeUnstackDetachProcess(&ApcState);
  46.                 attach = FALSE;
  47.         } __except(1)
  48.         {
  49.                 if (maplockpage)
  50.                 {
  51.                         MmUnmapLockedPages(MappedAddress, mdl);
  52.                 }
  53.                 if (lockpage)
  54.                 {
  55.                         MmUnlockPages(mdl);
  56.                 }
  57.                 if (havemdl)
  58.                 {
  59.                         IoFreeMdl(mdl);
  60.                 }
  61.                 if (attach)
  62.                 {
  63.                         KeUnstackDetachProcess(&ApcState);
  64.                 }
  65.                 return STATUS_NOT_FOUND;
  66.         }
  67.         return STATUS_SUCCESS;
  68. }

  69. NTSTATUS MMWriteProcessMemory(PEPROCESS tagetProcess, PVOID addr, SIZE_T size, PVOID data)
  70. {
  71.         KAPC_STATE ApcState;
  72.         SIZE_T tosize;
  73.         PMDL mdl = NULL;
  74.         PVOID MappedAddress = NULL;
  75.         BOOLEAN attach = FALSE;
  76.         BOOLEAN lockpage = FALSE;
  77.         BOOLEAN maplockpage = FALSE;
  78.         BOOLEAN havemdl = FALSE;
  79.         if (size < PAGE_SIZE)
  80.         {
  81.                 tosize = PAGE_SIZE;
  82.         }
  83.         else
  84.         {
  85.                 tosize = size;
  86.         }
  87.         if (!MmIsAddressValid(data))
  88.         {
  89.                 return STATUS_NOT_MAPPED_DATA;
  90.         }
  91.         __try
  92.         {
  93.                 KeStackAttachProcess(tagetProcess, &ApcState);
  94.                 attach = TRUE;
  95.                 mdl = IoAllocateMdl(addr, tosize, FALSE, FALSE, NULL);
  96.                 if (mdl == NULL)
  97.                 {
  98.                         KeUnstackDetachProcess(&ApcState);
  99.                         return STATUS_NOT_MAPPED_DATA;
  100.                 }
  101.                 havemdl = TRUE;
  102.                 MmProbeAndLockPages(mdl, KernelMode, IoReadAccess);
  103.                 lockpage = TRUE;
  104.                 MappedAddress = MmMapLockedPagesSpecifyCache(mdl, KernelMode, MmCached, NULL, FALSE, HighPagePriority);
  105.                 maplockpage = TRUE;
  106.                 RtlCopyMemory(MappedAddress, data, size);
  107.                 MmUnmapLockedPages(MappedAddress, mdl);
  108.                 maplockpage = FALSE;
  109.                 MmUnlockPages(mdl);
  110.                 lockpage = FALSE;
  111.                 IoFreeMdl(mdl);
  112.                 havemdl = FALSE;
  113.                 KeUnstackDetachProcess(&ApcState);
  114.                 attach = FALSE;
  115.         }
  116.         __except (1)
  117.         {
  118.                 if (maplockpage)
  119.                 {
  120.                         MmUnmapLockedPages(MappedAddress, mdl);
  121.                 }
  122.                 if (lockpage)
  123.                 {
  124.                         MmUnlockPages(mdl);
  125.                 }
  126.                 if (havemdl)
  127.                 {
  128.                         IoFreeMdl(mdl);
  129.                 }
  130.                 if (attach)
  131.                 {
  132.                         KeUnstackDetachProcess(&ApcState);
  133.                 }
  134.                 return STATUS_NOT_FOUND;
  135.         }
  136.         return STATUS_SUCCESS;
  137. }
复制代码

回复

使用道具 举报

累计签到:14 天
连续签到:1 天

23

主题

28

帖子

180

积分

正式会员 Rank: 2

威望
0
热心值
0
贡献
152
交易币
0
发表于 2019-6-12 15:12:53 | 显示全部楼层
功力太低有点看不懂
回复

使用道具 举报

尚未签到

0

主题

46

帖子

92

积分

正式会员 Rank: 2

威望
0
热心值
0
贡献
46
交易币
0
发表于 2019-6-14 19:09:20 | 显示全部楼层
好帖必须得顶起
回复

使用道具 举报

尚未签到

0

主题

51

帖子

102

积分

正式会员 Rank: 2

威望
0
热心值
0
贡献
51
交易币
0
发表于 2019-6-14 23:10:37 | 显示全部楼层
回复

使用道具 举报

尚未签到

0

主题

47

帖子

94

积分

正式会员 Rank: 2

威望
0
热心值
0
贡献
47
交易币
0
发表于 2019-6-15 08:53:59 | 显示全部楼层
态度决定一切,不错!
回复

使用道具 举报

尚未签到

0

主题

59

帖子

118

积分

正式会员 Rank: 2

威望
0
热心值
0
贡献
59
交易币
0
发表于 2019-6-15 09:58:59 | 显示全部楼层
楼主给脑残下了定义!
回复

使用道具 举报

尚未签到

0

主题

46

帖子

92

积分

正式会员 Rank: 2

威望
0
热心值
0
贡献
46
交易币
0
发表于 2019-6-15 11:58:04 | 显示全部楼层
小弟默默的路过贵宝地~~~
回复

使用道具 举报

尚未签到

0

主题

38

帖子

76

积分

正式会员 Rank: 2

威望
0
热心值
0
贡献
38
交易币
0
发表于 2019-6-15 22:22:15 | 显示全部楼层
啥玩应呀
回复

使用道具 举报

尚未签到

0

主题

56

帖子

112

积分

正式会员 Rank: 2

威望
0
热心值
0
贡献
56
交易币
0
发表于 2019-6-16 15:36:32 | 显示全部楼层
没人理我,好伤心啊!
回复

使用道具 举报

尚未签到

0

主题

46

帖子

92

积分

正式会员 Rank: 2

威望
0
热心值
0
贡献
46
交易币
0
发表于 2019-6-17 17:34:25 | 显示全部楼层
这么版块的帖子越来越有深度了!
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|Archiver|手机版|小黑屋|广海社区 |格子

GMT+8, 2019-8-22 18:07 , Processed in 1.603614 second(s), 44 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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