Chinaunix首页 | 论坛 | 博客
  • 博客访问: 242261
  • 博文数量: 65
  • 博客积分: 2758
  • 博客等级: 少校
  • 技术积分: 725
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-25 00:23
文章分类

全部博文(65)

文章存档

2011年(4)

2010年(1)

2009年(60)

我的朋友

分类: 项目管理

2009-11-19 23:20:25

  前言:三年前,我就一直在找这个游戏的基址,大约一年前,找到过一次,并成功的写出了修改资源的辅助工具,但游戏中的人口上限问题一直没能解决,四处发贴求助,广海也发过。hehe
    最近用OD找到了人口上限的地址,但这个地址随着时间会自己改变,为了解决这一问题,我又打开这个游戏,结果发现,要再次找寻全局基址,结果就有了这次的痛苦经历...

    2009-11-17日,重新找寻 帝国时代-征服者 1.0C 的全局基址的痛苦经历...开始

一、用CE搜索木的精确数值 200 ,float。再次搜索 400 ,搜索出5个结果

  1


    0AFCA334
    0AFCA5CC
    0B0431E4
    0BEB6BFC
    0BEB6CBC

    1.    将0AFCA334值改动一下,发现游戏中也变了,而且0B0431E4的值也跟着变了。
改动第二个0AFCA5CC的值,游戏中没变,但0BEB6BFC里的值跟着变了。看来,0AFCA334有很大的嫌疑。
  2.    对0AFCA334深入分析。查找写入该地址的代码,回到游戏中运行一下,显示如下:
  004b2d60 - d9 18 - fstp dword ptr [eax],fstp是什么意思呢?google一下:
fstp都是x87指令 
fild是将整数转化为长双精FP80压栈(压到st0)  fstp是将弹栈指令,将st0弹出。
    不懂再查。
    DWORD(32位)
    不好,刚才copy上面的指令时,004b2d60 - d9 18 - fstp dword ptr [eax]被改成 nop了。有意思的是,木头数量不增加了,人口变成了0/0(正常的是4/200),好象一个工人还被主城收回了。小退也不行。晕。
    只好重新来过

    二、这次搜索出3个木头的地址:0B19A334 / 0BD6DC3C / 0BD8BB84
      改一下第一个,第三个值也跟着变了。回到游戏中运行一下,第二个值也跟着变了。
    对写入该地址的代码进行查找,还是这个
    004b2d60
        - d9 18 - fstp dword ptr [eax] //eax = 0b19a334
    运行了一会游戏之后,多了一条
    005b409f – d9 19 – fstp dword ptr [ecx] // ecx=0b19a334
    查看第一条内存查看器,它停在了
    005ea23b mov edx,[esp+10]
    用od出场吧。表达式005ea23b,然后执行一下,出现了这个。

2



    先下个断,没有断下来。
    到它的头上下个断,也没有反映.

    Hw 0B19A334这样试一下:断了,游戏也断了。
  下个内存断吧 重新开游戏,找到粮0AFCA330,表达式,内存写入,游戏,又死了。

    三、再来,搜索粮值0AFCA330/5b409f
    用od : dd 0AFCA330 出现个200,人口上限设定周围都是属性,明天好好看一看。


  2009-11-18 * Free 在线指导

    学会了用d3dwindower工具将征服者窗口化,这样od下断应该能解决了.

      一、用CE搜索出三个粮的地址  0C00BCE0/0C0819D0/0D3B6BCC 起作用的是第一个.
    点击访问该地址的代码,回到游戏,用掉一点粮,出现了以下的三条
005b409d - d8 29 - fsubr dword ptr [ecx] //实数减法
005b409f - d9 19 - fstp dword ptr [ecx] //将ST(0)m32real(m64real,执行一次出栈操作
005bbd80 - 8b 12 - mov edx,[edx]
   
    二、因为时间关系,老师也没能深入研究。太晚了,睡觉。

    2009-11-19

    昨天虽然老师在线指导,但因为时间关系,他也没有找出全局基址。今天下午看了ghoffic重楼的寻找基址的文章,好象有一点点明白了。再试。

    一、先搜索粮的值,得到:0C830ADC/0C8D72E0/0C8E79D0 三个地址,改动第一个的值,其它没变化,进入游戏后,自己又变成原来的值;改动第二个,第三个立即跟着变化,但第一个没有立即变化,进入游戏运行才跟着变。改动第三个,一秒后,自己又回到原来的值。是不是可以这样理解:第一个地址,是用来在游戏中显示数据的,就象只读一样,经过游戏刷新,它会从第二处地址来读出当前的值并刷新自己。第二处地址,是用来改写的。第三处的作用跟第一处一样,但游戏不暂停时,它也在读第二处的数值,不停地修正自己。看来关键在第二处地址:0C8D72E0

  二、开工
    (一)查找0C8D72E0 处写入地址的代码,进入游戏并减少粮的数值后得到:
Code :005b409f - d9 19 - fstp dword ptr [ecx] // ecx = 0C8D72E0
    接下来搜索指针0C8D72E0 得到一个地址:0D2C5DA8,添加指针0D2C5DA8,偏移0,数值是当前粮的值,没有错误。
接下来,搜索一下访问该地址的代码,This is a pointer,所以选第一个 find out what accesses this pointer ,出来一堆代码,回到游戏再减少点粮:得到
Code :005b4084 - 8b be a8 00 00 00 - mov edi,[esi+000000a8] // esi = 0D2C5D00
搜索0D2C5D00,得到48个地址指向这个地址:选最后一个0D51458C,看看吧。

3


结果正确,试着将数值改到一下,游戏里也跟着改了,一切看上去很正常。

    (二)继续查找访问该地址的代码,出了一堆,选择第一条:
Code :00493d91 - 8b 46 0c - mov eax,[esi+0c] // esi = 0D514580
搜索这个地址,又出来10个,还是选择最后一个吧:0D515B04 ,将它添加到上图的指针(第三层了):结果正确。查找访问这个地址的代码:结果为空。
回头选择第一个值00128608,结果正确,但再查找访问这个地址的代码,也没有结果。
第二个01165FD4,结果正确,查找访问这个地址代码,有结果了:
Code :00603fab - 8b 04 91 - mov eax,[ecx+edx*4] //ecx = 01163F00 ,edx = 0000835象个数组,用计算器算一下这个835=十进制 2101,好象没什么用。
第三个值0119BE50 ,代入 得到结果:
Code :005dab20 - 8b 39 - mov edi,[ecx] //ecx = 0119B50,是它本身,搜索0119B50,没有结果。
第四个值0BF564C0,代入得到结果:Code :005db5e9 - 8b 39 - mov edi,[ecx]
又变成地址了,继续搜索这个地址0BF564C0,出来58个。
选择4-1值0D03137C ,添加指针:0D03137C,偏移0,结果正确,也能改游戏中的。但再搜索访问该地址的代码,没结果。
选择4-2值0D03139C ,添加并搜索访问该地址的代码,没结果。
选择4-58值0D09675C,同上操作,有结果了:
Code :005db5e6 - 8b 49 14 - mov ecx,[ecx+14] // ecx = 0BF564C0,这个值是前面的,还是后面的呢?后面的。继续搜索,又是56个,要死人了
选择第一个0D03137C,等等,不就是上一个4-1吗。看来进入循环了。

    (三)再回到标题(一)重新来过
  Code :005b4084 - 8b be a8 00 00 00 - mov edi,[esi+000000a8] // esi = 0D2C5D00 这次得到56个结果,同第一次48个,多了12个。这次选择第一条0012B430,ok。查找访问该地址的代码,没结果。
第二条0012B4C4,看上去靠得很近,果然不出所料,也没结果。
第三条0109433C,出结果了:
Code :00493d91 - 8b 46 0c - mov eax,[esi+0c] //esi = 01094330,搜它,出了10条
看到其中有一条为01096864离这个值比较近,就先试试它:代入[01096864]+c+a8+0,但再搜索访问该地址的代码,无结果。
跳过和第三条相近的值,选择一个值0A47F4CC,试试:[[0A47F4CC]+a8]+0,ok。
搜索访问该地址的代码,Code :00493d91 - 8b 46 0c - mov eax,[esi+0c],看来也没戏,00493d91,跟上面第三条的一样。
再选择一条0C88A1CC,试下: Code :0053c60a - 8b 4e 0c - mov ecx,[esi+0c]差不多。
再选择一条0D1D3C88 ,Code :005bfb97 - 8b 86 50 08 00 00 - mov eax,[esi+00000850],有点不一样了,试试esi=0D1D3438 ,搜索出来二条:0BF9A6E4/0C8E5CE0
先看 0BF9A6E4,代入:0BF9A6E4]+850+a8+0,访问它的地址:
Code :004e3f95 - 8b 8e 7c 10 00 00 - mov ecx,[esi+0000107c] //esi = 0BF99668
搜索0BF99668,终于有两条绿的了068D8F0 / 075D1E8
试一下[[[[068D8F0]+107c]+850]+a8]+0 ,结果正确,游戏也能修改。
试一下[[[[075D1E8]+107c]+850]+a8]+0 ,结果正确,游戏也能修改。

    三、测试。退出游戏,再进来,但,这两个地址的值不是0BF99668了,变成0BBCF90了。但游戏还是能修改。剩下的就请各位玩帝国时代-征服者 1.0C的大大位帮助在你的电脑上测试了。

    唉哟我的妈哟……

阅读(3022) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~