C++ 查找内存效率问题

作者&投稿:官响 (若有异议请与网页底部的电邮联系)
嗯。。。我也不是很懂。。但是大家可以讨论下嘛。。

先是发现一个地方,就是ReadProcessMemory的时候,你第一次只读了一个字节。。。。嗯。。我们设想一下,假设有100个字节需要比较,那么,读一个比较一个再读一个比较一个。。一共需要100次读取+100次比较。。而如果一次性将这100字节全读完,再依次比较,就只需要1次读取+100次比较了。

然后再猜测一下提速方法。

嗯。。。因为程序中的数据都用变量储存,那么如果我们可以定位变量的地址范围,就不需要从0x00010000搜索到0x7ffeffff了对吧。。。
那么,数据的存放变量粗略地划分为三类,全局变量(包括一些静态变量),局部变量,还有就是new或者malloc来的那些。。。
全局变量是最容易定位的一种,因为这些一般都存放于PE文件的.data节。。也许有些程序.data跟其它Section合并了,但是这影响不大。。我们需要做的就是根据目标exe文件(以及其导入表得到的各非系统DLL)结构计算出各Section的VA和大小,然后在这范围中搜索可能出现的全局变量。下面是全局变量与静态变量的示例:

我构造了这样一个程序:
int a;
int main(int argc, char* argv[])
{
static int b;
_asm int 3;
a=0;
b=0;
return 0;
}

用OllyDbg调用这个程序,中断在int3的地方,接下来两句a=0,b=0的反汇编代码如下:
00401028 |. CC int3
00401029 |. C705 4C7C4200 00000000 mov dword ptr ds:[427C4C], 0
00401033 |. C705 487C4200 00000000 mov dword ptr ds:[427C48], 0

PEiD里查看,.data节VOffset=24000,VSize=5610,于是27C4C(全局变量a)和27C48(静态变量b)正好在这个节中。

然后是Stack和heap的定位。。。这个我想了好久没什么头绪。。。但是dbg了几个程序,程序开始时ESP的值都是0x0012FFC4...这个。。。不知什么原因。。。。留待研究。。但是也基本可以定位局部变量的位置了,就是小于这个值的空间。。

然后就是堆。。。。这个是最头疼的东西了。。。。记得前几天测试malloc()的时候,也对得到地址的规律莫名了很久。。。。后来单步的时候,碰到了HeapAlloc(),网上搜了一下,可能这两篇文章能有些帮助(后一篇是Linux下的,但是可作为参考):
http://blog.csdn.net/zero2046/archive/2005/12/23/559742.aspx
http://blog.csdn.net/drizztzou/archive/2007/06/11/1648328.aspx

这样,大体上可以定位各种各样的数据的存放位置了。然后在这个范围内搜索应该比直接搜索0x00010000~0x7ffeffff快一些。

然后,想到金山游侠有个功能是“暂停当前游戏并切换到普通模式下修改”(或许是其它描述。。记不清楚了。)。。让我一下子想到了SEH(Structured Exception Handling ,windows异常处理机制)。。。也许。。或许。。。金山游侠也是像大多调试器一样,在目标代码中插入int3来断下程序运行以获取各寄存器状态?

然后,你所要修改的游戏数据不是固定地址。。于是再考虑这各种变量类型。。
位于Section中的数据,因为是写入PE文件中的,所以每次加载后,VA不会变化。
而位于栈中的数据,因为执行部分已经写入.text节,所以如果每次执行的时候,ESP确定0x0012FFC4不变的话,那么栈中的数据位置应该也不会变化。。。
那么最有可能的就是数据位于堆中了。。。但是。。我构造了一个小程序,只有两句代码:
int * a = (int *)malloc(1);
printf("%d",a);
多次执行,却得到了相同的结果。。。。。。

于是猜测无能。。。完全不知道存储位置动态变化是什么原因造成的。。。

---

以上。。。也可能我的思路偏了。。。总之大家讨论一下吧。。如果有了结果。。记得Hi我>.<

按内存块查找吧....按特征分成不同的块...如果不匹配就跳到下一个块

我想查一下内存条频率~

06年买的多半是DDR2533
你可以下载个“鲁大师”查一下
搞不懂你贴出的参数

去下载CPU-Z 就可以看到了!