如何在另一进程的内存中查找一变量值,然后将其替换为我设定的数?

lizx 2000-07-02 11:06:00
加精
如何修改WINDOWS中另一进程中的内存变量!例如金山游侠!
我需要在另一进程的内存中查找一变量值(例如11223344),
然后将其替换为我设定的数。大侠能帮帮我吗!

...全文
773 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
lizx 2000-11-23
  • 打赏
  • 举报
回复
好久没来了,回来把分全给出去,谢谢所有的朋友。
lizx 2000-08-15
  • 打赏
  • 举报
回复
aborigine兄:
我用BCB无法编译你的VC代码,我VC不太熟,你能把你上面的完整源程序发给我吗!
谢谢了,我知道内存的分布后就可大大加快读取速度了!
lizx@21cn.com
Fenian 2000-08-14
  • 打赏
  • 举报
回复
慢主要是由于字符串的匹配算法不好,可改进之,任何一本数据结构书上都有。
aborigine 2000-08-06
  • 打赏
  • 举报
回复
据我所知,<Advanced Windows>没有电子版下载,zhq2000大哥所说的RegionSize不稳定是什么意思呢?可否告知,我的程序看起来运行的很好,不过具体到搜索内存中的某个数值时,无法成功,我在怀疑这种方法是否切实可行?我总觉得这个方法好像哪里有不对劲的地方,不过现在也说不上来
aborigine 2000-08-06
  • 打赏
  • 举报
回复
lizx,试试我的方法,运行在133上,从0x00000000到0xffffffff只有几秒钟的时间
你可以察看任何一个进程的虚拟内存情况,注释我就不写了,有看不明白的再说

HANDLE hProcess;
hProcess=OpenProcess(PROCESS_ALL_ACCESS , FALSE, dwProcessID);

CString AddressInfo,BufState,BufProtect;
DWORD dwBaseAddress=0x00000000;
MEMORY_BASIC_INFORMATION mbi;
DWORD fOK=TRUE;

while (fOK)
{
BufState.Empty();
BufProtect.Empty();

fOK=VirtualQueryEx(hProcess, (LPVOID)dwBaseAddress, &mbi, sizeof(MEMORY_BASIC_INFORMATION));

switch (mbi.State)
{
case MEM_FREE:
BufState="空闲";
break;
case MEM_COMMIT:
BufState="分配";
if (mbi.Protect==PAGE_READWRITE)
BufProtect="可读写";
else
BufProtect="不可访问";
break;
case MEM_RESERVE:
BufState="保留";
}

strAddressInfo.Format("%x",dwBaseAddress);
strAddressInfo+=" "+BufState;
strAddressInfo+=" "+BufProtect;
strAddressInfo.MakeUpper();

lpListBox->AddString(strAddressInfo);
dwBaseAddress+=mbi.RegionSize;
}
CloseHandle(hProcess);
}
haitian99 2000-08-06
  • 打赏
  • 举报
回复
想你们学习.
lizx 2000-07-28
  • 打赏
  • 举报
回复
zhq2000兄:
使用VirtualQueryEx()、ZeroMemory()是什么原理我不太明白,我目前是用
ReadProcessMemory()每次读取4096个字节出来比较的,因为内存是按4096
字节分页的,如大于4096,会发生读取不到的现象!因此用每次读取4096字节
来循环至&ffffffff,其速度之慢可想而知.我发现一些内存搜索工具搜索时
硬盘灯猛闪,不知何故! 希望你早日解决这个难题!先谢了!
lizx 2000-07-27
  • 打赏
  • 举报
回复
aborigine兄: <<Advanced Windows>>是书吗?那儿有下载?

zhq2000兄: 你的VC++ Examples 还未写好吗?一定要帮帮我!谢谢!

aborigine 2000-07-27
  • 打赏
  • 举报
回复
lizx,你看了<<Advanced Windows>>就会都明白了
zhq2000 2000-07-27
  • 打赏
  • 举报
回复
Sorry! VirtualQueryEx反回的RegionSize不稳定。所以可能会所要的该区,我正在找另一方法解决。
lizx 2000-07-26
  • 打赏
  • 举报
回复
各位老兄,我有个帖子每人回答,如何才能把它删除把分要回来?ID: http://expert.csdn.net/TopicView.asp?id=13717
lizx 2000-07-26
  • 打赏
  • 举报
回复
VC++应该可以吧,我有VC++5.0,但从未用过,你要给我完整的Examples,否则我不会写VC++除*.CPP以外的相关文件代码。先谢谢了!
SCUM 2000-07-26
  • 打赏
  • 举报
回复
!
zhq2000 2000-07-26
  • 打赏
  • 举报
回复
BC++ 我不熟,VC++可以吗?我想差不多吧!
wolfzhu 2000-07-25
  • 打赏
  • 举报
回复
要自己编修改器吗?有志气。。。呵呵!
zhq2000 2000-07-25
  • 打赏
  • 举报
回复
typedef struct _MEMORY_BASIC_INFORMATION { // mbi
PVOID BaseAddress; // base address of region
PVOID AllocationBase; // allocation base address
DWORD AllocationProtect; // initial access protection
DWORD RegionSize; // size, in bytes, of region
DWORD State; // committed, reserved, free
DWORD Protect; // current access protection
DWORD Type; // type of pages
} MEMORY_BASIC_INFORMATION;

typedef MEMORY_BASIC_INFORMATION *PMEMORY_BASIC_INFORMATION;

MEMROY_BASIC_INFORMATION mbi;
ZeroMemory(&mbi,sizeof(MEMORY_BASIC_INFORMATION));
DWORD dwBase;
…………
在用ReadProcessMemory之前先用VirtualQueryEx(hTargetProcess,(LPVOID)dwBase,&mbi,sizeof(MEMORY_BASIC_INFORMATION))选出mbi.Protect为
PAGE_READWRITE及PAGE_EXECUTE_READWRITE
的内存区后,再用XXXXProcessMemory进行操作。
如果mbi.Protect为其它值,则令
dwBase=(DWORD)mbi.AllocationBase + dwXX;//dwXX为此区的最大 mbi.RegionSize
后继续查询。

所以从0x00040000到0xffffffff的定位过程不到0.3秒(AMD 500),剩下的由你的内存查找匹配算法所确定,我想最快大约2-3秒,就算用穷举法也应小于10秒。
也就是说总过程<=10秒!
lizx 2000-07-25
  • 打赏
  • 举报
回复
zhq2000兄:
非常感谢,但小弟学浅,还是不太明白具体意思,能再烦劳你写个小的 BC++ Examples给我研究一下吗?如真能达到照你所说的效果,哪比金山游侠还快,真是神了!我给你加200分!能帮帮我吗!
lizx@21cn.com
lizx 2000-07-25
  • 打赏
  • 举报
回复
zhq2000兄:
其实以上方法我已知道,现在主要是速度问题,我们知道一个进程的内存地址可以是从
&00040000 - &FFFFFFFFF,如此大的数据量,使用循环读取后再每4个字节来比较,速
度不可忍受,如果你用过金山游侠,会发现其查找瞬间完成,我百思不得其解,是不是有
什么方法可以直接在内存中搜索,另外如何判断程序在内存中的结束位置,而不用一直
查到&FFFFFFFFF.如果谁能帮我解决以上问题,我再加送200分给他,非常感谢,谢谢!
zhq2000 2000-07-23
  • 打赏
  • 举报
回复
如果你觉得可以,请给分吧!^_^
zhq2000 2000-07-22
  • 打赏
  • 举报
回复
通过OpenProcess或CreateProcess取得目标进程句柄,然后用VirtualProtectEx取得所访问的内存区的读写特权,然后用ReadProcessMemory读取内存中的值,比较后如果是目标变量,则用WriteProcessMemory将其改为你所定的值,再用VirtualProtectEx恢复所访问的内存区的特权,(最后还可以再用FlushInstructionCache来加快刷新目标进程的的内存变量值,但作用不是很明显)。
此方法只能用于Windows9X系统,对于NT或2000无效,因NT或2000对进程间的隔离与保护做得非常强大!

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧