450 likes | 1.22k Views
第三章 Android 恶意代码静态分析. 学习目标. 掌握恶意代码静态分析的方法 能够熟练使用 APKTool 、 IDA Pro 等工具分析恶意代码. 移动终端恶意软件简介. 移动终端恶意软件是一种破坏性程序,和计算机恶意软件一样具有传染性、破坏性。 恶意软件分类 ( 1 )蠕虫 Worm ( 2 )木马 Trojan ( 3 )感染性恶意软件 Virus ( 4 )恶意程序 Malware. 移动终端恶意软件发展史 ( 1 ) 2004 年 6 月,第一个智能移动终端恶意软件 Cabir 出现,感人 SymbianS60 平台的移动终端
E N D
学习目标 • 掌握恶意代码静态分析的方法 • 能够熟练使用APKTool、IDA Pro等工具分析恶意代码 2
移动终端恶意软件简介 • 移动终端恶意软件是一种破坏性程序,和计算机恶意软件一样具有传染性、破坏性。 • 恶意软件分类 • (1)蠕虫Worm • (2)木马Trojan • (3)感染性恶意软件Virus • (4)恶意程序Malware
移动终端恶意软件发展史 (1)2004年6月,第一个智能移动终端恶意软件Cabir出现,感人SymbianS60平台的移动终端 (2)2005年1月,出现全球第一例通过计算机感染移动终端的恶意软件 (3)2005年7月,通过彩信进行传播的移动终端恶意软件出现
(4)2006年2月,俄罗斯首现攻击Java程序的“Redbrowser.A蠕虫”(4)2006年2月,俄罗斯首现攻击Java程序的“Redbrowser.A蠕虫” (5)2007年,熊猫烧香移动终端恶意软件现身 (6)2010年,一个名为“给你米”的病毒将Android手机卷入了“吸费门”
移动终端恶意代码传播途径 (1)彩信传播 (2)蓝牙传播 (3)红外传播 (4)USB传播 (5)闪存卡传播 (6)网络下载传播
1 静态分析 • 静态分析是指在不运行代码的情况下,采用词法分析、语法分析等各种技术手段对程序文件进行扫描从而生成程序的反汇编代码,然后阅读反汇编代码来掌握程序功能的一种技术。
1 静态分析 • 静态分析方法种类: (1)使用APKTool对程序进行分析 (2)阅读反汇编生成的Dalvik字节码,可以使用IDA Pro分析dex文件,或者使用文本编辑器阅读反编译生成的smali文件; (3)阅读反编译生成的Java源码,可以使用dex2jar生成jar文件,然后在使用jd-gui阅读jar文件的代码
2 使用APKTool静态分析Android恶意代码 • 将apk文件利用APKTool反编译,生成smali格式的反汇编代码,然后阅读Smali文件的代码来理解程序的运行机制,找到程序的突破口进行修改,最后使用APKTool重新编译生成apk文件并签名,最后运行测试,如此循环,直至程序被成功破译。
2 使用APKTool静态分析Android恶意代码 • 步骤 (1)反编译APK程序 (2)程序的主Activity (3)需要重点关注的Application类
2 使用APKTool静态分析Android恶意代码 • (1)反编译APK程序 每个APK文件中都有一个AndroidManifest.xml文件,它记录着软件的一些基本信息,包括软件的包名、运行的系统版本。并且这个文件被加密存储进了apk文件中,在开始分析前,有必要先反编译apk文件。
2 使用APKTool静态分析Android恶意代码 • APKTool 下载地址 http://code.google.com/p/android-apktool/ • APKTool安装 • 在Windows平台上需要两个文件:apktool1.5.2.tar.bz2和apktool-install-windows-r05-ibot.tar.bz2,将这两个文件解压到同一个目录下,如D:\apktool,解压后将该目录添加到path环境变量中。 • 反编译apk命令 Apktool d[ecode] [OPTS] <file.apk> [<dir>] • 编译apk命令 Apktool b[uild] [OPTS] <app_path> [<out_file>]
2 使用APKTool静态分析Android恶意代码 • 分析APK文件 • 反编译APK文件成功后,会在当前的outdir目录下生成一系列目录与文件。其中smali目录下存放了程序所有的反汇编代码,res目录则是程序中所有的资源文件。
2 使用APKTool静态分析Android恶意代码 • (2)程序的主Activity • 一个Android程序有一个或者多个Activity组成 • 每个Activity都是Android程序的一个显示页面,负责数据的处理及展示工作 • 在反编译出的AndroidManifest.xml中找到主Activity后,可以直接去查看其所在类的onCreate()方法的反编译代码,通常这就是程序的入口处,所有的功能都从这里开始执行,我们可以沿着这里一直向下查看,追踪软件的执行流程。
2 使用APKTool静态分析Android恶意代码 • (3)需要重点关注的Application类 • 如果需要在程序的组件之间传递全局变量,或者在Activity启动之前做一些初始化工作,需要使用Application类 • 在程序中添加一个继承自android.app.application,然后重写它的OnCreate()方法 • 由于Application类启动较早,一些恶意软件会在OnCreate()方法中实现恶意代码
2 使用APKTool静态分析Android恶意代码 • 例子:使用APKTool对Android程序Crackme02分析与破解 • 步骤 • (1)运行Crackme02查看结果 • (2)使用APKTool反编译APK文件 • (3)分析APK文件 • (4)修改Smali文件 • (5)重新编译APK文件并签名
2 使用APKTool静态分析Android恶意代码 • 运行Crackme02查看结果 • 安装apk文件 adb install crackme02.apk
2 使用APKTool静态分析Android恶意代码 • 分析APK文件 • 反编译APK文件后,会在当前的outdir目录下生成一系列目录与文件。其中smali目录下存放了程序所有的反汇编代码,res目录存放了程序所有的资源文件。 • 如何寻找突破口?错误提示。打开res\values\string.xml文件。
2 使用APKTool静态分析Android恶意代码 • <?xml version="1.0" encoding="utf-8"?> • <resources> • <string name="app_name">Crackme0201</string> • <string name="menu_settings">Settings</string> • <string name="title_activity_main">Crackme0201</string> • <string name="info">Android程序破解演示实例</string> • <string name="username">用户名:</string> • <string name="sn">注册码:</string> • <string name="register">注 册</string> • <string name="hint_username">请输入用户名</string> • <string name="hint_sn">请输入16位的注册码</string> • <string name="unregister">程序未注册</string> • <string name="registered">程序已注册</string> • <string name="unsuccessed">无效用户名或注册码</string> • <string name="successed">恭喜您!注册成功</string> • </resources>
2 使用APKTool静态分析Android恶意代码 • 使用APKTool反编译apk文件后,所有的索引值保存在public.xml文件中。unsuccessed的id值为0x7f05000b,在smali目录中搜索包含0x7f05000b的文件,最后发现只有MainActivity$1.smali文件一处调用。
<?xml version="1.0" encoding="utf-8"?> • <resources> • <public type="string" name="hint_sn" id="0x7f050008" /> • <public type="string" name="unregister" id="0x7f050009" /> • <public type="string" name="registered" id="0x7f05000a" /> • <public type="string" name="unsuccessed" id="0x7f05000b" /> • <public type="string" name="successed" id="0x7f05000c" /> • <public type="style" name="AppTheme" id="0x7f060000" /> • <public type="menu" name="activity_main" id="0x7f070000" /> • <public type="id" name="textView1" id="0x7f080000" /> • <public type="id" name="edit_username" id="0x7f080001" /> • <public type="id" name="edit_sn" id="0x7f080002" /> • <public type="id" name="button_register" id="0x7f080003" /> • <public type="id" name="menu_settings" id="0x7f080004" /> • </resources>
2 使用APKTool静态分析Android恶意代码 • 修改Smali文件代码 • 将.line 32行的代码“if-nez v0, :cond_0”改成“if-eqz v0, :cond_0”,并保存
2 使用APKTool静态分析Android恶意代码 • 重新编译APK文件并签名 • 使用apk b outdir命令,编译成功后会在outdir目录下生成dist目录,里面存放着编译成功的APK文件
2 使用APKTool静态分析Android恶意代码 • 使用jdk中提供的工具进行签名 • (1)生成签名文件 apk_dir>keytool -genkey -keystore crackme02.keystore -alias crack -keyalg RSA -validity 2000
2 使用APKTool静态分析Android恶意代码 • 使用jdk中提供的工具进行签名 • (2)对apk文件签名 apk_dir>jarsigner -verbose -keystore crackme02.keystore -signedjar crackme_signed.apk crackme02.apk crack
2 使用APKTool静态分析Android恶意代码 • 使用jdk中提供的工具进行签名 • (3)验证签名 apk_dir>jarsigner -verify crackme_signed.apk
2 使用APKTool静态分析Android恶意代码 • 测试 • 删除已经安装的smackme02.apk adb uninstall com.droider.crackme0201 • 安装新生成的apk文件 adb install smackme02_signed.apk
3 使用IDA Pro分析Android恶意代码 • IDA Pro是目前全世界最强大的静态反汇编分析工具。它具备可交互、可编程、可扩展、多处理器支持等众多特点。 • IDA Pro从6.1版本开始,提供了对Android的动态调试支持。 • http://www.hex-rays.com/products/ida/6.1/index.shtml
3 使用IDA Pro分析Android恶意代码 • 例子:同上 • 步骤 • (1)使用ZIP工具解压缩APK文件 • (2)使用IDA Pro打开DEX文件 • (3)修改DEX文件 • (4)重新修复与签名
3 使用IDA Pro分析Android恶意代码 • 使用IDA Pro打开DEX文件 • 按照上一个例子的分析方法,在IDA Pro中查找0x7f05000b • 然后找到“if-nez v0, :cond_0”位置,点击IDA Pro主界面上的“Hex View-A”选项卡,发现这行代码的指令为“39 00 0f 00”,第一个字节39为if-nez指令的Opcode,我们需要将其改为if-eqz指令的Opcode(38) • 使用Uedit打开DEX文件并进行修改
3 使用IDA Pro分析Android恶意代码 • 文件修复与签名 • 使用DexFixer对Dex文件进行修复 • 将修复后的Dex文件重新放回crackme02.APK文件中,然后删除APK中的META-INF文件夹 • 重新进行签名
4 阅读反编译的Java代码 • 由于Android程序是采用Java语言开发的,因此传统意义上的Java反汇编工具依然能够用上。 • (1)使用dex2jar生成jar文件 • (2)使用jd-gui查看jar文件的源码
4 阅读反编译的Java代码 • (1)使用dex2jar生成jar文件 • Dex2jar的官网http://code.google.com/p/dex2jar,并将戒烟后的文件夹添加到PATH变量中 • 使用方法 d2j-dex2jar XXX.apk
4 阅读反编译的Java代码 • (2)使用jd-gui查看jar文件的源码 • jd-gui是一款用C++开发的Java反编译工具,该工具可以直接以源码的形式显示jar文件中的内容 例子:crackme02
5 DroidKongFu病毒分析 • DroidKongFu是Android平台上一款十分活跃的病毒。早在2011年,这款病毒就出现了。 • DroidKongFu病毒的主体是一个Android原生程序,通常它被捆绑到正常的Android软件中,用户只要安装遭到捆绑的软件就会感染该病毒。 • 本章分析的病毒捆绑在一款名为“Cut The Rope Unlock”的游戏解锁软件中。
5 DroidKongFu病毒分析 • 当用户安装游戏软件并运行后,软件中被植入的Java代码就会执行Native层的病毒主体,病毒主体进而感染手机系统、篡改系统文件,连接远程的C&C(Command & Control),服务器并接受控制指令。
5 DroidKongFu病毒分析 • Java层启动代码分析 • 首先反编译样本virus.apk apktool d virus.apk dex2jar virus.apk • 查看virus目录下的AndroidManifest.xml文件,能得到什么信息? • 使用jd-gui工具打开jar文件,定位到MainActivity的OnCreate()方法,分析这个函数做了哪三件事情?并找到相应的代码?
病毒在MainActivity初始化时,做了一下三件事 • (1)启动广告接收线程 • (2)启动全局定时器 • (3)启动恶意服务