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

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

(责编/唐小引)

三步骤实现ASP.NET(C#)项目中添加谷歌(Google Map)地图 使用C# ASP.NET以FTP客户端方式下载文件 ASP.NET如何用C#代码检测手机浏览器 使用C#读取上传的Excel文件 新版本SQL Helper类 C#使用iTextsharp生成PDF 在.NET里用iTextSharp库生成PDF文档 用itextsharp将ASP.NET页面导出到PDF中 什么是JQuery-JQuery API jQuery入门指南-JQuery API jQuery的核心部分-JQuery API $(elements)-JQuery API $(expr, context)-JQuery API $(fn) -JQuery API $(html) -JQuery API $.extend(prop) -JQuery API $.noConflict() -JQuery API each(fn)-JQuery API eq(pos)-JQuery API get(num)-JQuery API get()-JQuery API gt(pos)-JQuery API index(subject)-JQuery API length-JQuery API lt(pos)-JQuery API size()-JQuery API CSS-JQuery API css(key, value)-JQuery API css(name)-JQuery API css(properties)-JQuery API height(val) -JQuery API 各位兄台:如何激活一个窗口! 我发送Microsoft.XMLHTTP怎样获得验证??? 高分相送:有没有能察看一个dll文件中包含哪些函数的工具??????? help!!!! 怎样发送Microsoft.XMLHTTP获得验证???????? 请问,ASP中,能使用类似VB中的“On Error GoTo XXXX”这样的语句吗? foxpro怎样倒入sql server? 我现在有foxpro的dbf文件?应该怎样做? 多谢 mediaplayer的问题。 告诉我tostring 函数什么用途我们感到阿!谢谢了一个初学者! 请问VB6如何才能认到access2000的数据库文件? 关于对象序列化问题 怎样让返回值为自定义结构? 怎么在对话框上面话线? 请解释一下跃点数 小问题一个,但是需要高手................. 我想把公司的网站改放到公司,该怎么办? ——如需要还有很多分送 请帮忙,我自己觉得问题很难(特急)!!!!!!!!!!!!!!!!!!!! 明天我哥结婚,我很开心啊!!! 我想把公司的网站改放到公司,该怎么办? ——如需要还有很多分送 关于存储过程和触发器的问题?(高分求助) WIN2000机器上ADSL,另一台linux下如何做ADSL的代理让局域网中机器上网! 为什么新生成一个session对象后,jsp page中的scope=session的bean会不正常? ★★oracle中ora-04031错误 请问:在安装MSSQL2000 时(因为公司的电脑是对等网的原因)我装完后出现以下错误: 我应该去东软吗? 请您帮我诊断一下! 如何共享已打开的设备 rs.open sql,conn,3,2参数含义? 我应该去东软吗?? 求救~~~~安装完WINXP,进入系统前会出现错误窗 怎么现在没法用search了? 一个菜鸟的问题,关于事件的加载 求救~~~安装完WINXP,进入系统前会出现错误窗 关于速度,效率,VB IIS ASP COM高手请进 我用extracticon将图标从exe文件中提取出来了,请问高手们,如何保存为ICO文件。 急急急,如何解决多窗口关联及激活问题!高分相送 请教一下,如何刷新ie浏览器,我用postmessage模拟按键F5,没成功,谢谢 怎么样把多个程序打包到一个文件中,然后怎么样释放出来!高分求答案(分两次给100分)! 为什么计算字段不能排序 我是新手,高手教教我吧!!! 如何激活oracle8.16的监听??? Domino Administrator 中的“配置”->“消息处理”->“网络域” C#究竟是什么东东?象C++还是象JAVA? 求dxdbtreeview 1.2 for d5 有人知道天津英业达吗? vb6如何结合DirectX编程? 怎樣才能把數據寫入BIOS中的DMI里去? 我要用vb得到一个EXCEL表格中的内容,经过数据处理再把数据写入新的EXCEL表格,如何实现? 心情不好,散分 我怎樣才能把mssqlserver中的數據庫導出到mysql中? 快乐的一天(300字) 对一件小事的感受 作文“说真话,表达自己真实的感情.”写自己熟悉的生化,虽一件小事,融进自己的感情活看法,认真、具体宾有顺序的写下去,就是一篇好习作.在我的身边每天都发生着许许 关于《快乐的一天》的作文500字快点18点前 哪个皇帝的女人最多? 一件小事体现父爱的作文今天一定要写完! 快乐的童年作文开头300字 中国历史哪个皇帝干过的女人最多?连宫内带宫外的. ,汝为一位受宠的长公主,一日,边境某族可汗来求亲,皇上之女年幼,欲派汝去和亲,汝不愿,汝该如何说服皇上? 关于描写父爱的文章一定要是自己写的 中国历史上最迷 皇帝的女人北齐高纬宠冯小怜,北齐亡后,冯小怜嫁给了北周的一个五十多的老王爷,老王爷一生简朴,曾说,人不要贪财贪色,要修养自己.可收了冯小怜判若两人.冯小怜要算一个 汝为一位受宠的长公主,一日,边境某族可汗来求亲,皇上之女年幼,欲派汝去和亲,汝不愿,汝该如何说服皇上? 写一篇读后感有关母爱或父爱的作文 读日寇侵略中国的文章有感最好是写日寇侵略沙家浜有感其他的嘛,也可以 读《跨越百年的美丽》有感 作文 500字 描写父爱的作文 爱牙日的起源 历史上有哪些皇帝只娶了一个女人? 表示父爱,母爱伟大的文章 皇上怎么称呼皇太后的亲姐姐 跟牙有关的作文 《父爱是伟大的》作文,600字 想问问皇帝的奶奶是不是太皇太后啊?有几个问题:1,那皇帝怎么称呼她?皇奶奶?好像不是.2,皇帝的妃子怎么称呼她?3,她有没有权利命令皇帝做事情? 中华儿女报效祖国的文章的读后感~ 唐朝与西域各国关系友好,吐蕃请求与唐和亲,唐太宗答应让吐蕃国王娶文成公主.两国和亲对双方有什么好处? 《建设幸福的中国》读后感作文评语 关于中华儿女报效祖国的文章读后感 唐朝文成公主的故事【简介】.20-30字左右 作文:《我是中国人》读后感 写中华儿女报效祖国的文章或书籍的读后感 唐朝皇帝为什么把文成公主嫁到西藏 语句短 中国古名著作文读后感600字以内,但不要太短.急! 求关于父爱、母爱和友爱的作文要600多字``不能太多``谢谢各位 民间传说里松赞干布给文成公主说了什么文成公主答应了婚事 作文:写一件体现 “母爱”或“父爱” 的事这个时候我刚从医院回来,我还在伤心流眼泪,我的孩子摔了,我非常的心疼,他一周岁,才出了八颗牙,可就在刚才,一个不小心,太自从车里摔倒了地上, 作文快乐的一天600字 文成公主是唐朝皇帝的什么,她进藏是为了什么 体现父爱母爱的事的作文yao xie ju ji de shi要写具体的事情, 怎样保护牙齿我早晚都刷牙...可是现在还有5个蛀牙. 五年级上册语文第一单元作文《 我和书的故事》注意什么?要重点注意什么? 关于父爱或母爱的作文,专门写一件事 作文初三随想600字 五年级第一单元作文怎么写,《我和书的故事》 关于爱的作文,通过一件事,写父爱或母爱 成长随想的作文.600字左右 跨越百年的美丽读后感要原创!复制的就不要来了 牙齿英文怎么说 中华经典诵读 读后感、体验、和感悟等……急 跨越百年的美丽 读后感这么写? 一段关于保护牙齿的英语作文,题目为“How to keep our teeth healthy".短文不少于50词. 以“读一本好书,谈人生感悟”为主题,写1000字读后感 《跨越百年的美丽》读后感怎么写啊? 作文快乐的一天300字 描写牙齿的作文不是故事,是牙齿写牙齿有什么用,不是故事啊,级也不是爱护牙齿的作文,是描述牙齿、 快乐的一天作文500字以上 三年级作文“快乐的一天”300字左右 作文:听《长城随想》有感 600字以上!你们自己去听,我听不懂。注意是“曲”《长城随想》听后感作文!!! 快乐的一天作文500 字如果好的我加10分 快乐的一天作文300字 谁有关于牙齿的文章?(注:有关蛀牙和保护牙齿的都可以,不过不要太长.) 快乐的一天 作文500字一天发生的事
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn