2007年3月18日 星期日

ollydbg 对 GlobalAlloc 系列堆内存分配函数的支持

ollyDBG 的用户帮助->内存映射(Memory map)中说:
如果想查看由应用程序通过调用GlobalAlloc()LocalAlloc()等申请的内存块列表,请使用堆列表[Heap list]。
我们是不是可以这么理解:ollyDBG 的内存映射功能看不见使用 GlobalAlloc 系列API函数申请的堆内存。以上引用的这段文字见于翻译版的 ollyDBG 帮助,下面来看看英文原版是怎么说的:
To get list of memory chunks requested by application via calls to GlobalAlloc(), LocalAlloc() etc., use Heap list.
完全在四级考试范围之内,翻译的相当正确,没有歧义和理解错误。看来 ollyDBG 确实看不见GlobalAlloc 系列API函数动态分配的内存了。
.
.
.
.
.
.
.
可是,我做的实验似乎不是这样的…………
不明白,拿出来讨论一下吧。
嗯,还是讨论讨论比较好,请看我的实验程序。

[我的实验程序]


  这是一个相当简单的 HeapAlloc/GlobalAlloc 函数的 Delphi 10 实现演示,和原先发布的“御姐控的伟大胜利”范例程序如出一辙,只是按+/-按钮改变的变量是用以上提到的两个函数现场生成的。当然,程序退出时会主动释放(调用HeapFree/GlobalFree)。
  在MSDN上了解到,GlobalAlloc 函数是为了16位兼容性而存在的,效率比较差。建议使用 HeapAlloc 取代之。不过似乎又在哪里看见:这两个函数的入口点是一样的来着~~ 于是,俺先采用了 HeapAlloc 函数获得分配的内存的句柄或偏移量,再使用CopyMemory()写入数值。意外的,生成的变量用 FPE 和 Cheat engine 都搜索不出来,可是直接使用函数返回的偏移量可以在 ollyDBG 的内存映射里找到。这我就不明白了:ollyDBG 不是看不见 GlobalAlloc 出来的内存块吗?顺带又用 GlobalAlloc 做了一次,效果几乎一样。
  于是,我更加不爽了:为什么我自己做的什么程序的变量都可以在OD的内存映射里看见,而我调试的几个游戏中的属性值,明明知道偏移量的值,却在内存映射里怎么也找不着。

ps:
  实验程序下载 [7zip格式]

10 评论:

[tc]天驰 说...

看到配图我下巴都快撞到桌子了,我猜想MMzX一定想象不出来我有多么吃惊。

楼主自己都说了,GlobalAlloc是Windows 3.1函数,请楼主仔细看看,你得到的指针在4MB以外吗?是个合法的32位指针吗?你用VirtualAlloc有可能获得这么低的地址吗?不能吧。

所以,由于FPE是从0x40 0000开始搜索的,怎么可能找到你的东西呢?
结论1:请使用金山公司的产品。

另外,楼主所引文字我有疑问,人家也没说GlobalAlloc来的内存就不能被列在Memory map里面。要知道,[tc]那个高中写的小程序要照样可以反映GlobalAlloc来的内存。
结论2:不能说OllyDbg无法识别GlobalAlloc的内存。

问题3:游戏并不是一个.exe就可以运行的,实际上数据经常被存放在别的模块中,比如.dll中([tc]改魔兽就是在Game.dll中进行的)。请楼主再耐心找找。
结论3:耐心,成就男人梦想。

zx.Longinus 说...

居然没有撞断-_,-|||
结论一:金山的一样挂(v5),在fpe的内存编辑里可以看见,cheat engine也是。heapalloc的例子是高于$00040000的。
结论二:那个heap list只能在95/98下使用,那句话怎么看都象是只能用heap list查看globalalloc的内存。
结论三:越共里也有一个game.dll,但调试的时候在安装目录里的可执行文件怎么只有主程序一个?不懂,某[tc]囧教我。

zx.Longinus 说...

更正结论三,使用附加的时候看见了,让我试试……

zx.Longinus 说...

咦,为什么我用附加载入的程序的线程被挂起我怎么点恢复都没反应?

zx.Longinus 说...

刚刚cnc2的不花钱修改成功了,不过采矿的话,钱还会长,过短时间再仔细看看。

[tc]天驰 说...

成功了吧,一点都不难。
(注:刚才MMzX打了一个具有恐吓性质的电话给我)

zx.Longinus 说...

但是越共仍然找不到……
orz

[tc]天驰 说...

什么类型的游戏?地址贴来我看!

zx.Longinus 说...

一开始有个汉化的壳,找到真正的主程序后,所有附加时看见的模块都能看见了,估计是在线程里。我再找找。

zx.Longinus 说...

blogspot 又被ban掉了,正筹划搬家……