反静态反汇编技术的原理其实非常简单,主要弄清除反汇编程序的原理,就可以创作出多个ANTI-反汇编的方法。由于这个技术没有固定的技术形势,如何反怎么样反全靠你自己的想象力了。这里就介绍一下原理方面和几个常见的技术。
反汇编软件的原理:
反汇编软件的原理非常简单,读取可执行文件后从PE头中取出代码节的入口点文件偏移。按照X86体系结构的编码规则进行解码。然后将代码的助记符进行输出。类似IDA这样先进的反汇编软件还加入了函数头分析,跳转分析,局部变量分析等功能。其实,最基本的原理都是大学编译原理课程中所提到的词法分析和语法分析的相关知识。这里插入一个题外话,至少我感觉的是任何先进的软件,其中到最后用到的核心技术都是编译原理相关的技术。都出不了- 分析- 模拟 - 解释,这些东西。
随机加密原理:
随机加密原理最初是在多态病毒中使用的技巧,它的反反汇编语言也非常简单,就是将自身的代码进行加密,这样反汇编器反汇编后出现的是一堆乱码。这样的随机加密可以有两层随机一个是算法的随机,一种是算子的随机,算法的随机在专题下面的多态加解密中进行专门的探讨,算子的随机相对简单,只要取一个随机值就好了。而这样加密形式也有一个固定的形势存在。
如一下形式:
--- 解密头 ---
--- 被加密体 ---
--- 解密算子 ---
这样代码的功能部分被保护,保护不到的是解密头。解密头启动后如果节被设置了可写标志则直接执行,如果没有,可以使用VirusProtect这个函数修改内存的属性进行可写的设置。当然也可以开辟一个堆空间将密体写入并解密运行。如果认为一开始在没有任何重定位的情况下不想暴露太多的获取API的函数和功能,也可以将代码写入栈中,这样可以进行两个分段的解密情况,一加密的为代码体本身,另一个就是保护程序自身的功能代码。例如:解密代码和ANTI-DEBUG代码。在栈中有个很方便的事情就是天生支持可读可写可执行,分配空间方便等特点,释放轻松等特点,大有百试不爽的感觉。
此结构类似如下(可以自行发挥想象构建复杂的结构):
--- 解密头 ---
--- 被加密体 ---
--- 功能被加密体 ---
--- 加密体解密算子 ---
--- 功能体解密算子 ---
解密头首先开辟栈,将功能被加密体写入栈后解密,再次跳入执行。功能体解密真正的功能代码。当然可以在其中加入ANTI-DEBUG代码与设定异常等。
加密这种方法简单实用。如果有想些类似程序的朋友不妨常用,而且它反汇编反的很彻底,一个简单的XOR就能让IDA对主体分析失效。
不规则的函数头:
让我们先看一个标准的函数头
push ebp
mov esp, ebp
sub esp, StackSize
代码...
mov esp, ebp
pop ebp
ret
IDA在识别函数的时候也是通过识别这些指令的opcode码来识别函数的。通常在整过编译器编译过后采用[ebp+偏移]来引用参数,而使用[ebp-偏移]来引用局部变量的。
当然写壳这类的东西用汇编是最适合的,如果用高级语言当然一定也要嵌入汇编,总之因为汇编的灵活,我们就来构建自己特殊的函数
反汇编软件的原理:
反汇编软件的原理非常简单,读取可执行文件后从PE头中取出代码节的入口点文件偏移。按照X86体系结构的编码规则进行解码。然后将代码的助记符进行输出。类似IDA这样先进的反汇编软件还加入了函数头分析,跳转分析,局部变量分析等功能。其实,最基本的原理都是大学编译原理课程中所提到的词法分析和语法分析的相关知识。这里插入一个题外话,至少我感觉的是任何先进的软件,其中到最后用到的核心技术都是编译原理相关的技术。都出不了- 分析- 模拟 - 解释,这些东西。
随机加密原理:
随机加密原理最初是在多态病毒中使用的技巧,它的反反汇编语言也非常简单,就是将自身的代码进行加密,这样反汇编器反汇编后出现的是一堆乱码。这样的随机加密可以有两层随机一个是算法的随机,一种是算子的随机,算法的随机在专题下面的多态加解密中进行专门的探讨,算子的随机相对简单,只要取一个随机值就好了。而这样加密形式也有一个固定的形势存在。
如一下形式:
--- 解密头 ---
--- 被加密体 ---
--- 解密算子 ---
这样代码的功能部分被保护,保护不到的是解密头。解密头启动后如果节被设置了可写标志则直接执行,如果没有,可以使用VirusProtect这个函数修改内存的属性进行可写的设置。当然也可以开辟一个堆空间将密体写入并解密运行。如果认为一开始在没有任何重定位的情况下不想暴露太多的获取API的函数和功能,也可以将代码写入栈中,这样可以进行两个分段的解密情况,一加密的为代码体本身,另一个就是保护程序自身的功能代码。例如:解密代码和ANTI-DEBUG代码。在栈中有个很方便的事情就是天生支持可读可写可执行,分配空间方便等特点,释放轻松等特点,大有百试不爽的感觉。
此结构类似如下(可以自行发挥想象构建复杂的结构):
--- 解密头 ---
--- 被加密体 ---
--- 功能被加密体 ---
--- 加密体解密算子 ---
--- 功能体解密算子 ---
解密头首先开辟栈,将功能被加密体写入栈后解密,再次跳入执行。功能体解密真正的功能代码。当然可以在其中加入ANTI-DEBUG代码与设定异常等。
加密这种方法简单实用。如果有想些类似程序的朋友不妨常用,而且它反汇编反的很彻底,一个简单的XOR就能让IDA对主体分析失效。
不规则的函数头:
让我们先看一个标准的函数头
push ebp
mov esp, ebp
sub esp, StackSize
代码...
mov esp, ebp
pop ebp
ret
IDA在识别函数的时候也是通过识别这些指令的opcode码来识别函数的。通常在整过编译器编译过后采用[ebp+偏移]来引用参数,而使用[ebp-偏移]来引用局部变量的。
当然写壳这类的东西用汇编是最适合的,如果用高级语言当然一定也要嵌入汇编,总之因为汇编的灵活,我们就来构建自己特殊的函数