Android反编译(三)— 手动编译

PS: 最近没工作,没工作就没需求,没需求就没什么技术总结的灵感,那就没更新什么。但是两个月不更新了,要是三个月不更新就会出大事,所以这次打算做一件有意思又不难的事。
之前有发文章写过反编译,今天就来试试反编译之正编译,开玩笑的,就是试试手动编译的过程,平时我们在项目中编译出包都是使用Gradle直接执行assemble任务就能解决,我打算试试手动模拟整个过程。当然我也是第一次这样搞,所以如果有写得不对的地方,还望指出。

1. apk包的结构

众所周知,apk实质上就是一个压缩包。复习一下,我们写个最简单的Demo,然后打包,然解压,注意是解压,不是反编译,意义是不同的。



注意我这个Demo很简单,什么都不引入



因为我怕引入什么V4、V7、AndroidX这些,到时候翻车,脚踏实地嘛,从最简单开始,就什么都没有,就只有我自己写的代码。

然后我们看看整个出包的过程,随便从网上拿张图


然后这里我们用Android SDK给我们提供的工具来完成整个流程,工具在sdk文件夹下的build-tools文件夹下,有什么aapt.exe、dx.bat,用的就是这些

2. 手动打Dex文件

这步应该是整个流程最简单的吧,我感觉,所以从最简单的开始。
我们先看看生成的dex有什么



对比项目,我是一开始最基本的项目,什么都没动,所以只有一个MainActivity.clas,所以这里肯定是要先想办法得到BuildConfig.class和R.class。

输入命令:
aapt p -f -m -J <输出路径> -S <res路径> -I <android.jar路径> -M <Manifest路径>


然后得到一个R.java文件

要注意这里的 -J命令 ,大小写是不同的,我这没注意一直输入小写结果不出来,看了几遍之后才知道。具体的命令是根据 aapt help查看的,这个老套路了。
然后我们之后用dx工具的时候是要class文件,这个是Java文件,java文件变成class文件就不用多说了吧,javac R.java

下一步,我们需要BuildConfig.class
这个BuildConfig.java是由gradle在我们配置好gradle之后自己帮我们生成的,所以我们直接拿来用,然后再javac就得到class文件了


然后我们再编译我们的MainActivity.java并将它们放到同一个文件夹下,MainActivity因为引用了Android.jar和R文件,所以编译时注意点,我为此被动好好的复习了一遍javac,都是泪

最后一步,我们用dx工具就能打出dex文件了


good boy,又翻车了,路径有问题,我们应该直接在之前的文件夹下进行编译,再试一次,把包名的路径加上去。

然后执行命令就得到一个Dex文件,看看这个文件里面和上面直接打出的apk中的Dex文件有什么不同:


结构上没什么不同,但是R.class的里面的地址发生变化了,其实很蛋疼,因为我之前的想法是想先生成dex文件,然后替换掉之前的dex文件先打包试试正不正常的,现在这个R文件的地址变了,那之前的resources.arsc就和现在的R文件里面的资源地址对不上了,那就只能全部做完再看效果了。

3.生成APK

看图,我们上一步已经生成.dex了,那么我们需要和compiled Resource 还有 Other Resource 一起生成APK。

我们先来生成compiled Resource,也就是resources.arsc
发现之前使用aapt生成R文件的时候没写完整,当时可以加一个-F参数直接生成arsc和Manifest



导出的abc.zip里面就有resources.arsc和AndroidManifest.xml。
因为之前写漏了,所以肯定要重新编一次MainActivity.java和Dex


4. 编译成apk

我们把刚才的dex文件和aapt生成的resources.arsc、AndroidManifest.xml和res放到一个文件夹里面。
PS:res文件夹也是上面aapt的命令生成的
然后我们对比这个文件夹和之前apk解压的文件夹


少了个META-INF,我知道这个是签名的文件夹,我的第一反应就是不用管它,到时候压缩成apk之后签名会自己有这个文件夹。
对比虽然结构相同,但是文件的大小不同,有点担心是不是会又翻车,不管了,直接变成压缩包然后改后缀apk

最后运行



看来是成功了。

5. 总结

再说说遇到的还有两个问题,并说下我解决问题的思路
(1)我把它们都放到一个文件夹之后,我压缩成压缩包,然后改后缀成.apk,然后发现安装不了,我就直接反编译,发现发编译失败,提示包有问题,以我多点玩包的经验,我感觉就是压缩工具出了问题,然后我去下个“好压”(这不是广告啊),然后就能正常反编译了。
(2)但是还是安装不了,再根据我多年的玩包经验,我感觉是签名问题,然后我随便给这个包上一个签名,就能正常安装得到上图的结果了。

总体来说,还真挺好玩的,这整个过程,就是翻车了几次。做完之后感觉非常牛逼,为什么这样说,因为我知道这整个过程,我就可以做到,我不经过gradle来打包,我自己写个python脚本来调用aapt和dx来打包也是能做到的。
当然上面纯属异想天开,因为这是个什么都没有的Demo所以觉得简单,要是一个真实的项目,我感觉肯定要有很多坑,别的先不说,一个项目那么多依赖关系,我这javac要搞死人。
最后如果有不对的地方,希望有大佬能够指出,毕竟能运行也不能证明完全没问题。然后我使用的build-tools是28的,不敢保证其它版本包括以后版本的玩法都一样。

推荐阅读更多精彩内容

  • 了解APK构建打包流程 构建构成中用到的工具 aapt/aapt2 android资源打包工具 aidl ...
    佼佼者Mr阅读 136评论 0 0
  • apk是安卓工程打包的最终形式,将apk安装到手机或者模拟器上就可以使用APP。反编译apk则是将该安卓工程的源码...
    隋胖胖LoveFat阅读 61,532评论 6 53
  • APK 反编译 一、APK反编译基本原理 1.APK分析 assets文件夹:原始资源文件夹,对应着Android...
    R7_Perfect阅读 320评论 0 1
  • 蓝师傅最近几个月非常忙,很久没更新文章了,惭愧惭愧,距离上一篇技术文章已经是半年前了~ 前几个月负责游戏SDK的开...
    蓝师傅_Android阅读 1,381评论 1 11
  • 前言 处理反编译,首先先要了解apk文件的结构,然后是编译过程,最后是反编译。反编译Apk的目的就是Apk拆成我们...
    yzzCool阅读 4,954评论 0 8
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 5,375评论 16 21
  • 创业是很多人的梦想,多少人为了理想和不甘选择了创业来实现自我价值,我就是其中一个。 创业后,我由女人变成了超人,什...
    亦宝宝阅读 986评论 1 0
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 7,929评论 0 9
  • 哈里·基恩想和新教练何塞·穆里尼奥建立一种“牢固的关系”,这将有助于托特纳姆更上一层楼。 凯恩在4-2战胜奥林匹亚...
    疯狂SPORTS阅读 7,536评论 0 6
  • 可爱进取,孤独成精。努力飞翔,天堂翱翔。战争美好,孤独进取。胆大飞翔,成就辉煌。努力进取,遥望,和谐家园。可爱游走...
    赵原野阅读 1,476评论 1 1