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

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

(责编/唐小引)

列出 SQL Server 数据库中所有的存储过程-VB资料 列出MDB档当中所有table的名称-VB资料 您想知道有谁正在使用您的 Access 文件吗?(多人环境中)-VB资料 主题:浅谈Excel 的VB编程 巧用VB6的DataGrid实现通用电子表格 VB取得正确的 RecordCount 值 主題:如何动态新增、移除 ODBC DSN? -VB资料 VB如何将表中的数据导出到电子表格中 VB如何将文本文件转换为ACCESS数据库 VB如何將 Excel 的文件导入 Access文件? VB如何判断数据中是否存在某一表或查询 VB如何删除FoxPro数据库的数据? VB如何设置对VB数据库连接的动态路径 VB如何使用 ADO 來压缩或修复 Microsoft Access 文件 VB如何修改Foxpro数据库(不是用VB实现的,不过也可以看看) VB如何在 SQL 语句中使用日期? 返回 VB如何在表中保存单引号? VB如何抓出 Access 的 Table 欄位中的【敘述】部份呢? 实现Access数据库的Web查询-VB资料 使用Visual Basic访问数据库几个注意的问题 数据库查询-VB资料 数据约束控件和 RecordSet-VB资料 锁住数据库中的表 -VB资料 谈谈VB的数据库编程方式 为VB5辩解: VB处理数据库时求数据表记录总数的最佳方法 为什么安装后的数据库应用总是路径不对或找不到? 返回 -VB资料 无论如何,就是只能输入数字-VB资料 VB用 DAO 或 ADO 正确访问 Access 2000 VB用CELL组件显示Access数据库的图片对象 VB用DAO打开Excel文件 VB用DATA控件绑定报表控件打印报表 一个VFP的打印问题! 关于基于单文档应用程序的问题 怎样在Exchange Server上部署应用,拦截所有通过outlook发给该Exchange的邮件,提供一个思路也行! wolfAone (黑色的狼(WOLF))你给我进来,有消息了! 请问JAVA如何读写注册表 经典图书??? 请问一个关于窗体置前的问题 HELP!关于STRUCT的问题! 请问,怎样知道光驱里面的光盘是不是已被更换? 在Delphi如何进行包的调用,本人将无比感谢 关于exchange的几个问题? sdk中怎样在客户区中播放视频文件(从通用对话框中) 打印问题 大家帮帮忙看看代码,指点我一下。 请问如何让浏览器中的COM组件得到当前浏览器的IDsipach接口(或IWebBrowser2接口)? 控件打印的问题 有关request.getParameter();的奇怪问题! 常见代码,有些地方我不明白帮我详细注解一下以下代码 征求解决方案 裁剪linux后,不能起动 请教MayFlower,asmx文件变成下载的问题 高手难题:SYBASE触发器中如何获取text字段的内容 珠海程序员薪金调查!(决定了我的前途)谢谢! 对利用Telnet进行自动化处理提点意见 强制类型问题 这都啥年代了?CSDN还在卖VS.net beta2!!! 请问在一个基于对话框的应用程序中,怎样实现打印功能?同时要求不弹出打印对话框,而且将纸张大小设为A4,打印方向设为横向? 小问题 SQL Server 7.0有for Alpha的吗? JIT究竟是什么东西?能否详细叙述,谢谢!另外,由于Java的跨平台技术,编译后的Java程序速度相对较慢,那么速度究竟慢到什么程度?通过什么能提 请教各位高手,关于CDONTS.Newmail对象的一些疑问? 我在新建类时为什么找不到CTOOLBAR基类,怎么新建基于CTOOLBAR的类? 用goto语句如何调用另外一个过程中的标签?急!急!急! 我仍然不能打开第二个光驱? 500分求一份关于工资管理系统的分析报告 如何得知一个字符是中文还是英文? help:画一个点的CDC member function is ....? linux下的编译机制与VC的编译机制是不是相差很多,好像LINUX下的慢很多,WHY? 如何导入一个数据文件 RMACreateRMBuildEngine调用失败---real VFP6。0中如何做图,我怎么找不到gengraph.app??? datawindow怎么做打印预览? 一个有关FORMVIEW的问题???? OLE DB的 ICommandText 访问SQL server 2k的问题 .net Enterprise是不是仍有很多bug? 有关ds1820传感器的问题?? 谁有中国电信的邮件EMAIL,我要上一个BBS,它要求必须是中国电信或是教育 MFC网络编程中的奇怪现象??? 招网站及数据库系统维护人员两名! 关于wchar_t的问题 CPalette到底起到了什么作用? 求过点p(2,3)且在两坐标轴上截距相等的直线的方程 一个圆柱形容器内装有水,从里面量,内半径为10cm.容器中有一底面半径5cm的圆锥形铅锤(沉浸在水中).补充:当铅锤从容器中取出时,水面下降了5mm,求铅锤的高. 全世界最美的100个地方中国有哪些? 过点P(1,4)的直线与两坐标轴的正半轴相交,当直线在两坐标轴上的截距之和最小时,求直线的方程我要详解,请尽快. 在一个底面半径为10cm的圆柱形杯中装一些水,把一个底面半径是5cm的圆锥形铁锤完请给我说说.急 全世界有哪一百个最美的地方? 高中必修2,经过p(1,4)的直线在两坐标轴上的截距都是正值,且截距之和最小,则直线的方程是()这题先用斜截式y=kx+b.然后将点p代入上式,求出在y轴上的截距b=4-k,再将b值代入求出在x轴上的 一道关于柏松随机过程的题一台机器检测每一个到达的货物,这些货物的到达过程是个柏松随机过程,参数是a,如果两个相邻货物到达的时间间距小于等于b的话这台机器将停止工作,让T作为机器 数学物理方程怎么学 金刚石是晶体吗 柏松分布的公式是怎么来的,凭空捏造?概率论的书上面柏松分布直接给出了一个式子,这个式子到底是怎么出来的? Uxx+5Uxy-6Uyy=0的化简,包括步骤和结果, 放大1200倍的显微镜能看到叶绿素吗? 放大镜下看到的面积或区域叫做透镜的()快 数学物理方程怎么学啊谁有好的建议 假如在一个简单电路中,并联一个电阻和电容,那么在开关闭合时,是电容优先充电,还是电流优先通过电阻 通过透镜看到的面积或区域叫做透镜的视野,请问不同放大倍数的放大镜,他们的透镜视野有什么不同 怎么学数学物理方程? 证明叶绿素的形成与阳光有关的实验要把五个步骤写全 1 2做出假设 3制定计划 4实施计划 5得出结论 通过透镜看到的面积或区域叫做透镜的? 研磨机、研磨机厂家,保定研磨机哪家的产品好? 当一个电容器和一个电阻并联在电路中时,电容器和电阻的电流电压分别是怎么样变化的? 通过放大镜看到的面积或区域叫做什么?只要答出了,@ 放大镜的放大倍数越大范围就越大吗 4、一个半径为R的薄球壳,球表面均匀分布正电荷q,试求(1)球壳外电场强度分布(2)球壳内电场强度分布 英语翻译3Q 在一定范围内,放大镜离物体越远,放大倍数越大 请问蔬菜里的叶绿素对人体有什么好处呢?人体细胞也不合成叶绿素,感觉它只是和植物的光合作用有关,不知道它对人体有什么作用呢请大家多多指教哈~ 数学物理方程中,弦横振动的边界条件:一端固定,一端自由.请问表达式应该是什么?非知勿扰! 离子化合物有键能吗?晶格能就是键能吗?只有共价化合物才有键能? “电压是使自由电荷定向移动形成电流的原因 杆的纵向振动是怎么个振动方向?数理方程书上没说清楚的一些问题.一个横放的弦的横向振动能理解,是上上下下.一个横放的杆,纵向振动是怎么个振法?难不成左右晃?还有弹性支承,对弦来讲 离子晶体的晶格能比较-----高手进我知道有三个影响因素,但比较时哪个占主导地位,哪个是相对次要的?为什么? 什么蔬菜里含有叶绿素包括水果 试以下面的方程为例,叙述用分离变量法求解方程的步骤.{Utt-a^2Uxx=0,Q={00U|t=0=φ(x),0= 想问下数学物理方法与数理方程有什么区别? 电压是使电路中额额自由电荷定向移动形成的( )的原因 数理方程怎么学更容易? 清华数学物理方程与北大数学物理方法哪个好 二维晶格的基元由一个原子组成,问有多少支格波,声学支和光学支各有多少?详细说明理由, 有谁知道二元振动研磨机和三元振动研磨机的区别在哪儿?三元振动研磨机的工作原理是什么? 电气工程学不学数学物理方程或数学物理方法,我指的是除了复变函数剩下的那些我对你们无语了,数学物理方法是一门课程, 传统的测量叶绿素的方法与叶绿素测定仪的原理有什么区别没? 一般振动研磨机的价格是多少?隆鑫振动研磨机多少钱,樟木头隆鑫的那个厂 正电荷究竟能不能移动,为什么物理书说带正电的电荷定向移动,也能产生电流 SPAD-502叶绿素仪测定的叶绿素含量单位是什么?比如说测得数据为35.6,单位是什么呢 如何选择振动研磨机 卧式振动研磨机生产厂家有妙招 一个底面半径是10cm,高14cm的圆柱形容器中盛有一些水,水面高10cm.现在将一个底面半径是5cm的圆锥形铁块完全浸没在水中,此时水面高11cm,这个圆锥形铁块的高是多少厘米? spad-502叶绿素仪的测量结果的单位是什么? 哪里的振动研磨机比较好我公司因生产需要,准备购买2台振动研磨机,麻烦告诉我哪个生产厂家比较好 晶体的晶格能与什么有关? 物理凸透镜成像规律帮我把关于这里的知识点全写出来吧,至少2000字最好是复制的! 叶绿素测量值spad值是什么意思叶绿素测量所得的spad相对值具体是什么意思?是哪两个值的比值? 振动研磨机用的三角磨料是什么成分? 物理凸透镜成像的规律一倍焦距分虚实二倍焦距分大小物距像距相矛盾像与像距相一致这 几 句 话 是 什 么 意 促使金属导体的自由电子发生定向移动形成电流的是?A电荷 B电压 C电流 D电阻 3、把凸透镜当作放大镜来观察物体时,必须把物体放在凸透镜的 ()3 、把凸透镜当作放大镜来观察物体时,必须把物体放在凸透镜的 ( ) A .焦点以内 B .2 倍焦距处 C .焦点上 D .2 倍焦 电源12V接一个开关,再接一个电阻,在接一个电容,最后接地.请问一下闭合开关瞬间,求电容两端电势 一只底面半径为10cm的圆柱形水桶中盛有水 当在桶内浸没一个底面半径为5cm高 为18cm的圆柱形零件后 水面上一只底面半径为10cm的圆柱形水桶中盛有水,当在桶内浸没一个底面半径为5cm高,为18cm 一凸透镜的焦距为10cm,作放大镜使用时,被观察的物体到凸透镜的距离应满足()要想使它得到物体放大的实像,该物体到凸透镜的距离满足();要想使它得到物体缩小的实像,该物体到凸透
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘