永发信息网

为什么反汇编call 不能直接跳转到函数

答案:4  悬赏:50  手机版
解决时间 2021-01-27 04:13
  • 提问者网友:遁入空寂
  • 2021-01-26 16:36
我调试进入反汇编里,当调用一个函数时,汇编代码是
616C17BE call ff (616C120Dh)
接着就跳转到
616C120D jmp ff (616C1770h) //为什么要添加这一行呢? 谢谢!
再到
void ff()
{
616C1770 push ebp
616C1771 mov ebp,esp
616C1773 sub esp,0C0h
616C1779 push ebx
616C177A push esi
616C177B push edi
616C177C lea edi,[ebp-0C0h]
616C1782 mov ecx,30h
616C1787 mov eax,0CCCCCCCCh
616C178C rep stos dword ptr es:[edi]
}

请问为什么不直接跳转到函数的地址,要加个中间的jmp
最佳答案
  • 五星知识达人网友:大漠
  • 2021-01-26 16:54
616C17BE call ff (616C120Dh)
616C120D jmp ff (616C1770h)
这两次函数调用的地址不一样,是不是不是同一个函数?
全部回答
  • 1楼网友:骨子里都是戏
  • 2021-01-26 19:46
entry一般是: push ebp mov ebp,esp 所以 通常来说 ebp+8是本函数的参数开始,ebp+4是调用者函数当前位置的eip。而ebp-10是调用者函数的代码操作的。你可以追踪ebp+4地址处的值找到调用这个函数的代码地址,然后在那里向上去分析esp。明显是一个堆栈地址,用c语言的话来说,就是直接声明出来的变量,这样的变量一般都是在那个函数里赋值的,所以这样追过去应该就能得到用户名长度赋值的过程(也很有可能会得到用户名赋值的过程)。
  • 2楼网友:行雁书
  • 2021-01-26 18:19
你好,你的问题很有深度啊,我也不会,不过,我可以帮你问问我的老师,他教单片机的时候汇编语言也讲,知道后我会回复你的。
  • 3楼网友:枭雄戏美人
  • 2021-01-26 17:11
这个jmp指令的跳转目的地址,就是这些函数的入口地址。用户call函数时,call的目的地址就是表中对应的项的地址这张表被称为ILT-Incremental Link Table。这样,当执行call指令时,先会跳到ILT的某个表项,然后再跳到具体的函数执行这样一来,当加长函数而导致要移动另一个函数的机器码时,只需要修改ILT中的对应表项,而不需要修改别处调用另一个函数的地方。时间复杂度变为O(1),链接器的工作效率极大提高。 但还需注意,ILT表只会在debug模式下生成,在release下不会生成表项,原因你具体查查debug和release的区别就知道了,也就明白为什么call指令会调用两回。我在这里就不多说了! 还有小建议,一般的书本都不会讲得很深奥,建议你可以看看《老码识途》-韩宏,李林著。里面有很多反汇编和程序习惯的思想,可以对自己的代码能力提高很多!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯