【移动安全高级篇】————5、Andorid APK反逆向解决方案---梆梆加固原理探寻

主流加固方案深度剖析(梆梆/腾讯/阿里) 文件头魔改特征原始DEX头:64 65 78 0A 30 33 35 00乐固DEX头:4C 47 44 58 01 00 00 00修复脚本f.seek(0)f.write(b'dex\n035\x00') # 修复魔数f.write(struct.pack('<I', 0x70)) # 修复header_size。 阅读详情

一、序言

目前Android市场充斥着大量的盗版软件,开发者的官方应用被“打包党”们恶意篡改。如何使程序代码免受盗版篡改就成了开发者面临的头等大事,今天我们将分析一个不错的解决方案---梆梆加固(http://www.secneo.com/appProtect/)。
通过对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加壳技术方案”
(http://blog.youkuaiyun.com/jiazhijun/article/details/8809542)中提出了一种使DexClassLoader加载组件类具有生命周期的方法。
运行加固后的程序并通过Mat内存分析工具查看类加载情况:

  如上图所示,组件类的加载类已经被修改为com.secapk.wrapper.MyClassLoader类,可以得出结论,该方式和我提出方式基本相同,通过修改系统组件类ClassLoader来实现。

(2)如何混淆native方法在so库函数对应关系?
jni方法注册方式有两种,
1、通过javah产生函数头,该种方式产生的方法具有固定的格式。该方式使逆向分析人员比较容易获取java层native方法对应的本地方 法。
 2、在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);

1、读取dexFileName文件内容并解密到byte数组。
2、调用dexFileParse函数解析byte数组为DexFile
\dalvik\libdex\DexFile.c
DexFile* dexFileParse(const u1* data, size_t length, int flags)//dlsym(handle, "dexFileParse");
3、调用allocateAuxStructures转换DexFile为DvmDex,(由于该方法为static方法,因此需要按照其逻辑自行实现)
\dalvik\vm\DvmDex.c
static DvmDex* allocateAuxStructures(DexFile* pDexFile) 
4、添加DvmDex到gDvm.userDexFiles
\dalvik\vm\Init.c
struct DvmGlobals gDvm; //gDvm = dlsym(handle, "gDvm");
5、修改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恶意软件也通过这种方式加固保护,这将会给移动安全分析人员带来巨大的挑战,因为安全分析人员经常使用的代码静态逻辑分析和动态调试分析在该情况下都失效了。
梆梆官方声称不会对恶意软件进行加固,的确在加固的过程中发现存在安全软件扫描信息和云测试处理流程,不过这些措施只能减少而不能彻底杜绝恶意软件通过梆梆加固保护。如何不被恶意软件利用是梆梆需要解决的问题。

Keil 5安装教程(C51与MDK共存) 目录前言MDK的安装C51的安装安装完成后的验证新建C51工程添加C51程序文件编译测试总结 前言 本篇文章将介绍嵌入式开发工具Keil 5的安装方法,并使MDK(Microcontroller Development Kit,开发stm32时会用到)和C51(51单片机C语言软件开发系统)共存。今后使用Keil 5可同时开发51单片机程序和ARM单片机程序,便于学习与从51到32的过渡。 注: 为防止商业纠纷,本篇文章不涉及文中软件的注册破解,请支持正版。 同时为了便于今后更深入的学习,本文不会介绍软件的 阅读详情

相关推荐

PyMuPDF`库实现PDF旋转功能

本文介绍了一个简单的Python应用程序,用于将PDF文件转换为旋转90度的PDF文件。通过使用`wx很抱歉,Markdown格式在当前聊天界面无法显示。我将为您提供纯文本格式的博客内容,您可以将其复制到Markdown编辑器中进行格式化。PDF转换工具本文介绍了一个简单的Python应用程序,用于将PDF文件转换为旋转90度的PDF文件。该工具使用了wxPython和PyMuPDF库。功能该PDF转换工具具有以下功能:1. 选择PDF文件:通过点击“选择文件”按钮,用户可以选择要转换的PDF文件。

Winfredzhang的博客 2735

APK脱壳之—如何脱掉“梆梆加固”的保护壳

一、前言 现如今Android用户的安全意识不是很强,又有一些恶意开发者利用应用的名字吸引眼球,包装一个恶意锁机收费的应用,在用户被骗的安装应用之后,立马手机锁机,需要付费方可解锁。这样的恶意软件是非常让人痛恨的。所以本文就用一个案例来分析如何破解这类应用,获取解锁密码,让被骗的用户可以找回爽快! 二、分析软件锁机原理 本文用的是一款叫做:安卓性能激活.apk,关于样本apk文件后面会给出下载地址,从名字可以看到它肯定不会是一个恶意软件,但是当我们安装的时候,并且激活它的权限之后就完了。下面不多说了,直接用

白帽子九一 1万+

WIFI CSI动作识别数据集全解析:从数据采集到深度学习应用

本文全面解析了利用商用Wi-Fi设备的信道状态信息进行动作识别的完整流程。文章以经典WiSA数据集为例,深入剖析了CSI数据的采集原理、结构特点,并详细阐述了从原始数据预处理、特征工程到深度学习模型(如CNN-LSTM融合架构)构建与优化的关键技术,旨在为研究者提供从数据到应用的全链路实战指南。

r2s3t4的博客 281

Android加固平台推荐(五星)

目前我使用的是360加固来用来加固,然后加固完成,使用的是爱加密来加密。这样的组合还不错。现在的360加固的加密要收费,之前是免费的加固与加密一起,现在要开vip才可加密,但是加固还是老样子免费。喜欢就喜欢吧,喜欢没有理由。

zxz_zxz_zxz的博客 2万+

Vben Admin权限管理全解析:从动态菜单到按钮级控制(附代码示例)

本文全面解析Vben Admin框架的权限管理系统,从动态菜单生成到按钮级细粒度控制,提供完整的实现方案和代码示例。深入探讨基于角色-权限模型的架构设计,分享前后端协作的最佳实践,帮助开发者快速构建安全高效的企业级后台系统。

weixin_30919429的博客 485

【MATLAB代码】蚁群算法(Ant Colony Optimization, ACO)路径规划(避障)仿真程序,订阅专栏后可直接查看完整源代码

基于蚁群算法的路径规划系统。可自定义起点、终点和障碍物地图,系统通过蚁群算法自动计算最优路径,并输出路径坐标、障碍物地图和收敛曲线。完整MATLAB源代码直接运行。适用于复杂障碍环境下的路径优化问题。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 3091

梆梆加固原理分析

壳的运行流程: 加固流程分析: 总结篇: 梆梆加固将整个Dex文件加密,并重写了原来的Application类,并将程序的入口重定向到“Loader”--secData0.jar上。系统会在初始化的时候执行loader内的stubApplication,subApplication完成对原始Dex文件(Playload)的解密并动态加载,然后执行原Application类

雪一梦的博客 9370

5、数据计算与处理技巧全解析

本文深入解析了Tableau中的多种数据计算与处理技巧,涵盖LOD计算、日期与字符串处理、计数优化、数据混合限制及自定义总计等核心内容。通过实际案例和流程图,系统讲解了各技巧的应用场景、实现步骤与注意事项,并提供性能优化建议和常见问题解答,帮助用户提升数据分析效率与可视化精度。同时展望了未来数据计算技术的发展趋势,是Tableau用户进阶必备的全面指南。

peach的博客 82

梆梆加固破解

加固后的apk脱壳

jiang_lostcode的专栏 1万+

Buck电源设计常见的一些问题(五)MOS管振荡抑制方法(三)

关于开关节点振荡的产生机制和抑制问题,总结了三种抑制方法。第一种方法是利用输入端的高频去耦电容;第二种方法是设计 RC 缓冲电路;第三种方法是优化自举电路的串联电阻。以上三种方法均通过实验加以验证,对开关节点振荡具有很好的抑制作用。应该综合同步 Buck 变换器的各项指标权衡设计。

小幽余生不加糖 1633

【机器视觉】基于深度学习的托盘PCB识别与计数(有无、正反)

工业机器视觉是指在制造业和工业环境中使用计算机视觉技术来执行检测、测量、识别和控制任务。它结合了硬件(如相机、镜头、光源)与软件(图像处理算法)来自动完成传统上需要人工视觉的任务,从而提高生产效率、产品质量以及工作安全性。工业机器视觉系统通常具有高精度、高速度和高可靠性,能够适应恶劣的工作环境。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

APK加固(梆梆助手)

前言:朋友在使用梆梆时出现Apk加固后安装失败的现象,所以自己写篇小白文 1.进入梆梆官网(注册) 2.下载梆梆助手(点击加固工具) 本人电脑是Windows系统(下载) 3.安装后,登录账号,导入APK 4.等------------到软件流程到已完成后,点击导出,选择导出签名APK(弹出输入框,需输入密钥文件,密码) 5.将自己的密钥,密码输入,导出成功。 ...

计蒙不吃鱼的博客 5474

31.XAPP1052乱序分析及处理

目录 1.XAPP1052乱序分析 2.XAPP1052乱序处理 2.1乱序处理方法选择 2.2 XAPP1052乱序处理代码详解 3.XAPP1052乱序处理后的波形分析 3.1发送引擎 3.2接收引擎 4.XAPP1052乱序处理后的带宽测试 5.下期内容 1.XAPP1052乱序分析 首先先给大家讲解下什么是PCIe的乱序。在PCIe系统中,乱序就是主机发送的TLP序列ID为1、2、3、4到从机,从机接收到的可能不是1、2、3、4。主机和从机如果都不解决乱序的问题,就会导致从机接

一个早起的程序员 1707

梆梆企业版加固技术之防篡改剖析

(本文仅限于技术讨论,不得用于非法途径,造成不良后果,与作者无关) 本篇主要介绍梆梆安全加固防篡改的原理和方法。选择梆梆,是因为其在防篡改方面是比较突出的。如果后续有时间会陆续将梆梆企业版使用的加固技术和大家分享。前言既然我们选择BB,我们先看一下BB在防篡改技术的介绍,下图是BB官网上关于防篡改的介绍。 BB官网防篡改介绍 从上图可知,APK“任何文件”(这里的任何加引号的意思

移动安全逆向研究 5934

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

梆梆安全加固企业版分析

我是一名奋战在安全第一线的程序猿,爱好和平,爱好打包不平,Freedom Forever ! 最近移动安全太火,火的我都忍不住玩了一把,最近几个月在研究各家的安全加固方案,大多dex加密、反调试等技术,玩着玩着就没了意思。 前段时间,突然发现有的企业客户端apk的加固方式发生了一些变化,勾起了我的兴趣,好东西不敢私藏,分享出来供大家把玩。这个apk文件中包含了一个classes.des文件,如

sg11225001的专栏 7233

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Apk脱壳圣战之—如何脱掉“梆梆加固”的保护壳

一、前言 现如今Android用户的安全意识不是很强,又有一些恶意开发者利用应用的名字吸引眼球,包装一个恶意锁机收费的应用,在用户被骗的安装应用之后,立马手机锁机,需要付费方可解锁。这样的恶意软件是非常让人痛恨的。所以本文就用一个案例来分析如何破解这类应用,获取解锁密码,让被骗的用户可以找回爽快! 二、分析软件锁机原理 本文用的是一款叫做:安卓性能激活.apk,关于样

AT弄潮儿 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

脱壳之常用的加固样本特征

主要看assets文件夹和lib文件夹。

AdrianAndroid的专栏 2848

APK签名V1+V2加固

Android签名加固工具V1V2

Unity项目开发中遇到的问题 765

利用梆梆加固逻辑漏洞取巧脱壳

首先要道个歉,之前要发的进程注入,开发hook框架、插件化等技术,因为原公司产品还在使用,暂时是不能开源了,还是食言了。   抽空看了几家加固的应用,做了个通用脱壳机(轻量化,只需要进程注入埋点,全Java层即可,可以不依赖hook框架,当然我为了方便使用的我自己写的hook框架。类似dexhunter以及一些修改源码、编译系统的方式太重了),暂时除了梆梆函数级加密,其他加固的抽取字节码的只要...

DaoDivDiFang的博客 5783

Android 应用加固技术综述

原理 转载 加壳原理 加固的过程中需要三个对象: 需要加密的Apk(源Apk) 壳程序Apk(负责解密Apk工作) 加密工具(将源Apk进行加密和壳Dex合并成新的Dex) 主要步骤: 用加密算法对源Apk进行加密,形成加密的DEX文件 将加密的DEX文件与壳Apk进行合并得到新的Dex文件 用新的Dex文件替换壳程序中的dex文件,得到新...

清澈见底的专栏 473

梆梆加固脱壳解密sign

2023.10梆梆免费版脱壳

AMarin的博客 4249

Android加固

前段时间,研究了一些Android逆向相关的工具和技术,并写了一些博客。当然,逆向的博客还没写完,初步写了那么几篇,后面还会继续写。之前也提到过,有逆向,就有相关的保护措施,加固就是其中的一种。接下来,我将总结一下目前常用的Android加固平台。 一.梆梆加固 1.在线加固 1.这是梆梆加固的官网:https://dev.bangcle.com/。注册新用户并且登录后,点...

zhaojun的博客 2万+

Apk脱壳圣战之---如何脱掉“梆梆加固”的保护壳

一、前言 现如今Android用户的安全意识不是很强,又有一些恶意开发者利用应用的名字吸引眼球,包装一个恶意锁机收费的应用,在用户被骗的安装应用之后,立马手机锁机,需要付费方可解锁。这样的恶意软件是非常让人痛恨的。所以本文就用一个案例来分析如何破解这类应用,获取解锁密码,让被骗的用户可以找回爽快! 二、分析软件锁机原理 本文用的是一款叫做:安卓性能激活.apk,关

云守护的专栏 5283

AI如何助力梆梆加固,提升移动应用安全防护

当检测到异常行为(如非预期的root权限请求)时,模型能快速关联其他线程状态,区分是功能需求还是攻击行为。比如检测到未加密的敏感数据存储时,AI会结合数据流向判断风险等级,并优先标记可能被恶意利用的代码段。最惊喜的是"一键部署"功能——完成代码调试后,点击按钮就能生成可对外提供服务的加固接口,不用操心服务器配置。过去的安全报告满是技术术语,现在AI会按风险等级分类,并用开发者熟悉的业务模块名称描述问题位置。对于移动开发团队来说,这种低门槛的智能化加固方案,或许会成为未来快速迭代中的标配工具。

CrystalwaveStag的博客 149

推荐开源项目:APK加固工具

推荐开源项目:APK加固工具 项目地址:https://gitcode.com/gh_mirrors/jia/Jiagu 1、项目介绍 在移动互联网时代,安全问题一直困扰着Android开发者。为了保护您的应用程序免受恶意攻击和逆向工程,我们很高兴推荐一款强大的开源项目——APK加固。该工具专为Android应用提供高效且易于使用的加固服务,支持从Android 5.0到最新版的操作系统,并已经在...

gitblog_00034的博客 3124

Andorid APK反逆向解决方案---梆梆加固原理探寻

本文章由Jack_Jia编写,转载请注明出处。   文章链接:http://blog.youkuaiyun.com/jiazhijun/article/details/8892635 作者:Jack_Jia    邮箱: 309zhijun@163.com 一、序言        目前Android市场充斥着大量的盗版软件,开发者的官方应用被“打包党”们恶意篡改。如

移动安全研究和Android/iOS/小程序隐私合规 3万+
上一篇: 【移动安全实战篇】————6、xx.apk Android破解新思路
下一篇: 【移动安全高级篇】————6、Android DEX安全攻防战
FLy_鹏程万里
FLy_鹏程万里 优质创作者: 后端开发技术领域 优质创作者: 后端开发技术领域 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄9年 1万+粉丝 1364原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值