Android 加壳与脱壳方式总结
介绍
说到加壳,之前接触的主要都是pc端的壳,当时的脱壳就是用的esp脱壳法,大概意思就是程序运行到将当前环境保存之后,在当前的esp指向的地址下硬件断点,然后再次运行到该点时,进行dump内存,即可(大概意思,好多年没弄过了,网上资料很多反正)。这个时通常的加密或者压缩壳的方式,还有类似vmprotect的虚拟机壳,就是用其他指令代替原有的指令从而达到反调试的技术。这个没研究过怎么破解,还有代码抽取技术,将部分关键代码抽取出来,具体也没了解过。。当时学的太粗浅了。现在主要搞Android方面的,看了非虫的新书,所以这里做个总结,首先介绍一下常见的壳的识别:
可以使用类似peid的工具,对文件的二进制进行识别,Android中工具是:apkid 需要安装yara,使用pip install apkid后,
命令行执行:$ apkid 文件名 即可得到编译类型以及所加的壳。
压缩壳、加密壳:
这种第一代,开始时对dex和so加密,运行时或者加载后解密,通常会加一些反调试手段。
破解方式:
hook法:
直接hook dex2oat的函数,可以得到原始的dex,但是有些apk不再走系统默认的dex2oat函数了
缓存脱壳法:
早期会有一些壳,安装包是加密压缩了,但是安装后会在/data/dalvik-cache目录下生成解密的odex文件,只要取出来进行一下deodex即可。
内存dump法:
在运行后,dump出文件内容。工具是:android-unpacker
原理即通过/proc/pid/maps的内存映射表,找到dex起始位置,通过dump_memory()将dex dump出来。
动态调试脱壳法:
通过适当的点,在dex解密后dump,适当的点包括:dvmdexfileopenpartial;dexFileParse;memcpy(当第二个参数为DEX_OPT_MAGIC)时,并且这是一个不断更新的过程。之前还看过四哥写的一个函数是Dexclassloader
hook脱壳法:
其实原理就是动态调试,只是通过hook框架自动化实现了。
系统定制法:
修改android源码中的相关函数后刷机实现,也是一种自动化
指令抽取壳:
部分方法需要执行时动态解密。
防脱壳方式:
设置一些虚假函数,一旦调用自动退出程序
破解方式:
FART:针对art模式,调用所有方法后抽取dex
dalvik:f8left可破解,但是dalvik很多应用以及无法安装
保护壳:
多种方式保护,如代码抽取、执行前后解密又加密、多进程保护、反调试、反dump等
破解方式:
内存重组脱壳法:
通过内存中dex文件的格式,找到完整的dex文件,将其组合到一起。主要流程:libdvm.so->gDvm->userDexFiles->pEntries.isDex->pRawDexFile->pDvmDex->pDexFile。工具参照Cvvt编写的dumpDex脚本
https://github.com/CvvT/dumpDex
hook方式:
还是实现自动化的方式,断点为dvmCallMethodV;
系统定制法:
这里为了让所有代码全部解密,主动加载所有类,而后就变为全解密的dex了,通过dvmDefineClass实现,工具为DexHunter。
虚拟执行壳:
llvm pass 混淆壳,360壳就采用这种方式
类似vmprotect,大概有三种混淆方式:
1:指令替代:使用新的汇编级指令代替原有指令,造成逆向的困难,如a + b可替代为 (a|b)+(a&b)等;
2:控制流平坦化
3:伪造控制流
还有修改控制流、伪造控制流等方式。
Android中使用的方式是llvm编译,开源库为:Obfuscator-LLVM
破解方式:
如上a+b,可以替换为多种指令,可以使用模式匹配的方式还原。
针对控制流修改,通过对比CFG,修改bl指令的执行。
Android 加壳与脱壳方式总结相关推荐
- .NET程序的代码混淆、加壳与脱壳
通常我们通过代码混淆.加密的形式达到软件保护的目的.在Web开发里我们接触过的可能就是JS代码加密了,可以通过对JS代码进行混淆.加密从而实现对核心JS代码的保护.如果没有接触过的可以在这里简单了解一 ...
- 什么是加壳和脱壳技术?加壳和脱壳技术是什么意思?
什么是加壳和脱壳技术?加壳和脱壳技术是什么意思? 加壳,是一种通过一系列数学运算,将可执行程序文件或动态链接库文件的编码进行改变(目前还有一些加壳软件可以压缩.加密驱动程序),以达到缩小文件体积或加密 ...
- BUUCTF-Reverse:新年快乐 + 加壳与脱壳
题目地址:https://buuoj.cn/challenges#%E6%96%B0%E5%B9%B4%E5%BF%AB%E4%B9%90 用IDA打开文件: 怎么可能才两个函数,猜测加了壳,直接查: ...
- Python pyc文件 bytecode的压缩, 加壳和脱壳解析
我们常常看到, 自己用PyInstaller等库打包的exe被别人反编译.而源代码在exe文件中是以字节码形式存储的.掌握了字节码的加密技巧, 就可以防止源代码的反编译. 目录 1.字节码是什么 2. ...
- 软件的壳和壳的含义、概念以及加壳和脱壳方法
软件的壳和壳的含义.概念以及加壳和脱壳方法 PE(Portable Executable) 也就是EXE和DL)文件所具有的起压缩.加密.保护作用的东西.可以用PEiD等软件查壳. 加壳通过修改程序入 ...
- 实验四:使用UPX加壳与脱壳
一.实验目的 了解程序加壳.脱壳原理 掌握PE文件结构 学习利用UPX Shell.LoardPE.IDA等工具完成软件的加.脱壳操作 二.实验题目 UPX加壳:对crackme加上UPX壳,用 Lo ...
- android 加壳 方案,android加壳思路
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 对java及dex代码保护的技术发展:第一代 dex文件加密,打包.在运作时通过一个自定义的类加载器进行解密. 第二代 ...
- 360 so加壳动态脱壳方法
转载地址:http://mp.weixin.qq.com/s?__biz=MjM5NzAxMzk4NA==&mid=209300616&idx=1&sn=bcc440640f6 ...
- PE文件的简单加壳和脱壳(UPX和PEiD)
先普及几个概念: PE文件:portable executable(可移植的可执行文件),主要在Windows系统中,包括exe/dll/sys文件. 加壳:是利用特殊的算法,对EXE.DLL文件里的 ...
最新文章
- SQL语句order by两个字段同时排序
- poj2418map或者字典树
- CTFshow php特性 web136
- 基于 Netty 如何实现高性能的 HTTP Client 的连接池
- 解决问题Can’t connect to local MySQL server through socket
- 霍尔电流传感器ACS712的性能参数和用法
- Building designing UVA - 11039
- 数据库分页技术的实现及高效率分页技术方案
- 成都东软学院php期末考试题,求大神。。。C语言期末项目答案。。。题在一楼。。。...
- linux essid 异常,关于BSSID,ESSID讨论
- mysql 索引使用不当_MySQL笔记:select默认使用不当索引导致的巨大性能损失问题_MySQL...
- 查看APP用到的图片方法
- 36.windbg-!peb(手工分析PEB结构)
- Python数据可视化 | 一文带你掌握Pyecharts地理数据可视化
- Java + OpenCV 实现图片年龄识别(JavaCV)
- Artifactory的搭建与使用简介
- 自动上传视频到B站和西瓜视频
- Navicat重新使自增id从1开始
- cba篮球暂停次数和时间_篮球比赛一节有几次暂停?
- C++ primer Plus(第六版)第十三章 类继承 章节编程练习答案