首页
社区
课程
招聘
[原创]安卓APP动态调试技术--以IDA为例
发表于: 2017-5-14 15:46 23845

[原创]安卓APP动态调试技术--以IDA为例

2017-5-14 15:46
23845

之前初学安卓APP 调试时写的文章,希望对初学者能有所帮助!


随着智能手机的普及,移动APP已经贯穿到人们生活的各个领域。越来越多的人甚至已经对这些APP应用产生了依赖,包括手机QQ、游戏、导航地图、微博、微信、手机支付等等,尤其2015年春节期间各大厂商推出的抢红包活动,一时让移动支付应用变得异常火热。

然后移动安全问题接憧而至,主要分为移动断网络安全和客户端应用安全。目前移动APP软件保护方面还处于初级阶段,许多厂商对APP安全认识不够深入,产品未经过加密处理,使得逆向分析者能够通过逆向分析、动态调试等技术来破解APP,这样APP原本需要账号密码的功能可以被破解者顺利绕过,使得厂商利益严重受损。

对未加壳的APP进行动态调试,通常可以非常顺利且快速地绕过一些登陆限制或功能限制。本文将以安卓APP为例,来详细介绍一下移动APP动态调试技术。

JAVA环境的搭建请自行查找资料,这里不做详述。

下载地址:http://developer.android.com/sdk/index.html

下载完安装包后解压到任意一目录,然后点击运行SDK Manager.exe,然后选择你需要的版本进行安装,如图:

下载地址:http://www.eclipse.org/downloads。选择Eclipse for Mobile Developers,解压到任意目录即可。

动态调试可以用真实的手机来做调试环境,也可以用虚拟机来做调试环境,本文采用虚拟机环境。因此创建虚拟机步骤如下:

1打开Eclipse >windows->Android Virtual Device

2点击Create,然后选择各个参数如图:

这里Target 就是前面步骤中安装的SDK 选择任意你觉得喜欢的版本就可以。点击OK 就创建完毕。

这个是一个很好用的辅助调试的软件,请自行搜索下载。

IDA6.6开始支持安卓APP指令的调试,现该版本已经提供免费下载安装,请自行搜搜。

安卓APP应用程序后缀为apk,实际上是一个压缩包,我们把它改后缀为rar打开如图:

其中classes.dex是应用的主要自行程序,包含着所有Dalvik指令。我们用APK改之理打开apk,软件会自动对其进行反编译。反编译后会有很多smail文件,这些文件保存的就是APPDalvik指令。

APK改之理里双击打开AndroidManifest.xml,为了让APP可调试,需要在application 标签里添加一句android:debuggable="true" 如图:

然后点击保存按钮,然后编译生成新的apk文件。接着打开Eclipse >windows->Android Virtual Device,选择刚才创建的虚拟机,然后点击start,虚拟机便开始运行。偶尔如果Eclipse启动失败,报错,可以同目录下修改配置文件:

 


把配置参数原本为512的改为256 原本为1024的改为512,然后再尝试启动。

SDK安装目录有个命令行下的调试工具adb shell,本机所在目录为E:\adt-bundle-windows-x86-20140702\sdk\platform-tools,把adb.exe注册到系统环境变量中,打开dos命令行窗口执行adb shell 就可以进入APP命令行调试环境,或者切换到adb所在目录来执行adb shell

这里先不进入adb shell,在DOS命令行下执行命令:adb install d:\1.apk

来安装我们刚才重新编译好的APK文件。安装完毕会有成功提示。

APP包里的classes.dex解压到任意一目录,然后拖进IDA。等待IDA加载分析完毕,点击Debugger->Debugger Options如图

按图所示勾选在进程入口挂起,然后点击Set specific options 填入APP包名称和入口activity 如图:

其中包的名称和入口activity 都可以通过APK改之理里的AndroidManifest.xml

文件获取:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.simpleencryption">

    <application android:allowBackup="true" android:debuggable="true" android:icon="@drawable/creakme_bg2" android:label="@string/app_name" android:theme="@style/AppTheme">

        <activity android:label="@string/app_name" android:name=".MainActivity">

        然后在IDA点击Debugger->Process Options

其他默认不变,端口这里改为8700。这里默认端口是23946,我在这里困扰了很久,就是因为这个端口没有改为8700所致。然后我们看看这个8700端口是怎么来的。在Android SDK里提供了一款工具DDMS,用来监视APP的运行状态和结果。在SDKTOOLS目录有个DDMS.BAT的脚步,运行后就会启动DDMS。由于我的本机安装了SDKADT插件,DDMS集成到了Eclips中,打开Eclips->Open perspective->ddms就启动了DDMS

如图所示:

DDMS选中某个进程后面就会注释出它的调试端口,本机这里是8700

到此所有的工作就准备就绪,然后就可以下断点来调试该APP了。我们在APK改之理中在com目录下查看smali文件 发现MainActivity.smali里有一个感兴趣的函数getPwdFromPic(),那么我们就对它下断以跟踪APP的运行。

IDA里搜索字符串getPwdFromPic,发现onClick有调用该函数

我们在onClick 函数开始位置按F2下断如图:

然后点击上图中绿色三角形按钮启动调试如图:


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

收藏
免费 1
支持
分享
最新回复 (10)
雪    币: 6865
活跃值: (4052)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2017-5-14 22:10
0
雪    币: 33
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢为新手提供这么好的文章,辛苦了
2017-5-30 12:57
0
雪    币: 234
活跃值: (827)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
新手动态调试用这篇文章就够了
2017-5-30 23:33
0
雪    币: 235
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
非常好的动态调试教程
2017-9-2 10:25
0
雪    币: 14
活跃值: (1620)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
adb  shell  push  d:\  android_server  /data/data/sv 
这句  我改成
adb  push  d:\android_server  /data/data/sv
才能copy  搞了半天

(去掉  shell  跟空格)
2017-9-5 21:57
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
非常好!感谢!!
2017-9-7 19:57
0
雪    币: 239
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
很棒的文章,刚好最近打算学习Android逆向
2017-9-8 14:00
0
雪    币: 1110
活跃值: (569)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
9
请问楼主用的什么虚拟机运行android_server
2018-2-21 15:18
0
雪    币: 10336
活跃值: (3162)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
10
wx_晴天下的雨 请问楼主用的什么虚拟机运行android_server
Android  SDK
2018-3-1 14:12
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
2018-6-10 20:53
0
游客
登录 | 注册 方可回帖
返回
//