smalidea 无源码调试 apk

Android · hackoooo · Created at · Last by hackoooo Replied at · 6543 hits
2679

前言

公司最近把指纹打卡改为钉钉打卡,作为有自驱力的程序员,每天打卡简直就是在浪费我的生命,所以黑掉钉钉的考勤打卡功能,期间用到smalidea这个神器,相比ida简单许多,记录下怎么玩(文章末尾有彩蛋~)。
现在关于smalidea的资料其实一大堆,不过很多都没更新了,自己也是踩了不少坑,好吧,这篇就作为diycode的处女贴吧 :)

关于smalidea

smalidea官网: https://github.com/JesusFreke/smali/wiki/smalidea
它其实就是 IntelliJ IDEA/Android Studio 的插件,让你拥有smali文件就能去debug 一个apk,而不需要拿到它的源码。

如何安装

首先下载 smalidea : https://bitbucket.org/JesusFreke/smali/downloads
话说这个好久没更新了,目前还是smalidea-0.0.3.zip,我用的Android Studio, Android Studio 更新速度贼快,半年就更新了N个版本,亲测大部分版本已经用不了smalidea, 目前有个相对较新的版本能用上 smalidea的版本是 Android Studio 2.2 Preview 4
下载结束后,开始安装插件:
Android Studio -> Preferences -> Plugins -> Install plugin from disk -> 选择 smalidea插件 ->重启 -> 插件就安装好了。

准备工作

  1. 第一步当然是要拿到你想debug的apk啦,这里就拿阿里的钉钉开刀,下载完的apk文件为 com.alibaba.android.rimet.apk

  2. 第二步就是要把apk里面的编译后的代码转成smali。这里用apktool,具体如何使用参考网 https://ibotpeaches.github.io/Apktool/
    apktool d com.alibaba.android.rimet.apk 后,成功的话就反编译出来一堆smali了:
    这里写图片描述

  3. 这一步很关键,就是让运行在设备中的程序支持debug。方法有几种:

  • 把设备root掉
  • 修改测试机的 /default.prop 文件的ro.debuggable=1,目测这一步也可能需要root。
  • 使用模拟器
  • 修改apk的Manifest application 属性 android:debuggable="true",可以用apktool 解出 Manifest 然后修改,接着重新打包回去。
  • 终极办法,自己编译一个debug版 的rom,这个稍微麻烦一点,我就是用这个方法,自己编一个,想怎么玩就怎么玩,酸爽。

开始debug

好了,假设你已经把apk安装到设备里了。

接下来用Android Studio 打开一个 Project , 工程的目录定位到刚刚apk反编译后的的文件夹,这里为 com.alibaba.android.rimet, 接着右键工程主目录:Mark Directory As -> Sources Root
这里写图片描述

设置Project 的 sdk
这里写图片描述

工程配好了,配置debug的端口:
EditConfigurations...
这里写图片描述

添加一个remote调试
这里写图片描述

修改调试的端口
这里我用8800端口,这个可以随便定,只要不与其它端口冲突即可,然后apply->ok。
这里写图片描述

好了,project方面就准备好了!Nice!
接下来需要准备的就是如何连上设备debug了!这个过程稍微麻烦一点:

  1. 拿到apk的包名和启动的Activity,这里为com.alibaba.android.rimetcom.alibaba.android.rimet.biz.SplashActivity,如何拿到呢?还是从反编译后的Manifest里面找啊。
  2. 把应用启动起来然后等待debug: adb shell am start -D -S -W com.alibaba.android.rimet/.biz.SplashActivity 这里写图片描述 正常的话,你会看到设备里的应用已经跑起来了,并且有个 Waiting For Debugger 的提示,别关掉它。 另外这一步命令行执行也很久,要等个10秒左右的超时,有点蛋疼,后面会讲怎么优化这一步。
  3. 拿到程序运行的pid: adb shell ps | grep com.alibaba.android.rimet 这里写图片描述 图中的5413就是进程的pid啦。
  4. 端口映射: adb forward tcp:8800 jdwp:5413 这里的8800 是上一步在配置工程中自定义的端口。
  5. 万事具备,只差断点:
    打断点,在你想下断点的地方随便下, 这里随便在SplashActivity的初始化地方下一个断点:
    这里写图片描述

  6. 开始debug
    这里写图片描述
    点一下debug, OK,狂拽炫酷屌炸天的画面出现了!
    这里写图片描述
    好了,接下来你想干嘛就干嘛了~

小小的彩蛋

哈哈,终于debug起来了是不是感觉很爽~
然而,每次debug都要敲着一堆的命令蛋都要碎了。
前段时间看了下python,还没怎么写过,所以,我决定把人生的第一段python脚本献给这次任务。
传送门:https://github.com/hackoooo/ApkDebugConnection
求少年们给我多点几个star, 平时没怎么玩,github上的星星少得可怜...T_T...

ok,玩的愉快,有任何问题欢迎留言~

本帖已被设为精华帖!
共收到 2 条回复
96
colintree · #1 ·

你好你好~超级赞的文章,不过我遇到一个小问题:



请问这是咋了……

2679
hackoooo · #2 ·

#1楼 @colintree
修改apk的Manifest application 属性 android:debuggable=“true”,可以用apktool 解出 Manifest 然后修改,接着重新打包回去。

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up