我在 main 中使用此 asm 代码创建了小型 C 程序(x86):
__asm
{
jmp label // EB 02
nop // 90
nop // 90
}
label:
在 IDA 中加载它(在静态模式下,因此它将使用首选基地址),查找jmp label代码段的地址并减去虚拟地址(可以在 PE 资源管理器中快速看到)。然后我在可执行文件中找到文件偏移量并对其进行修补,因此EB 02 90 90代码序列变成了相对无条件跳转66 E9 <16bit offset to program entry point>。
请注意,我并不是要尝试做某事,我只是想看看 IDA 会如何回应。IDA 识别地址:
jmp short start
我在入口点的第一条指令上放置了断点,一旦它被击中我就恢复。令我惊讶的是,IDA 似乎没有跟踪指令指针(或跳转到不同的位置),并且发生了一些奇怪的事情。
起初我尝试在代码部分外进行相对跳转,IDA 的行为方式相同,我认为这可能与检查代码部分的边界有关。但从技术上讲,我们可以在代码段之外执行代码,我们只需要将代码字节放入全局数组中,手动将包含初始化数据的段标记为可执行并使用相对跳转。
我读到 IDA 不处理混淆的二进制文件。跟它有关系吗?有人可以解释为什么 IDA 在这种情况下拒绝遵循控制流吗?谢谢。