一个android样本的过保护
前段时间处理一个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样本的过保护的更多相关文章
- Android应用中如何保护JAVA代码
Java Classes字节码的反编译太容易了,有很多功能强大的反编译利器可以轻松的将Java字节码 反转为源代码,但是android中普通.apk文件可以轻松的被反编译为Java源代码吗? 答案是当 ...
- Android程序的签名保护及绕过方法
随着Android 市场的扩大,各类盗版.破解.打包党纷纷涌现,其使用的手法无非是apk _> smali ->修改代码 ->重打包签名,为对抗此类技术,广大程序员挖掘了Androi ...
- 如何在本地搭建一个Android应用crashing跟踪系统-ACRA
https://github.com/bboyfeiyu/android-tech-frontier/tree/master/others/%E5%A6%82%E4%BD%95%E5%9C%A8%E6 ...
- 用Kotlin创建第一个Android项目(KAD 01)
原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...
- 一个android参考网站,工具+源码
Android多渠道打包工具 https://github.com/wubo/apptools Android官方培训课程中文版(v0.9.4) http://hukai.me/android-t ...
- 3.创建第一个android项目
安卓开发学习笔记 1.安卓开发之环境搭建 2.SDK目录结构和adb工具及命令介绍 3.创建第一个android项目 1.打开Eclipse,选择File——>new——>others.. ...
- 创建一个Android项目
当我们的eclipse安装了SDK后,点击Window-->Perference-->DDMS.eclipse界面立即转为DDMS界面. 这时,我们可以打开我们的服务端(安卓模拟器或者是我 ...
- 认识Activity,创建第一个android应用-Hello Word
2016-04-05 配置好Java.eclipse和Android环境就花费了一天时间.下载SDK真是费了不少时间.现在终于找到解决SDK更新的好方法了(更新自己电脑上的hosts文件,就可以使用G ...
- Android开发自学笔记(Android Studio1.3.1)—2.开始第一个Android应用
一.前言 使用Android Studio开发Android应用是一件非常简单的事情,因为它会帮你自动完成很多工作.本篇我们主要完成一个单击按钮在文本框显示当前时间的简单应用,借此来演示一下 ...
随机推荐
- 在wpf中使用winrt的Toast弹框效果
源码地址:https://code.msdn.microsoft.com/windowsdesktop/Sending-toast-notifications-71e230a2/sourcecode? ...
- nyoj138 找球号(二)_离散化
找球号(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中,每个球上都有一个整数编号i(0<=i< ...
- MFC Initinstance中DoModal()返回-1
新建一个基于对话框的MFC应用程序,在App的Initinstance中调用对话框DoModal()来显示对话框,这是框架的内容,应用程序框架生成的全部是正常的. 当把我对话框的资源文件提取到一个资源 ...
- 【leetcode】Remove Linked List Elements(easy)
Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --& ...
- IOS - 内购
内购的五种产品类别 •非消耗品(Nonconsumable)买了就有,头衔,功能 –指的是在游戏中一次性购买并拥有永久访问权的物品或服务.非消耗品物品可以被用户再次下载,并且能够在用户的所有设备上使用 ...
- java课后作业 弹出窗口求两个数的加减乘除
//计算2个数的加减乘除 谷伟华 2015/10/6package jisuan; import javax.swing.JOptionPane; public class Jiasuan { pub ...
- supersr--去除tableViewHeader的粘性
这段代码能去除tableViewHeader的粘性 const static NSInteger kSectionHeaderHeight = 30; - (void)scrollViewDidScr ...
- 25个增强iOS应用程序性能的提示和技巧(中级篇)(2)
25个增强iOS应用程序性能的提示和技巧(中级篇)(2) 2013-04-16 14:42 破船之家 beyondvincent 字号:T | T 本文收集了25个关于可以提升程序性能的提示和技巧,分 ...
- UIView和CALayer的区别
CALayer属于Core Animation部分的内容,比较重要而不太好理解.以下是园子中看到的一篇文章的摘录: 以下摘自<<核心动画编程指南>>: 两者最大的区别是,图层不 ...
- JS 打印对象的方法
2 3 4 5 6 7 8 function writeObj(obj){ var description = ""; for(var i in obj){ var p ...