安卓逆向笔记(8)——动态调试Smali代码

文章目录

工具

  1. Android Studio2.2.3
    (1) 为什么要用AS而不用eclipse?因为apktool不再支持-d选项,原因:
    apktool的开发者说,不想做这个功能了,因为他们觉得自己做的这个功能不够好,还说Android Studios的DDMS功能比他们做的-d选项的功能还要厉害上10倍!建议我们去用Android Studios的DDMS。(具体自己去看 https://github.com/iBotPeaches/Apktool/issues/1061
    在这里插入图片描述
    (2) 然后我就来到了Android Studios寻找DDMS。现在2019年5月了,都已经是3.3版本了,为什么还要用2.2.3版本?因为在3.0版本以后,Google也不再支持DDMS了,也就是apktool不再支持-d之后,google没过多久也来了这波神仙操作!(我TMD还怎么动态调试?针对我啊?!好气哦,就像表白,还没开口就被拒了一样难过!)Google为啥不再支持?他说:
    However, most components of the Android Device Monitor are deprecated in favor of updated tools available in Android Studio 3.0 and higher.
    啥意思?各位看官我乱翻译一下:
    然而哇,为了支持3.0及更高版本中提供的更新工具(注意是update,不是more new),所以呢,我们就放弃了一大堆(most components of!!!)安卓设备的监视器
    我想给这俩货一个大大的fk。
    好了,各位看官,我已经找到解决办法了,别担心。

  2. Smalidea0.0.5
    下载好了不要解压!

  3. 调试用真机
    怎么把真机做成调试模式,看我另一篇文章: https://blog.csdn.net/yhsnihao/article/details/89555394

  4. 要调试的APP
    用apktool给我先把apk反编译出来,然后新建个文件夹,名字随你心情,最好英文,把反编译出来的smali目录复制到新建的文件夹(其他的不要,只要smali目录),并把smali目录重命名成src。

开搞

  1. 首先,安装AS2.2.3,这就不用我说了吧(其实我觉得最新版本也可以,反正我是装了2.2.3版本之后,也没找到Tools->Android选项,所以安装最新版本应该也没问题,只要你的DDMS能打开就行了)
  2. 配置AS:将smalidea插件装入AS。
    选择file->settings->plugins->install plugin from disk,找到smalidea插件包,OK之后重启一下AS,你不放心也可以再去plugins选项下看看有没有装上
  3. 导入刚刚被更名为src的那个目录:file->new->import project,找到刚刚新建的文件夹,OK。点project,再点project
    在这里插入图片描述
  4. 设置一下要调试的smali文件。展开目录,右键src目录,然后看图
    在这里插入图片描述
  5. 设置调试器:
    打开调试器run->edit configurations,然后新建一个debug,最后点OK就好了。看图:
    在这里插入图片描述

在这里插入图片描述

为什么第4步填8700?因为这里要填入的端口号,是我们等下要调试的app进程所使用的端口号(即online值);可是我的进程并不是8700端口啊,8700是debug值呀,那为什么写8700?因为我们等下还要做一步,那就是端口转发,将app实际所使用的端口产生的所有数据全部转发到8700端口去,所以我们要填8700;那为什么要转发,而不是直接填online值呢?因为app进程所占用的端口并不是永远不变的,可能在进行一些测试操作的时候,会让端口改变(如重启APP),这时候又要重新配置Debug选项,太麻烦,端口转发只需要一条命令就OK了,所以我们最后选择这种方式来进行动态调试。
6. 连接到调试机,开始调试!重、难点来了!严格按照我的顺序来,不然你不出错我吃光我家狗粮,饿死我家狗子。
(1)关了AS,DDMS,AndroidKiller什么的一大堆,免得出现端口占用之类的问题,浪费时间去处理这些问题。
(2)把APK安装到手机上并运行。
(3)查看反编译APK的AndroidManifest.xml文件。找到以下2项:
在这里插入图片描述(4)输入如下命令:

adb shell am start -D -n package属性的值/android:name属性的值   
//注意这两个属性中间有个“斜杠/”且不要有空格

手机则会进入等待调试,黑屏并弹出个对话框,千万别点手机上弹出来的对话框(不要点force),它是在等待AS的debug接入,别去动手机
(5) 打开DDMS
找到你要调试的进程,这时候,应该是前面出现了一个红色的虫虫,好了,记住这个进程的两个值(online值和debug值)
在这里插入图片描述
(6)开启转发
开启转发前,先关了DDMS,再输入命令:

netstat -aon |findstr 8700

看看有没有哪个进程占用端口,有的话就kill掉,没有就直接开启端口转发:

taskkill /PID pid值 /F
//pid值是前面的命令输出的最后一列数字

然后输入以下命令开启转发

adb forward tcp:8700 jdwp:9143

(7)在你的smali代码中打断点,然后debug吧

注意

  1. 如果先查打开DDMS查看端口,再去设置进程debug,进程的pid会变,此时会出现错误提示
 Error running Smali: Unable to open debugger port (localhost:8700): java.io.IOException "handshake failed - connection prematurally closed"

在这里插入图片描述

  1. 如果未开启端口转发,则会出现如下错误:
Error running Smali: Unable to open debugger port (localhost:8700): java.net.ConnectException "Connection refused: connect"

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yhsnihao/article/details/89763437
今日推荐