APK分析常识和最新技术文章
作者:姜军 刘大勇 尹良凯
本文为转载只为办案人员提供参考资料
图1是一条包含手机木马超链接的信息, 信息内容是:“ 毕业聚餐照片, 你自己看吧, 哈哈, 样子好好笑哦, 打开http://65.49.70.91/c/1/下载激活。” 受害人点击超链接, 并按要求激活后, 发现银行账户的资金被盗了。经对受害人手机进行勘验, 发现感染了木马。木马为了提高生存率, 一般会使用隐藏或伪造技术, 对文件、进程和网络连接、通信内容和通道进行隐藏或伪造处理[1], 图2中的“ 照片” 就是伪装成照片查看软件的手机木马程序。
![]() | 图1 受害人手机接收到的木马短息及激活后的界面Fig.1 The interface after a smartphone received and activated the Trojan message |
在此类手机木马案件的取证中, 除按照一般电子物证检验原则[2, 3], 提取电子物证外, 更关键的是如何更好地检测、提取出木马程序, 鉴定出木马程序所具有的主要功能, 并结合其它证据还原出犯罪嫌疑人是如何利用木马盗取受害人银行账户资金的, 本文针对这些问题提供了完整的技术路径。
1)互联网超链接传播。首先木马程序被上传到互联网上, 生成超链接, 并利用微博等工具将长链接转换为短链接。然后将超链接发布出去, 编造各种理由, 诱使受害人下载安装木马程序。
2)WIFI传播。不法分子通常在公共场所设置一个免费的WIFI热点, 诱使受害人使用手机连接, 并通过网页提示安装免费WIFI软件, 其实安装的软件就是木马程序。
3)USB传播。手机通过数据线连接外部设备时, 可能被植入木马, 如在手机连接感染了病毒的计算机时, 有可能被安装木马程序。
4)APP捆绑传播。通过与正常的APP软件捆绑也是手机木马传播的途径, 受害人手机在安装APP时, 也同时被植入了木马, 木马隐藏在提供正常服务的APP后面, 该种传播途径更加隐蔽。
除以上几种传播途径外, 当木马被植入到受害人手机后, 木马程序会向受害人手机通讯录中的所有人发送木马链接, 并不断扩散。
从手机木马的传播途径可知, 木马被植入目标手机过程中, 会留下痕迹, 如超链接信息、接入的WIFI名称和连过的设备等, 所以可根据这些痕迹线索, 并结合手机持有人反映的异常情况, 对送检手机进行初步检查, 查看在这些痕迹背后有没有下载安装APK文件; 还可以通过应用程序管理器检查APP的安装时间、文件大小、分配的权限等。
综合以上情况, 筛选出可疑APK文件。再运用静态和动态分析方法对可疑APK进行检测[4], 最终提取出木马APK。静态检测方法主要是检查应用程序的源代码和Manifest文件, 如检查签名、字节码、资源文件、应用程序组件和分配的权限等。
动态分析方法一般通过应用程序的行为来评估是否为木马, 如监听分析应用程序的文件系统、网络流量、发送的信息、呼叫的电话等。
手机木马检测可以运用特征码扫描法、启发式扫描法、完整性检测法、基于行为分析法和污点检测法等技术方法, 它们各有优缺点, 可以综合考虑进行选择。特征码扫描法是通过病毒本身的特征来查找病毒, 该方法开销小, 已被广泛运用于病毒检测工具[5]。
启发式扫描法是通过对代码的分析, 来断定程序是否存在病毒特征和恶意行为意图[6], 该方法具有检测出某些未知病毒的能力, 无需或仅需少量病毒库, 但存在误报, 性能开销较大。完整性检测法是通过对系统中的文件进行定期计算校验和, 每次打开文件前使用当前校验和与之前的进行比较, 若不一致, 则判断文件感染了病毒[6], 这种检测法简单易行, 也能发现未知病毒, 但误报率高。基于行为分析法是指获取程序的行为特征, 与已知恶意行为特征进行比较, 从而判断其行为是否具有恶意企图, 可以检测出新型或者变种恶意程序, 是当前移动平台上的一种主流恶意代码检测技术。
行为分析检测又分为静态检测和动态检测, 静态检测是通过对程序进行反编译, 提取行为特征; 动态检测是指在程序运行时监控所调用的函数, 来判断程序的行为[7], 成功检测的关键是具有完备的异常行为策略和有效的实时监控手段。污点检测技术也是一种动态检测技术, 通过对数据做污点标记, 跟踪和分析污点数据在程序内部的流动和使用情况, 来判断是否存在恶意行为, 污点检测技术可以有效检测出应用程序的隐私泄露行为[7]。
在检测提取手机木马的同时, 根据不同的传播途径, 还要提取固定木马的来源性数据。例如若手机木马是通过互联网超链接下载安装的, 那么就要提取超链接的来源、接收时间、下载和安装时间等。若木马是通过WIFI下载安装的, 需要提取WIFI的名称、接入时间、打开的页面等。此外, 待提取了回传账号和密码后, 还要对回传数据进行提取固定。总之, 要按照智能手机的一般取证流程[8], 检查还原手机木马的全生命周期的数据, 以便形成有效的证据链。
本文将安卓手机木马取证过程分为四个阶段, 即检测、数据提取、预处理、鉴定分析。图3概括了安卓手机木马取证的总流程。其中检测阶段是根据木马检测规则对可疑APK文件或已经安装的APP程序进行检查, 找出木马程序。数据提取阶段的任务是提取木马APK, 并固定来源和回传性数据, 如APK来源、下载安装时间、文件大小、与外部联系的内容等。预处理阶段是将提取到的木马APK反编译为JAR文件, 并找到程序入口, 查找木马回传的可疑账号。鉴定分析阶段是通过对木马代码的分析和逆向处理, 鉴定测试木马的危害。
3.1.1 文件AndroidManifest.xml的提取分析
安卓木马程序是扩展名为APK的安装包, 其中的文件AndroidManifest.xml声明了程序的基本信息, 如木马程序名称、基本组件、木马程序所申请的权限及版本信息等。Android系统通过应用程序框架设计了权限许可机制, 使用一百余种权限来细化各个应用程序所具有的权限。应用程序要访问用户数据、系统配置、设备信息等资源, 需要在AndroidManifest.xml中申请对应的权限, 否则无法运行。程序在运行期间无法动态地改变自身权限, 因此, AndroidManifest.xml中的权限分配能够作为是否具有恶意行为的判断依据。通过apktool工具内的aapt命令, 可以提取出木马APK安装包内的AnroidManifest.xml文件。具体命令如下:“ aapt dump xmltree 木马.apk AndroidManifest.xml > C:demo.txt” 。通过查看AnroidManifest.xml文件可知该款木马程序要求分配的权限有:访问网络的权限android.permission.INTERNET, 读信息的权限android.permission.READ_SMS, 接收信息的权限android.permission.RECEIVE_SMS, 写信息的权限android.permission.WRITE_SMS, 发送信息的权限android.permission.SEND_SMS, 访问WIFI的权限android.permission.ACCESS_WIFI_STATE等, 显然与其名称“ 照片” 所需要的权限不符, 可以初步判断为具有木马嫌疑。
3.1.2 手机木马反编译
将提取到的木马APK反编译为JAR文件, 并对JAR文件进行分析, 能够获取木马与外界联系的通道, 并对其功能进行鉴定, 为侦查办案提供线索和证据支撑。下面以上文中的案例来说明安卓木马反编译的方法。从手机文件目录提取到木马的安装文件, 或使用手机助手软件查看手机安装的应用, 并将木马应用导出为APK文件, 这里将木马APK文件命名为“ 照片.apk” 。“ 照片.apk” 是一个压缩包, 可以将apk后缀直接改为zip、rar等压缩包格式, 再对其进行解压缩。在解压后的文件夹里有个 “ classes.dex” 文件, 该文件是安卓手机编码的二进制文件。如图4所示, 利用工具dex2jar对该文件进行反编译后, 得到文件clases_dex2jar.jar。利用jd-gui.exe可以把jar包反编译为java源代码, 如图5所示, 是在jd-gui.exe中打开的文件clases_dex2jar.jar, 从中可以找到设置的回传邮箱账号和密码, 以及回传手机号码。
![]() | 图4 安卓木马的二进制文件被反编译为字节码文件Fig.4 The bytecode file that was decompiled from Android Trojan’ s binary file |
![]() | 图5 木马程序中设置的回传手机号码、邮箱账号和密码Fig.5 The Trojan program set up to return back phone number, email account and password |
3.1.3 回传账号的解密
近两年出现的部分新型手机木马被反编译后, 查看其源代码发现, 木马有效期限、回传手机号码、电子邮箱账号及密码都进行了加密, 这增大了破解的难度。下面是一个名为“ 相片3.APK” 的木马的部分源代码, 其中设置的手机号码、电子邮箱账号和密码都进行了加密。
public String d(){//获取“ 回传手机号码” 方法
return this.b.getString(“ a10” , “ b2cd44945343a358
81de508c6ce8fa69” );
}
public String h(){ //获取“ 电子邮箱账号” 方法
return this.b.getString(“ a6” , “ b2cd44945343a358
042c1f14ef496317f72927203283a7fe” );
}
public String j(){ //获取“ 电子邮箱密码” 方法
return this.b.getString(“ a8” , “ 285e709e0cee96ec
f02c3fa8e086f199eda7f36474f02f3d” );
}
我们无法根据账号密文追查犯罪嫌疑人, 但木马也不能直接使用账号密文向犯罪分子回传信息, 所以木马源码中必定有解密算法。经分析发现, 该木马使用的是DES加解密算法。木马初次运行时, 调用上述方法获取到密文, 利用DES算法对密文解密得到明文, 并将明文赋值给上述方法的第一个参数对应的键值。这样, 再次调用上述方法时, 获取的就是第一个参数的键值, 也就是明文。为了增大破解难度, 该木马程序被做了防反编译处理, 所以反编译未能还原出原始代码中的类名、方法名和变量名, 仅以字母代替。为了便于阅读, 本文根据代码功能, 对类名和方法名进行了重命名。下面是DES算法和解密电话号码密文的部分源代码, 包括DES加解密算法类和账号初始化类。
public class DESCrypto{ //DES加解密算法类
public DESCrypto(byte[] paramArrayOfByte){
Key localKey = DESKey(paramArrayOfByte);
this.b = Cipher.getInstance(“ DES” );
this.b.init(1, localKey);
this.c = Cipher.getInstance(“ DES” );
this.c.init(2, localKey);
}
private Key DESKey(byte[] paramArrayOfByte){ //密钥转换为DES算法需要的标准
byte[] arrayOfByte = new byte [ 8 ];
for (int i = 0; ; i++){
if ((i > = paramArrayOfByte.length) || (i > = arrayOfByte.length)) {
return new SecretKeySpec(arrayOfByte, “ DES” );
}
arrayOfByte[i] = paramArrayOfByte[i];
}
}
public static byte[] ciphertextByte(String paramString){ //密文字符串转换为DES算法要求的字节数组
byte[] arrayOfByte1 = paramString.getBytes();
int i = arrayOfByte1.length;
byte[] arrayOfByte2 = new byte[i / 2];
for (int j = 0; ; j += 2){
if (j > = i) {
return arrayOfByte2;
}
String str = new String(arrayOfByte1, j, 2);
arrayOfByte2[(j / 2)] = ((byte)Integer.parseInt(str, 16));
}
}
public byte[] Decrypt(byte[] paramArrayOfByte){ //解密方法
return this.c.doFinal(paramArrayOfByte);
}
public String Decrypt(String paramString){ //解密方法
return new String(Decrypt(ciphertextByte(paramString)));
}
}
public class AccountInit{ //帐号初始化类
public static void setSecretKey(){ //设置密钥
StringBuffer localStringBuffer = new StringBuffer().append(‘ h’ ).append(‘ ~’ ).append(‘ m’ ).append(‘ x’ );
SecretKeyByte = localStringBuffer.toString().getBytes();
SecretKeyStr = localStringBuffer.toString();
public static void setPhoneNumber(Context paramContext){ //解密电话号码, 并给“ 电话号码” 键值赋值
}
String phoneNumberCiphertext = Account.getParamContext(paramContext).
getPhoneNumberCiphertext(); //获取电话号码的密文
//对获取的电话号码密文进行解密
String phoneNumber = new DESCrypto(SecretKey
Byte).Decrypt(phoneNumberCiphertext);
Account.getParamContext(paramContext).setPhone
Number(phoneNumber); //初始化“ 电话号码” 键值
}
}
该木马设置的密钥为:“ h~mx” 的十六进制编码补齐8个字节, 密文在解密时, 也被转化为十六进制。经过DES算法解密后得到:回传手机号码13439838565, 回传电子邮箱账号13439838565@163.com, 邮箱密码yfiflwqifjtiwkwx。经检查, 受害人手机向手机号码13439838565发送了验证码短信, 登录电子邮箱13439838565@163.com, 发现了该电子邮箱将受害人手机通讯录的所有号码发送给了自己。
除了反编译后分析木马的源代码外, 还可以利用动态分析方法, 对木马行为进行分析, 如通过抓包分析可以查看到木马的具体动作, 通过动态调试能够破解和绕过木马的一些加密和加固措施。
下面通过网络抓包对木马的行为进行分析, 将木马安装到测试手机上, 测试手机通过笔记本电脑的WIFI热点连接互联网, 在笔记本电脑上运用抓包工具进行抓包。如图6所示, 是利用抓包工具抓取的木马“ 相片3.APK” 的网络数据包。将抓获的网络数据包按协议排序后, 找到SMTP协议, 发现电子邮箱账号13439838565@163.com在测试手机上进行了登录, 登录后向该账号自己发送了邮件。另外还截获了电子邮箱的登录密码, 如图6中方框内的字符串“ eWZpZmWlmanRpd2t3eA==” 就是邮箱密码的BASE64编码, 经BASE64解码后即得到了登录密码明文:yfiflwqifjtiwkwx, 与上文使用解密算法获取的密码相同。
为了更好地鉴定手机木马具有哪些危害, 除了从源代码进行分析外, 更加直观的方法是通过逆向技术[9], 对手机木马做鉴定测试。本文所讲的逆向技术是指通过修改安卓手机木马某些关键数据, 使木马处于可控情况下, 测试其所具有的功能的方法。
3.3.1 木马逆向技术思路
首先反编译木马程序“ 照片.apk” 得到文件“ 照片.jar” , 然后在文件“ 照片.jar” 中找到回传邮箱账号和手机号码, 将其改为由检测人员控制的测试邮箱账号和手机号码。然后再把文件“ 照片.jar” 编译成文件“ 照片.dex” , 再改名为“ classes.dex” , 用该文件替换原始文件“ 照片.apk” 中的classes.dex, 最后对“ 照片.apk” 进行签名处理, 即可运行安装。
3.3.2 操作步骤
若要运行安卓手机木马逆向软件工具, 需要安装java环境, 准备如下工具软件:dex2jar、jbe、jd-gui-windows。还以木马程序“ 照片.apk” 为例说明操作步骤。
第一步:使用反编译工具dex2jar对“ 照片.apk” 进行反编译, 命令为“ j2d-dex2jar.bat照片.apk” , 得到文件“ 照片-dex2jar.jar” 。
第二步: 用解压缩软件打开文件“ 照片-dex2jar.jar” , 导出要修改的class文件“ a.class” 。用jbe打开文件“ a.class” , 找到要修改的代码, 如替换回传手机号码。然后用修改后的文件“ a.class” 覆盖“ 照片-dex2jar.jar” 中的同名文件。
第三步:把jar文件“ 照片-dex2jar.jar” 编译为二进制文件, 命令为“ j2d-jar2dex.bat 照片-dex2jar.jar” , 得到文件“ 照片- jar2dex -jar2dex.dex” 。把文件“ 照片-jar2dex-jar2dex.dex” 改名为“ classes.dex” , 替换“ 照片.apk” 中的同名文件。
第四步:对完成修改的文件“ 照片.apk” 进行签名, 命令为“ d2j-apk-sign.bat 照片.apk” , 得到文件“ 照片-signed.apk” , 至此完成了逆向过程。
3.3.3 鉴定功能
在目标手机上安装修改后的应用“ 照片-signed.apk” , 激活运行后, 设置的回传手机号码和电子邮箱分别接到了目标手机传回的短信和通讯录。此外, 目标手机还向通讯录内的所有联系人发送了木马链接短信。至此, 通过源代码分析和逆向技术都鉴定出该款手机木马具有窃取目标手机短信和通讯录数据, 并向目标手机通讯录号码发送木马链接的危害。
通过木马鉴定和案件侦查证实该款木马是通过以下途径协助犯罪嫌疑人盗取受害人银行账户资金的:1)木马植入受害人手机后, 将受害人的通讯录、手机历史短信通过内置的电子邮箱发送给犯罪分子, 将受害人手机实时接收的短信通过手机短信转发给犯罪分子的手机号码。2)犯罪分子会设法找到受害人的银行账号, 受害人手机历史短信很可能暴露银行账号, 犯罪分子也可能通过购买信息的方式获取到受害人的银行账号。3)犯罪分子以受害人的名义注册一个第三方支付账号, 再将受害人银行账号绑定到第三方支付账号上, 绑定过程中银行会向受害人预留的手机号码发送验证码进行验证, 而木马会把验证码转发给犯罪分子, 所以犯罪分子能够完成绑定。4)完成绑定后, 犯罪分子就能够将受害人的银行账号资金转移到第三方支付账户内进行消费变现。
本文从实战的角度总结了安卓手机木马的传播途径、提取方法、反编译方法、源代码分析和逆向技术, 并通过实例对手机木马的危害做了鉴定, 为侦查办案和证据固定提供了一套可行的取证方案。
如果本文涉涉及版权问题请联系yantaibbs@qq.com进行投诉 我们将第一时间处理。谢谢!
下一篇:Android勒索类病毒本周样本