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

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

(责编/唐小引)

NBA全明星周末,数据打造下的辉煌盛事 2014情人节没活动?我们来帮你! Windows 8授权销售已超过2亿份 速度不及Win 7 IDC:2013年第四季度Windows Phone出货量大幅增长 深入思考SDN的核心本质:从SDN=OpenFlow回到软件定义网络 谷歌、VMware在Chromebooks上双赢了,微软你怎么看? Tizen真要来了!又有15家IT大佬成帮会成员 研发周报:开源世界应该致谢的五家公司 Square、LinkedIn、Google... 看国外巨头如何“绑架”用户? 一周消息树:5.5寸屏幕的iPhone 6概念机来袭、索契冬奥会开幕式现Bug 一周热点:美国大学生数学建模分析,Hadoop不是万能,探访雅虎数据中心 Google Play services 4.2全球推送,完全支持Chromecast! 移动周报:最快的Web开发IDE——HBuilder Google Glass是空有噱头还是实用品? 服务好“最后一公里”,高效CDN架构经验 “义军”突起,帮用户夺回大数据控制权 为安全,Google收购基于超声波密码验证技术公司SlickLogin 2014 Shenzhen Maker Faire:国内顶级创客聚会即将举行 若无创新,智能手机将是死路一条 任道远上任VMware中国研发中心总经理 Windows免费,微软方能解救PC市场 Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解 将会出现iCar?苹果应该收购特斯拉的七大原因 广大程序员的福音:Bing Code Search扩展助你方便查找代码 深挖线下价值是当前婚恋交友网站获取盈利的突破点 15个最好的Bootstrap设计工具推荐 Google首席软件工程师Joshua Bloch谈如何设计一款优秀的API【附PPT】 Webix 1.5发布:一个强大的JavaScript UI组件库 四大著名风投:在我们眼中只有技术革新 美女CEO谈AWS:是香水还是毒药 国外一学生发明新计算机系统,用微芯片代替硬盘 怎么把自己的图片做成asp的底板图? 请问在DELPHI中编程怎样打开WORD,EXCEL,。TXT文件并使他们可见?(谢谢) 小女子问一个很小很小的问题。举手之劳 好不容易才找到ACTIVE SKIN4.27的破解机 JDK文档 1000分都给你!谁能列出最好的几本算法与数据结构书,并提供下载地址? 请教一个问题~~~~~~!在线等~! 1000分都给你!谁能列出最好的几本算法与数据结构书,并提供下载地址? 1000分都给你!谁能列出最好的几本算法与数据结构书,并提供下载地址? 请问sql server 2000数据库 的unicode->big5如何转换? 倒分揭露 vc我自建了一个子窗体类,点击主窗体时显示,怎么做啊? 难道我的word文档全都废了吗?? 帮帮忙!一个小问题!呵呵! "自助建站系统"到底能不能实现真正的二级域名、独立域名? 请看看我的代码有什么问题 如何将一个OLE对象转换为位图(注:不要截屏的方式) 在olecontainer里面调出的excel文档,如何使之不可编辑。 急救啊!这个字体怎么设置? 请问在jcreator下能不能编译成exe啊? small_wei进来领分! 初学这样的,觉得是很简单的思路,但找不出错误,有经验的帮忙看看 if a sql syntan can succeed in sql but asp... GDI+的问题 谁有FLASH的注册码,给个,谢谢 怎样用js写一个终止程序,类似asp的response.end 求教:学习MFC文件系统-针对一段代码的3个初学者问题 如何使98一开机就运行屏保!!!急!!!来者有分!帮忙了!!!!! 怪问题 <了解Struts1.1 > 我刚看到的一篇好文章,贴出来,大家共享 dayday up (: 如何驱动8139网卡(笔记本) interbase能与VC结合吗?另外想问有些软件与interbase一起打包安装,如何实现的呢? Lotus——你在哪里? 网络编程中遇到的几个问题(求助) 在java中调用javac.exe 紧急在线等待,求助!!!!! 我是新来的,很多都不懂!也没有朋友,有谁能和我做朋友么? 分手为什么只要一个人说了就算,为什么不能像离婚一样要双方同意,法院判决??? 关于从TImage继承创建自定义控件的问题? JRUN4怎么运行Servlet? 关于远程创建表,删除表的问题?请帮忙。 启动数据库时报 监听程序无法启动专用服务器进程???ORACLE 9.2.0.1.0 如何將指針作為參數傳遞。 请教vb自带的报表编程 在Sql语言中的取整函数是什么? 怎样将添加的记录到所有的现有记录后面? 如何装双系统?(在线等候) CSS一般要学多久才算掌握? 从事共享软件开发的进来谈谈做共享的辛酸好吗? 请教使用notifyicon遇到的问题 ActiveState.Visual.XSLT.for.VS.2003.v1.7.9.2475.WinNT2K无法安装。 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+pat 舟在碧波上,人在画中游中的碧是什么意思 salary 迂能组什么词 开展综合实践活动课之前要做哪些方面的准备? postension slab是什么板是在图纸上出现的 关于request的解释!‘就要这个解释两句说的通俗点就行了 综合实践活动是一门什么样的课程?(定义、性质与特点) air 若a^2+b^2+c^2=1 则3ab-3bc+2c^2最大值为 1、与传统的学科课程相比,综合实践活动课程有哪些新的特点?开设综合实践活动课程的意义和价值何在? 尘起尘落是什么意思很多都起这个网名 这个网名是什么意思 谁能告诉我 谢谢~ 这个字怎么读.(迩) 综合实践活动方法指导课是什么意思 形容做事认真刻苦的名言今天就要,不关于学习 Pass应用有WP版吗?或者在国内有类似Pass社交的应用吗? 下列细胞的膜结构能合成ATP的是( )A 线粒体的外膜 B 叶绿体的类囊体薄膜 C 内质网的膜 D高尔基体的膜 尘满是什么意思 听说现在都流行网络或者电话学英语,朋友介绍我去CEC,来问一下,CEC咋样? 体积相等的两个正方体,它的表面积也一定相等. 落落无尘是什么意思 pass cec英语的一对一外教,学过的朋友们,给点主意啊 OVM15-2(1)锚具 是什么意思? pass by可以理解为忽视吗? a+b+c=1,求ab^2c+abc^2的最大值 OVM15-22什么意思 背景中"迂"是什么意思 直6棱柱的全面积怎么算?底面积怎么算 锚具OVM15-2P什么意思? pass 与pass by的区别 不若从炉塘道 稍迂而路辟 ∫[-∞,+∞]e^(-t^2)dt等于多少,求详细解答 中"迂"是什么意思 友情是什么,它可以.造句 电工题,为什么du/dt不是等于0 天车某机构电机在工作时产生震动是什么原因 1.2小时等于多少分钟 谁知道这是什么动物,像猫但它脚好像比猫短,而且身体很臃肿啊.如图猫的脚怎么会这么短啊, 长虹饮涧中"立涧之东西望,则为日所铄都无所睹."是什么意思 PASS什么意思 两只脚的动物都有翅膀吗?今天突然想到这样的一个怪问题,我不内行.拿出来请各位朋友或专家指导一下:陆地上好象两只脚的动物都有翅膀一样.不知是不是这样?是不是这样?不过,我还是不满 立涧之东西望,则为日所铄, 英语高考作文提高本人写作文时只能写出普通的主谓宾结构句子和定语从句.有时想用一些短语时,又不知道该放在句子的什么位置,有谁有一些作文句子结构的样式(说明一下哪些词放在哪里? 解释“舟行碧波上,人在画中游.” 矩形AD等于5AB等于7E为动点三角形ADE沿AE折叠当点D的对应点D撇落在角ABC的角平分线上三角形AD撇B面积 判断:体积相等的两个正方体,表面积一定相等( ) 猫猫长翅膀是真的吗 AD A撇D撇分别是三角形ABC和三角形A撇B撇C撇的高 AB=A撇B撇 AD=A撇D撇 BC=B撇C撇 求证AC=A撇C撇今晚作业啊~! 判断2.两个正方体的表面积相等,体积一定相等【 】 elevated permission are required to run 三角形ABC全等于三角形A撇B撇C撇 AD,A撇D撇分别是三角形ABC和三角形A撇B撇C撇的角平分线 求证AD=A撇D撇 判断:一个正方体的棱长扩大2倍,表面积扩大2倍,体积也扩大2倍.( ) Are you grassy?are you elevated?是什么意思?是习语吗? 关于也买酒的pass,我已经有过消费记录如何获得也买酒pass码? 已知三角形abc和三角形a撇b撇c撇.中ab等于a撇b撇bc等于b撇c撇.设bc边上的高adb撇c撇边上的高a撇d撇,且ad等于a撇的d撇 表示看意思的什么尘莫及 迂绕是什么词 在△ABC和△A撇B撇C撇中,AB/A撇B撇=BC/B撇C撇=AC/A撇C撇=2/3,且△A撇B撇C撇的周长为80cm,求三角形ABC. maintain 美国有意叫停窃听盟国元首 部门“内讧哈萨克斯坦举办首届国际美食节 各国顶乌克兰法院裁定没收季莫申科女儿名下饭秘鲁高等法院驳回藤森在家服刑申请美刊:中国房地产“泡沫总会破灭”斯里兰卡一出租司机诈骗中国游客900中国国家级人才工程“万人计划”全面实天天在校门口带孩子们过马路 郑大伯红马英九呼吁台立法机构尽快通过服贸协议中国三部门要求规范母乳代用品宣传和销三季度中经产业景气指数:工业经济温和“基础四国”杭州发声督促发达国家兑现食品安全法修订草案:网购食品出问题网宁波1至6号轨道站点全公布 看看家门有了闲林水库这只“碗” 杭州饮水防洪安徽宁国网友募捐遭民政局叫停:我们压药店奶粉自动售卖机故障 消费者抱怨无穿“新制服”配IC卡 每一杯西湖龙井上海自贸区揭牌满月巡礼 开启新一轮改美智库报告称朝鲜为发射大型导弹扩建卫杨洁篪会见伊朗伊斯兰议会议长拉里贾尼从小就能看出女神和女屌丝的区别乐视第三代电视年内发布 产品和内容有一名格斗裁判名片的正确打开方式450㎡东南亚自然之居,浓郁的民族特75款卫生间,这才有家的感觉!!!好美的电视背景墙,客厅就这么布置吧!100㎡混搭二居婚房,小夫妻要装修就震惊!一部失传已久的《装修通关秘笈》11种美味鸡蛋羹的做法一个突如其来的精神攻击!怎么破。。伦敦10层高楼间建透明泳池 住户“串单身十二星座怎么过七夕?周杰伦老婆自研:昆凌蛋白减肥大盘反复无情 午后谨慎观望家庭里,如何简单泡功夫茶?推飞机致小臂红肿 张雨绮晋级“热炼女女性补充雌激素吃什么好必须了解的茶叶三泡法吴莫愁胖成那样,哈林知道“捉腰记”吗秋季吃什么水果养生效果好难道你只是在玩砗磲吗?看看它的科学价
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘