




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Andorid APK反逆向解决方案:梆梆加固原理探寻2013-06-27 09:33 Jack_Jia 看雪安全论坛 字号:T | T梆梆是一个面向Android开发者的应用保护解决方案,它可以有效的阻止Android APK包被逆向工程破解,从而保护开发者的利益,防治打包党。那么它到底是如何实现这一效果的呢,梆梆的解决方案真的无懈可击吗?来看网友对其技术实现的分析。AD: 2013云计算架构师峰会课程资料下载 一、序言目前Android市场充斥着大量的盗版软件,开发者的官方应用被“打包党”们恶意篡改。如何使程序代码免受盗版篡改就成了开发者面临的头等大事,今天我们将分析一个不错的解决方案-梆梆加固(/appProtect/)。通过对App进行加固保护。梆梆可以有效防止移动应用在运营推广过程中被破解、盗版、二次打包、注入、反编译等破坏,保障程序的安全性、稳定性,对移动应用的整体逻辑结构进行保护,保证了移动应用的用户体验。二、梆梆加固逆向分析过程首先我们通过对APK加固前后文件结构的比较,来了解梆梆加固对APK文件所做的处理。为了使分析过程足够简单,我新建一个最简单的测试程序,并上传到梆梆加固,整个加固过程大概需要4天的时间才可以完成,这是一个漫长的等待过程。该测试程序包含了Activity、Service、ContentProvider、BroadcastRecevier四大组件、Application、普通类、Jni调用等7类对象,目的就是全面的了解梆梆的加固效果。1、apk加固前后静态文件结构及动态运行时对比分析(1) 加固前后静态文件结构变化(左为加固前,右为加固后)加固后apk新增以下文件: assetsmeta-datamanifest.mf /APK文件列表SHA1-Digest assetsmeta-datarsa.pub /RSA公钥信息 assetsmeta-datarsa.sig /数字签名文件 assetsclasses.jar /已加密原classes.dex文件 assetscom.example.hellojni /ARM平台二进制可执行文件 assetscom.example.hellojni.x86 /x86功能同上 libsarmeabilibsecexe.so /ARM平台共享库文件 libsx86libsecexe.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查看启动参数:初步怀疑该进程为assetscom.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方法注册方式有两种:1、通过javah产生函数头,该种方式产生的方法具有固定的格式。该方式使逆向分析人员比较容易获取java层native方法对应的本地方法。2、在JNI_OnLoad方法中手动注册jni方法,不易查找对应关系。使用第二种方式可以实现混淆java层native方法和so函数的对应关系。1. #include 2. #include 3. 4. JNIEXPORT jstring JNICALL abcdefghijklmn( JNIEnv* env,jobject thiz ) 5. 6. return (*env)-NewStringUTF(env, Hello from JNI !); 7. 8. 9. JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) 10. 11. JNIEnv* env = NULL; 12. jint result = -1; 13. 14. if (*vm)-GetEnv(vm, (void*) &env, JNI_VERSION_1_4) != JNI_OK) 15. return JNI_ERR; 16. 17. JNINativeMethod gMethods = 18. stringFromJNI, ()Ljava/lang/String;, (void*)abcdefghijklmn , 19. ; 20. jclass clazz = (*env)-FindClass(env, com/example/hellojni/HelloJni); 21. 22. if (clazz = NULL) 23. return JNI_ERR; 24. 25. if (*env)-RegisterNatives(env, clazz, gMethods, sizeof(gMethods) / sizeof(gMethods0) 0) 26. return JNI_ERR; 27. 28. /* success - return valid version number */ 29. result = JNI_VERSION_1_4; 30. return result; 31. 以上代码中的字符串都是明文(比如“stringFromJNI”),如果这些文明字符串都换成密文的话,再通过运行时解密,相应的对应关系更不易看出。(3)如何使DexClassLoader加载加密的dex文件?虽然不了解梆梆加固是怎么做的,不过通过分析它的运行逻辑,我推测了一种可行的实现方案:了解该方案需要对 Android DexClassLoader的整个加载流程需要有清 晰的了解。首先推断assetsclasses.jar是一个加密的jar包。正常的DexClassLoader加载的流程如下:会有一个DexOpt产生odex过程但是梆梆加固后的应用DexClassLoader加载过程并没有该过程的log信息。推断加密的jar包里面含有odex文件,如果不是odex文件的话,DexClassLoader肯定会在运行时释放未加密的odex文件到目录,这样的话被保护的逻辑也就泄露了。DexClassLoader加载过程会在java层和C层产生不同的数据结构,java层并没有实质性的数据, 所有的数据都在c层,我们可用通过底层代码完成dex数据的解析。底层dex分析是可以支持byte数组的,解密 odex数据,传递过去就行了。这样java层就可以调用了。以下是大概伪代码实现步骤:1. int loadDex(char * dexFileName) 2. 3. char *dvm_lib_path = /system/lib/libdvm.so; 4. void * handle; 5. DvmGlobals gDvm; 6. handle = dlopen( dvm_lib_path, int mode); 1、读取dexFileName文件内容并解密到byte数组。2、调用dexFileParse函数解析byte数组为DexFiledalviklibdexDexFile.cDexFile* dexFileParse(const u1* data, size_t length, int flags)/dlsym(handle, dexFileParse);3、调用allocateAuxStructures转换DexFile为DvmDex,(由于该方法为static方法,因此需要按照其逻辑自行实现)dalvikvmDvmDex.cstatic DvmDex* allocateAuxStructures(DexFile* pDexFile) 4、添加DvmDex到gDvm.userDexFilesdalvikvmInit.cstruct DvmGlobals gDvm; /gDvm = dlsym(handle, gDvm);5、修改MyDexClassLoader中的mDexs对象的mCookie值,mCookie主要用于映射底层DvmDex数据DexClassLoader.mDexs0.mCookie值(4)so如何实现程序的反调试?同linux反调试基本原理相同,这里提供一种方式就是在JNI_Onload中调用ptrace方 法,ptrace被广泛用于调试(比如IDA)和进程代码注入(比如LBE,金山等权限管理功能实现),一个进程只能被一个进程ptrace,如果你自己 调用ptarce,这样其它程序就无法通过ptrace调试或者 向您程序进程注入代码。ptrace(PTRACE_TRACEME,0 ,0 ,0);通过本人实验,该种方式可以实现so的反调试。三、总结通过以上分析,梆梆加固的确可以有效防止移动应用在运营推广过程中被破解、盗版、二次打包、注入、反编译等破坏,不过如果Android恶 意软件也通过这种方式加固保护,这
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 被指导教师毕业论文指导心得体会
- 苏教版小学科学三年级上册秋季教学计划
- 2025春季少先队防灾减灾计划
- 广东摄影家协会入会申请书-广东女摄影家协会
- 部门月度工作总结3篇
- 2025中国海洋安全态势监测论文范文
- 幼儿园美术创意教育活动计划
- 快递物流疫情期间安全防控措施
- 2025年信息技术教育整顿心得体会
- 公共卫生师徒结对计划-师傅计划
- 职业技术学院《装配式混凝土构件生产与管理》课程标准
- 初中数学自制教具研究报告
- 中暑急救知识培训课件
- DBJ15 31-2016建筑地基基础设计规范(广东省标准)
- 部编新人教版教材语文九年级上下册必背古诗词
- 智能交通系统应急预案
- Unit6DisasterandHope单词教学设计-2023-2024学年高一英语外研版(2019)必修第三册
- 盘扣式卸料平台施工方案
- DL∕ T 736-2010 农村电网剩余电流动作保护器安装运行规程
- 钙钛矿光电探测器的研究进展
- 组合截面的惯性矩课件讲解
评论
0/150
提交评论