吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2296|回复: 68
上一主题 下一主题
收起左侧

[Android 原创] 将APK转换为Android Studio项目-APK二次开发

  [复制链接]
跳转到指定楼层
楼主
WuDiZhanShen 发表于 2024-11-14 22:59 回帖奖励
本帖最后由 WuDiZhanShen 于 2024-11-14 23:04 编辑

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

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

要删除的文件
2. 使用电脑端的ApktoolJadx或手机端的ApktoolM等工具反编译目标APK,将得到的assetslibsres文件夹和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里声明你新建的ActivityLauncher 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来实现函数Hookso Patch

免费评分

参与人数 7吾爱币 +13 热心值 +6 收起 理由
yottaWind + 1 + 1 谢谢@Thanks!
正己 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
苏紫方璇 + 2 + 1 用心讨论,共获提升!
XiaoXiaoXiaoHo + 1 + 1 用心讨论,共获提升!
twl288 + 1 谢谢@Thanks!
PastorBonus + 1 + 1 谢谢@Thanks!
leger1210 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
peng214 发表于 2024-11-15 11:37
现在apk基本都有加固和混淆
推荐
banqiaoxu 发表于 2024-11-17 14:52
3#
zyh5028 发表于 2024-11-15 12:49
4#
Night1918 发表于 2024-11-15 13:51
使用Flutter开发的应用适用这种方法吗
5#
呱呱生 发表于 2024-11-15 14:29
太深奥了
6#
ysjd22 发表于 2024-11-15 15:27
好复杂呢。。
7#
jnu777 发表于 2024-11-15 15:45
感谢楼主的分享  我去学习了
8#
echoofw 发表于 2024-11-15 17:09
感谢分享
9#
yxtybtt 发表于 2024-11-15 17:11
且行且艰
10#
cclnnl 发表于 2024-11-15 19:21
谢谢楼主分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 15:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表