关于Smali工具的一些研究总结

一、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文件夹

关于Smali工具的一些研究总结_第1张图片
image.png

4、选择Create project from existing sources,之后一直选择next
5、成功导入工程后右键点击 src 目录,设定Mark Directory As->Sources Root
关于Smali工具的一些研究总结_第2张图片
image.png

6、配置远程调试的选项,选择Run–>Edit Configurations:
关于Smali工具的一些研究总结_第3张图片
image.png

关于Smali工具的一些研究总结_第4张图片
image.png

7、增加一个Remote调试的调试选项,端口选择:8700
关于Smali工具的一些研究总结_第5张图片
image.png

8、选择File–>Project Structure 配置JDK
关于Smali工具的一些研究总结_第6张图片
image.png

9、以调试状态启动app

adb shell am start -D -n com.example.simpleencryption/.MainActivity

10、端口转发:

adb  shell ps | grep simpleencryption 

可以查到启动的应用使用的端口号


image.png

接下来执行

adb forward tcp:8700 jdwp:24551

这条命令的含义可以认为是在本地8700端口与手机24551进程之间建立一条通道,当开始调试时,AS连接本地的8700端口,通过这条通道控制程序的运行

11、下断点


关于Smali工具的一些研究总结_第7张图片
image.png

12、调试 run->debug选择刚才新增的调试器,此时程序会断在设置的断点的行,调试器解密如下


关于Smali工具的一些研究总结_第8张图片
image.png

最后总结:
随着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

你可能感兴趣的:(关于Smali工具的一些研究总结)