轩辕春秋文化论坛 » 曹操传MOD制作交流 » 扩展引擎中的对话框 - [不借助DLL]


2012-2-20 11:44 砖家叫兽
扩展引擎中的对话框 - [不借助DLL]

前言

现有的对话框数量远远不够,如何才能扩充对话框以满足更高级的需求成为了引擎探索目标。

之前蛇夫 研究过 自创角色  新引擎增加了 围攻 那几个按钮

而本人要做的方法,比较笨,但是在前人基础上进行加工,前人栽树后人乘凉,前人开路后人走,希望能够让你修改引擎更加随心所欲。

[color=Silver][[i] 本帖最后由 砖家叫兽 于 2012-2-20 23:54 编辑 [/i]][/color]

2012-2-20 11:50 砖家叫兽
前言

对我们E族来讲,完全依靠引擎而不借助外来因素是我们的最爱,也是一直探索的方向。

本人为了制作主角命名,查找到CCZ中唯一一个可以接受输入信息MFC对话框是,买入 卖出 那个输入数字的EDIT

经本人修改后虽然还有个小BUG,即默认显示数字 1 (比较麻烦的一点),但是接受汉字已经实现并且这个BUG将在将来解决。

扩充对话框,首先要从对MFC的认识开始。


推荐工具  OD    EXESCOPE    VC6

结合这三个工具,我们将可以用来 “修改” 出我们要的对话框

2012-2-20 12:01 砖家叫兽
VC篇

VC 即 MICROSOFT VISUAL C++

微软的VC中有关于 MFC的部分  也就是创建你自己心目中的对话框的基础

首先构建工程,用引擎打开EXESCOPE,找到你要修改的对话框,按引擎中组件的顺序添加进你想要的组件 首先构造你需要的对话框样式


这一步的关键是 因为修改,只能在原有的对话框基础上修改样式,比方EDIT、PUSHBUTTON、你可以修改 XY坐标  XY 大小

在VC中创建好样子了,编译


这时候 CCZ输入数字的EDIT控件 ,仅仅接受数字,还不能接收字符。

而VC的EDIT控件是可以

这时候需要的是,修改属性,去掉EDIT控件中 接收数字 那个 选项

当然 这一步不是在EXESCOPE中直接改,而是用 E 打开 VC 编译后生产的EXE文件,找到对话框。


这一步完毕之时,你已经用VC 构造了个和 引擎中某个对话框一样的对话框

2012-2-20 12:15 砖家叫兽
EXESCOPE篇

上一步完成,这时候应该是打开了两个EXESCOPE  其中一个是引擎 一个是编译的VC文件

这时 先检查一下 两个相似的对话框 二进制格式是不是一样,如果是一样的,那就放心大胆的进行下一步,(其实不一样也不要紧,下面会告诉原因)

虽然本人承认方法笨,但至少不会笨到为了构造一个对话框而废掉一个对话框。

因此,对话框修改不是在E 中直接进行


打开OD,找一段空间足够大的,把 VC 编译程序 对话框整段二进制数值拷贝过来。

关键信息 待替换首地址 *exchg

同样在OD中搜索资源区段,用二进制搜索 找到与EXESCOPE 对应的 对话框二进制内容

关键信息 对话框资源的首地址 *p

因为是重复利用,所以,把原先对话框的内容也找个空间保存下来吧

首地址 *Pstore


接下来的原理很简单

三个地址  有两个地址存储了对话框的信息,包括 样式 属性 等等

还有一个地址的内容决定了 对话框会显示成什么样子

你需要做的就是,在调用对话框之前 ,复制一次内容,调用完毕,复制回去。


这个代码在OD中写。

而  实际上 资源段是被保护的   MOV [XX],XX 是会导致引擎弹出的,这就需要EXESCPOE了

用 E  打开引擎,找到头部区段,可以看到 资源段 信息,有个 【只读,保护】之类的,跟代码段不一样。代码段没有加保护,因此把相应的二进制复制到资源的那一项吧。

2012-2-20 12:29 砖家叫兽
OD 篇

最终极的一篇是OD篇。

首先 需要有个接口来调出你的对话框,一般是从剧本控制。

这里的部分,交由修改者自行完成。

进入调出对话框的子函数

首先 找一个地址作为标记,默认是0 也就是原始的对话框

现在 MOV [XX],1  做一下标记

当然 记得函数末尾 要MOV [XX],0  或者在原先调用对话框的函数那里写

这个标记的实质是告诉代码的处理机制,我在执行哪一个。

对相应MFC控件功能的修改:

调用对话框你只要接入原先的函数即可。比方输入姓名,我直接接入买入卖出显示的那个对话框。仅仅修改了个别参数。

CCZ就这一点好,很多功能都可以找到相应的函数。

问题是,单纯显示出来还打不到我要的目的。


比方我修改了对话框,屏蔽了多余按钮,没有显示“买入XX要XX钱”,而对话框仍旧只接受数字。

这时候不要急,用EXESCOPE打开引擎 看看这个控件的ID

好像EDIT那个是1420,转换成十六进制 59D

然后搜索引擎中59D

看到PUSH 59D  并且底下就CALL 了一个非引擎的函数(79XXXX  77XXXXX)而且 这些函数 OD是认识的,名称是 getdlgitemint

不知道函数是什么意思对不对,百度一下。

函数很多,有用的就是这个,那么只接受数字是因为什么缘故就知道了。

你要改的 同样 百度一下,找到接受字符的函数 getdlgitemtext

然后OD 中CTRL+G  找到这个函数首地址,保存到一个地址,然后传入合适参数。

比方本人的缓冲区直接写在引擎某个区,那么调用完成后这个区段的文字 来进行下一步处理即可。

而显示方面,当然 凭借反汇编的技巧,有条件抹掉一点东西(不是NOP , 是CMP JE)

2012-2-20 12:36 砖家叫兽
做完这几步以后,基本功能已经可以实现,但是还有些细节,需要在引擎中去完善

可能大家看完后还不知所云,下面我概括一下

本工作的核心是复制。对话框的修改不是靠EXESCOPE而是靠引擎。相应的数据内容保存在引擎中非资源段。这样确保了一个对话框可以多次修改使用。

其余的工作全部都是围绕这个一点来服务的。


当然如果想要对话框更强大,那就 需要一个比较完善的对话框,包含各种控件。




而精髓的精髓,还是OD本身的技巧。摸索出反汇编的很多小技巧之后,很多事情自己会有办法的。

[color=Silver][[i] 本帖最后由 砖家叫兽 于 2012-2-20 12:44 编辑 [/i]][/color]

页: [1]


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.