在进程的可执行内存中,如何区分汇编“调用”指令的操作码(E8地址)和其他E8字节(例如,位于另一条指令中间的字节)?(最好是从C语言的角度来看)
验证紧跟在E8字节之后的四个字节是否引用了有效地址,然后验证该区域(即被调用函数的开始)是否以操作码"push ebp“和"mov ebp,esp”(大多数函数使用此开场白)所对应的字节开始是否足够?或者有更好的选择,比如检查从入口点到出口点的每个操作码?
顺便说一句,我几乎没有这个话题的经验,所以任何信息都是值得感谢的。
谢谢!
发布于 2018-06-10 10:26:54
对于像x86这样的可变长度指令集和许多其他指令集,你必须从已知的良好入口点开始反汇编,并按执行顺序反汇编,不一定是线性的。
不能保证这将工作,因为它通常是微不足道的绊倒反汇编程序,并导致它失败。
举个简单的例子,有很多方法可以做到这一点。
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,你可能会发现这种反汇编问题,然后不得不做更多的工作,主要是代码分析,以确定哪一个执行路径是正确的。
固定长度的指令集,有一个已知的对齐方式,你可以从任何地方线性反汇编,你必须容忍未知的指令,因为当你点击数据部分时,你会看到很多这样的指令,但你可以采取不处理执行顺序的捷径。
https://stackoverflow.com/questions/50778177
复制相似问题