Android 逆向工程,反编译心得

前言

apk的反编译是我们在Android开发中绕不开的一个坎,对于反编译这门技术,我们应该抱着学习的态度,学的越多,也越能防备别人反编译我们,这就是所谓的知己知彼吧,哈哈

需要准备的工具

  • Apktool,解包和重新打包都需要它
  • dex-tools,可以直接把apk中的classes.dex文件反编译为.jar文件
  • jd-gui,直接查看.jar文件中的java文件
  • JEB,同时满足dex-tools和jd-gui的功能,但反编译出来的代码不太一样,可以互相对照
  • Notepad++,非常强大的文档编辑器,用来查看各种文件,修改.smali我用的就是它
  • Android SDK target版本的build-tools中的apksigner,用于给打包好的apk签名

具体实现

apktool

Apktool - A tool for reverse engineering 3rd party, closed, binary Android apps.

用来解包和重新打包apk的工具,命令最多只用得到几行,可以反编译出AndroidManifest.xml和各种资源文件。

解包

这句命令是指在D:\tools\apk_tool_2.7.0文件夹中有一个test.apk文件,这个test.apk文件反编译到同路径下的test文件夹中,该操作会反编译AndroidManifest.xml和res的资源文件

apktool d D:\tools\apk_tool_2.7.0\test.apk -o D:\tools\apk_tool_2.7.0\test

但需要注意的是,重新打包时不能用反编译过res和AndroidManifest.xml的文件夹打包,不然会报错,不会反编译AndroidManifest.xml和res的命令如下:

apktool -r d test.apk

这句命令省略了当前文件路径和输出文件夹路径,和上面的命令相差只是在d前面多加了一个-r

该操作不会反编译AndroidManifest.xml和res的资源文件,可以被重新打包

重新打包

把apktool相同路径下的test文件夹重新打包为test.apk

apktool b test

 dex-tools

github地址:

GitHub - pxb1988/dex2jar: Tools to work with android .dex and java .class files

 我们把需要反编译的apk准备好,例如我这里准备了一个test.apk,现在我们需要获取这个apk中的classes.dex文件。

扫描二维码关注公众号,回复: 15909540 查看本文章

有两种办法:

方法一是右键用xx压缩软件打开

 直接解压这两个文件出来即可。

方法二是把.apk文件的后缀名改为.rar或是.zip,然后再用压缩软件打开,剩下的步骤是一样的。

注:一定要解压所有名为classes.dex和classes[n].dex的文件,n是数字

 这个时候,我们就可以把下好的dex-tools解压出来,并且把我们刚刚解压出来的classes.dex文件丢进来,如图所示:

使用起来非常简单,在未配置环境变量时(默认不配置),打开命令行进入到当前目录(快捷方法是按住shift键,在当前目录右键空白处

输入命令:d2j-dex2jar.bat [文件名]

d2j-dex2jar.bat classes.dex

如果提示如下信息:

 则在命令前面加上".\"即可

.\d2j-dex2jar.bat classes.dex

这条命令仅仅只是反编译1个classes.dex文件,如果有多个classes.dex文件,我们需要依次反编译

因为这里我有两个classes.dex文件,所以最后我能反编译出两个.jar文件

jd-gui 

下载地址:

Java Decompiler

想要阅读.jar文件我们就需要jd-gui,下载完成后解压出来如图所示,我们双击运行jd-gui.exe即可

 

打开刚刚我们反编译出来的两个.jar文件 ,就可以阅读源码!此时的源码一般都是被混淆过的

 JEB

官网文档地址:

下载地址和激活教材在参考博客中,但可能并不存在时效性

JEB Decompiler

JEB是一个非常强大的逆向工程工具,我仅仅只会粗略的使用,更加进阶的使用请查阅官方文档或其他博客,本文仅做浅显的使用

JEB下载好之后直接双击运行jeb_wincon.bat即可

 语言设置

我们可以在Edit->Language->中文(中文)把JEB设置为中文界面,设置完后需要重启才能生效

在JEB中,我们可以直接打开.apk文件,会自动帮我们反编译,既可以查看java源码也可以对照查看smali

打开.apk时,会弹出以下界面,我们可以进行一些反编译的设置,但默认就足够用了,我们直接点击确定即可 。等待一会

 点击转换后,可以看java代码和smali对照

注:JEB的横向查看代码需要按住shift+鼠标滚轮,就可以横向滑动了 

 JEB的debug调试

JEB还有一个非常实用的功能,就是把一个apk重新打包为可调式的包,并且可以在JEB中打断点进行调试,具体步骤如下:

如果你的apk文件是可调式的安装包,则可以直接进行第3步

  1. 重新打包为可调试的apk
  2. 为apk重新签名
  3. 打断点,使用JEB进行debug调试

 重新打包为可调试的apk

jeb自带一个makeapkdebug的命令可以帮助我们直接重新打包出可以调试的apk

在有jeb_wincon.bat的文件夹下,打开cmd或power shell窗口,test.apk中的test是apk名称

命令如下:

jeb_wincon.bat -c --makeapkdebug -- test.apk

为apk重新签名 

 重新打包出来的apk需要重新签名才能够安装和调试,所以找到我们安装Android SDK的目录,找到build-tools文件夹,目前我的最新安装版本为13,因此我使用的是33.0.0的构建工具,找到文件夹中存在apksigner.bat即可

 然后我们随意准备一个签名文件,我这里使用的是Android Studio新建一个签名,步骤如图所示:

随意打开一个工程,点击Build-> Generate Signed Bundle / APK

 

选啥都行,点next 

点击create new 

key store path 是保存签名文件的路径

第二行Password 是签名文件的密码

然后来到Key标签页

第一行 Alias 是秘钥的名称

第二行 Password 是秘钥的密码

Validity是签名有效期

Certificate标签页是提供你的个人信息证明

第一行是名称

第二行是组织单位名称

第三行是组织名称

第四行是所在城市或区域

第五行是所在州或省份

第六行是所在的国家代码

 

 填写完之后就在刚刚填写路径的地方生成好了一个.jks的签名文件

这里为了方便省事,我把这个签名文件和重新打包后可以调试的apk文件,直接复制到apksigner.bat所在的文件夹,同样的,在这个文件夹打开命令行(方法同上),运行命令进行签名

--ks后跟的是签名文件的名称,test_debuggable.apk是我们重新打包可以调试的apk文件,运行命令之后,我们还需要输入签名文件的密码别忘了!这里输入密码是看不到的,输完直接回车即可

apksigner sign --ks 123456.jks test_debuggable.apk

更多命令详见官方文档  

 apksigner  |  Android 开发者  |  Android Developers

签名好之后,我们就可以用这个apk在JEB上进行断点调试了! 

打断点,使用JEB进行debug调试

手机或模拟器连接好之后,我们把刚刚签名好的apk重新打开,打好断点,点击开始调试

断点只能打在smali文件中,快捷键为ctrl+B

官方调试文档说明:Debugging - JEB Decompiler

 点击开始后,会让你选择需要调试的设备和需要调试的包,选中设备和包之后点击attach/附上就可以开始调试了

至此,我们进行到了最后一步,找到关键代码后,我们需要进行修改并重新打包为可以我们自己使用的apk

在第一步中,想要重新打包,就必须得使用apktool的这个解包命令,然后修改对应的.smali文件

apktool -r d test.apk

修改完.smali文件后,记得保存!然后使用apktools重新打包,最后再去签名,签名完就可以使用我们修改后的apk了! 

参考博客

JEB动态调试Smali-真机/模拟器(详细,新手必看) - 『移动安全区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

猜你喜欢

转载自blog.csdn.net/TDSSS/article/details/130871844