前段时间处理一个android样本,样本本身作用不大,但是加了保护,遂做一个过保护的记录

通过dex2jar将dex转为jar文件的时候发现无法成功,通过抛出的异常可知,此处MainActivity:onCreate函数在解析的时候出现了问题。

使用ida打开该dex文件,发现该函数确实进行了加密

搜索一遍ida可以发现同样被处理的函数还有SmsReceiver.onReceive,此处很容易就断定此处是样本对远控发送数据的处理端。

通过分析apk数据包,可以发现apk中存在libAPKProtect.so的so文件,此处即可推断该apk中解密的处理有可能存在于.so文件中。

通过ida附加该进程调试

此时报错,由此推断so文件中做了反调试保护。

因此我用通过ida对应用进行启动调试,在该so文件的jni函数中查看都进行了什么反调试。下图为刚加载进内存的so文件。

通过ida反编译该so文件可以知道在jni函数中进行了ptrace处理,如下图,此处只需要在调试的时候将此处的blx ptrace指令nop就行,这样就可以进行调试了。

在jni函数中,进行ptrace之后会继续向下执行,首先运行到函数sub_14ec

跟进该函数发现有进行dex字符的对比操作,通过调试发现r4寄存器中保存了加载到内存中的dex文件的地址,此处将该dex文件dump出来后发现此处还没有进行解密。

现在我们找到了内存中加载的dex文件,但是如何确实它在何时进行解密了?通常对so的解密都是在jni函数中完成的,因此,此处我们只要在jni函数的返回处下断,断下之后在进行内存dump即可,如下图即为解密之后的dex,此时SmsReceiver.onReceive已是正常的 smali代码。

对比加解密之后的两个dex即可发现,除去内存中的dex需要的一些标志位之外,两个dex文件最大的不同之处有两处,即为两个被加密处理的函数。

那此处的加密是如何实现的了?通过查看jni函数即可发现,在jni函数的返回处调用了函数sub_1438,该函数负责对dex中的代码进行解密还原。

跟进函数后,首先在调用函数sub_1290对dex进行校验

之后获取内存中的dex文件地址,此处的地址为52320000

计算出第一个需要解密的函数在dex中的偏移,此处为1A90

通过对比即可发现加解密之后的两个文件长确实是从19A0处开始不同的,解密前是classes,解密之后是classs。

之后调用mprotect设置内存访问权限

最后进行解密操作

取密钥第一位

取解密函数第一位

做xor操作

结果写回,此时变成12,和解密后的文件一致。

通过分析可以发现,在so中对于解密声明得有专门的结构,其中第一处为dex中需要解密的函数在dex中的偏移,第二处为解密的长度,第三处为使用的秘钥,所有的需要解密的函数以此结构声明成一个连续的数组,由于对应的解密数组中包含了硬编码的函数偏移,所以解密处理中无需对dex进行解析。

至此整个样本的加壳流程就分析完毕了,dex中加密的函数通过so文件中保存的解密数组做xor操作计算得出。

一个android样本的过保护的更多相关文章

  1. Android应用中如何保护JAVA代码

    Java Classes字节码的反编译太容易了,有很多功能强大的反编译利器可以轻松的将Java字节码 反转为源代码,但是android中普通.apk文件可以轻松的被反编译为Java源代码吗? 答案是当 ...

  2. Android程序的签名保护及绕过方法

    随着Android 市场的扩大,各类盗版.破解.打包党纷纷涌现,其使用的手法无非是apk _> smali ->修改代码 ->重打包签名,为对抗此类技术,广大程序员挖掘了Androi ...

  3. 如何在本地搭建一个Android应用crashing跟踪系统-ACRA

    https://github.com/bboyfeiyu/android-tech-frontier/tree/master/others/%E5%A6%82%E4%BD%95%E5%9C%A8%E6 ...

  4. 用Kotlin创建第一个Android项目(KAD 01)

    原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...

  5. 一个android参考网站,工具+源码

    Android多渠道打包工具  https://github.com/wubo/apptools Android官方培训课程中文版(v0.9.4)  http://hukai.me/android-t ...

  6. 3.创建第一个android项目

    安卓开发学习笔记 1.安卓开发之环境搭建 2.SDK目录结构和adb工具及命令介绍 3.创建第一个android项目 1.打开Eclipse,选择File——>new——>others.. ...

  7. 创建一个Android项目

    当我们的eclipse安装了SDK后,点击Window-->Perference-->DDMS.eclipse界面立即转为DDMS界面. 这时,我们可以打开我们的服务端(安卓模拟器或者是我 ...

  8. 认识Activity,创建第一个android应用-Hello Word

    2016-04-05 配置好Java.eclipse和Android环境就花费了一天时间.下载SDK真是费了不少时间.现在终于找到解决SDK更新的好方法了(更新自己电脑上的hosts文件,就可以使用G ...

  9. Android开发自学笔记(Android Studio1.3.1)—2.开始第一个Android应用

    一.前言      使用Android Studio开发Android应用是一件非常简单的事情,因为它会帮你自动完成很多工作.本篇我们主要完成一个单击按钮在文本框显示当前时间的简单应用,借此来演示一下 ...

随机推荐

  1. java入门第一季2

    1. 变量:在java中,我们通过三个元素描述变量:变量类型,变量名以及变量值 注意:java中的标点符号都是英文的 2. 变量名= 首字母+其余部分 字母,+  字母 下划线,  数字 $      ...

  2. iScroll.js 用法参考 (share)

    分享是传播.学习知识最好的方法 以下这篇文章是iScroll.js官网的中文翻译,尽管自己英文不好,但觉得原作者们翻译的这个资料还是可以的,基本用法介绍清楚了.如果你英文比较好的话,可以看看官网的资料 ...

  3. 【leetcode】Minimum Path Sum(easy)

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  4. 【leetcode】Sort Colors(middle)☆

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  5. 【leetcode】Implement strStr() (easy)

    Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...

  6. jsDoc的使用

    nodeJS使用: 直接:npm install jsdoc -g使用:jsdoc [name].js 简介 JsDoc Toolkit 是一款辅助工具,你只需要根据约定在 JavaScript 代码 ...

  7. [转]DB2时间类函数

    Src URL:http://www.cnblogs.com/wanghonghu/archive/2012/05/25/2518604.html 1.db2可以通过SYSIBM.SYSDUMMY1. ...

  8. MVC - 20.前台ajax分页

    1.用pager方法,输入参数,会返回一个导航条的html字符串.方法的内部比较简单. ajax-pager.js /** * pageSize, 每页显示数 * pageIndex, 当前页数 * ...

  9. Android的两种事件处理机制

    UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理. 对于基于监听器的事件处理而言,主要就是为Android界面组件绑定特定的事 ...

  10. 【转载】 Python 方法参数 * 和 **

    Python的函数定义中有两种特殊的情况,即出现*,**的形式. 如:def myfun1(username, *keys)或def myfun2(username, **keys)等. 他们与函数有 ...