一、AS Smali插件
二、简单语法
三、断点调试
四、参考URL
一、AS Smali插件:
1、java2smali 最主要的功能是可以在AS中转换JAVA为smali
2、smalidea-0.05 主要用于代码跳转,方便阅读那些混淆后的代码
下载地址:https://download.csdn.net/download/qq_27960029/9516601
二、简单语法:
Smali代码
.method public methodAReturn(Lcom/bolex/AA;Lcom/bolex/AA;)Lcom/bolex/AA;
.registers 3
.param p1, "mAA" # Lcom/bolex/AA;
.param p2, "sAA" # Lcom/bolex/AA;
.prologue
.line 34
return-object p1
.end method
.line 21
new-instance v0, Lcom/bolex/AA;
invoke-direct {v0}, Lcom/bolex/AA;->()V
.line 22
invoke-virtual {p0, v0, v0}, Lcom/bolex/seamAct;-methodAReturn(Lcom/bolex/AA;Lcom/bolex/AA;)Lcom/bolex/AA;
.line
.line 34
表示当前代码在源java文件中的行数。
method
.method public methodAReturn(Lcom/bolex/AA;Lcom/bolex/AA;)Lcom/bolex/AA;
表示来自公共方法methodAReturn返回值是一个对象com.bolex.AA
registers
.registers 3
表示该函数上需要使用3个寄存器
param
.param p1, "mAA" # Lcom/bolex/AA;
.param p2, "sAA" # Lcom/bolex/AA;
表示接收两个入参都是AA对象,并标记寄存器p1和p2
.prologue
.prologue
表示函数内执行的起始标记。直译为开场白的意思。
.line
.line 34
表示在源代码中的第34行。
return-object
return-object p1
表示 返回寄存器上p1对象
.end method
.end method
表示函数结束标记
new-instance
new-instance v0, Lcom/bolex/AA;
创建一个AA对象
invoke-direct
invoke-direct {v0}, Lcom/bolex/AA;->()V
表示使用无参构造方法直接调用
invoke-virtual
invoke-virtual {p0, v0, v0}, Lcom/bolex/seamAct;->methodAReturn(Lcom/bolex/AA;Lcom/bolex/AA;)Lcom/bolex/AA;
表示为虚拟方法
三、断点调试
在网上看了一些资料,最初找到的总是有一些不完美,总是无法调通,最后东拼西凑 结合起来 才真正的跑通,其中容易让人忽略的地址就是manifest中要设置debugable,否则如果设置端口都是无法进行断点
思路:apktool反编译APK修改为可调试并加入断点,apktool回编译APK并signapk加签名,安装,以调试状态打开app,端口转发
baksmali反编译APK得到源代码,用androidstudio打开并设置sourceroot和远程调试端口设置,打好断点就可以开始调试。
思路:apktool反编译APK修改为可调试并加入断点,apktool回编译APK并signapk加签名,安装,以调试状态打开app,端口转发,baksmali反编译APK得到源代码,用androidstudio打开并设置sourceroot和远程调试端口设置,打好断点就可以开始调试
实操:
1、修改AndroidManifest.xml中的android:debuggable=”true”
2、修改完成之后,回编译apk并且进行签名安装
3、Android Studio导入该反编项目的smali文件夹
4、选择Create project from existing sources,之后一直选择next
5、成功导入工程后右键点击 src 目录,设定Mark Directory As->Sources Root
6、配置远程调试的选项,选择Run–>Edit Configurations:
7、增加一个Remote调试的调试选项,端口选择:8700
8、选择File–>Project Structure 配置JDK
9、以调试状态启动app
adb shell am start -D -n com.example.simpleencryption/.MainActivity
10、端口转发:
adb shell ps | grep simpleencryption
可以查到启动的应用使用的端口号
接下来执行
adb forward tcp:8700 jdwp:24551
这条命令的含义可以认为是在本地8700端口与手机24551进程之间建立一条通道,当开始调试时,AS连接本地的8700端口,通过这条通道控制程序的运行
11、下断点
12、调试 run->debug选择刚才新增的调试器,此时程序会断在设置的断点的行,调试器解密如下
最后总结:
随着smali的进一步了解,再通过使用插件、工具的方式可以更有效的阅读反编代码,特别是断点调式,可以更高效的阅读混淆代码。
主要参考地址:
https://blog.csdn.net/shengerjianku/article/details/76511898
https://www.cnblogs.com/gordon0918/p/5570811.html
四、参考URL
https://blog.csdn.net/woblog/article/details/52106571
https://www.cnblogs.com/wangaohui/p/5071647.html
http://www.cnblogs.com/linwx/p/7965706.html
https://www.cnblogs.com/linwx/p/7965893.html
https://segmentfault.com/a/1190000011746970