x86汇编对同一目标的两个跳转指令
我试图理解Michael Sikorski所着的书“实用恶意软件分析”的一个例子。 有一个关于反拆卸技术的例子,我不理解。 它说一种常见的技术是创建两条条件指令,即如果跳转到零(JZ)并跳转(如果不是零)(JNZ),它们一起考虑实际上只是一个无条件指令(这对我来说很清楚)。 以下是反汇编程序创建的两个可能结果的图形。
下面的引用是指图1:
在这个例子中,紧跟在两个条件跳转指令之后的指令看起来是(call)的一个调用指令,从字节0xE8开始。 但是,情况并非如此,因为条件跳转指令实际上指向0xE8字节之外的1个字节
这是什么意思,为什么跳转位置loc_4011C4 + 1(从哪里来的+1)? 在图2中它是loc_4011C5? 有人可以提供更详细的解释吗?
汇编代码编译的结果是一段本地代码,更具体地说是一个字节序列,其中该序列的不同部分对应于来自原始程序集的指令。 英特尔x86处理器有一个所谓的CISC指令集,基本上意味着指令长度以字节为单位可以从1变化到12,并且不考虑现在可用的指令集扩展。 所提出的技术利用了这个事实。
关键在于误导那些在他们脑海中可能存在的恶作剧的人。 第二个例子的代码(使用pop eax
和retn
)是我们想要执行的内容以及执行的内容。 然而,因为我们在pop eax
指令前插入了一个假字节,所以反汇编代码将不会引起注意,就好像有一个call
内存中的某个位置一样,因为大多数不太明亮的反汇编器会自动假定机器代码为二进制没有差距。
这种技术不是万无一失的。 更复杂的装配者将揭示作者的真实意图。 还要注意,如果试图闯入代码的人在调试环境中运行它,这种技术将再次无用。
链接地址: http://www.djcxy.com/p/80361.html上一篇: x86 Assembly two jump instructions with the same target