本文假设你已经使用过梆梆加固,手头至少有个一个通过梆梆加固后的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和工程资源文件后,就可以将程序跑起来,还可以在外面加一层壳后跑起来,后面会写一篇文章详细描述这个过程。
相关推荐
"梆梆加固方案分析和破解--论梆梆安全加固的不可靠" 梆梆加固方案分析和破解是一篇关于Android应用程序加固方案的分析和破解文章。通过对梆梆加固方案的技术分析和破解,文章揭示了梆梆加固方案的保护策略和实现...
MAC版梆梆加固助手是梆梆安全应用加固系统的 PC 端加固辅助工具,可以帮助客户实现“一 键加固 -> 自动下载 -> 自动打渠道包 -> 自动签名 -> 自动导出”的一站式加固服务体 验,是客户执行应用加固操作的必备助手。
这篇文章可能涵盖了如何集成梆梆加固服务到Android项目中,以及如何进行配置和测试加固效果等内容。由于我们无法直接查看该文章,以下将基于梆梆加固的一般特性进行说明: 1. **动态加载技术**:梆梆企业版通常采用...
Andorid APK反逆向解决方案:梆梆加固原理探寻-CSDN
梆梆加固方案分析和破解__论梆梆安全加固的不可靠.doc
脱壳练习(2)-最新免费版梆梆加固脱壳笔记-附件资源
梆梆企业版是一款知名的移动应用安全加固平台,其主要功能是增强应用程序的安全性,防止恶意攻击和逆向工程。在给定的压缩包文件中,包含的“libDexHelper.so”是一个动态链接库文件,它在Android系统中起到关键作用...
DroidSword快速锁定具体的方法类名、FDex2_1.1去壳获取dex、GDA3.62查看去壳后的源代码
360加固保为开发者提供加固基础服务和可选增强服务,开发者根据使用需求选择增强服务,勾选后,再选择您上传的apk签名为正式签名还是测试签名,完成后,点击“开始加固”按钮进行加固。
androidHook,xposed,Android逆向androidHook,xposed,Android逆向
研发团队在移动安全领域有着多年的研究和经验,有成熟的企业级产品。项目实现了Android应用的安全加固功能,包括SDK和加固工具。实现的功能请见《移动安全...同类产品请参考:爱加密、梆梆加固、聚安全、360加固宝。
加固工具如腾讯乐固、360安全加固、梆梆安全等提供了一站式解决方案,它们能帮助开发者全面提高应用的安全性。 5. **Dome源码**:Dome可能指的是防御外壳,一种用于增强应用安全性的技术。它通常包含运行时的防护...
查壳功能,支持获取爱加密,360加固,梆梆加固,阿里云加固,腾讯乐固,百度加固,娜迦加固,顶象加固,通付盾,网秦,几维加固等壳信息 支持提取高清图标 支持提取APK对应的权限,并且给出权限注释 支持提取签名...
梆梆程序管理_0.8_wap世纪-4梆梆程序管理_0.8_wap世纪-4梆梆程序管理_0.8_wap世纪-4
技术实现上,类似360加固宝、梆梆加固、爱加密、阿里聚安全类似。实现了: - 签名运行时校验 - 资源文件运行时校验 - dex资源运行时校验 - 其他资源运行时校验 保护个人移动应用或企业数据的安全性。如有源码需要,...
查壳功能,支持获取爱加密,360加固,梆梆加固,阿里云加固,腾讯乐固,百度加固,娜迦加固,顶象加固,通付盾,网秦,几维加固等壳信息 支持提取高清图标 支持提取APK对应的权限,并且给出权限注释 支持提取...
在实际操作中,可以使用现有的加固工具,如梆梆加固、360加固宝等,它们提供了自动化处理流程,简化了加固步骤。同时,开发者也需要定期更新加固策略,以应对不断演进的攻击手段。 综上所述,so加固是Android应用...