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.