说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Andorid APK反逆向解决方案:梆梆加固原理探寻

HTML文档下载 WORD文档下载 PDF文档下载
Android市场充斥着大量的盗版软件,让“如何使程序代码免受盗版篡改”成为开发者面临的头等大事。通过梆梆加固对App进行加固保护,可有效防止应用在运营推广过程中被破解、盗版、二次打包、注入、反编译等破坏。

目前Android市场充斥着大量的盗版软件,开发者的官方应用被“打包党”们恶意篡改。如何使程序代码免受盗版篡改就成了开发者面临的头等大事,今天我们将分析一个不错的解决方案——梆梆加固


梆梆加固

通过对App进行加固保护,梆梆可以有效防止移动应用在运营推广过程中被破解、盗版、二次打包、注入、反编译等破坏,保障程序的安全性、稳定性,对移动应用的整体逻辑结构进行保护,保证了移动应用的用户体验。

一、梆梆加固逆向分析过程

首先我们通过对APK加固前后文件结构的比较,来了解梆梆加固对APK文件所做的处理。为了使分析过程足够简单,我新建一个最简单的测试程序,并上传到梆梆加固,整个加固过程大概需要4天的时间才可以完成,这是一个漫长的等待过程。

该测试程序包含了Activity、Service、ContentProvider、BroadcastRecevier四大组件、Application、普通类、Jni调用等7类对象,目的就是全面的了解梆梆的加固效果。

1. apk加固前后静态文件结构及动态运行时对比分析

(1)加固前后静态文件结构变化(左为加固前,右为加固后)


加固后apk新增以下文件:

  • assets\meta-data\manifest.mf  //APK文件列表SHA1-Digest
  • assets\meta-data\rsa.pub        //RSA公钥信息
  • assets\meta-data\rsa.sig         //数字签名文件
  • assets\classes.jar                    //已加密原classes.dex文件
  • assets\com.example.hellojni    //ARM平台二进制可执行文件
  • assets\com.example.hellojni.x86  //x86功能同上
  • libs\armeabi\libsecexe.so        //ARM平台共享库文件
  • libs\x86\libsecexe.so               //x86功能同上

加固后修改文件:

  • AndroidMainfest.xml  //(如果应用配置有Application信息,则该文件加固前后相同,如果应用未配置Application信息,则该文件加固前后不相同,梆梆会配置Application信息为自己实现类)
  • classes.dex

对classes.dex进行反编译,观察代码树结构变化:(左为加固前,右为加固后)

 

(2)加固前后动态运行时变化

运行原程序,系统仅创建一个相关进程,但是加固的程序,系统会为其同时创建三个相关程序进程:


进程启动顺序:597进程创建605进程,605进程又创建了607进程

通过查看maps文件获取597进程映射文件信息:


通过map文件可以看出,597进程为主进程,Android各组件在该进程中运行。

605和607进程并无与apk文件相关文件信息,通过cmdline查看启动参数:

初步怀疑该进程为assets\com.example.hellojni可执行文件运行结果。

2. 梆梆加固保护效果分析

我们通过逆向分析加固后的app,来看看梆梆加固对app的保护效果。

程序代码的第一执行点是Application对象,首先查看TestApplication类对象。


程序的Util类完成大部分的java层逻辑:


ACall类主要完成对libsecexe.so JNI的调用:


查看libsecexe.so文件导出函数,发现所有函数名都经过加密处理,与我们平时jni调用产生的函数名并不同。平时jni产生的函数名应该为这样格式:Java_com_secapk_wrapper_ACall_{函数名}。


抗静态分析:

  • Util类通过MyClassLoader完成对加密classes.jar的动态加载,内存中解密classes.jar,完成动态加载。
  • jni方法对应so函数名的混淆。

抗动态调试: 

  • 当使用IDA动态调试该程序时,程序无法建立连接调试。

梆梆加固可以常用的有效的逆向分析方法。

二、梆梆加固技术实现关键点猜想

1. 如何使DexClassLoader动态加载组件具有生命周期?

根据APK文件是否在AndroidManifest.xml配置Applicaiton信息,梆梆加固会做不同的处理。

通过上传Applicaiton不同配置的APK文件,我们发现:

  • 当APK配置有Applicaition信息时,梆梆加固重写Application类
  • 当APK未配置Application信息时,梆梆加固新建类,并在AndroidManifest.xml中配置自己Application类


因此Applicaiton就是程序的第一执行点。

我们知道DexClassLoader加载的类是没有组件生命周期的,也就是说即使DexClassLoader通过对dex的动态加载完成了对组件类的加载,当系统启动该组件时,还会出现加载类失败的异常。我已经在“Android APK加壳技术方案”中提出了一种使DexClassLoader加载组件类具有生命周期的方法。

运行加固后的程序并通过Mat内存分析工具查看类加载情况:


如上图所示,组件类的加载类已经被修改为com.secapk.wrapper.MyClassLoader类,可以得出结论,该方式和我提出方式基本相同,通过修改系统组件类ClassLoader来实现。

2. 如何混淆native方法在so库函数对应关系?

jni方法注册方式有两种:

  • 通过javah产生函数头,该种方式产生的方法具有固定的格式。该方式使逆向分析人员比较容易获取java层native方法对应的本地方法。
  • 在JNI_OnLoad方法中手动注册jni方法,不易查找对应关系。

使用第二种方式可以实现混淆java层native方法和so函数的对应关系。

#include <string.h>#include <jni.h>JNIEXPORT jstring JNICALL abcdefghijklmn( JNIEnv* env,jobject thiz ){    return (*env)->NewStringUTF(env, "Hello from JNI !");}JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved){	JNIEnv* env = NULL;	jint result = -1;	if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {		return JNI_ERR;	}    JNINativeMethod gMethods[] = {	    { "stringFromJNI", "()Ljava/lang/String;", (void*)abcdefghijklmn },    };	jclass clazz = (*env)->FindClass(env, "com/example/hellojni/HelloJni");		if (clazz == NULL) {		return JNI_ERR;	}	if ((*env)->RegisterNatives(env, clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < 0){		return JNI_ERR;	}	/* success -- return valid version number */	result = JNI_VERSION_1_4;	return result;}

以上代码中的字符串都是明文(比如“stringFromJNI”),如果这些文明字符串都换成密文的话,再通过运行时解密,相应的对应关系更不易看出。

3. 如何使DexClassLoader加载加密的dex文件?

虽然不了解梆梆加固是怎么做的,不过通过分析它的运行逻辑,我推测了一种可行的实现方案:了解该方案需要对Android DexClassLoader的整个加载流程需要有清晰的了解。

首先推断assets\classes.jar是一个加密的jar包。正常的DexClassLoader加载的流程如下:会有一个DexOpt产生odex过程。但是梆梆加固后的应用DexClassLoader加载过程并没有该过程的log信息。


推断加密的jar包里面含有odex文件,如果不是odex文件的话,DexClassLoader肯定会在运行时释放未加密的odex文件到目录,这样的话被保护的逻辑也就泄露了。

DexClassLoader加载过程会在java层和C层产生不同的数据结构,java层并没有实质性的数据,所有的数据都在c层,我们可用通过底层代码完成dex数据的解析。底层dex分析是可以支持byte[]数组的,解密odex数据,传递过去就行了。这样java层就可以调用了。

以下是大概伪代码实现步骤:

int loadDex(char * dexFileName){char *dvm_lib_path = "/system/lib/libdvm.so";void * handle;DvmGlobals gDvm;handle = dlopen( dvm_lib_path, int mode);

  • 读取dexFileName文件内容并解密到byte数组。

调用dexFileParse函数解析byte数组为DexFile

\dalvik\libdex\DexFile.c

DexFile* dexFileParse(const u1* data, size_t length, int flags)//dlsym(handle, "dexFileParse");

  • 调用allocateAuxStructures转换DexFile为DvmDex(由于该方法为static方法,因此需要按照其逻辑自行实现)。

\dalvik\vm\DvmDex.c

static DvmDex* allocateAuxStructures(DexFile* pDexFile) 

  • 添加DvmDex到gDvm.userDexFiles

\dalvik\vm\Init.c

struct DvmGlobals gDvm; //gDvm = dlsym(handle, "gDvm");

  • 修改MyDexClassLoader中的mDexs对象的mCookie值

mCookie主要用于映射底层DvmDex数据——DexClassLoader.mDexs[0].mCookie值

4. so如何实现程序的反调试?

同Linux反调试基本原理相同,这里提供一种方式就是在JNI_Onload中调用ptrace方法,ptrace被广泛用于调试(比如IDA)和进程代码注入(比如LBE,金山等权限管理功能实现),一个进程只能被一个进程ptrace,如果你自己调用ptarce,这样其它程序就无法通过ptrace调试或者向您的程序进程注入代码。

ptrace(PTRACE_TRACEME,0 ,0 ,0);

通过本人实验,该种方式可以实现so的反调试。

三、总结

通过以上分析,梆梆加固的确可以有效防止移动应用在运营推广过程中被破解、盗版、二次打包、注入、反编译等破坏,不过如果Android恶意软件也通过这种方式加固保护,这将会给移动安全分析人员带来巨大的挑战,因为安全分析人员经常使用的代码静态逻辑分析和动态调试分析在该情况下都失效了。

梆梆官方声称不会对恶意软件进行加固,的确在加固的过程中发现存在安全软件扫描信息和云测试处理流程,不过这些措施只能减少而不能彻底杜绝恶意软件通过梆梆加固保护。如何不被恶意软件利用是梆梆需要解决的问题。

文章来源:jiazhijun'Blog

(责编/唐小引)

120万操作/秒Redis Cloud 集群单一服务器非基准测试程序 2014微信开发者大会顺利结束 TOP10优秀微信开发商名单公布 【最佳实践】通过DevOps确保可靠和有效的信息安全 2048 Hello World:跨平台快速应用开发Python框架Kivy Forrester:关于私有云的10个事实 2014年8月操作系统份额:Win 8.x大涨,Linux继续下跌 0代码、不编程—交互式网页设计工具VXPLO 揭秘Instagram Hyperlapse背后的技术 【CTO俱乐部在线教育研讨会】用互联网技术深入创新教育产品 降低门槛!Hybrid应用开发框架LigerMobile 下一代IT革命:微服务器和雾计算 使用Mongo Connector和Elasticsearch实现模糊匹配 时隔8个月,物联网联盟AllSeen如今怎样? 《近匠》简网:开发零门槛 快速建原生App MDCC免费展位申请超预期 大会内容初曝光 在服务器与交换机定制之后,谷歌着手量子计算机CPU设计 电信天翼开放平台鲍占斌:优质能力 分成比例高 艾格拉斯副总裁王晓波:手游定价如何设计 Xcode 6 Beta 7发布:语法定、内库改,Swift何时完善? 干货来袭:由22个联邦机构分享的6482个数据集 Phablet出货量今年将超移动PC,明年再超平板 如何提高Web服务端并发效率的异步编程技术? 改改改!让应用通过审核出人头地的10个方法 正益无线CEO王国春:AppCan如何获得50万开发者青睐 在收购Xtreme Labs之后,Pivotal推出PaaS移动服务 .NET开发者必备的11款免费工具 .NET开发不可错过的25款高效工具 Docker最佳实践!尽在2014 Container技术大会 pflua:用Lua编写的高性能网络包过滤工具箱 掌上明珠张磊:如何设计手游付费体系 云游科技何千军:游戏开发和后端逻辑经验 为什么我在JSP中能得到TEXT文本中的数据,却得不到在SELECT中的数据呢? 求救!为什么我的ACESS数据库文件会莫名其妙的达到25M,我还没输任何数据呢?而生成MDE后只有500K? 我要一个功能强大的弹出日历 Viva La Costa Rica! 我再也不看Chinese Team的比赛了! 如何做jar包呢?还有如何做bak呢?大家救救我吧。 《inside the c++ object model》问题 这句是什么意思??? 问一个Win2000Server域用户客户端登陆问题。 小问题:在线等待:) 如何删除一个ini文件中的关键项目?急 求救!为什么我的ACESS数据库文件会莫名其妙的达到25M,我还没输任何数据呢?而生成MDE后只有500K? 求教关于c++builder的图象预处理的源代码。50分!!还有金钱相送! access的问题 郁闷!!关于数据窗口一个奇怪的问题!! 如何实现断点续传 寻求《软驱监控程序》!!!!!!!!!!!!!!价格面议 用imp恢复数据库,要做什么准备呀? 刚才给分失败,重新散分! 关于SQLserver数据库和MDB数据库的句语问题!!! IE数据保密大全,如何禁止以下功能?菜单,工具栏,收藏夹,鼠标右键,PRINTSCREEN键,键盘快捷键 帮忙:DCOM 无法使用任何配置的协议与计算机 慨n 通信? 查询问题 请教bean中填写方法问题,高手帮忙啊!!!!! 昨天回家遇到打劫,被暴打一顿 本人有一个数据窗口对象中的一个字段,其为DDDW型的,可是在它的选项页中却怎么也不能显示出我想设置的名字显示出来,却总是显示保存在表中 在线求助,当场送分。 用MASM编译DOS程序经常有问题啊!? asp.net问题 有关DateDiff的问题。。。SOS 请问用什么软件制作chm帮助文档? 数据库中记录条数在增加,但字段却是空的呀??? 高分求:如何确定TreeView的SelectedItem为空? ******* 怎样调试硬中断程序? 存储过程中的一个语法问题 servlet中forward到jsp页面的显示问题 SOS:请问一个页面在不同分辨率下适应性的问题! 我在做数据库链接时,出现了编译错误,实在看不错在哪里(在线等待) rpm的升级过程中的问题,请大家关注 有关gethostbyname的问题 关于数据库系统信息的ini文件 请问一个简单语法问题 股票界面的画法问题 自从和男友去看了《我的野蛮女友》后,我又变野蛮了~~ 一个小问题 在aspx文件中取出aspx.vb文件中的数据怎么做到? 救命!! 为什么我的数据窗口中的编辑框不能写入数据(问题解决,立即给分) 如何立即更新水晶报表中的数据库?关于水晶报表高分(100) 关于makefile问题(在线等) ASP编程中的问题,很急…… 如何写手机短信程序? “聚乙二醇--药物溶解后……形成核晶非常困难,……故溶质可形成微晶”当聚乙二醇--药物溶解后迅速冷却药物形成核晶非常困难,由于低温时介质粘 度很大形成固化时间很短,故溶质可形成 利用二氧化碳的气体就能区分氢氧化钠,氢氧化钙,和稀盐酸三种溶液吗 酸性氧化物的性质rt分条列出来 纳米晶软化水的效果怎么样? 利用二氧化碳如何区别NaOH、氢氧化钙和稀盐酸 酸性氧化物的性质怎样体现. 说的是宗法制宗法制! 一氧化碳是否为酸性氧化物 大家帮一下忙啊,初中酸性氧化物性质的概念,谢拉,要是初中的啊! 关于酸性氧化物的疑问酸性氧化物的定义为酸性氧化物是一类能与水作用生成酸或与碱作用生成盐和水或与碱性氧化物反应生成盐的氧化物(且生成物只能有一种盐和水,不可以有任何其它物 在运动场上常见到的一些现象中,不能用惯性知识解释的是短跑运动员跑到终点后不能立即停下来跳远运动员要助跑一段距离后才起跳投掷铅球是,铅球离开人的手以后继续向前运动跳高运动 一氧化碳是不是酸性氧化物 酸性氧化物和碱性氧化物酸性氧化物或者碱性氧化物与其它物质反应通式 食盐食醋纯碱能否检验鸡蛋壳溶于酸 一氧化碳是酸性氧化物吗,为什么? 解释惯性的步骤(4个) 宗法制为什么有如下优点历史书上写:::宗法制有利于凝聚宗族,防止内部纷争,强化王权,把“国”和“家”密切的结合在一起.为什么? 一氧化碳为什么不是酸性氧化物?我知道它不是酸性氧化物.想知道深层的原因. 食盐晶体这类的物质属不属于电解质? 误食水银死亡是什么症状?多少水银能致人 一氧化碳为什么不是酸性氧化物?若它不是那它是属于什么性质的物质我们那个二逼化学老师撒都讲不好,就说了一氧化碳不是酸性氧化物,也没说为什么不是.而且像CO2、No都符合酸性氧化物的 惯性解释系列的习题应该有一个固定的解答模式吧.例如:用力击打一摞棋子的最下面一个,情况会怎么样?为什么?如以上问题,怎样解答能得全分?其实我主要是想问对于这类问题的完美答案,请 加热a克氯酸钾和b克氧化铁的混合物,反应完全后,得到c克氯化钾,则生成氧气的质量为?A.(a+b-c)克. B.(a-c)克. C.(a+c)克. D(b-c)克. 酸性氧化物的特征 一些不溶盐是电解质吗 还有 氢氧化钾固体是电解质吗?如碳酸钙固体等 银子遇水银变黑怎样清洗 酸性氧化物的特点是什么?还有碱性的有什么特点请告诉我常见的酸性氧化物和碱性氧化物 什么是干扰素?干扰素的作用是什么? 银手镯遇汞变黑怎么办?我在甩温度计时不小心将温度计磕到了银手镯上,现在手镯遇汞变黑(乌)了,请问怎样才能使它恢复光泽? 酸性氧化物的特征和组成部分是什么? 求氢氧化钠和二氧化碳反应方程式(有过量么?) 铝和氧化铁反应的实验探究:为什么要在混合物上面加少量氯化钾 秦朝灭亡了之后秦始皇的女儿姬妾都到哪里去了? 干扰素的作用 请问彩金戒指遇水银变黑了怎么办?戒指3600元买的,温度计打坏了,水银沾到了戒指上,戒指黑了,以前买戒指的地方也搬家找不到了,别的珠宝店都不敢收,我该怎么办?结婚时买的,扔了太可惜了, 西周宗法制的主要内容和实质简略一点概括重点 过量的氢氧化钠和二氧化碳反应方程 关于电热水袋换水后无法加热的问题我是新买的热水袋,用了两个星期,今天换水,然后就不加热了,水里加了些盐就又能加热了.我是想问,是为什么才会爆?是因为热水袋在加热的时候会有气体产 秦始皇后的秦朝多久灭亡的? 请问:干扰素a-2a和干扰素a-2b的作用?干扰素a-2a,干扰素a-2b各自的药理作用和各自的适应症. 固体水银有毒吗?误食后会死吗? 西周宗法制的实质是什么呢?(内容简要的) NaOH和少量,过量CO2的反应方程式分别是… 烷烃的所有性质都与甲烷相同注是相同不是相似 秦始皇自即位以后到秦朝灭亡,秦朝出了几个上将军. 下列现象中不能用惯性解释的是1、骑自行车上坡前往往要加紧蹬几下加大速度2、人从形式的车上跳下来容易摔倒两个从中选一下 需要一些理由说明 水银遇空气发生什么反应 西周实行宗法制,根本上是要?A、保证嫡长子一系的特权B、巩固父系家长在本宗族中的地位C、封邦建国,拱卫王室D、保证王权的稳定 下列现象不能用惯性解释的是》A.骑自行车上坡前,加紧蹬几下B.跑步的人绊到石头容易摔倒 13 2010年3月召开的第十一届全国人大三次会议,表决通过了关于修改《中华人民共和国选举法》的决定.这表明全国人民代表大会具有 A监督权 B任免权 C立法权 D决定权 各位高手,选哪一 请你们帮我选选,并说明原因可以吗?..西周实行宗法制的根本目的是( )选项1:广建诸侯藩国选项2:区分血缘亲疏选项3:保证法律执行选项4:巩固分封秩序 下列现象中,能用惯性知识解释的是()多选A.拍打衣服,灰尘脱离衣服B.人从行驶的车上跳下来,容易摔倒C.短跑运动员到达终点后不能立即停下来D.用力将物体跑出去,物体最终要落到地面上我 少量二氧化碳通入氢氧化钠溶液中和 过量二氧化碳通入氢氧化钠溶液中的离子反应方程式? 西周宗法制的实质.宗法制对中国封建社会有什么影响 魔兽体内的“晶核”是干什么用的?有什么作用?写玄幻小说用. 十一届全国人民代表大会第一次会议十一届全国人大三次会议是什么意思?有什么区别? 酸性氧化物有哪些性质?酸性氧化物能与哪些物质反应,表现什么性质? 纳米的作用是什么我想知道的是作用 桥烷烃有什么特殊的性质吗? 酸性氧化物 性质
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘