二进制明文字符串加密:还原与反还原

news2024/11/15 18:01:19

背景

上一篇文章中介绍了xorstr的原理和最小化验证概念的代码,这篇文章来看下这种已经被广泛应用于各恶意样本以及安全组件中的技术如何还原,如果还没看上篇建议先看下了解其实现后再看本篇文章

xorstr的现状

随着相关技术的应用越来越广,各种攻击样本都用上了这一工具,威胁样本分析变得越来越耗时。这就是为什么需要一个对抗上述混淆技术的还原工具的原因,两个开源的还原工具flare-floss和AntiXorstr,工具的应用让这种二进制隐藏的字符串还原难度大幅降低

还原方案分析

flare-floss是mandiant公司开发并开源出来的针对病毒分析的自动化二进制字符串启发式查找工具,针对此类加密方式flare-floss提供了两种还原逻辑(stack string & tight string),两者基于不同的假设,但都可以用来处理上述加密,下面给出他的实现原理的简要分析摘要

stack string:flare-floss的这种还原方式基于一种非常宽的假设,即这种字符串必须基于栈,在栈上构造并解密。所以他使用模拟执行的方式对每个函数逐汇编代码的进行模拟执行,并在遇到函数调用指令时对当前栈进行全dump,最后使用字符串明文算法在dump中查找疑似的明文字符串,保存结果。

由于其假设过宽,致使其几乎拥有对当前开源的xorstr类似项目拥有100%的覆盖率,但过宽的假设导致大量的误报,对安全分析来说过多的垃圾信息反而干扰了正确的判断,这个误报在其代码中特别标注为“don’t run this on functions with tight loops as this will likely result in FPs”

floss-stack stringfloss-stack string
覆盖率优+
绕过难度优+
误报率差-
精确性差-

tight string:而flare-floss为了解决上述解决方案过宽假设带来的大量False Postive的问题,在去年更新了floss2加入tight string还原模式,这种模式基于这样的假设:存在栈加密字符串的函数存在一个循环Block块,这个Block块出去时栈为解密状态,也即他瞄准的时上述代码中的decrypt内联函数部分,decrypt中的for循环结构即为tight string关注的循环Block,而他也从每个函数调用转为每个循环block出口时对函数栈进行dump并搜索明文字符串

floss-tight stringfloss-tight string
覆盖率优-
绕过难度中+
误报率中+
精确性差-

AntiXorstr:去年写这个工具的时候并没有关注到floss项目因此实现的逻辑和他完全不同。区别于tightstring对decrypt特征的关注,该工具关注的是类构造函数。基于这样的假设:“栈加密字符串的加密数值必须是编译期计算出来的”。工具会对函数的栈进行预分析,并对栈进行立即数染色,被非0立即数染色过的联通区域标记为高可疑区域,并在后续的模拟执行过程中关注此类区域的读写并输出结果

AntiXorstrAntiXorstr
覆盖率中+
绕过难度优-
误报率优+
精确性优+

tight string的绕过

在对floss的tight string逻辑分析的过程中发现他的假设实际上并非是栈字符串的必须的,但确实是当前几乎所有开源的实现一定会存在的特征,即解密函数流程图中表现为环的形式。所以对floss-tight string的绕过即实现一个不会成环的字符串解密函数。首先我们先看下当前常规字符串的解密逻辑的反汇编流程图特征,demo如下

在这里插入图片描述

这里的loc_1400010A0即为一个循环的Block,Block中的代码就是for循环中解密原始数据的decrypt函数的汇编码。这里让decrypt函数内部不生成循环即可实现对此还原方式的绕过,那么如何消环呢?这里用模板编程的思路去考虑一下,可以把循环使用模板递归展开的方式在编译期给消除掉,最终需要的效果如下

__forceinline char* decrypt()
{
    for (auto index = 0; index < N; index++)
    {
        encBuffer[index] -= 1;
    }
    return encBuffer;
}

//N = 5
__forceinline char* decrypt_noloop()
{
    encBuffer[0] -= 1;
    encBuffer[1] -= 1;
    encBuffer[2] -= 1;
    encBuffer[3] -= 1;
    encBuffer[4] -= 1;
    return encBuffer;
}

剩下就是如何使用C++模板生成decrypt_noloop代码,使用递归展开的方式生成并对N=0做个特化终止即可消除loop环,并且还有一些细节这里限于篇幅不做展开,实现DEMO已开源:xorstr_s.h

测试demo

void test()
{
    printf(Enc("Samsung\n"));
    wprintf(Enc(L"Apple\n"));
    printf(Enc("Xiaomi\n"));
    wprintf(Enc(L"Oppo Group\n"));
    printf(Enc("vivo\n"));
    wprintf(Enc(L"Transsion\n"));

    std::cout << Enc("Honor") << std::endl;
    std::wcout << Enc(L"Realme") << std::endl;
    std::cout << Enc("Motorola") << std::endl;
    std::wcout << Enc(L"Huawei") << std::endl;
    std::cout << Enc("Others") << std::endl;
}

测试结果:STACK & TIGHT 绕过,DECODED模式还原出一部分

 ─────────────────────
  FLOSS STACK STRINGS
 ─────────────────────

 ─────────────────────
  FLOSS TIGHT STRINGS
 ─────────────────────

 ───────────────────────
  FLOSS DECODED STRINGS
 ───────────────────────
Samsung
Apple
Xiaomi
Oppo Group
vivo
Transsion
Honor

更鲁棒的绕过策略

上述通过详细分析floss还原策略写的xorstr_s似乎显得不是很鲁棒,仅仅针对一个开源的工具去实现定制化的绕过方案显得成本过高,那么是否有更鲁棒的反还原方式呢,暂时有两种方式,其中一种的核心原理是:”基于堆的明文展开“,使得Floss这样对堆明文做监控的模式彻底失效。

读过上一篇文章的应该可以知道栈中保存了字符串密文,但并不是一定要就地解密,完全可以对栈数据只读而解密后的明文写入堆中,并利用临时对象的析构函数完成堆的释放即可。实现DEMO已开源:xorstr_h.h,测试FLOSS的效果如下

FLOSS STACK STRINGS
 ─────────────────────
o]QOIR[6<
}<L<L<P<Y<6<<<
dU]SQU6<
s<L<L<S<
<{<N<S<I<L<6<<<
JUJS6
h<N<]<R<O<O<U<S<R<6<<<
tSRSN
n<Y<]<P<Q<Y<<<
qSHSNSP]<
t<I<]<K<Y<U<<<
sHTYNO<

 ─────────────────────
  FLOSS TIGHT STRINGS
 ─────────────────────

 ───────────────────────
  FLOSS DECODED STRINGS
 ───────────────────────
o]QOIR[6<

测试结果:Floss所有模式下的绕过

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1125942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新咸鱼签名JS逆向分析教程

本章教程,主要分享一下咸鱼H5网页端sign签名算法。 案例地址:https://h5.m.goofish.com/item?id=744640763988 程仅供参考,请勿滥用,由此带来的法律责任,需由自己承担。 目录 一、参数分析 二、逆向过程

TCmalloc (google开源项目核心部分模拟实现)

1什么是内存池 1.1池化技术 所谓“池化技术”&#xff0c;就是程序先向系统申请过量的资源&#xff0c;然后自己管理&#xff0c;以备不时之需。之所以要申请过 量的资源&#xff0c;是因为每次申请该资源都有较大的开销&#xff0c;不如提前申请好了&#xff0c;这样使用时就…

橙河网络:国外问卷调查赚钱的项目可靠吗?

国外问卷调查项目是可靠的&#xff0c;是一个长期稳定的互联网项目。 大家好&#xff0c;我是橙河网络&#xff0c;今天聊一聊国外问卷调查赚钱的项目可靠吗&#xff1f; 在海外地区&#xff0c;很多公司和机构&#xff0c;它们为了收集一些关于产品和服务的消费者意见&#…

读懂Json文件[妈妈再也不用担心我不读懂了]

第一次见到它&#xff0c;我特别害怕&#xff0c; 很大一个文件&#xff0c;还是二进制的&#xff0c;是什么意思呢&#xff1f;该文件是深度学习模型训练完成之后由模型的输出数据保存的结果数据&#xff1b; 在线JSON编译器 JSON Editor Online 把文件传上去&#xff01; …

React-native-camera 在小米手机上拍照查看闪退

场景&#xff1a;为实现可拍照和录像的相机用react-native-camera这个库手写一个相机&#xff0c;发现了拍出来的图片在小米10上查看闪退 根据手机后台捕获的错误信息是什么玩意太大了&#xff08;之前还以为是图片显示组件的问题&#xff09; 改进&#xff1a;相机吊起的时候…

unity中使用protobuf工具将proto文件转为C#实体脚本

unity中使用protobuf工具将proto文件转为C#实体脚本 介绍优点缺点Protobuf 为什么比 XML 快得多&#xff1f;Protobuf的EncodingProtobuf封解包的过程通常编写一个Google Protocol Buffer应用需要以下几步&#xff1a; Protostuff是什么Protobuf工具总结 介绍 protobuf也就是G…

第三章Maven依赖的特性-基础篇

文章目录 Maven依赖核心配置文件pom.xml依赖的范围概念compile 和 test 对比compile 和 provided 对比结论 测试验证 compile 范围对 main 目录有效验证test范围对main目录无效验证test和provided范围不参与服务器部署验证provided范围对测试程序有效 依赖的传递概念传递的原则…

计算机体系结构实验三-缓存一致性

最近在看CMU15-418&#xff0c;LECTURE10-11就是讲两个缓存一致性协议&#xff0c;刚好这部分内容在实验中学习过&#xff0c;在实验中监听式协议提到的是MSI协议(modified&#xff0c;shared&#xff0c;invalid)&#xff0c;lecture中还讲了优化的版本MESI(应该是实际使用的协…

pytorch 入门 (四)案例二:人脸表情识别-VGG16实现

实战教案二&#xff1a;人脸表情识别-VGG16实现 本文为&#x1f517;小白入门Pytorch内部限免文章 参考本文所写记录性文章&#xff0c;请在文章开头注明以下内容&#xff0c;复制粘贴即可 &#x1f368; 本文为&#x1f517;小白入门Pytorch中的学习记录博客&#x1f366; 参…

CSMM软件能力成熟度评估

CSMM认证&#xff0c;又称为“软件能力成熟度评估”&#xff0c;也有地方称为“CSMM软件能力成熟度模型评估国家标准认证”&#xff0c;也被民间喊作“中国版CMMI认证”。该标准于2021年6月8日发布&#xff0c;是我国自主标准&#xff0c;适合中国国情以及中国软件企业的特点。…

2023腾讯云服务器价格表(轻量/CVM/免费/GPU)

腾讯云服务器租用价格表&#xff0c;轻量应用服务器、云服务器CVM、免费云服务器申请和GPU云服务器配置报价&#xff0c;轻量2核2G4M价格108元一年、2核4G6M带宽159元一年、4核8G10M优惠价425元一年、8核16G14M优惠价1396元一年、16核32G20M价格2775.99元一年&#xff0c;云服务…

Cesium冷知识:API中显示私有方法

在Cesium.js源码中&#xff0c; 某些类或方法的注释中含有private这个“私有”标识 会导致不会在API文档中显示 &#xff08;这是jsdoc的规范&#xff09; 解决方法&#xff1a; Ceisum.js 1.110.0版本的解决方案&#xff1a; 在gulpfile.js中的buildDocs方法中&#xff0…

vscode Coder Runner 运行C++

1. 设置Code Runner 2. 防止输入读不到&#xff0c;把在终端运行勾上。 3. 设置minw/bin的环境变量 安装mingw教程&#xff1a;https://blog.csdn.net/fancy_male/article/details/133992000 4. 见图

ArGIS Engine专题(15)之GP模型在地图服务与地图服务之间实现叠置分析

前一篇文章已经介绍过导入要素范围与地图服务的叠加分析,相当于单要素与多要素之间的分析,这篇文章介绍地图服务与地图服务之间的叠加分析,即是多要素有多要素之间的相交分析,功能基本类似。 一、结果预览 二、需求简介 以下是一些常见的业务场景: (1)空间规划和土地…

淘宝商品详情API接口(H5端和APP端),淘宝详情页,商品属性接口,商品信息查询

一、接口参数说明&#xff1a;提取淘宝商品详情页各项数据&#xff0c;包含skuid、价格、收藏数、加购数、月销售量、主图、标题、详情页图片等页面上可以看奥的数据都可以拿到。 点击获取key和secret 二、使用场景 1、商品销售情况分析&#xff0c;根据销量调整活动方案&am…

【linux系统】如何在服务器上安装Anaconda

文章目录 1. 安装Anconda1.1. 下载Anaconda安装包1.2. 安装Anaconda1.2.1. 点击回车&#xff08;Enter&#xff09;1.2.2. 添加环境变量1.2.3. 激活环境变量 1.3. 检查是否安装成功 2. Anaconda安装pytorch2.1. 创建虚拟环境2.2. 激活(进入)虚拟环境2.3. 安装pytorch 1. 安装An…

51单片机实现换能器超声波测水深

一&#xff0c;超声波换能器定义&#xff1a; 定义1&#xff1a;可把电能、机械能或声能从一种形式转换为另一种形式的能的装置。 所属学科&#xff1a;测绘学下的测绘仪器。 定义2&#xff1a;能量转换的器件。在水声领域中常把声呐换能器、水声换能器、电声换能器统称换能器。…

电脑出现vcomp140.dll错误,五种解决办法分享

电脑出现由于找不到 vcomp140.dll 无法继续执行代码的问题&#xff0c;通常是因为系统缺失了 Microsoft Visual C 2015 Redistributable 导致的。为了解决这个问题&#xff0c;您可以尝试以下 5 个解决方案&#xff1a; 方案1&#xff1a;使用dll修复工具&#xff1a;下载vcomp…

【图灵诸葛】jvm笔记

2023年10月23日14:04:44 jvm 1.jdk体系结构图回顾(Av333129672,P1) jdk jre 底层是hotspot jvm 2.java虚拟机内部组成(Av333129672,P2) 堆 方法区 执行引擎 类加载 本地方法栈 线程栈&#xff08;虚拟机栈&#xff09; 3.java虚拟机栈讲解(Av333129672,P3) 程序计数器&#xf…

Python自动化测试框架之unittest使用详解!

这篇文章主要介绍了Python接口自动化浅析unittest单元测试原理,文中描述了单元测试&#xff0c;unittest模块特性、大致流程、源码及实战例子这几个模块&#xff0c;有需要的朋友可以借鉴参考下 以下主要介绍unittest特性、运行流程及实际案例。 一、单元测试三连问 1、什么是…