首页
社区
课程
招聘
[原创]C/C++搜索进程内存中的字符串
发表于: 2012-1-24 14:28 9303

[原创]C/C++搜索进程内存中的字符串

2012-1-24 14:28
9303

注入进程后使用。可以用来自动更新游戏基址,省的每次游戏更新都要同步更新。也可以在找不到基址情况下每次启动时根据特征码找动态地址。

参数说明:
s: 需要找的字符串。此字符串不包含在搜索结果中。
n:字符串长度。
a:存放地址的数组。
m:最多搜索m个地址。
type:搜索的内存页区域的类型。参见MEMORY_BASIC_INFORMATION结构。
from:搜索起始地址。
to:搜索结束地址。

返回值:返回搜索到的数量。发生错误或没有搜索到都返回0。

memscan.h

#pragma once
#include <stdio.h>
#include <Windows.h>

#define MEMSCAN_IMAGE MEM_IMAGE
#define MEMSCAN_MAPPED MEM_MAPPED
#define MEMSCAN_PRIVATE MEM_PRIVATE

int memscan(void *s, size_t n, void *a, int m, int type = MEMSCAN_IMAGE | MEMSCAN_MAPPED | MEMSCAN_PRIVATE, size_t from = 0, size_t to = 0);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (4)
雪    币: 223
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错哈
2012-1-24 15:41
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
VirtualQuery返回0不应该直接return吧,貌似不能保证起始地址有效,而且有效的内存并不一定是连续的
注入后再用有点麻烦,可以用ReadProcessMemory写个跨进程版
手头上没法测试验证,说错了的话尽管指正
2012-1-24 20:47
0
雪    币: 65
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
1, 起始地址是从GetSystemInfo()得到的, from小于lpMinimumApplicationAddress会将from设为lpMinimumApplicationAddress, 保证起始地址在可查询范围内.
2, 你说的有效是指已经被分配吗? 就算没有分配VirtualQuery也会正确返回, 可以从MEMORY_BASIC_INFORMATION信息中过滤掉未分配, 不可读或不在设定类型的内存段.
3, 如果地址在内核模式区域, VirtualQuery返回0. 但lpMaximumApplicationAddress最大值小于内核模式区域的起始地址. 因此VirtualQuery返回0的可能性很小.

如果有BUG请多多指点, 谢谢~
2012-1-24 21:52
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
哈哈,看来是我搞错了,我还以为无效内存的话会调用失败
2012-1-25 10:02
0
游客
登录 | 注册 方可回帖
返回
//