参考文章:结合CE,OD找数据结构http://hi.baidu.com/glfbin/blog/item/ba38e9f58d8c6821bc3109ed.html
进入正题:
游戏版本:5007
大体思路:游戏里先说一句话,然后用CE查找到某一内存地址。找到后用OD下内存断点。就找到了操作内存的语句。仔细研究后能得到下面的东西:
LOG首地址基址:CBBB64
LOG内容基址:CBBCE0
LOG首地址基址是一个指针。读取LOG首地址CBBB64内存数据,我这里读出来的是07322E5C。然后看看内存地址07322E5C是什么东西。
07322E5C 80 2E 32 07 00 00 00 00 00 00 00 00 00 00 00 00
07322E6C 00 00 00 00 14 00 00 00 00 00 00 00 0E 00 00 00
07322E7C 7F 01 00 00
每4字节为一组,含义分别是:
后一个LOG地址,前一个LOG地址,未知,偏移,未知,长度,未知,信息类型,未知。
比如后一个LOG地址是80 2E 32 07(内存是反着储存的,正确的是07322E80)。
结构分析完了,最后是读取对应的文字内容。
公式是:
文字内容=LOG内容基址+结构体里的偏移*2
文字长度=结构体里的长度*2
最后有一个前辈写的读LOG脚本,我已更新到最新版。
文章评论
收益颇多,想学习下这段代码,不知道能否告知最新的内存地址?我逆向推理学习下,谢谢!
@尼森 最新地址我也没有研究。但是可以根据LOG行数推算出来。具体参考http://hi.baidu.com/wking/item/f888a917cdc719721109b5f8
logohead_addr = &h00cea1fc
logotail_addr = &h00cea200
logosum_addr = &h00cea380
logoinfo_addr = &h00cea378
Sub 读最后一句话(i,zfs)
logobase=Plugin.LazyGod.ReadMemory(objwin(i),logoinfo_addr, 2)
logoaddr=Plugin.LazyGod.ReadMemory(objwin(i),logotail_addr, 2)
logoaddroff=logoaddr+12
offset=Plugin.LazyGod.ReadMemory(objwin(i),logoaddroff, 2)
temp0 = logobase + offset*2
logolast=Plugin.LazyGod.ReadMemory(objwin(i),temp0, 6,zfs)
End Sub
zfs 是调用程序带来的字符数长度,汉字读取必须是偶数啊