开发软件的人都知道这个世界上没有破解不了的软件,只有不值得破解的软件。换而言之,只有软件的破解成本超过Hacker收益,软件资产才是相对安全的。Android平台以其免费和开源的特性占据了移动应用领域半壁江山,但也因其应用很容易被逆向破解获取源码,导致它成为Hacker最喜欢攻击的一个“靶子”。
那么如何才能保护自己开发APP不被逆向破解呢?在道高一尺魔高一丈的网络安全攻防对抗中,防逆向保护技术也在不停更新演进,笔者在这里梳理了几个关键时期的防逆向保护技术,让大家对APP防护有一个更好理解。
启蒙阶段——防逆向保护始于代码混淆技术
这个时期最大特点是,从未能登上大雅之堂的代码混淆技术,摇身一变成为了防逆向保护唯一有效的技术。这要从1995年JAVA语言横空出世说起,它让人们在享受跨平台便利运行的同时,由于其天生易反编译特性,也让传统针对机器码的安全保护一夜之间变得毫无用处。
从此,那个曾经被唾弃的代码混淆技术开始逐渐被人所重视。从Android 2.3开始,Google在SDK中加入了一款叫ProGuard代码混淆工具,通过它可混淆JAVA代码。
ProGuard混淆后DEX文件截图
从上图就可以看到,代码混淆之后左侧的类名大多都变成了a、b等自定义字母,虽然机器执行起来的逻辑是一样的,但增加了黑客人为分析的难度和时间成本。从某种程度上来说,代码混淆技术很好的保护JAVA源代码,但这种方式也只是简单的改变类名或者变量名,黑客只要找到DEX文件,反编译也就是时间问题了,就看时间成本是否超过黑客收益。
发展阶段——DEX加密技术成为应用防护中流砥柱
随着Android反编译技术越来越纯熟,即便代码混淆技术做到native层,也是治标不治本。为了解决代码混淆技术存在弊端,越来越多的人采用DEX整体隐藏和DEX函数抽取加密来保护自己代码安全,例如梆梆安全等厂商早期加固产品用的就是这个技术。
1. DEX文件整体加密
对DEX文件进行整体加密,与壳APK进行合并得到新的DEX文件,然后替换壳程序中的DEX文件即可得到新的APK。新APK运行时将加密后DEX 文件在内存中解密,并让 Dalvik虚拟机动态加载执行。
DEX文件整体加密能够对抗静态分析,但也存在一定缺陷。该技术对DEX文件进行整体加密、解密操作,运行时在内存中存在连续完整的代码。通过修改Dalvik虚拟机就有可能通过内存Dump的方式获得解密后的代码。虽然开发者可以采取一些 patch 的方法来增加破解难度,例如类加载结束后,抹掉或者混淆内存中 DEX 文件的头部或尾部信息,但这些方法也无法从根本上解决内存 Dump 的问题。
2. DEX函数抽取加密
为解决DEX文件整体加密可以被内存 Dump这个弱点,DEX函数抽取加密技术对代码中每个方法抽取进行单独加密。JAVA 虚拟机在第一次执行某个方法前,才开始加载这个方法的代码。利用这个机制将解密操作延迟到某个方法在执行之前才对该方法进行解密,并且解密后代码在内存中是不连续存放。例如通过抽取Dalvik虚拟机运行一个DEX必不可缺少DEXCode中的部分,然后对字节码指令添加nop,这种方式大大增加代码安全性。
加密前后DEX 文件中的代码对比
这种加固技术的主要优点在于:
加密粒度变小,加密粒度从DEX 文件级别变为方法级别;
按需解密,解密操作延迟到某个方法在确实要执行之前才触发,如果方法不被执行,则不被解密;
内存不连续,避免了内存 Dump的问题,极大提高安全性。
巅峰阶段——VMP加固成为防逆向保护“终极大招”
DEX函数抽取加密解决了内存被Dump问题,但是本质上这也是一种代码隐藏技术,最终代码还是通过Dalvik或者ART 虚拟机进行执行。因此,破解者可以构建一个自己修改过的虚拟机来脱壳。这就需要寻求更加强大、安全的防逆向技术来保证 APK 的安全。虚拟机软件保护技术(VMP)成为了当下最前沿移动应用安全加固技术。
VMP首先会对被保护的目标程序核心代码进行“编译”,将由编译器生成的本机代码(Native code)转换成效果等价的byte-code,然后将控制权交虚拟机,由虚拟机来执行控制。VMP最关键技术是需要自定义一套虚拟机指令和与之对应解释器,然后将标准指令转换成自己指令,由自定义解释器解释执行指令。
这样即使破解者拿到自定义的字节码也毫无意义,除非能够逆向破解自定义的虚拟机解释引擎。除此之外,VMP 还可以构建多个不同虚拟化解释引擎,不同的JAVA方法采用不同的虚拟化执行引擎,这就进一步提高了应用的安全性。
虽然现在市场上有相当一部分厂商都发布了针对移动应用VMP保护方案,但其实有很多厂商采用都是代码混淆或者代码隐藏技术。笔者认为拥有一套高质量的自定义指令集和解释器是判断VMP技术真伪唯一标准。而了解,目前在国内安全厂商中只有梆梆安全等公司在VMP技术上发展相对成熟。
写在最后:
任何安全技术变迁都是一部历史,移动应用安全发展也是如此。从某种程度上来看,Android应用防逆向技术演化史基本等于移动应用安全进化史。例如国内首个提出“应用加固”概念的梆梆安全,其加固技术也是从早期代码混淆技术演化到当前最先进虚拟机保护技术。
安全的攻与防是一个永恒话题,也是一个动态螺旋式发展过程,开发者需要不断提高自己安全意识和安全技能,才能更好应对各种层出不穷安全问题。
本文转自d1net(转载)
题库来源:安全生产模拟考试一点通公众号小程序2021年焊工(初级)考试为正在备考焊工(初级)操作证的学员准备的理论考试专题,每个月更新的焊工(初级)最新解析祝您顺利通过焊工(初级)考试。1、【判断题】P是硫的元素符号,S是磷的元素符号。(×)2、【判断题】()合理的配制药皮成分,焊接时还能改善熔渣的脱渣性和减小发尘量。(√)3、【判断题】铁碳合金缓慢加热到八1线温度,珠光体转变为奥氏体。(√)4、【判断题】焊工职业守则重要内容之一是在生产过程中,应严格执行焊工...
整合MyBatis和SpringData JPA一、整合MyBatis步骤1. 配置数据源相关属性2. 数据库建表department表:id department_Nameemployee表:id lastName gender d_id3. 创建JavaBean对象Department:加上get,set方法public class Department { private Integer id; private String departmentName;}
前端工程与性能优化 · Issue #3 · fouber/blog https://github.com/fouber/blog/issues/3
谁是卧底是一款适用于4-16人的派对游戏。每个人都有不同的身份,好人们努力的描述自己的词语,既让队友知道明白,又不能让卧底发现真正的词语;卧底努力去掩盖自己,伪装成一个好人;更有空白傻傻分不清楚,凭借别人的只言片语去猜测那个隐藏的卡牌。 应用简单易用,一台机器安装就可以让所有人都玩上游戏,更有机器智能判断,让所有人都参与到游戏当中。从此吃饭/聚会的时候大家不再低头玩手机,一款小小的游戏也能拉近彼此...
SBP_ORG_DEPT表结构如下:MySQL用函数 也可解决这种需求问题。group_concat 不适用数据较多的时候。函数getParentNodesFromChildNode如下所示(在MySQL数据库中新建函数):CREATE FUNCTION `getParentNodesFromChildNode`(rootId varchar(1024),sbp_org_dept varchar(...
http://www.emtronix.com/article/article2010352.html1. 进行嵌入式开发必须弄懂ARM汇编指令集吗? 书店里有很多入门级的书,第一章不是介绍ARM指令集,就是介绍ARM的CPU资源,这给很多初学者一个很不好的直观感觉,就是学习ARM一定要把汇编语言和CPU资源搞明白。然而,这两个方面,没有实际的去做一下,只是纸上谈兵,怎么
一、简介博客参考将主要分析Object 是用来干嘛的。它是 .NET Framework 中所有类的最终基类;它是类型层次结构的根。不管是系统定义的类型还是自定义的类型,都必须从Object派生。参考:网站1、微软官网https://docs.microsoft.com/zh-cn/dotnet/api/system.object?redirectedfrom=MSDN&vie...
oracle 字符串日期 作为 where 条件比大小select * from 表名 WHERE TO_DATE(str_DATE, 'yyyy/MM/dd') >= TO_DATE('2014/10/18', 'yyyy/MM/dd');
有这样的一个需求: 有用户看广告的数据,userid、date、timestamp,现在要求每个用户当前观看广告距离上次多长时间。如果我们能计算好每个广告行为距离上次发生该事件的时间差,我们就可以实现,基于频繁刷广告的行为进行反作弊。 思路: 先按userid,timestamp进行排序,不能进行groupby(userid).sort()。必须userid在前先...
微信公众号【程序员江湖】作者陆小凤,985 软件硕士,阿里 Java 研发工程师,在技术校园招聘、自学编程、计算机考研等方面有丰富经验和独到见解,目前致力于分享程序员干货和学习经验,同时热衷于分享作为程序员的一些成长心得和生活感悟。关注后在后台回复“资料”即可领取3T免费技术学习资料(包含...
以为在做公司项目,所以当然有开发环境和生产环境。我们公司使用 Jenkins来实现自动部署,将 Jenkins 生成的 docker部署到AWS上.我们项目使用supervisor来启动服务。但是由于同一个项目要做开发环境进行开发测试,然后再能部署到生产环境,而且我们公司的开发环境和生产环境是物理隔离的,所以必须要有两套不一样的环境。查了很久 最终还是在官网上查到了配置方法。(不过官网...
##cloudera官网:https://docs.cloudera.com/##cm环境要求说明:https://docs.cloudera.com/documentation/enterprise/release-notes/topics/rn_consolidated_pcm.html#TLS_Security_Versions_Table##cm下载地址:http://archive.cloudera.com/cm5/cm/5/搜索: cloudera-manager-.