android-加壳加固

news2025/3/2 3:35:01

title: android-加壳加固
categories: Android
tags: [android, 加壳, 加固, 混淆]
date: 2022-06-20 18:00:23
comments: false
mathjax: true
toc: true

android-加壳


前篇

  • Android之Apk加壳 - https://blog.csdn.net/LVXIANGAN/article/details/84956476
  • Android动态加载Dex机制解析 - https://blog.csdn.net/wy353208214/article/details/50859422
  • Apk加固原理学习与复现 (好文) - https://www.anquanke.com/post/id/247644
  • android黑科技系列——Apk的加固(加壳)原理解析和实现 (好文) - https://www.cnblogs.com/chenxd/p/7820087.html
  • Android最初的加固 (好文) - https://www.jianshu.com/p/8e578dc2c5db
  • Android开发学习之路-加固实践 (好文, 貌似来源于上一个连接) - https://blog.csdn.net/eastmoon502136/article/details/103703950
    • demo - https://github.com/eastmoon1117/StudyTestCase/tree/master/DexPack/ShellApk
  • https://github.com/longtaoge/AndroidShell
  • 浅谈 Android Dex 文件 - https://www.infoq.cn/article/u5ld584clblpyln8extu
  • Android dex,odex,oat,vdex,art文件结构
  • 分享一个自己做的函数抽取壳 - https://bbs.pediy.com/thread-271139.htm
    • https://github.com/luoyesiqiu/dpt-shell
  • 通过内存加载DEX文件技术,完成一键DEX加固脚本 - https://github.com/yongyecc/dexshellerInMemory
  • 用AppComponentFactory实现变种爱加密壳保护的策略分析 - https://bbs.pediy.com/thread-268008-1.htm
  • dpt-shell抽取壳项目源码及其逆向分析 - http://tttang.com/archive/1728/
  • Android APP漏洞之战(11)——整体加壳原理和脱壳技巧详解 - https://bbs.pediy.com/thread-273293.htm#msg_header_h2_1
  • Android App加固原理与技术历程 - https://juejin.cn/post/6844904176070164488
  • APP加固种类甄别与侦查 (好文) - https://zhuanlan.zhihu.com/p/509957240
  • Android垃圾代码生成插件 - https://github.com/qq549631030/AndroidJunkCode

as 原生混淆 Proguard 没啥卵用

  • 几种Android混淆和逆向工具介绍 - https://blog.51cto.com/u_15060511/4080326

Proguard的混淆方法就是对其中的类名和方法名去除其对应的意思,因为,逆向工作者可以根据类名和方法名猜出函数的意思,可以大大降低逆向难度,但是Proguard并没有对指令进行改变,所以使用Proguard进行混淆的强度比较低。


整体流程

  • Android最初的加固 - https://www.jianshu.com/p/8e578dc2c5db


ClassLoader

  • ClassLoader理解及使用 - https://juejin.cn/post/6844903998013571086

so 文件查看符号表

  1. 查看命令

    $ nm -D libx8a3pjbix.so
    

    as

  2. 只显示 T (方法), 加个 awk

    $ nm -D libx8a3pjbix.so | awk '{if($2=="T"){print $3}}'
    


踩坑

java 壳 套 kotlin 源 闪退

报错找不到资源 id: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jared.testshell/com.jared.apktest.MainActivity}: android.content.res.Resources$NotFoundException: Drawable com.jared.apktest:dimen/abc_text_size_display_4_material with resource ID #0x7f050040

  • 原因未明, 但是 kotlin/java 壳 套 java 源 就没问题, kotlin 壳 套 kotlin 源 也没问题

so 库开发

  • AS的JNI和NDK开发—入门篇 - https://juejin.cn/post/6844903873866366984

so 库里脱壳

  • [原创]入门级加固–3种加固方式学习记录 - https://bbs.pediy.com/thread-255220.htm
  • Android APK 加固技术探究(二) - 如何解密 dex 文件 - https://juejin.cn/post/6985040096042942495/

ida 分析 so

  • IDA静态分析so文件 - https://zhuanlan.zhihu.com/p/358218034

hook

  • Hook 插件化框架 ( 使用 Hook 方式替换插件 Activity 的 mResources 成员变量 ) - https://blog.51cto.com/u_14202100/5080958
  • Android 换肤那些事儿, Resource包装流 ?AssetManager替换流 - https://juejin.cn/post/6844903902060478477
  • 【Android 插件化】Hook 插件化框架 ( 使用 Hook 方式替换插件 Activity 的 mResources 成员变量 ) - https://blog.csdn.net/shulianghan/article/details/119619952
    • https://github.com/han1202012/Plugin_Hook

插件化

  • 浅谈Android插件化 - https://juejin.cn/post/6973888932572315678
  • Android插件化主流框架和实现原理 - https://blog.csdn.net/chuhe1989/article/details/104622513
  • 常见android插件框架对比 - https://www.jianshu.com/p/a73b4b0288ea
  • Android 插件化之ClassLoader加载Dex文件 - https://github.com/13767004362/HookDemo
  • 【Android插件化】启动没有在Manifest中注册的Activity (好文) - https://blog.csdn.net/u013293125/article/details/105407056
    • https://github.com/ydslib/PluginTest01

插件框架对比

  • 滴滴的 VirtualAPK (4 年期开始就貌似不维护了) - https://github.com/didi/VirtualAPK
  • 360 的 RePlugin - https://github.com/Qihoo360/RePlugin
    • https://github.com/Qihoo360/RePlugin/wiki/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B

源码记录

  • Activity启动流程源码分析 - https://hitendev.github.io/2018/03/29/Activity%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/

混淆

  • 6个常用Java 源代码 保护工具(混淆、加密、底层) - https://www.cnblogs.com/mq0036/p/14922232.html
  • 细数常用的5款Java代码混淆器! - https://zhuanlan.zhihu.com/p/105409587
    • Allatori 混淆可以加密字符串 - https://blog.csdn.net/Viviha/article/details/104801930

实测加固流程

  1. 直接把 apk 当成 zip 解压到一个 目录 a 中

  2. 让后对 dex, so 加固处理

  3. 然后把 目录 a 用 zip 压缩为 apk 文件

    压缩过程中, resources.arsc 文件不能压缩, 要以文档形式存储 ZIP_STORED, 不然会出现这个错误 [安装到 安卓 11+ (API 级别 30) 机子未 4 字节对齐 或者 resources.arsc 被压缩了](#安装到 安卓 11+ (API 级别 30) 机子未 4 字节对齐 或者 resources.arsc 被压缩了)

  4. 对压缩好的 apk 进行 4 字节对齐

    $ zipalign.exe -p -f -v 4 I:/unalign.apk I:/align.apk
    
    
  5. 对 4 字节对齐好的 apk, 用 apksigner (不是 jarsigner) 进行签名.

    $ java -jar apksigner.jar sign -verbose --v1-signing-enabled false --v2-signing-enabled true --ks "E:/test_jks.jks" --ks-key-alias test_alias --ks-pass pass:test_pass --key-pass pass:test_pass --out I:/signed.apk --in I:/align.apk
    
    
    
    

踩坑

apktool 编译 apk 时报 values-v31 错误

报错: res\values-v31\colors.xml:3: error: Error: Resource is not public.

这个错误时 sdk 使用了 31+ 造成的, apktool 还不支持 31+,

  • 解决办法是把 sdk 设置为 30

    compileSdkVersion 30
    buildToolsVersion "30.0.2"
    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 30
    }
    

apktool 编译 apk 时引用库 sdk 超过 30

报错

Execution failed for task ':app_shell:checkDebugAarMetadata'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckAarMetadataWorkAction
   > The minCompileSdk (31) specified in a
     dependency's AAR metadata (META-INF/com/android/build/gradle/aar-metadata.properties)
     is greater than this module's compileSdkVersion (android-30).
     Dependency: androidx.appcompat:appcompat:1.4.1.
     AAR metadata file: C:\Users\wilker\.gradle\caches\transforms-3\34a5f42d2f1863af6e2f0b71a2ab8437\transformed\appcompat-1.4.1\META-INF\com\android\build\gradle\aar-metadata.properties.

壳 apk 里引用库 androidx.appcompat:appcompat:1.4.1 是使用 sdk 31 编译的

  • 解决办法是引用不超过 sdk 30 编译的库 implementation 'androidx.appcompat:appcompat:1.3.1'

apktool 编译 apk 时报错 requestLegacyExternalStorage

报错: AndroidManifest.xml:42: error: No resource identifier found for attribute 'requestLegacyExternalStorage' in package 'android'

  • 解决办法: 移除掉 ‘requestLegacyExternalStorage’ 配置 即可

壳运行时 启动 activity 失败

报错

Process: com.rmgrummy.pro, PID: 15023
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.rmgrummy.pro/com.yang.androidaar.ReferrerActivity}: java.lang.ClassNotFoundException: Didn't find class "com.yang.androidaar.ReferrerActivity" on path: DexPathList[[zip file "/data/user/0/com.rmgrummy.pro/app_payload_odex/payload.apk"],nativeLibraryDirectories=[/data/user/0/com.rmgrummy.pro/app_payload_lib, /system/lib, /vendor/lib]]
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2570)

因为在 源 apk 中配置了启动项为 com.yang.androidaar.ReferrerActivity, 而壳中有没有去 loadClass

  • 解决办法有两种
    1. 启动时在 壳 代码里去 load 配置在 壳 apk 中 AndroidManifest.xml 里配置的启动 activity
    2. 修改 壳 apk 中 AndroidManifest.xml 里配置的启动 activity 为 壳 代码 load 的 activity

脱壳后运行 源 apk 时不支持 kotlin 反射

报错: kotlin.jvm.KotlinReflectionNotSupportedError: Kotlin reflection implementation is not found at runtime. Make sure you have kotlin-reflect.jar in the classpath

报错 java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter cookieJar

可能是 源 apk 里引用的 第三方 sdk 里面有使用 kotlin 编译的库, 所以报了这个错误

  • 解决办法: 在 壳 工程里引用一下 kotlin 的反射库: implementation "org.jetbrains.kotlin:kotlin-reflect:1.4.32"

    参考: https://stackoverflow.com/questions/36440295/kotlin-jvm-kotlinreflectionnotsupportederror-kotlin-reflection-implementation-i


脱壳后运行 源 apk 时找不到对应 cpu 的 so 库

报 Android 错找不到对应 cpu so 的弹窗提示

虽然脱壳后有对应的 so 库在指定 cpu 目录, 但是报错

  • 解决办法: 在 壳 工程里创建 对应 cpu 的目录, 并且创建一个空 libXXX.so 库即可 (暂时不清楚为啥), 如 lib\armeabi-v7a\libBugly.solib\arm64-v8a\libBugly.so

    image-20221009102156129

    !!!PS: 如果同时创建两个 cpu 目录 lib\armeabi-v7a\libBugly.solib\arm64-v8a\libBugly.so, 也会弹窗报错, 只能创建对应 cpu 的 so 文件

    如果是上架 google, 则可以创建两个, 因为谷歌会根据 cpu 分发不同的 so 的 apk 给用户安装.


脱壳后运行 源 apk 时找不到对应 cpu 的 dex

报错

java.lang.IncompatibleClassChangeError: Structural change of androidx.fragment.app.Fragment is hazardous (/data/user/0/com.rmgrummy.pro/app_payload_odex/payload.dex at compile time, /data/app/com.rmgrummy.pro-1/oat/x86/base.odex at runtime): Virtual method count off: 179 vs 184
    Landroidx/fragment/app/Fragment; (Compile time):
     Static fields:

在调用显示界面的代码时报了这个错误, 是因为 源 apk 打包时没有打运行机子 cpu 的 so

  • 解决办法: 打 源 apk 时打包运行机子的 so 库即可

安装到 安卓 11+ (API 级别 30) 机子未 4 字节对齐 或者 resources.arsc 被压缩了

报错: adb: failed to install xxx.apk: Failure [-124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary]

  • 这里有有可能有两个问题

    1. resources.arsc 被压缩了

      • 解决办法: 在压缩 apk 目录文件时, 对 resources.arsc 特别处理, 不进行压缩

        默认 zip 压缩类型是 ziplib.ZIP_DEFLATED, 需要针对这个文件设置为 ziplib.ZIP_STORED, Python 参考代码

        # 压缩 srcDir 目录为 dstFile
        def zipDir(srcDir: str, dstFile: str, mode: int = ziplib.ZIP_DEFLATED, isIncludeParent: bool = True):
            with ziplib.ZipFile(dstFile, 'w', mode) as zip:
                pDir = isIncludeParent and os.path.dirname(srcDir) or srcDir
                for root, dirs, files in os.walk(srcDir):
                    for file in files:
                        absDir = os.path.join(root, file)
                        relativeDir = absDir.replace(pDir, "")
                        if "resources.arsc" in relativeDir: # 特殊处理这个文件
                            zip.write(absDir, relativeDir, ziplib.ZIP_STORED)
                        else:
                            zip.write(absDir, relativeDir)
        
        
      • 参考: NEPTUNE ANDROID11 RESOURCES.ARSC不支持压缩问题解决 - https://www.freesion.com/article/75641402392/

    2. apk 包未 4 字节对齐

      • 签名前, 4 字节对齐一下, 然后再签名
      $ zipalign -p -f -v 4 in_unalign.apk out_align.apk
      

      参考: Android之通过 apksigner 对 apk 进行 手动签名 - https://blog.csdn.net/q610098308/article/details/105138228


安装到 安卓 11+ 机子报错至少要 scheme v2

报错: ERROR: Target SDK version 32 requires a minimum of signature scheme v2; the APK is not signed with this or a later signature scheme

  • 解决办法: 使用 apksigner.jar 去签名, 不要用 jarsigner.jar

    $ java -jar apksigner.jar sign -verbose --v1-signing-enabled false --v2-signing-enabled true --ks [证书文件.jks] --ks-key-alias [证书别名] --ks-pass pass:[证书密码] --key-pass pass:[别名密码] --out [out_sign.apk] --in [in_unsign.apk]
    

解压 native 库失败

报错: INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2

  • 解决办法: 打开AndroidManifest.xml 在 application 节点添加:

    android:extractNativeLibs="true"
    

    参考: https://blog.csdn.net/kidults/article/details/106570878


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

李沐论文精度系列之七:Two-Stream双流网络、I3D

文章目录一、双流网络1.1 前言1.2 网络结构1.3 光流(Optical flow)1.3.1 什么是光流1.3.2 如何利用光流1.3.3 双向光流(Bi-directional optical flow)1.3.4 光流的局限性及和对应的预处理(抽取)方式1.3.5 视频模型测试1.4 实验1.4…

✿✿✿JavaScript基本语法一

目 录 1.js的发展史(闲聊版) 2.浏览器分成两部分:渲染引擎和 JS 引擎 3.js与html的关系以及结合方式 (1)js与html的关系 (2)js与html结合方式 4.JavaScript注释 5.js中的基本数据类型 6.js中的变量 7.运算符(自动类型转…

9.前端笔记-CSS-盒子模型-border和padding

页面布局的三大核心: 盒子模型浮动定位 1、盒子模型 1.1 盒子模型组成 盒子模型本质还是一个盒子,包括边框border、外边距margin、内边距padding和实际内容content 1.1.1 边框border 组成 组成:颜色border-color、边框宽度border-wid…

518. 零钱兑换 II【完全背包:求组合数】

518. 零钱兑换 II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位…

C++11 右值,右值引用,移动构造,移动赋值

目录 一、左值,左值引用,右值,右值引用的相关概念: 1. 什么是左值,什么是左值引用? 2. 什么是右值,什么是右值引用? 3. 右值的属性是右值,右值引用的属性是左值 4. …

棒子老虎鸡-第12届蓝桥杯Scratch选拔赛真题精选

[导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第86讲。 蓝桥杯选拔赛每一届都要举行4~5次,和省赛、国赛相比,题目要简单不少,再加上篇幅有限,因此我精挑细选…

研究生有限元仿真应用中存在的问题与对策

作者:尚晓江 导读:有限元分析软件作为计算工具,在科研和工程领域都有广泛应用,而多数用户是在研究生阶段开始接触和使用这些计算软件的。本文以ANSYS结构分析为例,对现阶段研究生应用有限元分析软件的现状和存在的问题…

无人机设计仿真--在Isight平台上进行的基于CST参数化+Xfoil的无人机翼型优化

作者:Graychen 一、工程背景 翼型的选型和设计是飞行器气动设计中的一项基础性工作,翼型对飞行器的气动性能具有根本性的影响。现在高性能飞行器已不再从翼型库中选择适用翼型后直接使用,而是以现有翼型作为基准翼型进行气动优化&#xff…

java基本语法 下

目录 运算符 运算符:算术运算符 运算符:赋值运算符 运算符:比较运算符 运算符:逻辑运算符 运算符:三元运算符 运算符的优先级 程序流程控制 概念 顺序结构 if-else结构 switch-case结构 循环结构 循环结构…

Unity视差贴图多实现对比和改进

视差贴图多种实现方式对比和改进视差贴图视差映射陡峭视差映射视差遮蔽映射迭代视差映射-kerry视差贴图 参考 与法线贴图相同,可以模拟出物体得深度感,同时它得改进是能够随着视角得偏移显示不同得深度感,使得显示更加真实。 由于采样高度…

代码随想录刷题| 多重背包理论基础、背包问题的总结

目录 多重背包理论基础 多重背包的问题 多重背包的解法 多重背包的代码 背包问题的总结 01背包 完全背包 多重背包 多重背包理论基础 多重背包的问题 有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。…

单身福利专场, Python采集某相亲网站美女数据

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 现在,广大年轻人到了一定年纪,一定会引来父母的念叨 不是让相亲就是让结婚的,与其父母念叨,不如自己找一个 到时候问起来,就说再接触呢~~ 今天我们就来用python…

NestJS学习:使用session实现登录验证

参考 大佬的视频教程:nestjs session案例 大佬的博客地址:小满nestjs(第九章 nestjs Session) 在学习某些知识时如果有大佬的视频教程与文档真的是太爽了,能够学习到好多新知识。 nest后台 session session 是服务…

目标检测算法——3D公共数据集汇总(附下载链接)

>>>深度学习Tricks&#xff0c;第一时间送达<<< &#x1f680;&#x1f680;&#x1f680;近期&#xff0c;小海带在空闲之余&#xff0c;收集整理了一批3D公共数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&…

十个值得珍藏的正则表达式

正则表达式常学常忘&#xff0c;记规则不如记例子&#xff0c;记多不如记精&#xff0c;记例子就记最经典的。下面是本人珍藏的十个有用的正则表达式&#xff0c;不吝分享&#xff0c;以飨读者。 正则表达式要点 小括号&#xff1a;代表分组 中括号&#xff1a;代表集合 大括号…

回归分析(1)-回归分析的基本概念

1.回归方程 由于x是可控的非随机变量&#xff0c; 而Y 是一个与x有关的随机变量&#xff0c;因此&#xff0c;直接研究变量Y与x之间的相关关系是困难的&#xff0e; 如果注意到随机变量Y的数学期望反映了随机变量Y的平均取值&#xff0c;因此&#xff0c; 可考虑研究EY与x之间的…

第六章 支持向量机

6.1 间隔与支持向量 给定一个训练样本集&#xff0c;分类学习最基本的想法就是基于训练集D在样本空间中找到一个划分超平面。但是这个划分超平面也是很多的&#xff0c;如下图所示 直观上应该去找两类样本中最中间的划分超平面&#xff0c;因为该划分超平面对训练样本局部扰动…

与分类有关的一种时序优先现象

(A&#xff0c;B)---2*30*2---(1,0)(0,1) 用网络分类A和B&#xff0c;让A由两张图片组成&#xff08;0&#xff0c;0&#xff09;&#xff08;0&#xff0c;1&#xff09;&#xff0c;让B由两张图片组成&#xff08;1&#xff0c;0&#xff09;&#xff08;0&#xff0c;0&…

(附源码)计算机毕业设计JavaJava毕设项目租车网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

Ubuntu22.04:设置Samba服务

Samba服务可以实现在主机间共享文件与Windows的共享通用。 Ubuntu22.04可以按照如下步骤安装并开启Samba服务&#xff1a; 1.安装samba sudo apt install samba 2.创建一个用于共享的目录(路径和路径名可以自行决定&#xff09; mkdir samba 3.设置共享目录的访问权限 s…