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.