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

查看命令
$ nm -D libx8a3pjbix.so

只显示 T (方法), 加个 awk
$ nm -D libx8a3pjbix.so | awk '{if($2=="T"){print $3}}'

报错找不到资源 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
直接把 apk 当成 zip 解压到一个 目录 a 中
让后对 dex, so 加固处理
然后把 目录 a 用 zip 压缩为 apk 文件
压缩过程中, resources.arsc 文件不能压缩, 要以文档形式存储 ZIP_STORED, 不然会出现这个错误 [安装到 安卓 11+ (API 级别 30) 机子未 4 字节对齐 或者 resources.arsc 被压缩了](#安装到 安卓 11+ (API 级别 30) 机子未 4 字节对齐 或者 resources.arsc 被压缩了)
对压缩好的 apk 进行 4 字节对齐
$ zipalign.exe -p -f -v 4 I:/unalign.apk I:/align.apk
对 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
报错: 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
}
报错
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 编译的
implementation 'androidx.appcompat:appcompat:1.3.1'报错: AndroidManifest.xml:42: error: No resource identifier found for attribute 'requestLegacyExternalStorage' in package 'android'
报错
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
报错: 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
报 Android 错找不到对应 cpu so 的弹窗提示
虽然脱壳后有对应的 so 库在指定 cpu 目录, 但是报错
解决办法: 在 壳 工程里创建 对应 cpu 的目录, 并且创建一个空 libXXX.so 库即可 (暂时不清楚为啥), 如 lib\armeabi-v7a\libBugly.so 或 lib\arm64-v8a\libBugly.so

!!!PS: 如果同时创建两个 cpu 目录 lib\armeabi-v7a\libBugly.so 或 lib\arm64-v8a\libBugly.so, 也会弹窗报错, 只能创建对应 cpu 的 so 文件
如果是上架 google, 则可以创建两个, 因为谷歌会根据 cpu 分发不同的 so 的 apk 给用户安装.
报错
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
报错: 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]
这里有有可能有两个问题
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/
apk 包未 4 字节对齐
$ zipalign -p -f -v 4 in_unalign.apk out_align.apk
参考: Android之通过 apksigner 对 apk 进行 手动签名 - https://blog.csdn.net/q610098308/article/details/105138228
报错: 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]
报错: 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