如何跟踪调试Android的源码

如何跟踪调试Android的源码,第1张

1.首先,得到Android 源代码,并且编译,得到output file,在(Android source)/out目录下,也可通过别的途径获取Android source code (以androidsrc.tgz为例) 和别人编译好的 output file(out.tgz)

2.解压缩这两个 tgz 文件,并把解压出来的out 目录放到 myandroid 目录下,如下图所示。 3.拷贝 myandroid\development\ide\eclipse\.classpath 到 myandroid\.classpath.

4.拷贝 myandroid\out\target\product\generic\*.img 到 {Android SDK}\tools\lib\images 并且覆盖源文件.

5. 运行{Android SDK}\tools目录下的 emulator.exe.

6.运行{Android SDK}\tools目录下的 ddms.bat。你可以看到下面的窗口,里面会列出当前emulator里跑的进程

第一步:将我们开发所用的Android真机的USB调试功能打开(打开方法为Settings(设置)àApplications(应用程序)àDevelopment(开发)à勾选USB debugging(USB调试)),然后通过usb连接线连接到开发所用的PC上,由于是在没有安装usb驱动的情况下进行连接,系统会发现新硬件并且尝试通过windows update在互联网上搜索驱动进行安装:

第二步:由于通过windows update查找驱动会耗费非常长的时间并且需要互联网支持而且不一定能够成功找到,因此我们点击下方的“跳过从Windows Update获得驱动程序软件”跳过搜索:

第三步:关闭自动安装后,通过右键点击“计算机”(XP-我的电脑)选择“管理”进入到计算机管理界面,点击左边的“设备管理器”进入到设备管理界面,此时我们会发现一个带有黄色感叹号标志的硬件设备(如图中所示,位于其他设备分支下),即“Motorola ADB Interface”,这代表着该设备缺少驱动程序支持,从名称上看很显然这个设备就是我们usb调试需要的支持设备:

第四步:安装该设备的驱动程序,右键点击“Motorola ADB Interface”选择“更新驱动程序软件”,d出如下图所示框体:

第五步:正如前面所说,由于我们的SDK中已经存在了google提供的usb驱动程序,因此我们选择第二项“浏览计算机以查找驱动程序软件”,进入到下一对话框,在这里点击浏览,选中目录“%android_sdk_path%/google-usb_driver”,例如这里是使用的D:\study\programfiles\android-sdk-windows-r8\google-usb_driver路径,勾选上下方的“包括子文件夹”,点击下一步:

第六步:在上一步最后点击下一步按钮后,系统会开始在我们设置的文件夹下查找驱动程序软件并进行安装,这一步需要2分钟左右的时间,请耐心等待:

第七步:等待一段时间后,不出意外,系统将会提示“已经成功地更新驱动程序软件”,如下图,如果这一步失败,也不用慌张,可能是google提供的这种驱动暂时不能支持所使用的真机,这时就需要到所使用机器的生产厂商的官方网站去下载驱动程序软件,然后重复前面的步骤,只需要在第五步时设置驱动程序软件路径时定位到所新下载的特定驱动程序的存放路径即可,附件还提供了两款常用USB驱动程序,即motorola和HTC的usb驱动。

第八步:驱动程序安装完成后,此时再到设备管理器中查看,可以发现带黄色感叹号的“Motorola ADB Interface”设备已经消失了,取而代之的是在Android Phone分支下的“Android Composite ADB Interface”设备,这里再提到一点,如果是使用的Motorola的驱动程序的话,这里可能就是显示的“Motorola ADB Interface”了:

第九步:虽然前面系统已经提示了驱动程序安装正确,如果才能确定PC已经识别

Android真机并且正确地建立了连接呢?很简单,首先点击开始->运行,输入cmd:

第十步:在d出的命令提示符界面中使用命令adb devices查看设备(adb命令所对应的应用程序存放在%android-sdk-path%\platform-tools路径下,这里能够在任意路径下使用adb是因为笔者PC机的环境变量中加入了该路径,如果没有设置环境变量则需要首先定位到%android-sdk-path%\platform-tools路径,否则会提示adb不是一个有效的命令,如下图所示,返回了一个编号为04038B6005021006的device(代表真机),这就代表真机已经成功地与PC建立起连接了,如果PC上也运行了模拟器,会发现不只一条的记录,模拟器的类型是emulator:

点击运行一个Android Project时,它的默认行为是由eclipse自主选择一个设备进行应用程序的安装、运行,如果想要人工自主地选择调试设备,可以在对应Project的Run Configuration中进行设置,如图:

点击Run Configuration后,将会d出配置界面:

该界面左边一侧的栏目中是现在存在的一些可配置的应用程序,在左边选择待调试的应用程序,然后在右边单击Target选项卡,选择Manual(手动)即可,需要注意的是,好像目前eclipse在这里存在一个小问题(有可能是笔者自身的 *** 作问题),就是新建的一个项目在第一次编译运行过之前,该项目对应的应用程序不会出现在左边的应用程序列表中,因此不能对其进行设置,也就是说第一次Run时只能使用Automatic的方式由eclipse指定目标设备。不过这种情况影响并不大,假如eclipse此时自己启动了一个模拟器来作为目标,可以立即关闭模拟器终止该 *** 作,之后该项目应用程序就会出现在列表中可以配置为Manual了:

配置成Manual方式后,在Run一个Android Project的时候将会d出一个选择框用于选择设备,如下:

可以看到我们的真机出现在了正运行的设备列表中,通过选中该项点击OK或者直接双击它就可以将应用程序安装到真机上进行调试了,当然,如果需要的是模拟器调试,选中“Launch a new Android Virtual Device”然后选择需要启动的模拟器(列表中是已经建立的模拟器,也可以新建模拟器)就可以了。

1.1 安装JDK

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

1.2 安装Android SDK

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

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

1.3 安装Eclipse集成开发环境

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

1.4 创建Android Virtual Device

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

1打开Eclipse –>windows->Android Virtual Device

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

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

1.5 安装 APK改之理

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

1.6 安装 IDA6.6

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

0x02 Dalvik指令动态调试

2.1 准备工作

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

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

在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文件。安装完毕会有成功提示。

2.2 利用IDA动态调试

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

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

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

1

2

3

<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的运行状态和结果。在SDK的TOOLS目录有个DDMS.BAT的脚步,运行后就会启动DDMS。由于我的本机安装了SDK的ADT插件,DDMS集成到了Eclips中,打开Eclips->Open perspective->ddms就启动了DDMS。

如图所示:

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

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

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

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

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

调试过程中有一个问题出现了很多次,浪费了我大量的时间,就在写文章的时候, *** 作时还是遇到了这样的问题。就是点击启动后IDA提示can’t bind socket,琢磨了很久终于找到原因了,当打开过一次DDMS后 每次启动Eclips都会启动DDMS 而8700端口正是被这个DDMS给占用了,然后每次都会启动失败,解决办法就是 虚拟机运行起来后关闭掉Eclips,这时一切就正常了!

事例中是一个APP crackme 提示输入密码才能进入正确界面。这个时候我们输入123,点击登陆,IDA中断在了我们设置断点的地方,这时选中ida->debugger->use source level debugger,然后点击ida->debugger->debugger windows->locals打开本地变量窗口,如图:

然后按F7或F8单步跟踪程序流程,同时可以观察到变量值的变化,也可以在IDA右键选择图形视图,可以看到整个APP执行的流程图:

如上图所示 变量窗口中我们输入了123 被转化成的密码是么广亡,pw变量也显示出了正确的密码,其实这个时候已经很容易判断出正确密码了。

0x03 Andoid原生动态链接库动态调试

通常为了加密保护等措施,有时dex执行过程中会调用动态链接库文件,该文件以so为后缀,存在于APP文件包里。

这里我们以动态附加的方式来调试原生库。

3.1 准备工作

1、将IDA->dbgsrv目录下的android_server拷贝到虚拟机里,并赋予可执行权限

DOS命令分别为:

adb shell pull d:\ android_server /data/data/sv

adb shell chmod 755 /data/data/sv

2、启动调试服务器android_server

命令:adb shell /data/data/sv

服务器默认监听23946端口。

3、重新打开DOS窗口进行端口转发,命令:

adb forward tcp:23946 tcp:23946 如图:

3.2 利用IDA进行动态调试

1、虚拟机里启动要调试的APP 2、启动IDA,打开debugger->attach->remote Armlinux/andoid debugger

端口改为23946 其他保持不变,点击OK

如上图,选中要调试的APP 的数据包名,然后点击OK。

正常情况下,IDA会把APP进程挂起。

3、由于当前程序不是在动态链接库领空,这时我们要重新打开一个IDA,用它打开需要调试的so文件,找到需要下断的位置的文件偏移,并做记录,然后关闭后面打开的这个IDA。

4、在原IDA界面按下ctrl+s键,找到并找到需要调试的so,同时记录该文件的加载基址。然后点击OK 或者cancel按钮关闭对话框。

5、按下快捷键G 输入基址+文件偏移所得地址,点击OK 就跳转到SO文件需要下断的地方,这时按下F2键设置断点。当APP执行到此处时便可以断下来。

3.3 在反调试函数运行前进行动态调试

程序加载so的时候,会执行JNI_OnLoad函数,做一系列的准备工作。通常反调试函数也会放到JNI_OnLoad函数里。进行4.2中第2步时也许会遇到如下情况:

这时APP检测到了调试器,会自动退出,那么这时调试策略需要有所改变。

接着4.1第3步后,在DOS命令行执行命令:

adb shell am start -D -n com.yaotong.crackme/com.yaotong.crackme.MainActivity

来以调试模式启动APP 如图:

com.yaotong.crackme是APP包名称,com.yaotong.crackme.MainActivity是执行入口 这些可以用APK改之理查看。

这时由于APP还未运行,那么反调试函数也起不了作用,按照4.2中第2步把APP挂起。这时IDA会中断在某个位置

然后点击debugger->debugger opions设置如下:

点击OK 后按F9运行APP,然后再DOS命令下执行命令:

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

这时APP会断下来,然后按照4.2中的3、4、5补找到JNI_OnLoad函数的地址并下断,然后按F9 会中断下来。然后便可以继续动态跟踪调试分析。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12173132.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存