我试图理解迈克尔西科尔斯基的“实用恶意软件分析”一书中的一个例子。有一个关于反拆卸技术的例子,我不理解。它说一个常见的技术是创建两个条件指令,即如果为零(JZ)则跳转,如果不为零则跳转(JNZ),它们一起考虑实际上只是一个无条件指令(这对我来说很清楚)。以下是反汇编程序创建的两个可能结果的图形。
以下引用引用图1:
在此示例中,紧跟在两个条件跳转指令之后的指令似乎是(调用)的调用指令,从字节0xE8开始。但是,情况并非如此,因为两个条件跳转指令实际上都指向超出0xE8字节的1个字节
这是什么意思,为什么跳转位置loc_4011C4 + 1(来自+1)?在图2中它是loc_4011C5?有人可以提供更详细的解释吗?
答案 0 :(得分:6)
汇编代码编译的结果是一段本机代码,更具体地说是一个字节序列,其中该序列的不同部分对应于原始汇编的指令。 Intel x86处理器具有所谓的CISC指令集,这基本上意味着指令长度(以字节为单位)可以在1到12之间变化,而且不考虑现在可用的指令集扩展。所介绍的技术利用了这一事实。
重点是误导那个有潜在恶作剧的人。第二个示例的代码(包含pop eax
和retn
)是我们想要执行的内容以及将要执行的内容。
但是,因为我们在pop eax
指令前面插入了一个伪字节,所以反汇编代码将不会引起注意,就好像在内存中的某个位置有一个call
,因为大多数不太明亮的反汇编程序自动假设二进制文件的机器代码没有间隙。
这种技术并非万无一失。更复杂的反汇编者将揭示作者的真实意图。另请注意,如果试图侵入代码的人在调试环境中运行它,这种技术将再次无用。