一个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应用是一件非常简单的事情,因为它会帮你自动完成很多工作.本篇我们主要完成一个单击按钮在文本框显示当前时间的简单应用,借此来演示一下 ...
随机推荐
- Python缩小图像
LyncLynn用途: 缩小图像 # -*- coding: UTF-8 -*- #Version: V1.0 #Author:lynclynn #CreateDate:20151201 #Updat ...
- 51nod 1116 K进制下的大数 (暴力枚举)
题目链接 题意:中文题. 题解:暴力枚举. #include <iostream> #include <cstring> using namespace std; ; ; ch ...
- struts2.0整合json
框架:struts2.0+hibernate2+spring 今天写代码时,需要用到json,我就直接加了两个jar包:json-lib-2.1-jdk15.jar,struts2-json-plug ...
- php面向对象:封装
OOP三大特性:封装.继承.多态. 封装的目的:为了让类更安全封装的做法:1.类里面的成员变量做为private2.使用成员方法来间接访问成员变量3.在该方法里面加限制条件 注意:php类里面不允许出 ...
- 解决eclipse中maven web工程打包成war(发布到tomcar)时lib中没有jar包的解决方法
可能有两个原因:1.maven中某些jar包下载不下来 从其他地方下载jar文件放到相应maven本地库的.m2里2..classpath文件中缺少(下面代码的作用是制定maven的jar发布路径)& ...
- 四、优化及调试--网站优化--Yahoo军规中
8.避免使用CSS表达式(避免在CSS中使用Expressions) 什么是CSS表达式:是用来把CSS属性和JavaScript关联起来.
- max number of threads [1024] for user [lish] likely too low, increase to at least [2048]
# cat /etc/security/limits.d/-nproc.conf # Default limit for number of user's processes to prevent # ...
- 磁盘空间占满inode结点没用完 并删除了文件但是释放不了
lsof |grep delete lsof(list system open file )可显示系统打开的文件,以root身份运行. 很多时候文件正在被占用,即使删除了,也无法释放空间,只有停 了 ...
- C/C++学习笔记----指针的理解
指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一.利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯:指针能 ...
- CLR via C#(01)-.NET平台下代码是怎么跑起来的
1. 源代码编译为托管模块 程序在.NET框架下运行,首先要将源代码编译为托管模块.CLR是一个可以被多种语言所使用的运行时,它的很多特性可以用于所有面向它的开发语言.微软开发了多种语言的编译器,编译 ...