轩辕春秋文化论坛 » 曹操传MOD制作交流 » 关于OD中子程序(函数)的问题


2010-2-13 13:01 武骧金星
关于OD中子程序(函数)的问题

首先请看两张OD的截图

[img]http://www.xycq.net/attachments/2010/02/56399_201002131252511.jpg[/img]

这是原版EKD5.exe中,函数0043F8BE(获取武将攻击范围)的代码。从43F8BE开始,到43F919结束(RETN)

[img]http://www.xycq.net/attachments/2010/02/56399_201002131252512.jpg[/img]

这是本坛说岳EKD5.e5中,函数0043F8BE的代码,到43F916结束(RETN)

可以看到,图1中0043F8BE和0043F919由一条粗黑线连接起来(在地址栏后,HEX数据栏中),我想这应该表示这是一个子程序。

而图2中,可以看到这条粗黑线消失了(这段子程序结束于0043F916)。而我在写代码试图调用武将攻击范围时,用CALL EKD5.0043F8BE命令,似乎永远会得到一个“在武将攻击范围内”的结果。

因此,请问在图2中,0043F8BE到0043F916的这段代码,是否还是属于一个子程序?我相信说岳中用于调用攻击范围的还是这个函数,因为说岳的攻击相应函数并没有做过改动。

谢谢。

[color=Silver][[i] 本帖最后由 武骧金星 于 2010-2-13 13:11 编辑 [/i]][/color]

2010-2-13 13:30 蛇夫座
楼主的提问的函数调用在周大的《曹操传exe部分函数功能》中已有注释:

407A09检测武将ecx是否装备特殊效果为08栈的特殊道具

407AF2获取武将ecx装备特殊效果为08栈的特殊道具的特殊效果值

41DF70获取武将ecx的兵种

44F9A0获取兵种ecx的攻击范围

之后自己组织一下,比如:PUSH XXXXXXXX ; 这可能是特效号、道具编号、武将DATA编号、兵种编号、法术编号等等。

当遇到没有注解的函数时,先用OD注释出已知函数,再调试出未知部分,一边看OD一边看游戏窗口,有时也只能靠猜测

2010-2-13 13:57 武骧金星
啊,其实我就是想知道为什么别的子程序都有这条粗黑线,而图2中从43F8BE开始的子程序却没有。因为我在调用的时候确实遇到了问题。

[color=Silver][[i] 本帖最后由 武骧金星 于 2010-2-13 13:59 编辑 [/i]][/color]

2010-2-13 16:23 蛇夫座
回复 #3 武骧金星 的帖子

C、C++语言函数未优化时反汇编形式一般如:

push    ebp             ; 保护基址寄存器EBP
mov     ebp, esp      ; 使用EBP寻址
sub      esp, 0C        ; 开辟局部变量

mov     esp, ebp      ; 清理堆栈
pop      ebp            ; 还原EBP
retn                       ; 弹出返回地址到EIP指令指针寄存器

所以到retn 指令时函数才结束

汇编语言不同于高级语言,它可以直接操作内存,并不局限于函数形式

直于那条黑线你管它干什么,只要在有黑线的地方修改过指令黑线就会断开或者消失

这是因为OD工程记录下了你的修改,最重要的是告诉你判断一个函数是否结束不是靠那条黑线。

页: [1]


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