【原创】反编译Android apk,提取*.so, 编译jar包并在 Android 运行

有一个需求, 需要对 apk 反编译, 反编译后发现有 .so 引用, 基于 arm 平台, 并且只能运行于 Android 系统.

如果提示: Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library:  /home/zhipeng/libsign.so 
或者 logcat 提示java.lang.UnsatisfiedLinkError: Couldn't load sign from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/sdcard/test/Root.jar"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]]: findLibrary returned null
解决办法: 修改 System.loadLibrary, 使用 System.load("/home/zhipeng/libsign.so")

如果提示: Exception in thread "main" java.lang.UnsatisfiedLinkError/home/zhipeng/libsign.so: dlopen(/home/zhipeng/libsign.so, 1): no suitable image found.  Did find:  /home/zhipeng/libsign.sounknown file type, first eight bytes: 0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00
因为 libsign.so 是基于 ARM 平台编译运行的, 有试过在树莓派上运行, 但缺少 Android 依赖.

当编译好运行 app_process /sdcard/test com.zhipeng.app.Root 后直接  提示Aborted.
通过 logcat 后可以提取到有用的信息
app_process: no class name or --zygote supplied.
Zip is good, but no classes.dex inside, and no valid .odex file in the same directory
意思是在 jar 包中没有发现 dex 文件.
解决方法: d2x-jar2dex Root.jar -o classes.dex && zip -m Root.jar classes.dex
另外需要注意的是, xxx.jar尽量和main class name 保持一致.

如果提示:
nable to locate class 'com/zhipeng/app/Root'
java.lang.NoClassDefFoundError: com/zhipeng/app/Root
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.zhipeng.app.Root" on path: DexPathList[[zip file "/sdcard/test/Root.jar"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]

记得检查 classes.dex  是否打包到 Jar 包中, 注意文件名.


说到底, System.loadLibary 为啥总是不行, 除了 apk 的方式可以成功运行, 其他方式都提示找不到文件.郁闷了..

要点如下, jar 包名尽量和 main class name 保持一致.
System.loadLibary 不行就换System.load
eclipse 导出 jar 包后, 记得再用 jar 包生成 classes.dex, 将其打包至 jar 包.
运行方式:  /system/bin/dalvikvm -classpath  /sdcard/test /Root.jar  com.zhipeng.app.Root
也可以用 app_process  的方式: app_process /sdcard/test  com.zhipeng.app.Root, 但是需要先设置 CLASSPATH
// export CLASSPATH=/sdcard/test/Root.jar 

记得把 libsign.so 放到  /sdcard/test中, 可以放到别的位置.

如果logcat 提示Abort message: 'Error changing dalvik-cache ownership : Permission denied' 或者java.lang.UnsatisfiedLinkError: dlopen failed: couldn't map "/storage/emulated/0/test/libsign.so" segment 1: Operation not permitted

 将 .so 移动至 /data/local/tmp/下即可.  原因是: The SD Card is mounted noexec, so I'm not sure this will work. 意思是不支持加载 SD 卡这种可拆卸存储执行可执行文件.
 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android APK反编译教程是一个关于如何将已编译Android应用程序(APK)还原为原始的Java源代码和资源文件的指南。反编译APK可以帮助开发人员了解其他应用程序的实现细节,学习和借鉴他们的设计思路和技术方法。 以下是一个基本的Android APK反编译教程的步骤: 1. 下载反编译工具:首先,你需要下载一个反编译工具,例如dex2jar、apktool或Jadx等。这些工具可以从互联网上免费获取。 2. 安装和配置工具:解压缩下载的工具,并按照其文档中的说明进行安装和配置。确保将工具所在的目录添加到系统的环境变量中,以便可以在命令行中调用它们。 3. 反编译APK文件:在命令行中使用反编译工具将APK文件转换为可读的源代码。例如,使用dex2jar工具可以运行`d2j-dex2jar.bat yourapkfile.apk`命令将APK文件转换为JAR文件。 4. 反编译资源文件:使用apktool工具反编译APK文件的资源文件,以便可以查看和编辑应用程序的布局、图片和其他资源。例如,运行`apktool d yourapkfile.apk`命令将APK文件反编译到当前目录中的一个文件夹中。 5. 分析源代码和资源:通过查看反编译得到的Java源代码和资源文件,你可以深入研究和理解应用程序的实现细节。这些文件将在反编译的目录中找到,并使用文本编辑器或开发工具打开。 需要注意的是,反编译APK文件是为了学习和研究目的,以及对自己开发的应用程序进行检查和测试。在商业和法律层面上,我们不鼓励使用这些技术来获取未授权的应用程序源代码和资源。 总之,Android APK反编译教程可以帮助开发人员深入了解其他应用程序的实现细节,学习和借鉴他们的设计思路和技术方法。通过反编译APK文件,我们可以将已编译的二进制应用程序还原为可读的源代码和资源文件,以便进行更多的探索和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值