知物由学 | SO VMP 加壳与混淆,为移动应用提供函数级保护

news2024/11/18 5:26:43

导读:VMP 是一种用于软件保护的软件,对软件进行加壳,加固厂商都有自己的 VMP 方案,但值得注意的是,native 层的 VMP 方案并不成熟,兼容性只是其中一个影响因素,性能更是导致该方案无法普及的重要原因之一。

文 | 吴政

网易易盾

1.前言

随着智能手机的兴起,Android 应用逐渐普及,而破解、二次打包等恶意行为在 Android 端屡见不鲜,移动应用安全越来越受到大家的重视。为了解决应用安全问题,各大加固厂商对外提供安卓加固服务,在一定程度上对抗掉一部分黑灰产行为,以保障应用开发商的权益。

但随着 xposed、magisk、frida、unidbg 等工具的普及,对抗难度日益增加,开发者近年来逐渐将重要代码转到 native 层开发,让逆向分析的难度加大。

VMP 是一种用于软件保护的软件,对软件进行加壳,通过这个软件保护的代码部分在虚拟机上执行,能最大程度保护代码不被分析和破解。当前,加固厂商都有自己的 VMP 方案。但值得注意的是,native 层的 VMP 方案并不成熟,兼容性只是其中一个影响因素,性能更是导致该方案无法普及的重要原因之一。

2.强度分析

从保护强度的角度来看,native+VMP 是目前最强的代码保护策略。然而,目前商用的 native 层 VMP,几乎都是基于 llvm 实现 ir VMP,且针对源码,无法直接作用于 SO。而让外部相对熟悉的二进制 VMP 保护方案是 Windows 平台的 VMProtect。网络上更有不少针对 VMPortect 的分析文章,甚至有一些低版本的脱壳教程,但因为加壳软件的定期更新,低版本“脱壳”黑产工具的可用性几乎为零,加壳的强度得到保证,让大量逆向工程失效。

3.性能分析

从性能的角度看,dex VMP 对性能的损耗在十几倍左右,而 ir VMP 要比 dex VMP 性能损耗高达几十倍。而这些损耗都是在自定义解释器在解析执行虚拟机代码造成的。如直接对汇编指令虚拟化,性能损耗可达成百上千倍。

下面是基于已知的加固方案进行的测试,且针对特定的代码逻辑构造的性能测试对比数据。

在这里插入图片描述
在这里插入图片描述

可以看出基于汇编的 VMP 方案,因每条指令都需要进行解析执行,性能损耗极高。但因测试代码本身的构造方式具有特殊性,构造了将近 10 亿次循环,并在循环内做运算和函数的调用。因此此类几乎属于极端情况。

如果受保护的代码只执行一次,即使增量上百倍,总增量只是增加一个固定值。如果保护代码是在循环体中执行,那执行时间将成倍增加。由此可知,无论选取哪一种保护方案,都不建议保护高频调用的函数。

4.方案优化

上述方法在强度和兼容性上难以两全,带来一定损失。有人要问,是否有一种方法既可提高保护强度,又能兼顾效率呢?

答案是有的。从另一个角度来讲,VMP 是一种高强度的混淆,只不过混淆规则是指令格式,最终均需要执行指令的语义,保证程序的正确运行。VMP 本身遵循一种规律执行代码,但从代码保护的角度,只使用一种高强度保护策略,其本身不如多种随机化的保护方案来得有效。即使 VMP 做得很强,如果一成不变,最终还是有被修复的可能,只是时间成本不同。.

易盾在研究二进制加固的过程中,提出一种指令混淆的方案,结合 VMP,最大程度的保护代码强度,同时兼顾代码的运行效率。

在这里插入图片描述

当然,混淆之后的代码也降低了代码的易读性,建议接入该功能的开发者,对保护的函数做好充分的单元测试,避免因自身代码崩溃导致无法正常排查。同时,单元测试也可以更好地验证加固后代码执行的正确性。

5.保护效果对比

只做 SO 加固,能对抗静态分析,动态 dump 出来的 SO,即使有缺陷,还是可以分析指令。
在这里插入图片描述

混淆后,从被保护的函数可见代码已被抽空加密,且跳转地址处的指令被混淆,能够分析指令执行流程,在没有获取和还原所有混淆代码前,无法知道原函数真实的调用逻辑。

在这里插入图片描述

VMP 后,被保护的函数可以看出代码已被抽空,跳转地址是虚拟机逻辑,除非破解虚拟机逻辑,否则函数逻辑无法还原。

在这里插入图片描述

易盾 native 层代码保护基于无源码方案进行实现,客户只需要提供需要保护的函数列表就能直接对函数进行保护。另外,如果 SO 是 release 版本,可以提供编译过程中生成的带符号版本的 SO,方便定位受保护的函数范围。功能选择可以遵循以下两大原则:

○ 重要函数可进行 VMP 或混淆。

○ 高频调用函数尽可能使用混淆。

因保护方式基于指令,理论上 SO VMP 的混淆和 VMP 不仅仅适用于 Android,只要架构相同,对应的 linux 环境下的可执行文件和 SO 文件都可以使用该加固方案进行保护。

最后,没有绝对的安全,任何应用软件都有被破解的风险,但可以肯定的是,加壳以后肯定比不加壳要更安全,软件加壳后破解难度会增加。如果应用软件发布到市场上,那些想从你应用上获取漏洞点的黑灰产们,肯定要分析应用的代码,进行包括内购破解,加广告在内的恶意行为,损害用户使用体验的同时,致使开发商遭受商业损失。此外,开发者有核心的算法不想被友商分析,这个时候代码保护就比较重要,当然代码保护手段很多,加壳是其中一项。Android 系统和 PC 端的攻防是动态的对抗,技术一直在进步,易盾也将持续跟进。

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

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

相关文章

2022年广西最新建筑八大员(材料员)模拟真题及答案

百分百题库提供建筑八大员(材料员)考试试题、建筑八大员(材料员)考试预测题、建筑八大员(材料员)考试真题、建筑八大员(材料员)证考试题库等,提供在线做题刷题,在线模拟考…

C++仍然是2023年值得学习的好语言吗?

如今所有学习C的人都不得不面临一个问题,即C已经大大失去了它受欢迎程度。它同时被三种编程语言所取代 - python,Java和JavaScript。这就引出了一个问题,2023年是否还值得学习C? 如果您学习C是为了在IT领域工作,那么学…

系分 - 软件工程

个人总结,仅供参考,欢迎加好友一起讨论 系分 - 软件工程 考点摘要 信息/软件系统的生命周期(★★)软件开发方法(★★★)软件开发模型(★★★★)逆向工程(★&#xff09…

一步一步改写Observer观察者模式

简单的概述: Observer模式是建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步自动改变。 Observer的结构: Subject相当于…

H5 拖动排序 美食排行榜

尝试写一下拖动元素进行排序,真是想到什么去写什么 😂,有的时候很多人老是跟我说,别人都封装好了,你为什么还要自己去实现一下,写的还没别人好。但我总感觉所有都用别人写好的,就放弃思考的机会…

linux的CPU使用率达到100%的快速定位方式

一.问题现象 Linux服务器(操作系统版本是centos7.9)上面部署了若干Java站点服务,突然收到运维的CPU异常g告警,到了影响业务的情况发生,经初步排查,未出现异常进程,排除挖矿病毒的原因。 二.排查思路 &am…

[Verilog]Verilog经典电路设计(一)

Verilog经典电路设计&#xff08;一&#xff09; 1.1 8位移位寄存器 module shifter (din , clk, clr, dout) ; input din, clk, clr; output [7:0] dout; reg [7:0] dout_data;always (posedge clk) begin if (!clr) dout_data < 8b0; //同步清 &#xff0c;高电平…

第二证券|美国巨头向欧盟宣战,暴跌25%,芯片大国告急

“暴利税”完全激怒美国动力巨子。 3万亿美国巨子直接将欧盟告上法庭&#xff0c;当地时间12月28日&#xff0c;埃克森美孚公司正式申述欧盟&#xff0c;要求其撤销对石油集团征收的一项新“暴利税”。该公司表明&#xff0c;欧盟方面征收“暴利税”的行为超出了法律权限。别的…

蓝牙学习八(配对与绑定)

1.简介 Paring&#xff08;配对&#xff09;和Bonding&#xff08;绑定&#xff09;是实现蓝牙射频通信安全的一种机制&#xff0c;有两点需要注意&#xff1a; Paring/bonding实现的是蓝牙链路层的安全&#xff0c;对应用层来说是完全透明的。也就是说&#xff0c;不管有没有…

GitHub入门指南(下)

三、新手必备的GitHub基本操作 1.配置SSH Key (1) 第一次使用时&#xff0c;要配置一下账户。 在 Git Bash 客户端&#xff0c;输入&#xff1a; git config --global user.name “这里输入你在GitHub的账户名” git config --global user.email “这里输入你在GitHub的注册邮…

基于51单片机的数字电压表(PCF8591)(Proteus仿真+程序)

编号&#xff1a;32 基于51单片机的数字电压表&#xff08;PCF8591&#xff09; 功能描述&#xff1a; 本设计由51单片机最小系统PCF8591模块四路模拟量输入模块一路DA输出液晶1602显示模块 1、主控制器是89C82单片机。 2、PCF8591模数转换器进行A/D转换&#xff0c;读取四路…

Java中常见的文件操作

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 操作文件 File类 属性 构造方法 常见方法 重要方法的操作演示 文件内容的读写 FileInputStream OutputStream 按照字符读入 按照字符写入…

『分分钟玩转VueRouter●中』少开一把王者荣耀掌握VueRouter的基本使用

文章目录一、编程式路由导航二、缓存路由组件三、两个新的声明周期钩子四、路由守卫五、路由器的两种工作模式本篇博客会介绍Vue中的VueRouter的基本使用&#xff0c;编程式路由导航增加了我们进行路由跳转的灵活性&#xff0c;缓存路由组件保障了我们使用路由时的便捷性&#…

【高阶数据结构】搜索二叉树 经典习题讲解

&#x1f308;欢迎来到数据结构专栏~~搜索二叉树 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句…

【OpenFOAM】-olaFlow-算例6- waveFloatingObject

算例路径&#xff1a; olaFlow\tutorials\waveFloatingObject 算例描述&#xff1a; 波浪作用下的浮体的刚体运动&#xff0c;属于流固耦合&#xff08;FSI&#xff09;问题 学习目标&#xff1a; 动网格设置和使用&#xff0c;网格变形控制&#xff0c;浮体的物理参数设置&…

23种设计模式(二)——享元模式【对象性能】

文章目录意图什么时候使用享元享元模式的实现内部状态和外部状态享元模式的优缺点与其他模式的关系亦称&#xff1a; 缓存、Cache、Flyweight 意图 享元模式是一种结构型设计模式&#xff0c; 它摒弃了在每个对象中保存所有数据的方式&#xff0c; 通过共享多个对象所共有的相…

数图互通房产管理系统架构分析

数图互通高校房产管理系统V5.0 使用JAVA、Canvas、H5等技术开发的图形数据交互技术架构平台&#xff1b;本系统满足XX大学房屋管理系统需求&#xff0c;高校房产综合管理信息系统平台V5.0遵循高校房产“分级授权、分类管理、网络化、图形化、精细化、流程化”的管理理念&#x…

关于新冠的几点总结

关于新冠的几点总结一、前言:二、病程阶段1. 第一阶段 反复发热2. 第二极端 退烧虚弱3. 第三阶段 咳嗽嗜睡三、处置措施:1. 思想准备2. 药/物准备3. 退烧方式4. 保持体温5. 通则不痛&#xff0c;痛则不通6. 营养补充7. 恢复关键期写在最后一、前言: 所写内容&#xff0c;为个人…

磊科路由器后门蜜罐捕获的事件分布情况

重点物联网 漏洞利用情况本节我们选取了两个漏洞进行分析。UPnP 相关的漏洞我们将在 4.4.3 进行分析&#xff0c;除去 UPnP 相关漏 洞外&#xff0c;被利用最多的是 Eir D1000 路由器的一个漏洞 [44]&#xff08;CVE-2016-10372&#xff09;&#xff0c;我们将对其进行分析。 …

Apollo浅解2

目录 用户、角色、权限 三者间的关系 权限Permission 新增一个应用时 新增一个命名空间时 角色Role 新增一个应用时 新增一个命名空间时 第三方应用 用户、角色、权限 三者间的关系 apollo也采用经典的三层权限设计&#xff0c;用户关联角色&#xff0c;角色关联权限…