首页
论坛
课程
招聘

[原创]使用AndBug调试Android Java Bytecode

2011-10-27 18:49 72498

[原创]使用AndBug调试Android Java Bytecode

2011-10-27 18:49
72498
我们在开发android应用时,一般会使用eclipse来调试java代码。在有源代码的情况下,使用eclipse调试时很方便的。

但是当我们做android逆向时,显然不会有源代码,这时候如果想要调试目标java代码呢?
一种做法是:我们可以用反编译工具将apk编译成源代码,然后再编译回去,在某些情况下这种做法是有效的,但是并不是所有的apk都能成功编译成源代码的,即使编译成了源代码,再编译回去时也可能会产生很多错误。

这里向大家介绍一个有用的工具:AndBug,它可以在没有源代码的情况下,调试android上的java程序,并支持断点、call stack查看、查看class、method信息等。最重要的是,我们可以添加自己的脚本来加入我们所需要的功能,扩展这个工具。

AndBug的主页是:https://github.com/swdunlop/AndBug

安装AndBug

安装很简单,只要两步
1.        下载源代码
git clone https://github.com/swdunlop/AndBug.git
2.        编译
make
如果提示没有头文件,先安装python-dev


使用AndBug


假设有这样一个例子:
我们有一个apk,名字叫做HttpRequest.apk,它的界面包括一个按钮和一个文本框,当我们单击按钮的时候,程序会去访问一个固定的网页,并将页面的代码显示在文本框中,而这个网页的URL我们是不知道的,如下图所示,





现在我们的任务是要找出这个URL是什么(当然,对于这个简单的例子,我们通过抓包或者静态反编译都能解决这个问题)。

我们将通过AndBug来完成这个工作。

1.        首先在模拟器中启动apk,在命令行下输入 adb shell ps,找到相应的进程pid,在这个例子中pid是243





2.        进入AndBug目录,输入PYTHONPATH=lib ./andbug  shell  –p  243,不出意外的话就能attach上目标进程了




3.        我们可以在命令行中输入各种命令,输入”help”可以看到所有可用的命令,常用的命令有:

classes:  查看加载的class
Break:         下断点
suspend: 暂停进程
resume: 恢复进程运行

4. 我们应该在哪下断点呢?不要急,我们先看看这个apk用到了那些网络相关的类吧,输入:

classes    java.net




出现了一堆相关class,我们看到里面有java.net.URL,一般我们访问网络资源时,通常都会新建一个URL类,在这个类上下断点应该是合理的

5.        在java.net.URL类上下断点,输入
break java.net.URL




这条命令会对URL类中的所有方法下断点,如果只想断其中某一个方法,可以在参数后面加上方法名

6.        下面就是触发断点了,回到app界面,单击”get url”按钮




呵呵,断下来了! 看看堆栈,应该是在URL的init函数处断了下来
然后启动navi server,输入navi,可以看到server地址http://localhost:8080





7.        使用浏览器访问http://localhost:8080,神奇的一幕发生了,我们可以观察到当前线程的状态以及类成员变量,当然也包括我们关心的URL!




以上只是一个简单的功能,我们完全可以通过添加自己的脚本,将AndBug打造成一个android逆向的利器!

文中用到的apk在附件中

HttpRequest.apk

【预售】物联网安全漏洞实战!

上传的附件:
最新回复 (45)
XPoy 3 2011-10-27 23:14
2
0
好帅的帖子。不过android有专区啊 :)
qwoshiren 2011-10-28 17:45
3
0
你说的这个工具AndBug下不到啊,可否共享下,谢谢
nineB 2 2011-11-15 11:45
4
0
谢谢楼主分享,在调试时遇到个问题,向请教下

./andbug shell -p pid后,一直处于等待状态,无任何反应,不知道是什么原因,adb可以正常连接

ubuntu 11
nineB 2 2011-11-15 14:33
5
0
用真机可以了
ZhWeir 6 2011-11-15 14:34
6
0
很有可能是调试端口被其他应用占了。建议关掉其他与调试设备连接的程序,实在不行重启试试。
adb的调试状态要关掉哦~
nineB 2 2011-11-15 15:06
7
0
在audbug中输入 navi提示不支持的命令,不知道是什么原因,如何启动这个navi server呢?还请楼主指点下,谢谢啦
nineB 2 2011-11-15 15:07
8
0
谢谢,换真机可以了,仿真器貌似不行,大侠说的adb调试状态是指?
ZhWeir 6 2011-11-15 19:25
9
0
哦,不好意思,是我说得有问题。是DDMS的Debug状态要关掉。。。
xie风腾 2011-11-15 20:30
10
0

好资料哟,学习了
我是土匪 4 2011-11-16 11:11
11
0
好帖,占楼留名。高价出租此楼盘
曹无咎 1 2012-2-25 19:06
12
0
古河兄,为什么在第二步PYTHONPATH=lib ./andbug  shell  –p  243(当然这里是我测试程序的ID)附加进程的时候出现
error [errno 13] permission denied这个错误
望指教!
曹无咎 1 2012-2-29 09:51
13
0
已搞定,多谢古河兄
qffhq 1 2012-3-10 14:05
14
0
看了command.py代码以后发现,是Python库的问题,修改代码后找到原因:

  File "./andbug", line 25, in main
    andbug.command.load_commands()
  File "/usr/src/AndBug/AndBug/lib/andbug/command.py", line 208, in load_commands
    __import__( name )
  File "/usr/src/AndBug/AndBug/lib/andbug/cmd/navi.py", line 17, in <module>
    raise andbug.DependencyError('navi requires the "bottle" package')
andbug.errors.DependencyError: navi requires the "bottle" package

在到navi.py中可以看到需要 bottle 库.
wawt 2012-5-4 08:54
15
0
收藏下!得学习学习!
tashika 2012-5-6 17:06
16
0
win上能用不... 用python2 还是3
crackdung 2012-5-7 12:26
17
0
我偏向靜態分析
upxshell 2012-5-9 18:50
18
0
好东西,学习了
wuweizi 2012-6-7 17:10
19
0
有没有人做移植的?弄到win上比较大众化
peterchen 2012-7-18 15:41
20
0
抽空测试过个调试工具,发现比起smalidebug很多不足...
一不能单步调试
二只能中断核心api,无法任意中断
三由于无法头单步与只中断在核心api中,很难逆向找到逻辑判断关键

可能是针对http之类分析或短信这类分析(木马或病毒),找出http或smsto...
不过smalidebug,本人一直调试不通
pc小波 1 2012-7-18 17:32
21
0
木有安装成功的飘过
舵手 3 2012-7-24 10:09
22
0
red hat 下俺也没安装成功
hawks 2012-8-31 14:01
23
0
学习了
icejava 2012-10-15 21:38
24
0
请教楼主,win下能用么?
codexploit 2012-10-16 17:05
25
0
挺好的
就是有些疑问:
如果程序APK一点击某些代码就运行了,那不是断不到了?
能不能有step下去的调试呀?
zpsemo 2012-10-16 18:24
26
0
冒昧的问下
模拟器中启动apk
模拟器是在Windows下? 还是怎么搞?  能否指导下
天涯一鸿 2012-10-17 21:25
27
0
今天搞了一下……最后是成功了……

但是不是所有程序都用了jdwp的……对于没用jdwp的程序要怎么调试……难道那些商业软件会用jdwp???
kmsmxpro 2012-10-18 22:21
28
0
好资料哟,学习了
wsz卡比 2012-11-7 09:06
29
0
so  应该无法中断调试的吧。apk的源码其实看着感觉很好了 比起静态反汇编 幸福多了
飞雪 1 2012-11-7 17:51
30
0
打开网页居然显示500错误,何解?
飞雪 1 2012-11-7 17:52
31
0
http://localhost:8080 ,返回 500
冰凌雪逸 2012-12-22 20:24
32
0
app_50 28143 141 164396 39236 ffffffff 00000000 S org.gaeproxy
ota 28330 141 111352 15324 ffffffff 00000000 S com.android.updater
app_36 28338 141 112088 15168 ffffffff 00000000 S com.miui.backup
app_49 28442 141 111796 14856 ffffffff 00000000 S jp.sugitom.android.furoneko
app_49 28470 141 111840 16308 ffffffff 00000000 S jp.sugitom.android.furoneko:remote
root 28635 2 0 0 ffffffff 00000000 S flush-179:0
dhcp 28656 1 864 412 ffffffff 00000000 S /system/bin/dhcpcd
ota 28725 141 112484 16344 ffffffff 00000000 S com.android.deskclock
shell 28865 150 752 336 c009e0f4 afd0c49c S /system/bin/sh
shell 28866 28865 892 328 00000000 afd0b52c R ps
root@ubuntu:~# cd '/home/louis000/java/AndBug'
root@ubuntu:~/java/AndBug# PYTHONPATH=lib ./andbug shell –p 28143
!! process pid or name must be specified
求解啊  真机 模拟器 都是这个样。。环境 插件 都好的 啊  MAKE 也好的
yuletianxi 2013-9-5 10:27
33
0
好帖!!必须留言mark !!! 可是为啥我用真机调试,附加不上进程
yuletianxi 2013-9-5 11:33
34
0
在虚拟机上调试 , 敲打navi之后,访问http://localhost:8080  返回错误如下:
Error: 500 Internal Server Error

Sorry, the requested URL 'http://localhost:8080/' caused an error:

Template 'frontend' not found.

是啥原因?求调教
天高 2013-9-5 12:20
35
0
make
cairuijie 2013-12-23 16:02
36
0
使用浏览器访问http://localhost:8080  Error: 500 Internal Server Error
是什么原因呢?
ndaye 2014-1-2 11:02
37
0
好帖 小白学习了
万抽抽 2 2014-1-2 20:20
38
0
为什么我输入andbug shell -p pid之后显示如下信息呢?求解~~
上传的附件:
wule 2 2014-4-19 12:08
39
0
看到了一种方法,谢大神!
Ethernet 2014-8-8 12:43
40
0
测试出现以下问题:
connection reset by peer.
解决方法:
反编译apk,在AndroidManifest.xml里添加android:debuggable=true,然后再用
这个apk调试。
hznetease 2014-8-8 15:11
41
0
不错。。顶
xuefengw 2014-9-5 17:07
42
0
12楼,曹无咎兄,请问出现“error [errno 13] permission denied这个错误”怎么解决,希望得到你的帮助,谢谢!!
川美 2015-3-14 16:44
43
0
环境配置有点麻烦哟
xiiiiao 2015-7-30 09:49
44
0
楼住,我拿来调试微博和微信都出现了这样的问题,请问该如何解决

!! [Errno 104] Connection reset by peer
Traceback (most recent call last):
  File "./andbug", line 49, in main
    andbug.command.run_command(args)
  File "/home/xiao/AndBug/lib/andbug/command.py", line 266, in run_command
    return ctxt.perform(args[0], args[1:])
  File "/home/xiao/AndBug/lib/andbug/command.py", line 189, in perform
    if act.proc: self.connect()
  File "/home/xiao/AndBug/lib/andbug/command.py", line 65, in connect
    self.sess = andbug.vm.connect(self.pid, self.dev)
  File "/home/xiao/AndBug/lib/andbug/vm.py", line 1856, in connect
    conn = andbug.proto.connect(andbug.proto.forward(pid, dev))  #conn是Connection(Thread)类型的一个对象
  File "/home/xiao/AndBug/lib/andbug/proto.py", line 113, in connect
    p.start()
  File "/home/xiao/AndBug/lib/andbug/proto.py", line 319, in start
    self.readHandshake()
  File "/home/xiao/AndBug/lib/andbug/proto.py", line 182, in readHandshake
    data = self.read(len(HANDSHAKE_MSG))
  File "/home/xiao/AndBug/lib/andbug/proto.py", line 149, in read
    pkt = self._read(sz)  #返回值是读到的数据
  File "/home/xiao/AndBug/lib/andbug/proto.py", line 94, in read
    pkt = conn.recv(req)
error: [Errno 104] Connection reset by peer
了log 2016-2-29 15:31
45
0
收藏下!得学习学习!
Vn小帆 2018-5-9 10:45
46
0
感觉跟LLDB  一样用
游客
登录 | 注册 方可回帖
返回