220 likes | 466 Views
第四章 Android 恶意代码动态分析. 学习目标. 了解软件动态调试方法 掌握代码注入法和栈跟踪法 掌握使用 IDA Pro 调试 Android 原生程序的调试方法. 1 简介. 软件调试 ( 1 )源码级调试 ( 2 )汇编级调试 动态调试 Android 程序 ( 1 )动态调试 Android SDK 程序 ( 2 )动态调试 Android 原生程序. 动态调试 Android SDK 程序
E N D
学习目标 • 了解软件动态调试方法 • 掌握代码注入法和栈跟踪法 • 掌握使用IDA Pro调试Android原生程序的调试方法 2
1 简介 • 软件调试 (1)源码级调试 (2)汇编级调试 • 动态调试Android程序 (1)动态调试Android SDK程序 (2)动态调试Android 原生程序
动态调试Android SDK程序 (1)Dalvik虚拟机实现了JDWP(Java Debug Wire Protocol,Java调试有线协议),可以直接使用支持JDWP协议的调试器来调试Android程序。 (2)DDMS与Eclipse ADT插件 (3)Dalvik虚拟机中所有对调试支持的实现代码位于Android系统源码的dalvik/vm/jdwp目录下。每一个启用调试的Dalvik虚拟机实例都会启动一个JDWP线程。
动态调试Android 原生程序 原生程序使用传统的Linux程序调试方法如GNU调试服务器来连接进行调试。原生程序分为动态链接库与普通可执行程序两种。前者大多内置于Android程序中,在调试时需要先启动Android程序加载它,然后使用远程附加的方式来调试,后者可以直接使用远程运行的方式来调试它。
2 代码注入法 • 所谓的代码注入是指首先反编译Android程序,然后在反汇编出的smali文件中添加Log调用的代码,最后重新打包程序运行来查看输出结果。
例子:注册码验证模型程序,要求不修改程序,找出用户名admin的注册码例子:注册码验证模型程序,要求不修改程序,找出用户名admin的注册码 • 将修改完成的代码使用APKtool重新打包,签名并在此运该程序。输入用户名“admin”与任意的注册码,此时仍然会弹出注册码错误的提示,但Log.v()方法却“偷偷的”输出了正确的注册码。
3 栈跟踪法 • 栈跟踪法同样属于代码注入的范畴,它主要是手动想反编译后的smali文件中加入栈跟踪信息输出的代码。 • 与注入Log输出的代码不同,栈跟踪法只需要知道大概的代码注入点,而且注入代码后的反馈信息比Log注入要详细的多。
例子:运行本小节的例子stackTrace,程序运行后弹出了Toast,我们的要求是:这个Toast是何时被调用的?例子:运行本小节的例子stackTrace,程序运行后弹出了Toast,我们的要求是:这个Toast是何时被调用的? • 使用Apktool反编译,然后添加相应的代码 New Exception(“print trace”).printStackTrace(); 对应的smali代码
new-instance v0, Ljava/lang/Exception; const-string v1, “print trace” invoke-direct{v0,v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V Invoke-virtual{v0},Ljava/lang/Exception;->printStackTrace()V
使用Apttool重新打包,签名后再次运行程序 • Adb logcat –s System.err:V*:W查看logCat输出信息
4 使用IDA Pro调试Android原生程序 • IDA Pro从6.1版本开始,支持动态调试Android原生程序。 • 两种类型 (1)调试Android原生程序(远程调试) (2)调试Android原生动态链接库(远程附加)
Android中的原生程序 • Android NDK“安卓原生开发套件”。它是一款强大的工具,可以将原生C、C++代码的强大功能和Android应用的图形界面结合在一起,解决软件的跨平台问题。 • Android NDK从R8版本开始,支持生成x86、MIPs、ARM三种架构的原生程序。
4 使用IDA Pro调试Android原生程序 • 调试Android原生程序(远程调试) • 所谓“远程调试”是指通过网络调试在另一个网络上的计算机运行的代码的过程。利用远程调试,我们可以使用Windows GUI版本的IDA作为一个前端接口,调试IDA支持的任何平台上的会话。 • 运行IDA PRO界面的计算机被称为“调试器客户端”。 • 运行被调试的应用程序的计算机被称为“调试器服务器 ”。
4 使用IDA Pro调试Android原生程序 • 远程调试主要用于下面一些特殊应用: • 用于调试病毒/木马/恶意软件:通过这种方法,调试器客户端可以与可能受到这些软件攻击的计算机隔离。 • 调试那些在一台计算机上运行遇到问题,而且没有被拷贝安装在其他计算机上的应用程序。 • 调式分布式应用程序 • 它始终在你的主工作站上运行,因此你无需将IDA配置、文件和不同的调试相关资源拷贝到其它机器上。
4 使用IDA Pro调试Android原生程序 • 远程调试步骤 • 1.在IDA 6.1的目录下有一个android_server,是用来在远程端(目标机器)上运行的小程序。把ida 目录下android_server 传到android 目录中, 并设置适当权。如:C:\ adb push android_server /data/local/tmp/C:\ adb shell chmod 755 /data/local/tmp/android_server
4 使用IDA Pro调试Android原生程序 • 远程调试步骤 • 2.把使用的例子debugnativeapp复制到Android设备中,如/data/local/tmp目录中,并加上可执行权限
4 使用IDA Pro调试Android原生程序 • 远程调试步骤 • 3.启动Android调试服务器 C:\ adb shell /data/local/tmp/android_server 启动成功后提示信息: IDA Android 32-bit remote debug server(ST) v1.14. Hex-Rays (c) 2004-2011 Listening on port #23946...
4 使用IDA Pro调试Android原生程序 • 远程调试步骤 • 4.打开另一个命令提示符执行以下命令 C:\ adb forward tcp:23946 tcp:23946
4 使用IDA Pro调试Android原生程序 • 远程调试步骤 • 5.启动IDA Pro主程序,点击菜单项“Debugger->Run->Remote ArmLinux/Android debugger”,打开调试程序设置对话框