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