曹操传吧 关注:85,306贴子:1,295,431
  • 5回复贴,共1

请问一个修改exe的"小"问题

只看楼主收藏回复

问题的切入点很小啦,但感觉涉及一些我不懂的方法,如果掌握了应该可以用在更多修改场合吧,麻烦大神看看能否点拨点拨。
问题是:吃到移动力buff后,武将界面显示的是 8(+2),(图1)。强迫症觉得这里全角括号搭配半角数字太别扭了,如果显示 8 (+2) 就舒服了。想把全角括号的这个字符改掉。这个字符不出意外总是藏在exe里某个位置的吧。
我的尝试过程是:
1,故意把一个兵种名称改成(),用UE打开exe,找到存放兵种名称的位置,就知道了在UE里(的编码是A3A8,)的编码是A3A9(图2)。然后在UE搜索A3A8,本以为总能找到一个存放各类文字信息的区域,再把A3A8改成半角括号的编码就行了。结果是找不到(找到一处明显不是文字区域的,只是程序代码碰巧撞上A3A8了吧)……于是用UE就不会改了。
2,用OB打开exe,用 查找——常量 的功能,图3,之前在找一些数值常量时屡试不爽,现在查A3A8或A8A3(我略懂有低位高位的故事,吃不准就两个都查一下),结果是都查不到。
3,还是在OB,在做另一项修改时碰巧发现了这个地方,图4。我完全不懂那些汇编代码,但外行都能看出这里就是程序拼写移动力的地方了。%d是原始移动力,%u是实际移动力,将它们和()+- 等符号拼成了最终的8(+2)的字符串。
那太好了,只要修改这里的()字符就行了,但发现不会改……图中的ASCII "%u ( +%d )"这列只是OB给出的批注信息吧,真正的代码是 B9 C0EB4800,或者说是 mov ecx,Ekd5.0048EBC0 。像是调用了Edk5.exe自己的一个函数?怎么追溯到那个函数的真正位置呢?0048EBC0 这个地址在OB里找不到嘛。OB主窗口的最大地址也只到00485FFF,另外一个不知什么窗口的地址从00486000紧接下去,但最大也只到0048AFFC。

这可能就是所有拼图里我缺失的一块,请指导一下,谢谢~~


IP属地:上海1楼2023-01-26 16:10回复
    不错


    IP属地:江苏来自Android客户端2楼2023-01-26 17:13
    回复
      依次说明一下
      Q:为什么在UE里搜不到圆角的括号?
      A:其实移动力这里用的就是半角的括号,之所以你感觉像圆角是因为它前后各有一个空格...所以你在UE搜索的时候应该直接搜索"%u (" (注意%u后面是一个空格加一个半角括号)
      Q:OD那里,48EBC0和%u ( -%d )是什么关系?
      A:楼主学过编程的话肯定对字符串不陌生吧。48EBC0这个地址开始存储了"%u ( -%d )"这段字符串,换言之48EBC0就是这个字符串的指针。所以当指令涉及到48EBC0的时候,od会分析出这是一个字符串指针,并且会在注释区告诉你这串字符串是什么
      Q:OD为什么拉不到48EBC0这个地址?
      A:并不是说od只支持查看401000~486000这段区域,而是401000~486000是一个独立的区段,叫做text区段(俗称 代码区),在这个区段是集中写代码用的。od的左上角窗口就是专门为代码区服务的,所以你拉不到48EBC0
      而你的所有字符串常量、变量信息,存储在data区段(俗称 内存区,从486000往后基本都是),因此你需要目光转移到od左下角的工作区,这里是可以编辑内存区的信息的。快捷键Ctrl+G输入48EBC0,你就能找到这个字符串了

      具体找到位置后怎么改就很简单了,直接把 ( %d )改成(%d)就好了,注意右括号后面必须跟00这个字节,表示字符串结束


      IP属地:上海3楼2023-01-27 17:38
      收起回复