不明白内存修改器是个什么原理,求解释,多谢
不明白内存修改器是个什么原理,求解释,谢谢
看的是王艳平的《windows 程序设计》
他先写了个能产生数的程序1
然后再写一个修改程序1 g_nNum变量的程序2
他的思路是:按页搜索,看想查找的数是否与当前遍历的数相等,如果相等,就将地址添加到全局变量数组中。然后,因为查找到的地址不唯一,所以要在全局变量数组中进行第二次查找。然后写入我们要修改的值。
以上代码略去了在控制台显示查找到的地址和写入部分的代码
我不明白的是:在实际运行的时候,打开程序2,会自动运行程序1(因为我在2中调用了1进程)比如第一次我输入要修改的值时1002,程序会返回3个地址,然后书上说我需要在程序1上摁两下回车,然后再进行一次查找(我在这里输入的不是1002而是1000,然后程序找到了唯一的地址),这样循环直到找到的地址惟一为止。 最后输入要修改成的值,修改成功。我实在是想不明白,1002不是我想要替换的数吗?为什么要在程序1中摁两下回车?这代表什么?1002在程序1中不应该是唯一的地址码?程序为什么会返回多个地址给我?我最后替换1000成功了,如果我想到替换1002呢?
感觉我对于这个内存修改器完全不明白啊。。。。是因为我不玩游戏么。。。。。。

------解决思路----------------------
修改器的原理很简单,就是修改内存中数据,既然是修改内存中的数据,当然要先确定该数据在内存中的地址。
------解决思路----------------------
修改内存数据有那么难理解吗?建议楼主去玩玩Cheat Engine和OllyDBG。
------解决思路----------------------
我说下正确逻辑吧
首先输入一个值,确定所有内存页符合这个值的内存页。可能有10个和这个值相符。
之后,再改变这个值,再在之前的10个地址查找,就有可能只有一个地址了(如果超过1个,继续改变搜索)。
------解决思路----------------------
没错,就是这个原理。
改变值后,可以按准确值查找,也可以按改变(变大或变小)查找。
看的是王艳平的《windows 程序设计》
他先写了个能产生数的程序1
#include <stdio.h> // 02Testor 工程下
int g_nNum; // 全局变量测试
int main(int argc, char* argv[])
{ int i = 198; // 局部变量测试
g_nNum = 1003;
while(1)
{ // 输出个变量的值和地址
printf(" i = %d, addr = %08lX; g_nNum = %d, addr = %08lX \n", ++i, &i, --g_nNum, &g_nNum);
getchar(); }
return 0;
}
然后再写一个修改程序1 g_nNum变量的程序2
他的思路是:按页搜索,看想查找的数是否与当前遍历的数相等,如果相等,就将地址添加到全局变量数组中。然后,因为查找到的地址不唯一,所以要在全局变量数组中进行第二次查找。然后写入我们要修改的值。
BOOL CompareAPage(DWORD dwBaseAddr, DWORD dwValue)
{ // 读取 1 页内存
BYTE arBytes[4096];
if(!::ReadProcessMemory(g_hProcess, (LPVOID)dwBaseAddr, arBytes, 4096, NULL))
return FALSE; // 此页不可读
// 在这 1 页内存中查找
DWORD* pdw;
for(int i=0; i<(int)4*1024 -3; i++)
{ pdw = (DWORD*)&arBytes[i];
if(pdw[0] == dwValue) // 等于要查找的值?
{ if(g_nListCnt >= 1024)
return FALSE;
// 添加到全局变量中
g_arList[g_nListCnt++] = dwBaseAddr + i;
}
}
return TRUE;
}
BOOL FindFirst(DWORD dwValue)
{ const DWORD dwOneGB = 1024*1024*1024 ; // 1GB
const DWORD dwOnePage = 4*1024; // 4KB
if(g_hProcess == NULL)
return FALSE;
// 查看操作系统类型,以决定开始地址
DWORD dwBase;
OSVERSIONINFO vi = { sizeof(vi) };
::GetVersionEx(&vi);
if (vi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
dwBase = 4*1024*1024; // Windows 98 系列,4MB
else
dwBase = 640*1024; // Windows NT 系列,64KB
// 在开始地址到2GB 的地址空间进行查找
for(; dwBase < 2*dwOneGB; dwBase += dwOnePage)
{ // 比较 1 页大小的内存
CompareAPage(dwBase, dwValue); }
return TRUE;
}
BOOL FindNext(DWORD dwValue)
{ // 保存 m_arList数组中有效地址的个数,初始化新的m_nListCnt值
int nOrgCnt = g_nListCnt;
g_nListCnt = 0;
// 在m_arList数组记录的地址处查找
BOOL bRet = FALSE; // 假设失败
DWORD dwReadValue;
for(int i=0; i<nOrgCnt; i++)
{ if(::ReadProcessMemory(g_hProcess, (LPVOID)g_arList[i], &dwReadValue, sizeof(DWORD), NULL))
{ if(dwReadValue == dwValue)
{ g_arList[g_nListCnt++] = g_arList[i];
bRet = TRUE; }
}
}
return bRet;
}
以上代码略去了在控制台显示查找到的地址和写入部分的代码
我不明白的是:在实际运行的时候,打开程序2,会自动运行程序1(因为我在2中调用了1进程)比如第一次我输入要修改的值时1002,程序会返回3个地址,然后书上说我需要在程序1上摁两下回车,然后再进行一次查找(我在这里输入的不是1002而是1000,然后程序找到了唯一的地址),这样循环直到找到的地址惟一为止。 最后输入要修改成的值,修改成功。我实在是想不明白,1002不是我想要替换的数吗?为什么要在程序1中摁两下回车?这代表什么?1002在程序1中不应该是唯一的地址码?程序为什么会返回多个地址给我?我最后替换1000成功了,如果我想到替换1002呢?
感觉我对于这个内存修改器完全不明白啊。。。。是因为我不玩游戏么。。。。。。
------解决思路----------------------
修改器的原理很简单,就是修改内存中数据,既然是修改内存中的数据,当然要先确定该数据在内存中的地址。
------解决思路----------------------
修改内存数据有那么难理解吗?建议楼主去玩玩Cheat Engine和OllyDBG。
------解决思路----------------------
我说下正确逻辑吧
首先输入一个值,确定所有内存页符合这个值的内存页。可能有10个和这个值相符。
之后,再改变这个值,再在之前的10个地址查找,就有可能只有一个地址了(如果超过1个,继续改变搜索)。
------解决思路----------------------
没错,就是这个原理。
改变值后,可以按准确值查找,也可以按改变(变大或变小)查找。