WuDiZhanShen 发表于 2024-11-14 22:59

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

本帖最后由 WuDiZhanShen 于 2024-11-14 23:04 编辑

本文教大家将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。

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

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

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

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

剪切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

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

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

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 发表于 2024-11-15 11:37

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

banqiaoxu 发表于 2024-11-17 14:52

学习了,感谢大佬!

zyh5028 发表于 2024-11-15 12:49

学习了,继续努力

Night1918 发表于 2024-11-15 13:51

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

呱呱生 发表于 2024-11-15 14:29

太深奥了

ysjd22 发表于 2024-11-15 15:27

好复杂呢。。

jnu777 发表于 2024-11-15 15:45

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

echoofw 发表于 2024-11-15 17:09

感谢分享:lol

yxtybtt 发表于 2024-11-15 17:11

且行且艰

cclnnl 发表于 2024-11-15 19:21

谢谢楼主分享
页: [1] 2 3 4 5 6 7
查看完整版本: 将APK转换为Android Studio项目-APK二次开发