本文假设你已经使用过梆梆加固,手头至少有个一个通过梆梆加固后的apk,并且要求您对xposed框架有一定的了解,以下的所有hook方法都是通过xposed来实现的。
BTW:本人实现了一个hook动态库的功能,无需root就能hook住动态库的对外接口,后面会写文章介绍方法
梆梆加固的原理,这里就不仔细描述了,可以将加固后的apk反编译后分析一下,看看梆梆在里面都加了什么内容,我总结一下梆梆加固做了哪些事情:
1、创建.cache目录,/data/data/packageName/.cache/"
2、自定义DexClassLoader:
dexPath: /data/data/packagename/.cache/classes.jar
optimizedDirectory: /data/data/packagename/.cache
libraryPath: /data/data/packagename/lib
3、通过自定义dexclassloader的方式,可以将真正的dex进行隐藏,在运行时动态load该dex,
4、 由于dex在安装时会被转换为odex存放在/data/dalvik-cache目录下,梆梆加固后的app在该目录下的odex文件非真正运行的odex文件。
小结:万变不离其宗,不管梆梆加固怎么伪装,原理上都是通过自定义DexClassLoader来实现的,这也是破解梆梆加固的根本。
BTW:梆梆加固为了防破解还是做了很多工作的,比如笔者之前试着通过用gdb来挂进程,并通过dump内存的方式来破解,但是一挂上进程后,程序就异常终止了。
破解办法:由于梆梆加固将真实的dex进行了隐藏,所以咱们现在要做的就是想办法把真实的dex给挖出来,通过静态的文件分析没什么好办法,但是有一点可能是所有的加固软件都没办法解决的问题,就是在程序运行时,需要把dex文件加载到内存里来。这是我们破解的入口,以下内容也是围绕着这个目标来展开的。
1、 要获取dex文件的信息,必须获得系统的ClassLoaer ,每个apk运行起来后都有一个对应的数据结构:如下:
- public final class LoadedApk {
- private static final String TAG = "LoadedApk";
- private final ActivityThread mActivityThread;
- private final ApplicationInfo mApplicationInfo;
- final String mPackageName;
- private final String mAppDir;
- private final String mResDir;
- private final String[] mSharedLibraries;
- private final String mDataDir;
- private final String mLibDir;
- private final File mDataDirFile;
- private final ClassLoader mBaseClassLoader;
- private final boolean mSecurityViolation;
- private final boolean mIncludeCode;
- private final DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments();
- Resources mResources;
- private ClassLoader mClassLoader;
- private Application mApplication;
- private final ArrayMap<Context, ArrayMap<BroadcastReceiver, ReceiverDispatcher>> mReceivers
- = new ArrayMap<Context, ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>>();
- private final ArrayMap<Context, ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>> mUnregisteredReceivers
- = new ArrayMap<Context, ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>>();
- private final ArrayMap<Context, ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher>> mServices
- = new ArrayMap<Context, ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher>>();
- private final ArrayMap<Context, ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher>> mUnboundServices
- = new ArrayMap<Context, ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher>>();
- int mClientCount = 0;
如果能拿到这个数据结构,就能拿到对应的ClassLoader信息,还能拿到所有的services、receivers信息。这个可以通过hook类
Android.app.ActivityThread.AppBindData中的handleBindApplication方法来实现。
2、拿到ClassLoader后,就能拿到dex文件路径、library路径、odex文件路径,dexPath对应的类为dalvik.system.DexPathList,包含一个成员变量Element数组用来存放所有的odex文件,Element数据结构如下:
- static class Element {
- private final File file;
- private final boolean isDirectory;
- private final File zip;
- private final DexFile dexFile;
- private ZipFile zipFile;
- private boolean initialized;
其中DexFile就是odex文件的描述,而在该类中有个变量mCookie,如下图:
- public final class DexFile {
- private int mCookie;
- private final String mFileName;
- private final CloseGuard guard = CloseGuard.get();
这个就是咱们要找的东西啦,这个整形变量存储的是native层的指针值,指向的是dex在内存里的地址,也就是咱们的最终目标,mCookie指向的结构体如下图。
- typedef struct DexOrJar {
- char* fileName;
- bool isDex; //是dex文件还是jar包
- bool okayToFree;
- RawDexFile* pRawDexFile;
- JarFile* pJarFile; //如果是jar包,则指向JarFile结构
- u1* pDexMemory; //如果是dex,则指向dex内存区
- } DexOrJar;
思考:如何建立dexPath和DexOrJar结构体之间的映射关系呢?方法是:hook住dalvik.system.DexFile 中的openDexFileNative方法。在应用程序启动时,都会load dex文件,最终都会调用该方法,openDexFileNative方法为native方法,实现定义在dalvik_system_DexFile.cpp文件中的Dalvik_dalvik_system_DexFile_openDexFileNative方法中)然后根据dexpath取出DexOrJar对象指针,有了这个对象拿出odex只是时间的问题了。
从上述结构体中可以看出,根据扩展名是dex还是jar来决定内存的组织。有了指针我们就可以将其强转换为DexOrJar对象,其实到此处就已经拿到了odex文件对应的内存内容,下一步需要将该内容导出为smali,然后做dexodex to smali,最终得到smali文件后通过baksmali,就可以还原为dex文件。得到dex文件后,通过dex2jar可以转为Java文件,如下图为用梆梆加固后的陌陌解密后导出的dex文件反编译后内容:
在得到了dex和工程资源文件后,就可以将程序跑起来,还可以在外面加一层壳后跑起来,后面会写一篇文章详细描述这个过程。
相关推荐
MAC版梆梆加固助手是梆梆安全应用加固系统的 PC 端加固辅助工具,可以帮助客户实现“一 键加固 -> 自动下载 -> 自动打渠道包 -> 自动签名 -> 自动导出”的一站式加固服务体 验,是客户执行应用加固操作的必备助手。
Andorid APK反逆向解决方案:梆梆加固原理探寻-CSDN
梆梆加固方案分析和破解--论梆梆安全加固的不可靠.doc
梆梆加固方案分析和破解__论梆梆安全加固的不可靠.doc
相关使用请参考博文: http://blog.csdn.net/oooaooo/article/details/78737272
脱壳练习(2)-最新免费版梆梆加固脱壳笔记-附件资源
相关使用请参考博文: http://blog.csdn.net/oooaooo/article/details/78737272
DroidSword快速锁定具体的方法类名、FDex2_1.1去壳获取dex、GDA3.62查看去壳后的源代码
360加固保为开发者提供加固基础服务和可选增强服务,开发者根据使用需求选择增强服务,勾选后,再选择您上传的apk签名为正式签名还是测试签名,完成后,点击“开始加固”按钮进行加固。
androidHook,xposed,Android逆向androidHook,xposed,Android逆向
Android应用的破解与防破解,smali注入,动态调试,加壳去壳,目前市面上加固工具梆梆加固,360加固保的原理剖析。
研发团队在移动安全领域有着多年的研究和经验,有成熟的企业级产品。项目实现了Android应用的安全加固功能,包括SDK和加固工具。实现的功能请见《移动安全...同类产品请参考:爱加密、梆梆加固、聚安全、360加固宝。
查壳功能,支持获取爱加密,360加固,梆梆加固,阿里云加固,腾讯乐固,百度加固,娜迦加固,顶象加固,通付盾,网秦,几维加固等壳信息 支持提取高清图标 支持提取APK对应的权限,并且给出权限注释 支持提取签名...
梆梆程序管理_0.8_wap世纪-4梆梆程序管理_0.8_wap世纪-4梆梆程序管理_0.8_wap世纪-4
技术实现上,类似360加固宝、梆梆加固、爱加密、阿里聚安全类似。实现了: - 签名运行时校验 - 资源文件运行时校验 - dex资源运行时校验 - 其他资源运行时校验 保护个人移动应用或企业数据的安全性。如有源码需要,...
查壳功能,支持获取爱加密,360加固,梆梆加固,阿里云加固,腾讯乐固,百度加固,娜迦加固,顶象加固,通付盾,网秦,几维加固等壳信息 支持提取高清图标 支持提取APK对应的权限,并且给出权限注释 支持提取...
dumpDex , 一个开源的 Android 脱壳插件工具,需要在 Xposed 环境中使用,支持市面上大多数加密壳(实测360加固、腾讯乐固、梆梆加固、百度加固均可脱壳)。 dumpDex需要依赖于Xposed 框架才能发挥作用。 Dumpdex...
梆梆安全移动应用测评云平台产品白皮书 V3.5 ,分享技术白皮书。