Android开发Android开发Android技术知识

【安全与逆向】- smali文件分析及动态调试

2020-02-07  本文已影响0人  拔萝卜占坑

简介

Smali是Android虚拟机的反汇编语言,dex文件反编译之后就是Smali代码。通过分析Smali文件能够更加了解代码的执行流程。平时用java编写的代码,当编译后,实际的执行顺序并不是java的代码顺序,这就是java所谓的“指令重排序”,在多线程中尤其需要注意。所以,有些bug在java层逻辑完全没有问题,但是通过分析Smali文件,可能看到不一样的逻辑。

语法

打开Smali文件,看一下内容。可以直接在Android Studio中打开,而且有语法高亮。

下面只讲解Smali类,方法,字段定义,像执行指令请自行百度,不再累述。


截屏2020-01-20上午11.31.44.png

对应的java代码


截屏2020-01-20上午11.32.48.png

smali动态调试

参考:smali
其实网上对于smali的动态调试已有介绍,但是当自己动手尝试的时候,还是会出现这样那样的问题,网上只是给你提供一个思路,而自己亲自尝试才是掌握真正的技术。

如果安装好了smalidea插件,是可以在左边打断点的,否则不能。

  1. 查看调试应用的进程id
    adb shell ps | grep 包名


    截屏2020-02-07下午10.55.05.png
  2. pc和手机建立端口映射,并指定对应的调试进程。
    用 adb forward tcp:port jdwp:<pid> 在PC上做端口映射, 然后在PC上通过端口连接手机。例如:adb forward tcp:8666 jdwp:13335

    关于forward,jdwp具体使用,可以网上查找资料。

  3. 查看已经映射成功的进程和端口

    adb forward --list
    
  4. 创建远程调试


    截屏2020-02-07下午11.02.30.png

    这里的Port即为上面通过adb forward指定的端口。这个可以自己设定,只要没有被占用即可。

  5. 打断点,开始调试


    截屏2020-02-07下午11.04.51.png

    如果顺利,便会跳到调试断点的地方,但是,通过这个方法,始终在Run -> Debug smali的时候提示:

    Error running 'smali': Unable to open debugger port (localhost:8700): java.net.SocketException "Connection reset"
    

    解决办法,不使用adb forward命令做端口映射,使用DDMS。

    最新版Android Studio已经到不到打开这个工具的入口了,那么我们可以在命令行打开,如果配置了环境变量可以直接执行:monitor。如果没有配,mac电脑可以到在/Users/pds/Library/Android/sdk/tools目录下执行。

截屏2020-02-07下午11.24.22.png

我们可以直接使用8700端口。

其它

Dex、Smali、Class、Java、Jar之间的相互转换

工具 作用 举例
javac java----->class javac Test.java
dx class----->dex dx --dex --output=Test.dex Test.class
baksmali dex----->smali java -jar baksmali.jar -o [输出文件夹] dex文件
smali smali------>dex java -jar smali.jar -o 目标dex文件 [smali文件夹]
dex2jar dex----->jar(class的压缩包) d2j-dex2jar.bat dex文件
apktool apk----->smali apktool d testapp.apk

遇到的问题

上一篇 下一篇

猜你喜欢

热点阅读