首页
社区
课程
招聘
[求助]怎样快速扫描64位进程内存
2019-8-28 15:16 6650

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

2019-8-28 15:16
6650
请问怎样快速扫描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;
}

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞0
打赏
分享
最新回复 (4)
雪    币: 37
活跃值: (1753)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
X-Blades 2019-8-28 20:13
2
0

这里我说一下我的看法 如果 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;
                }
            }
        }
雪    币: 11107
活跃值: (4684)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
hhkqqs 1 2019-8-29 09:06
3
0
注入,注册异常处理函数,暴力搜完之后和主进程通信?
雪    币: 14
活跃值: (72)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
西门侠 2019-8-30 11:16
4
0
__int64 end = (__int64)si.lpMaximumApplicationAddress; 
while (readIndex< end)  你这里扫描了全部的内存,实际你只需要扫描已经使用的就可以啦。
雪    币: 1017
活跃值: (3326)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
逆向爱好者 2023-3-26 14:37
5
0
遍历已创建内存,排除没有可执行属性内存,对每个内存段一次性读完,然后再遍历
游客
登录 | 注册 方可回帖
返回