本文为笔者从零基础学习系统安全相关内容的笔记,如果您对系统安全、逆向分析等内容感兴趣或者想要了解一些内容,欢迎关注。本系列文章将会随着笔者在未来三年的读研过程中持续更新,由于笔者现阶段还处于初学阶段,不可避免参照复现各类书籍内容,如书籍作者认为侵权请告知,笔者将立刻删除。强调本系列所有内容仅作为学习研究使用,作者对此文章中的代码造成的任何后果不负法律责任。
前文链接
[系统安全] 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.exe
、VMwareTray.exe
、VMwareUser.exe
。 - 在注册表中也可以看到VMware的相关信息。
- 正常情况下windows不会使用LDT结构,但是vmware会使用。host系统中ldt位置的值位0,而在虚拟机中的值位非零。
- 其他的一些可以实现反虚拟机技术的常用指令包括sidt,sgdt,sldt,smsw,str,in,cpud等。
代码加壳
手动脱壳入门
https://blog.csdn.net/weixin_42172261/article/details/122275587
参考《恶意代码分析实战》