将APK转换为Android Studio项目-APK二次开发

查看 105|回复 10
作者:WuDiZhanShen   
本文教大家将APK转换为Android Studio项目,后续可用Java、C++高级语言进行二次开发,从此告别低效的改smali、改so字节码。适用于需要对同一个APK进行长期、大量修改的同学。
需求:未加壳、无签名校验的APK,一台有Android Studio的电脑
Tips:Github上的一个工具”FakerAndroid”会自动化地实现本文中的一些步骤。本文教大家的是手动操作,有兴趣的同学也可以去试试这个自动化工具。
正文开始!
1. 在Android Studio新建空白项目,把包名、最低SDK设置为和目标APK一致。然后把项目语言设置为Java,把Build Configuration Language设置为Groovy DSL。


图片1.png (57.27 KB, 下载次数: 0)
下载附件
新建空白项目
2024-11-14 22:54 上传

新建空白项目
最后进入项目目录,删除res文件夹和AndroidManifest.xml文件。


图片2.png (68.34 KB, 下载次数: 0)
下载附件
要删除的文件
2024-11-14 22:55 上传

要删除的文件
2. 使用电脑端的Apktool、Jadx或手机端的ApktoolM等工具反编译目标APK,将得到的assets、libs、res文件夹和AndroidManifest.xml放置在第一步新建的项目目录中,如下图。注意libs文件夹需要重命名为JniLibs(当然,没有libs文件夹的话就不用管)。


图片3.png (72.29 KB, 下载次数: 0)
下载附件
要放置的文件(libs文件夹需要重命名为JniLibs)
2024-11-14 22:56 上传

要放置的文件(libs文件夹需要重命名为JniLibs)
3. 使用电脑端的dex2jar或手机端的MT管理器将APK中的classes.dex转换为classes.jar(多个dex文件就转换为多个同名的jar),然后将得到的jar文件放置在项目目录的src文件夹中,也就是之前步骤用到的目录的上一级目录。具体位置如下图。


图片4.png (67.73 KB, 下载次数: 0)
下载附件
放置jar文件
2024-11-14 22:56 上传

放置jar文件
4. 将项目文件夹内的src/main/res/values/public.xml剪切到src文件夹。具体位置如下图。


图片5.png (69.53 KB, 下载次数: 0)
下载附件
剪切public.xml文件
2024-11-14 22:57 上传

剪切public.xml文件
5. 修改build.gradle(Module: app),在android{}内添加以下内容:
sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }
    lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }
    aaptOptions {
        additionalParameters "--stable-ids", "$buildDir/generated/ids.txt"
        additionalParameters "--emit-ids", "$buildDir/generated/idsgen.txt"
    }
    task generateIdsTxt {
        def publicXmlFile = file("src/public.xml")
        def idsTxtFile = file("$buildDir/generated/ids.txt")
        inputs.file(publicXmlFile)
        outputs.file(idsTxtFile)
        doLast {
            if (publicXmlFile.exists()) {
                def xmlParser = new XmlParser()
                def resources = xmlParser.parse(publicXmlFile)
                idsTxtFile.parentFile.mkdirs()
                idsTxtFile.withWriter { writer ->
                    resources.public.each { publicElem ->
                        def type = publicElem.@type
                        def name = publicElem.@name
                        def id = publicElem.@id
                        writer.writeLine("${android.defaultConfig.applicationId}:$type/$name = $id")
                    }
                }
            }
        }
    }
    preBuild.dependsOn generateIdsTxt


图片6.png (218.3 KB, 下载次数: 0)
下载附件
修改内容1
2024-11-14 22:57 上传

修改内容1
然后将dependencies {}整个替换为
dependencies {
    implementation fileTree(dir: 'src', include: ['*.jar'])
}


图片7.png (209.67 KB, 下载次数: 1)
下载附件
修改内容2
2024-11-14 22:57 上传

修改内容2
6. 到这一步已经可以编译出正常运行、未经修改的APK了。AndroidManifest.xml里可能会有一些鸡毛蒜皮的小错误,基本上右键错误并选择自动修复即可解决。后续就是修改Java层和Native层了。
7. 修改Java层的方法之1:假如要修改Activity,可以尝试新建一个Activity并继承自你要修改的Activity,如下图。


图片8.png (167.6 KB, 下载次数: 0)
下载附件
extends 后面填你要修改的Activity
2024-11-14 22:58 上传

extends 后面填你要修改的Activity
(记得在AndroidManifest.xml里声明你新建的Activity为Launcher Activity。)通过Override一些Activity生命周期函数,即可做到一定程度的Activity修改。
这种方法仅限修改Activity,虽然方便但局限性较大:无法修改父类中不能Override的函数(即非接口函数)、无法访问父类的私有变量。
8. 修改Java层的方法之2:假如要修改某个类,可以先使用电脑端的Apktool或手机端的MT管理器将该类从classes.dex中删去,然后在Android Studio新建该类,并重写该类的全部代码(可参照电脑端的Jadx或手机端的MT管理器给出的Java反编译代码来重写)。放心,非常好写,和正常开发完全没区别。Android Studio会读取classes.jar的信息,并和正常开发一样为你提供代码补全提示的。        
这种修改方法更加通用,基本上可以做到任何修改需求。
9. 修改Native层的方法:用MSHook或其他Hook框架,配合IDA Pro来实现函数Hook、so Patch。

宋体, 下载次数

peng214   

现在apk基本都有加固和混淆
banqiaoxu   

学习了,感谢大佬!
zyh5028   

学习了,继续努力
Night1918   

使用Flutter开发的应用适用这种方法吗
呱呱生   

太深奥了
ysjd22   

好复杂呢。。
jnu777   

感谢楼主的分享  我去学习了
echoofw   

感谢分享
yxtybtt   

且行且艰
您需要登录后才可以回帖 登录 | 立即注册

返回顶部