[Android] smalidea 无源码调试 apk

本文介绍了一种利用smalidea插件对钉钉APP进行调试的方法,通过反编译APK文件并设置断点,实现了对钉钉考勤功能的调试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

公司最近把指纹打卡改为钉钉打卡,作为有自驱力的程序员,每天打卡简直就是在浪费我的生命,所以黑掉钉钉的考勤打卡功能,期间用到smalidea这个神器,相比ida简单许多,记录下怎么玩(文章末尾有彩蛋~)。

关于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,玩的愉快,有任何问题欢迎留言~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值