安卓逆向 将APK转换为Android Studio项目进行二次开发

admin 2024年12月4日22:14:12评论28 views字数 2628阅读8分45秒阅读模式
本文教大家将APK转换为Android Studio项目,后续可用JavaC++高级语言进行二次开发,从此告别低效的改smali、改so字节码。适用于需要对同一个APK进行长期、大量修改的同学。
需求:未加壳、无签名校验的APK,一台有Android Studio的电脑
TipsGithub上的一个工具FakerAndroid”会自动化地实现本文中的一些步骤。本文教大家的是手动操作,有兴趣的同学也可以去试试这个自动化工具。
正文开始!
1. Android Studio新建空白项目,把包名、最低SDK设置为和目标APK一致。然后把项目语言设置为Java,把Build Configuration Language设置为Groovy DSL安卓逆向  将APK转换为Android Studio项目进行二次开发  
新建空白项目
最后进入项目目录,删除res文件夹和AndroidManifest.xml文件。
安卓逆向  将APK转换为Android Studio项目进行二次开发
要删除的文件
2. 使用电脑端的ApktoolJadx或手机端的ApktoolM等工具反编译目标APK,将得到的assetslibsres文件夹和AndroidManifest.xml放置在第一步新建的项目目录中,如下图。注意libs文件夹需要重命名为JniLibs(当然,没有libs文件夹的话就不用管)。
安卓逆向  将APK转换为Android Studio项目进行二次开发
要放置的文件(libs文件夹需要重命名为JniLibs)
3. 使用电脑端的dex2jar或手机端的MT管理器将APK中的classes.dex转换为classes.jar(多个dex文件就转换为多个同名的jar),然后将得到的jar文件放置在项目目录的src文件夹中,也就是之前步骤用到的目录的上一级目录。具体位置如下图。
安卓逆向  将APK转换为Android Studio项目进行二次开发
放置jar文件
4. 将项目文件夹内的src/main/res/values/public.xml剪切到src文件夹。具体位置如下图。
剪切public.xml文件
安卓逆向  将APK转换为Android Studio项目进行二次开发
5. 修改build.gradle(Module: app),android{}内添加以下内容:
修改内容1
然后将dependencies {}整个替换为
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
安卓逆向  将APK转换为Android Studio项目进行二次开发
修改内容1
然后将dependencies {}整个替换为
dependencies {
   implementation fileTree(dir: 'src', include: ['*.jar'])
}
安卓逆向  将APK转换为Android Studio项目进行二次开发
修改内容2
6. 到这一步已经可以编译出正常运行、未经修改的APK了。AndroidManifest.xml里可能会有一些鸡毛蒜皮的小错误,基本上右键错误并选择自动修复即可解决。后续就是修改Java层和Native层了。
7. 修改Java层的方法之1:假如要修改Activity,可以尝试新建一个Activity并继承自你要修改的Activity,如下图。
安卓逆向  将APK转换为Android Studio项目进行二次开发
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

本文内容来自网络,如有侵权请联系删除

原文始发于微信公众号(逆向有你):安卓逆向 -- 将APK转换为Android Studio项目进行二次开发

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月4日22:14:12
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   安卓逆向 将APK转换为Android Studio项目进行二次开发https://cn-sec.com/archives/3465217.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息