需求:未加壳、无签名校验的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。