首页 > 其他分享 >Android逆向与安全——360 dex加固与脱壳

Android逆向与安全——360 dex加固与脱壳

时间:2024-04-24 16:34:34浏览次数:30  
标签:dex 文件 函数 apk 360 加固 Android 调试

参考:https://zhuanlan.zhihu.com/p/566412180

前言

现在市面上对APP的安全合规管控越来越严格了,也就要求了APP在上架之前一定要做合规检测和加固处理。对APP就是加固的好处,可以提高APP的安全性,提高APP被逆向分析破解的门槛,同时通过加固保护可以提高过安全合规的检测。

由于APP加固技术不断被攻破情况,因此加固技术也是不断在快速迭代的过程。现在市面上的加固产品的还是比较多的,并且各个加固技术产品都有其各自优缺点,但是加固产品的所采用技术去有很多共性的地方。下面就对加固和脱壳对抗方案做些梳理总结。

Android 反编译的威胁

  • 逆向分析: 漏洞挖掘、协议分析
  • 二次打包: 盗版、破解、广告

保护方案

  • 代码混淆:Java代码、C\C++带马甲、JS\HTML代码
  • 应用加固:DEX文件、SO文件、资源文件

APP构建过程中用到的工具

编译流程

  • java源码编译:通过javac将源码编译为.class文件
  • 多dex分包:脚本将类根据一定规则划分到主dex和从dex中,生成配置文件
  • proguard优化/混淆:对.class文件进行压缩、优化、混淆处理
  • 转化为dex文件:dx\d8将.class文件转换为dex文件

DEX加固方案的演进

  • 动态加载:从服务器动态加载业务的DEX
  • DEX内存加载:模拟App启动的时候,将我们的壳、将业务DEX文件加载到内存中,然后通过一些处理方式,让DEX文件把Application启动起来,让应用认为和普通的启动方式是一样的 (缺点:DEX会暴露在内存中)
  • DEX指令抽取:把DEX文件中的一些方法的指令抽取出来,然后在内存中开辟一段区域,然后将我们内存加载的DEX解析到相应的方法指令偏移的地方,方法指令的偏移指向我们开辟的一段内存里面。(缺点:不彻底)
  • 虚拟机加固:我们通过自己实现一套虚拟机,将DEX方法的指令抽取出来,在运行的时候,我们的虚拟机里面就运行被抽取的一段指令。这样攻击者想要破解,首先必须要找到我们虚拟机的入口,将虚拟机整个逻辑还原出来,这样攻击成本相对比较高 (缺点:本身Android应用就运行在虚拟机里面,不论是Dalvik还是ART,增加个虚拟机,就会增加一层对应用运行时代码的解释执行操作,那么解释执行的效率会大大下降)
  • JAVA2C:提升应用运行时的效率,我们的方法会转换为一层在Native(JNI)上实现的逻辑,最终通过JNI编译成so,这样的话在本地执行,而不是在虚拟机执行,执行效率会大大提升。

360加固与脱壳流程

360整体加固classes.dex后的apk程序的特点,以超信1.1.4版本为例。360加固以后,会在apk的assets文件的路径下增加两个文件libjiagu.so和libjiagu_x86.so以及修改原apk的AndroidManifest.xml文件的application标签增加两个元素。

 

360加固脱壳需要完成两个任务,一个任务是过掉360加固的反调试,另外一个是获取原apk的classes.dex文件。下面写一下具体的脱壳步骤,完成这两个任务。为了脱壳成功,在动态调试加固apk程序前,需要将android_server调试程序的名字修改一下,因为360加固会通过查询/proc/pid/cmdline文件获取程序的名称来对android_server、gdb、ltrace、strace调试器进行反调试。

在动态调试加固apk程序的时候,需要在几个关键点函数 open、strtol、mmap、memcmp处下断点,后面具体的分析。由于android系统是由Linux系统修改而来,因此Android系统上很多的属性和Linux系统下的属性。Linux下进程和线程的信息是保存在文件中的,因此要查询进程或者线程的信息必须通过open或者fopen等方式操作文件来完成。

Android的so调试的步骤略过,已经在上面提到的4个函数处下断点,注意下断点的技巧,下断点的时候,要在一个函数的第1条指令和最后一条指令的地方下断点。

F9运行程序,当看到下图的状态,调用open函数打开文件/proc/self/status时,可以确实是加固外壳apk程序通过TracePid的反调试。

过掉通过TracePid方式的反调试的方法是在strtol函数处下断点,在strstol函数的最后一行指令的地方,修改该函数的返回值R0的值为0即可,然后F9运行程序。

360加固的外壳程序apk还会通过文件/proc/net/tcp的本地套接字进行反调试,一旦检测到程序有23946端口的本地连接的套接字,他就会结束当前程序,其实过这个方式的反调试的方法很多,修改远程调试的端口号就可以过掉反调试。

过掉通过/proc/net/tcp文件的本地套接字的反调试的方法是在open函数处下断点,然后F8单步调试发现strstr函数,加固的外壳apk程序就是通过strstr函数进行判断当前进程是否存在本地连接的套接字,一旦检测到,就结束当前进程。

发现程序循环调用strstr函数进行判断,当strstr函数的返回值不为0为字符串“sl local_address rem_address”时,需要注意,说明当前进程已经检测到了本地连接的套接字,因此需要修改strstsr函数的返回值为0即可。

加固apk程序还会通过"/proc/pid/mdline"对android_server、gdb、strace、ltrace调试器进行反调试,但是只要向前文提到的修改android_server的名称即可过掉该反调试。

过掉反调试的方法已经说明白了,下面只要F9运行,按照前面的方法过掉几次前面提到的反调试即可畅快的调试程序了。当发现当前进程调用open函数打开文件/proc/pid/maps需要注意了,脱壳需要关注的地方开始了。原被加固的dex文件开始解压和解密了。

经过几次F9的调试发现了下面截图的状态,但是不要心急,只是离脱壳进了一步,此时内存dump出来的odex文件不是被加固的原dex文件的而是加固外壳qihu360的dex文件。

继续F9运行程序,经过n次F9运行memcmp函数以后(其实这里可以做一个处理,暂时去掉mmap函数的断点,等到mmap函数断点处再次设置mmap函数的断点),再经过大约2次mmap函数运行以后,再一次调用memcmp函数即到了脱壳的地方,注意此时加固外壳apk程序呈现的堆栈和内存的状态。由于360加固自己制作了dvmDexFileOpenPartial函数,但是该函数需要调用memcmp进行dex文件的魔法字符串”dex“的比较,因此此时是脱壳的最佳时机。

OK,现在的任务就是从内存中dump出原来完整的dex文件,既可以手动的dump出内存中的dex文件,也可以通过IDC的脚本或者dumpdex的插件将原dex文件dump出来。

原apk程序的Dex文件拿到了,只需替换360加固的外壳程序的dex,删除AndroidManifest.xml文件的application标签增加的两个元素,删除assets文件的路径下增加两个文件libjiagu.so和libjiagu_x86.so以及原来的签名,重新签名一下apk程序即可。

在删除的application标签增加的元素中,特别是在删除android:name =””的时候,一定要检查脱壳的classes.Dex文件中否重写过application类,如果脱壳后的classes.Dex文件中重写了application类,需要将application标签中android:name=””修改过来才行。

以上就是有关dex加固的方法了,举例了360加固与脱壳流程。关于更多的Android逆向与Android技术学习我们可以前往《Android核心技术手册》。由阿里P10高工整理;助力初、中级Android开发有很大帮助。

Android核心技术进阶手册​docs.qq.com/doc/DUkNRVFFzTG96VHNi

文末

拓展学习

so加固

so反编译比较困难,比dex的反编译困难。一般做法是抽取Android工程的关键java代码转为c/c++, 然后生成so文件。so加密我只是了解了一下破坏.so部分头文件的方式加固。

加固里面的VMP(虚拟机)是什么?

VMP(虚拟软件保护技术)大概思路就是自定义一套虚拟机指令和对应的解释器,并将标准的指令转换成自己的指令,然后由解释器将自己的指令给对应的解释器。

标签:dex,文件,函数,apk,360,加固,Android,调试
From: https://www.cnblogs.com/kuangke/p/18155751

相关文章

  • 关于使用UE5打包Android的测试
    UE5打包Android,不同于UE4,在官方文档中需要Androidstudio4.0或者3.5,还有AndroidSDK,NDK等设置SetupAndroid, 在UE5Editor配置如下:  其中 gamedatainside.apk需要打钩,否则会出现报错:TherewasanerrorinstallingthegameortheobbfileProjectSDKOverri......
  • 抢先看!美团、京东、360等大厂面试题解析,技术面试必备。
    技术面试必备!美团、京东、360等大厂面试题详解,让你轻松应对各大公司面试挑战!往期硬核面经哦耶!冲进腾讯了!牛逼!上岸腾讯互娱和腾讯TEG!腾讯的面试,强度拉满!前几篇文章分享了上岸腾讯的最新面经。不少粉丝股东留言说别只发腾讯的啦,其他大厂的也安排一些吧,比如美团、360、京东的......
  • Android开发笔记[18]-使用本地模块
    摘要将摄像头预览页面封装到Android模块中并在app中使用这个本地模块.关键信息AndroidStudio:Iguana|2023.2.1Gradle:distributionUrl=https://services.gradle.org/distributions/gradle-8.4-bin.zipjvmTarget='1.8'minSdk26targetSdk34compileSdk34开发语言:K......
  • index join SLCT 条件过滤性好,怎么将它下推?
    sqlselect--/*+enable_index_filter(1)enable_hash_join(0)use_nl_with_index(authallrea2_,IDX_DM_20236274)*/--/*+no_semi_gen_crossHI_RIGHT_ORDER_FLAG(2)ADAPTIVE_NPLN_FLAG(3)USE_INDEX_SKIP_SCAN(1)*/citicscoma0_.fd_idasfd1_88_,citi......
  • GDExtension-Swift
    GDExtension-Swift使用Swift​编写GDExtension​步骤与使用C++​相同,根据官方文档介绍,我们使用一个由社区维护的SwiftGodot​项目。本文参考复刻社区的教程MeetSwiftGodot,并对遇到的问题进行补充。资源原版教程资料:下载实验资料本例代码仓库:https://github.com/biiigwang/go......
  • 盟军敢死队2 360关
    https://www.52pojie.cn/thread-1179852-1-1.html下载后,先D:\Comm2\Win10全屏补丁运行全屏补丁.然后Comm2P.exe右键属性,设置更改dpi,设置为应用程序的放缩.然后打开游戏设置分辨率,之后就能玩了.有一些改动.之前的108关也很经典.一共360关.......
  • 【android】获取手机安装的所有程序
     1.获取包管理器对象PackageManagerpm=context.getPackageManager();2.得到所有安装的程序包名List<PackageInfo>infos=pm.getInstallPackages(PackageManager.GET_UNINSTALLED_PACKAGES);3.然后遍历这个集合for(PackageInfopackInfo:infos){Drawabl......
  • 使用 MediaCodec 在 Android 上进行硬解码
    要使用MediaCodec在Android上进行硬解码,并获取RGBA数据,你可以按照以下步骤进行操作:创建MediaExtractor对象并设置要解码的MP4文件路径:MediaExtractorextractor=newMediaExtractor();extractor.setDataSource(filePath);根据需要选择音频或视频轨道:inttrackCo......
  • Android Studio 蓝牙 示例代码(转)
    原文:https://blog.csdn.net/qq_40511184/article/details/122698077因为androidstudio升级,下面代码中的startactivityresult函数有变化,不能使用,需要更换为publicActivityResultLauncher<Intent>register;ActivityResultLauncher<Intent>startBlueTooth=registerForActi......
  • 关于Android Studio双击exe没有反应解决办法
    首先说原因,我的因为之前卸载了,然后重新下载后一直打不开,查看了很多博客找不到解决办法,最终在AndroidStudio双击exe没有反应解决办法_androidstudio双击没反应-CSDN博客这个博客中得到了启发 先说解决办法第一步,到AndroidStudio的bin目录下,查看studio.bat文件查看的话......