首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何识别内存中的汇编“调用”指令?

如何识别内存中的汇编“调用”指令?
EN

Stack Overflow用户
提问于 2018-06-10 04:17:17
回答 1查看 301关注 0票数 0

在进程的可执行内存中,如何区分汇编“调用”指令的操作码(E8地址)和其他E8字节(例如,位于另一条指令中间的字节)?(最好是从C语言的角度来看)

验证紧跟在E8字节之后的四个字节是否引用了有效地址,然后验证该区域(即被调用函数的开始)是否以操作码"push ebp“和"mov ebp,esp”(大多数函数使用此开场白)所对应的字节开始是否足够?或者有更好的选择,比如检查从入口点到出口点的每个操作码?

顺便说一句,我几乎没有这个话题的经验,所以任何信息都是值得感谢的。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2018-06-10 10:26:54

对于像x86这样的可变长度指令集和许多其他指令集,你必须从已知的良好入口点开始反汇编,并按执行顺序反汇编,不一定是线性的。

不能保证这将工作,因为它通常是微不足道的绊倒反汇编程序,并导致它失败。

举个简单的例子,有很多方法可以做到这一点。

代码语言:javascript
复制
set flag
blah
blah
jump if flag to hello
put the first opcode byte but not the rest of the instruction here as data
hello:
real stuff here

我倾向于跟踪每个指令的第一个字节的位置,然后跟踪指令中附加的字节,这样对于每个指令,当遵循路径或分支时,可以首先检查我是否已经命中该路径,然后检查第一个字节是否位于非第一个字节的顶部。这可能是完全有效的手工代码,以绊倒汇编程序,也可能是你在其他地方被绊倒的其他原因。

编译器,除非被设计成或被告知不会编写有反汇编问题的代码(按照执行顺序,而不是线性的)。但是如果你回到过去,比如说反汇编经典的视频游戏roms,你可能会发现这种反汇编问题,然后不得不做更多的工作,主要是代码分析,以确定哪一个执行路径是正确的。

固定长度的指令集,有一个已知的对齐方式,你可以从任何地方线性反汇编,你必须容忍未知的指令,因为当你点击数据部分时,你会看到很多这样的指令,但你可以采取不处理执行顺序的捷径。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50778177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档