2017-08-19 47 views
2

我尝试了解Michael Sikorski所着的书“实用恶意软件分析”的示例。有一个关于反拆卸技术的例子,我不理解。它说一种常见的技术是创建两条条件指令,即如果跳转到零(JZ)并跳转(如果不是零)(JNZ),它们一起考虑实际上只是一个无条件指令(这对我来说很清楚)。以下是反汇编程序创建的两个可能结果的图形。x86汇编对同一目标的两个跳转指令

wrong interpretation

right interpretation

下面引用指的是图中1

在本例中,紧接在两个条件跳转指令的指令似乎是在一个调用指令(调用),从字节0xE8开始。这是不是这样的,但是,因为这两个条件跳转指令实际上指向一个字节超出了0xE8字节

那是什么意思?为什么跳位置loc_4011C4 + 1(其中从自带+1) ?并在图2它是loc_4011C5?有人可以提供更详细的解释吗?

+1

跳转目标在调用指令内部是1个字节。为什么?因为这就是程序员编写它的原因,大概是为了混淆目的。图2显示了将要执行的实际指令。 C4 + 1 = C5 – Jester

回答

6

汇编代码编译的结果是一段本地代码,更具体地说是一个字节序列,其中该序列的不同部分对应于来自原始程序集的指令。英特尔x86处理器有一个所谓的CISC指令集,基本上意味着指令长度以字节为单位可以从1变化到12,并且不考虑现在可用的指令集扩展。所提出的技术利用了这个事实。

重点在于误导那些潜在的恶作剧的人。第二个例子的代码(pop eaxretn)就是我们要执行的内容以及执行的内容。然而,因为我们在pop eax指令的前面插入了一个假字节,所以反汇编代码将不会被关注,就好像内存中的某个位置出现了call一样,因为大多数不太明亮的反汇编器会自动假定机器代码为二进制没有差距。

这种技术并非万无一失。更复杂的装配者将揭示作者的真实意图。还要注意,如果试图闯入代码的人在调试环境中运行它,这种技术将再次无用。