Board logo

标题: 关于OD中子程序(函数)的问题 [打印本页]

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

首先请看两张OD的截图



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



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

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

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

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

谢谢。

[ 本帖最后由 武骧金星 于 2010-2-13 13:11 编辑 ]
作者: 蛇夫座    时间: 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开始的子程序却没有。因为我在调用的时候确实遇到了问题。

[ 本帖最后由 武骧金星 于 2010-2-13 13:59 编辑 ]
作者: 蛇夫座    时间: 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工程记录下了你的修改,最重要的是告诉你判断一个函数是否结束不是靠那条黑线。




欢迎光临 轩辕春秋文化论坛 (http://www.xycq.org.cn/forum/) Powered by Discuz! 5.0.0