当前位置: 首页 > news >正文

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

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

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

文章目录

  • 静态角度——对抗反汇编
    • 线性反汇编
    • 面向代码流反汇编
    • 对抗反汇编
  • 动态角度——反调试
    • 使用windows api探测
    • 手动检测数据结构
    • 系统痕迹
    • int指令扫描
    • 执行代码校验和检查
    • 时钟检测
  • 动态角度——反虚拟机
    • VMware痕迹
  • 代码加壳
    • 手动脱壳入门

静态角度——对抗反汇编

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

线性反汇编

线性反汇编策略是遍历每一个代码段,根据二进制码进行反汇编,缺点是不会区分某个二进制码是数据还是指令,全部按照指令来反汇编。其中的一种对抗方法是植入多字节指令机器码,比如标准本地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

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

相关文章:

  • 二十三、Hive本地模式安装
  • Spring Cloud Alibaba — 0、服务架构演变
  • 实战 - AES对称加密算法加密和解密设备联动码
  • IDEA统计项目代码量
  • 图像处理:推导五种滤波算法(均值、中值、高斯、双边、引导)
  • 【光学】基于matlab GUI双缝干涉和牛顿环【含Matlab源码 2165期】
  • 合宙AIR32F103CBT6刷回CMSIS-DAP固件以及刷ST-LINK V2-1固件方法
  • 【操作系统】volatile、wait和notify以及“单例模式”基础知识
  • java自定义注解防重提交
  • 4-Arm PEG-Aldehyde,4ARM-PEG-CHO,四臂-聚乙二醇-醛基修饰蛋白质用试剂
  • C语言预处理、宏定义
  • Flink 成长之路专栏 - 导读目录
  • 软考高级系统架构设计师系列论文五十:论SOA在企业集成架构设计中的应用
  • spring boot企业网站设计与实现毕业设计源码211750
  • springboot基于JavaWeb的疫苗接种管理系统-JAVA.JSP【数据库设计、毕业设计、源码、开题报告】
  • 【翻译】babel对TC39装饰器草案的实现
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • gulp 教程
  • JS学习笔记——闭包
  • k8s 面向应用开发者的基础命令
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Python语法速览与机器学习开发环境搭建
  • 包装类对象
  • 初探 Vue 生命周期和钩子函数
  • 基于遗传算法的优化问题求解
  • 警报:线上事故之CountDownLatch的威力
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • NLPIR智能语义技术让大数据挖掘更简单
  • scrapy中间件源码分析及常用中间件大全
  • Spring Batch JSON 支持
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​iOS安全加固方法及实现
  • #laravel 通过手动安装依赖PHPExcel#
  • #Linux(帮助手册)
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (二)正点原子I.MX6ULL u-boot移植
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)fock函数详解
  • (转)Linq学习笔记
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET正则基础之——正则委托
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • /dev下添加设备节点的方法步骤(通过device_create)
  • :=
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [51nod1610]路径计数