首页
社区
课程
招聘
[原创]Smalidea+IntelliJ IDEA/Android Studio无源码调试
发表于: 2017-8-29 10:35 16318

[原创]Smalidea+IntelliJ IDEA/Android Studio无源码调试

2017-8-29 10:35
16318

smalidea是一个IntelliJ IDEA/Android Studio smali语言插件,可实现动态调试smali代码。
github地址:https://github.com/JesusFreke/smali/wiki/smalidea


前言

在开发过程中,debug版本我们可以跟踪调试,查看bug等信息,但是在release版本中只能去打log进行代码进行猜测,还有就是dump堆栈等无法与代码直接交互的方法。无源码调试指的是在没有源代码的情况下可以对app进行代码调试,逆向smali代码,然后查看其运行逻辑。在发现release版本问题的过程中可以让我们更块的定位错误。

动态调试Android App

smalidea支持14.1或以上版本的IDEA。android Studio如果是基于14.1或以上版本的IDEA也是支持的,我这里用的是2.3.3版本的Android Studio,IDEA的操作也差不多。
从上面的下载地址中下载以下三个应用


backsmali:可将apk转为smali代码,也可将odex转为smali代码,当然在odex转为smali过程的中需要/system/framework目录下的内容

smail:可将smail文件转为dex文件

下载结束后,开始安装插件:
Android Studio -> Preferences -> Plugins -> Install plugin from disk -> 选择 smalidea插件 ->重启 -> 插件就安装好了。

准备工作
  1. 第一步当然是要拿到你想debug的apk,这里随机使用一个app
  2. 第二步就是要把apk里面的编译后的代码转成smali。
    这里可以使用上述过程中的baksmali进行反编译,也可以使用apktool进行反编译
    baksmail:
java -jar baksmali-2.2.1.jar  d myapp.apk -o ~/projects/myapp/src

apktool:

java -jar apktool.jar d myapp.apk -o ~/projects/myapp/src

如图所示使用baksmali-2.2.1.jar反编译出的目录



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

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

接下来用Android Studio import一个 Project , 工程的目录定位到刚刚apk反编译后的的文件夹

使用“Create project from existing sources”一路next到底



设置Project 的 jdk[File->Project Structure]


完成之后 点击项目邮件 Mark Directory As->Sources Root

工程配好了,配置debug的端口:
EditConfigurations...



添加一个remote调试



修改调试的端口
这里我用8700端口,这里我们需要启动ddms去设置端口号映射,然后apply->ok。



好了,project方面就准备好了!Nice!

接下来需要准备的就是如何连上设备debug了!
过程也很简单,启动DDMS
Tools->Android->Android Device Monitor选择你要调试的apk的包名


最后,开始debug
Run->Debug Smali


针对DDMS端口转发,也可以手动的制定端口信息,操作如下(smalidea的作者推荐的是ddms的方式):

  1. 拿到apk的包名和启动的Activity 把应用启动起来然后等待debug: adb shell am start -D -S -W packageName(packageName的获取可以反编译AndroidManifest.xml里面有包含)

正常的话,你会看到设备里的应用已经跑起来了,并且有个 Waiting For Debugger 的提示,别关掉它。

  1. 拿到程序运行的pid: adb shell ps | grep packageName

  2. 端口映射: adb forward tcp:8800 jdwp:5413 这里的8800 是上一步在配置工程中自定义的端口。

官方步骤如图所示:


以上就是基于smalidea无源码调试的整个过程,有问题的可留言,我们一起交流学习。

PS:Android端 TCP直连,有资料的童鞋请不吝赐教。谢谢


关注微信公众号 Android历练记 或扫一扫二维码:让我们一起来搞事情。

Android历练记
Android历练记



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 1489
活跃值: (1033)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
smalidea调试经常断开。
2017-8-31 23:35
0
雪    币: 48
活跃值: (37)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
用ddms链接的话应该不会吧    程序里面应该有反调试
2017-9-1 08:58
0
雪    币: 905
活跃值: (1037)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
baksmali对apk那条命令可能默认只反编译第一个dex
2017-9-20 21:27
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
对多个dex的程序要怎么调试
2017-9-21 11:14
0
雪    币: 48
活跃值: (37)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
wx_La0s baksmali对apk那条命令可能默认只反编译第一个dex
关于支持multidex的  可以将apk解压出来直接使用bacsmali命令去逆向,或者写个java封装个jar包进行逆向,网上有现成的工程,不妨参考下https://github.com/difcareer/SmaliDebugTool
2017-10-9 09:28
0
雪    币: 48
活跃值: (37)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
tearsroad 对多个dex的程序要怎么调试
多dex和一个dex是一样的啊,都是反编译出来smali代码。,关于反编译多dex的方法请参考楼上提供的地址和方法
2017-10-9 09:29
0
雪    币: 1
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
as  import  反编译的smali  project后  直接am命令启动apk  在as的toolbar中  点choose  procccesses  就行了  不用配置remote  不用端口映射  相当方便
2017-10-9 14:58
0
雪    币: 48
活跃值: (37)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
lonelykin as import 反编译的smali project后 直接am命令启动apk 在as的toolbar中 点choose procccesses 就行了 不用配置remote 不用端口映射 相当方便 ...
不错    这样其实是as干了映射的活  这样也行
2017-10-12 17:29
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
好评(o^^o)
2017-10-14 07:16
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
用起来比较麻烦,但是ida  调试dex  看不到寄存器,就很尴尬,所以还是老老实实的用这个吧
2017-10-17 22:32
0
雪    币: 1
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
weixinx 用起来比较麻烦,但是ida 调试dex 看不到寄存器,就很尴尬,所以还是老老实实的用这个吧
可以看呀
2017-11-29 14:55
0
雪    币: 7695
活跃值: (1544)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
13
我的Android  studio好像根本没有dmms,然后手动端口转发之后一直出现Unable  to  open  debugger  port  (localhost:8800):  java.net.ConnectException  "Connection  reset:  connect",是AS版本的问题吗
2018-4-24 17:54
0
雪    币: 160
活跃值: (162)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
碰到一个app是梆梆加壳的,用idea附加的时候程序就挂了,楼主能帮忙解决吗?
2018-7-26 16:10
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
可以了解下 jeb,这个集成反编译与调试,而且不涉及multdex 问题
2018-7-28 09:44
0
雪    币: 48
活跃值: (37)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
想飞的超超 我的Android studio好像根本没有dmms,然后手动端口转发之后一直出现Unable to open debugger port (localhost:8800): java.net.Con ...
新手,端口映射用不好的话建议还是使用ddms,sdk/tools/monitor 这个手动吊起就可以了
2018-11-16 09:20
0
雪    币: 48
活跃值: (37)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
小青峰 碰到一个app是梆梆加壳的,用idea附加的时候程序就挂了,楼主能帮忙解决吗?
加固的话需要先解壳的。直接附加是没什么作用的。群里很多解壳的方法,可以尝试下
2018-11-16 09:21
0
雪    币: 977
活跃值: (435)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
18
好评
2019-7-6 23:48
0
游客
登录 | 注册 方可回帖
返回
//