加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

针对常见混淆技术的反制举措

发布时间:2022-04-01 10:51:09 所属栏目:安全 来源:互联网
导读:现代软件经常将混淆技术作为其反篡改策略的一部分,以防止黑客逆向分析软件的关键组件。他们经常使用多种混淆技术来抵御黑客的攻击,这有点像滚雪球:随着雪层的增多,软件规模也随之变大,使其逆向分析难度随之提高。 在这篇文章中,我们将仔细研究两种常见
  现代软件经常将混淆技术作为其反篡改策略的一部分,以防止黑客逆向分析软件的关键组件。他们经常使用多种混淆技术来抵御黑客的攻击,这有点像滚雪球:随着雪层的增多,软件规模也随之变大,使其逆向分析难度随之提高。
 
  在这篇文章中,我们将仔细研究两种常见的混淆技术,以了解它们是如何工作的,并弄清楚如何去混淆。
 
  概述
  这里,我们将研究以下混淆技术:
 
  基于IAT导入表的混淆技术
 
  基于控制流的混淆技术
 
  基于IAT导入表的混淆技术
  在深入介绍基于IAT导入表的混淆方法之前,先让我解释一下导入表到底是什么。
 
  什么是导入函数?
  当进行逆向分析时,需要弄清楚的第一件事,就是它如何调用操作系统的函数。在我们的例子中,我们将重点关注Windows 10系统,因为大多数视频游戏只能在Windows系统上运行。无论如何,对于那些还不知道的人来说,Windows提供了一系列重要的动态链接库(DLL)文件,几乎每个Windows可执行文件都会用到这些库文件。这些DLL文件中保存了许多函数,可以供Windows可执行文件“导入”,使其可以加载和执行给定DLL中的函数。

  无论如何,这些Windows函数能提供相当多的信息,因为它们是有据可查的函数。因此,攻击者希望能够把这些函数藏起来,以掩盖正在发生的事情。
 
  我们在反汇编器中看到的所有这些导入函数都是从导入地址表(IAT)加载的,该表在可执行文件的PE头文件中的某个地方被引用。一些恶意软件/游戏通常试图通过不直接指向DLL函数来隐藏这些导入地址。相反,他们可能会使用一个蹦床或迂回函数。
 
  我想,没有人喜欢用计算器手工重复上述过程,做一次已经很烦了。从现在开始,我们将使用C#实现自动计算。正如您可能已经看到的,我们只需要处理在同一个寄存器上执行的ADD、SUB和XOR操作。原因是Rax被用作返回地址,而诸如Rcx、Rdx、R8、R9和其他寄存器对于被调用方来说是不安全的,并且可能与调用约定冲突。这意味着,我们甚至不需要使用反汇编器,因为我们可以很轻松地区分这些指令,这要归功于涉及的寄存器和操作码寥寥无几。
 
  到此为止,我们已经详细解释了混淆处理技术。接下来,大家不妨以Unsnowman项目中的importfix.cs为例,来了解与去混淆处理相关的代码。
 
  基于控制流的混淆技术
  在逆向分析二进制文件时,另一个有价值的信息来源是汇编指令本身。对于人类来说,它们可能难以理解,但对于像IDA这样的反编译器来说,我们只需按下F5键,IDA就会生成我们人类可以理解的伪代码。
 
  混淆实际指令的一个简单方法,是组合使用垃圾代码和不透明分支(即该分支条件总是为不成立,也就是说,该分支用于也不会被执行)。这意味着:把垃圾代码放在一个分支指令之后。诀窍在于,我们可以使用条件转移,但是,要确保条件永远为真,这样分支就会一直被执行。反汇编器不知道的是,条件跳转在运行时总是为真,这使得它相信条件跳转的两个分支都可以在运行时到达。
 
  好吧,如果还不太明白的话,可以借助下面的截图来加深理解。第一张截图显示的是落到另一条指令中的jbe。
 
  注意:用红色标记的字节是垃圾代码。
 
  现在仔细看看下面的第二张图片,我在这里所做的只是NOP最后一条指令的两个字节,以便让IDA显示隐藏在and [rdx+24448B48h], bh指令后面的指令。
 
  我们也可以用无条件跳转来修补条件跳转,以确保IDA不会再次上当。
 
  在我们继续之前,我想展示最后一个例子,因为前面的例子太简单了。当我们将这些实现混淆处理的跳转链接起来时,事情就变得复杂起来,具体如下图所示。

  基于控制流的自动去混淆技术
  好了,现在我们已经考察了基于控制流的去混淆原理,接下来,我们将对这个过程实现自动化。正如我之前提到的,我们曾经用IDA脚本来修补无条件跳转指令,并将垃圾指令替换为NOP指令。
 
  然而,这个去混淆过程还是花了我40分钟,因为识别不透明的分支非常费劲。那么,我们该如何解决这个问题呢?大家可能认为应该检查每一个条件跳转指令,并检查它是否是不透明的,如果是的话,就用NOP替换它,然后重复上述过程,对吧?错了!
 
  让我告诉你一个秘密,我们并不关心什么是不透明的,或诸如此类的事情。我真正关心的是,当我按下F5键时,IDA能否返回反编译好的代码——只要这些经过混淆的跳转指令导致垃圾指令与实际的汇编指令发生冲突,这种情况就不会发生。
 
  但这是否意味着我们需要弄清楚一个条件跳转是否是不透明的呢?不,我们只需检查跳转操作是否与现有的指令相冲突,如果是的话,就对这个指令进行相应的修改,就像我们第一个例子中看到的那样。
 
  DeFlow去混淆算法
  现在,我们知道了如何解决这个问题,下面,我们开始深入研究本人想出的算法,以便对用这种混淆技术处理的内容进行去混淆。

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!