[系统安全] 逆向工程进阶篇之对抗逆向分析

时间:2022-10-15 07:19:14

本文为笔者从零基础学习系统安全相关内容的笔记,如果您对系统安全、逆向分析等内容感兴趣或者想要了解一些内容,欢迎关注。本系列文章将会随着笔者在未来三年的读研过程中持续更新,由于笔者现阶段还处于初学阶段,不可避免参照复现各类书籍内容,如书籍作者认为侵权请告知,笔者将立刻删除。强调本系列所有内容仅作为学习研究使用,作者对此文章中的代码造成的任何后果不负法律责任。

前文链接
[系统安全] PE文件格式详解1
[系统安全] PE文件格式详解2
[系统安全] Windbg Preview调试记录
[系统安全]《黑客免杀攻防》MFC逆向基础实战
[系统安全] windows下C++编写第一个加壳程序
[系统安全] PE文件格式分析实战基础—分析helloworld文件
[系统安全]《黑客免杀攻防》逆向基础之经典脱壳基础
[系统安全] 反病毒与免杀原理概论
[系统安全] 恶意代码分析实战基础之必备知识点和常用工具记录
[系统安全] Windows逆向必备知识、逆向分析小实战
[系统安全] 逆向分析之高级动态分析技术笔记
[系统安全] 系统虚拟化之容器底层原理实验
[系统安全] 万字总结系统虚拟化之容器底层原理实验
[系统安全] malloc的底层原理—ptmalloc堆概述

静态角度——对抗反汇编

反汇编算法主要分为两种:线性反汇编和面向代码流的反汇编算法。

线性反汇编

线性反汇编策略是遍历每一个代码段,根据二进制码进行反汇编,缺点是不会区分某个二进制码是数据还是指令,全部按照指令来反汇编。其中的一种对抗方法是植入多字节指令机器码,比如标准本地call指令有5个字节,以0xE8开头。如果在一个函数开头加上这个字节码,则反汇编器会认为是一个call指令,这条call指令占用了函数开头的4个字节,从而破坏掉要这个完整的函数。

面向代码流反汇编

IDA用的就是面向代码流的反汇编。它检查每一条指令,然后建立一个需要反汇编的地址列表。另外当遇到条件分支时,反汇编器从true或false两个分支处选择一个进行反汇编。大多数面向代码流的反汇编器会首先处理条件跳转的false分支。

对抗反汇编

  • 相同目标的跳转指令
    相同跳转目标到0xE8后,如下所示,这样会跳转到next+1处,但是如果是线性反汇编,那会将E8看成时call指令。解决方法是光标选中E8,按D键设置成数据。
jz next+1
jnz next+1
next:
	E8
	malware-code
  • 固定条件的跳转指令
    跳转条件总是相同,如下代码,反汇编优先处理false分支,这样会执行next后的E8指令
xor eax, eax
jz next+1
next:
	E8
	malware-code
  • 共同引用的字节码,如下图,EB字节作为jmp跳转指令,后面需要FF,而FF C0又是inc eax,反汇编器会破坏掉inc eax指令,处理方法是将EB字节按D键定义为数据。
    [系统安全] 逆向工程进阶篇之对抗逆向分析
  • 滥用ret指令
    如一下代码,call时将返回地址压栈,add时起始就是将返回地址加5,变成了004011CA出的push ebp指令,当ret的时候eip指向了这条指令。但是反汇编器却蒙圈了。
    [系统安全] 逆向工程进阶篇之对抗逆向分析

动态角度——反调试

当恶意代码意识到自己被调试时,可以改变正常的执行路径或者修改自身程序导致崩溃而对抗调试。

使用windows api探测

通过使用windwos提供的api可以判断自己是否正在被调试,比如下面的一些函数,如果在分析的代码中看到这些函数,就说明这个代码样本在检测自身是否被调试

IsDebuggerPresent
CheckRemoteDebuggerPresent
NtQueryInformationProcess
OutputDebugString

手动检测数据结构

PEB结构体中的一些标志会暴漏调试器存在的信息,进程运行时fs:[30h]指向PEB基址

  • BeingDebugged标志位
    通过检查BeingDebugged标志位可以确定自身是否被调试
    [系统安全] 逆向工程进阶篇之对抗逆向分析
  • NTGlobalFlag标志位
    调试器启动进程和正常模式下启动进程不同,创建的内存堆方式不同,使用PEB中偏移量0x68处值来判断如何创建堆结构。如果是0x70则在被调试中。

系统痕迹

当然就是查看注册表了。

int指令扫描

扫描内存中代码段中是否有0XCC字节,如果有的话说明是调试器下的断点。代码编写者自己插入int 3或者int 2D指令,当调试者调试时可以混淆其中断操作。

执行代码校验和检查

对代码求哈希,和硬编码的哈希值比较

时钟检测

被调试时,进程运行速度大大降低,可以利用代码执行时间间隔来判断是否被调试。可以使用rdtsc指令获取从开机到当前的时间间隔,两次调用做差得到代码执行时间。

动态角度——反虚拟机

VMware痕迹

  • 安装了VMware Tools的主机里有三个进程VMwareService.exeVMwareTray.exeVMwareUser.exe
  • 在注册表中也可以看到VMware的相关信息。
  • 正常情况下windows不会使用LDT结构,但是vmware会使用。host系统中ldt位置的值位0,而在虚拟机中的值位非零。
  • 其他的一些可以实现反虚拟机技术的常用指令包括sidt,sgdt,sldt,smsw,str,in,cpud等。

代码加壳

手动脱壳入门

https://blog.csdn.net/weixin_42172261/article/details/122275587

参考《恶意代码分析实战》