首页
社区
课程
招聘
未解决 [求助]怎样快速扫描64位进程内存
发表于: 2019-8-28 15:16 6976

未解决 [求助]怎样快速扫描64位进程内存

2019-8-28 15:16
6976
请问怎样快速扫描64位进程内存,stackoverflow有类似的提问但是没解决:https://stackoverflow.com/questions/14178387/scanning-memory-in-64-bit
以下代码扫描32位进程速度很快,但是扫描64位进程速度很慢。(ollydbg、x64dbg之类的调试器是怎么样快速搜索内存的呢?)
bool SearchMem(const HANDLE &process, BYTE *lpData, int iSize)
{
	SYSTEM_INFO si;
	GetSystemInfo(&si);

	__int64 end = (__int64)si.lpMaximumApplicationAddress;

	MEMORY_BASIC_INFORMATION info;

	SIZE_T bytesRead = 0;
	INT_PTR readIndex = 0;
	int totalBytesRead = 0;

	int iFlag = 0;
	while (readIndex< end)
	{	
		if (VirtualQueryEx(process, (LPCVOID)readIndex, &info, sizeof(info)) == 0) {
			break;
		}

		readIndex = (int)info.BaseAddress;
		if (info.State != MEM_COMMIT) {
			readIndex += info.RegionSize;
			continue;
		}	

		SIZE_T bytesToRead = info.RegionSize;
		char *buffer = new char[bytesToRead];
		if (ReadProcessMemory(process, (LPCVOID)readIndex, buffer, bytesToRead, &bytesRead)) {
			for (int i = 0; i < (bytesRead - iSize); i++) {

				if (memcmp(buffer + i, lpData, iSize) == 0)
				{
					delete[]buffer;
					return true;
				}
			}
		}
		else {
			if (bytesRead > 0) {
				for (int i = 0; i < (bytesRead - iSize); i++) {
					if (memcmp(buffer + i, lpData, iSize) == 0)
					{
						delete[]buffer;
						return true;
					}
				}

			}
			else {
				bytesRead = info.RegionSize;
			}
		}
		totalBytesRead += bytesRead;
		readIndex += bytesRead;
		delete[] buffer;
	}

	return false;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 45
活跃值: (2575)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

这里我说一下我的看法 如果 for 循环0x10000
然后 memcmp 每次对比 Size个字节 效率是不是低了 ?

        if (ReadProcessMemory(process, (LPCVOID)readIndex, buffer, bytesToRead, &bytesRead)) {
            for (int i = 0; i < (bytesRead - iSize); i++) {

                if (memcmp(buffer + i, lpData, iSize) == 0)
                {
                    delete[]buffer;
                    return true;
                }
            }
        }
2019-8-28 20:13
0
雪    币: 12527
活跃值: (6029)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
注入,注册异常处理函数,暴力搜完之后和主进程通信?
2019-8-29 09:06
0
雪    币: 14
活跃值: (73)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
__int64 end = (__int64)si.lpMaximumApplicationAddress; 
while (readIndex< end)  你这里扫描了全部的内存,实际你只需要扫描已经使用的就可以啦。
2019-8-30 11:16
0
雪    币: 1657
活跃值: (4753)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
遍历已创建内存,排除没有可执行属性内存,对每个内存段一次性读完,然后再遍历
2023-3-26 14:37
0
游客
登录 | 注册 方可回帖
返回
//