apk 脱壳
在理解android的类加载后,我们可以愉快对apk来脱壳了。脱壳重要的是断点:
断点:在哪个位置脱壳,这里着重指的是在哪个方法
先介绍断点,我们只要知道加壳是用哪个方法来加载dex的,hook这个方法就可以追踪到dex了。这个方法就是我们要的断点!
dvmDexFileOpenPartial:——int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)
apk为dex文件,android在执行前会先将dex转化为odex文件,由函数dvmContinueOptimization(/dalvik/vm/analysis/DexPrepare.cpp)执行。在dvmContinueOptimization中先调用mmap(这也是一个断点)将原Dex文件整体映射到内存;然后调用dvmDexFileOpenPartial去尝试生成DexFile(既然会生成DexFile,当然会调用dexFileParse函数)。以上步骤在dex转odex时才会执行,若加固的apk本来就是odex,则此断点失效。
dexFileParse:——DexFile* dexFileParse(const u1* data, size_t length, int flags)
odex会生成dex的内存描述DexFile(dalvik浅析三:类加载),此函数的前2个参数与dvmDexFileOpenPartial相同(自行查看源码)。没什么好说的了,记住在生成DexFile时调用。看雪上已经将提取dex代码集成到libdvm中了:【原创】让开下,让我脱下壳。
上面提及的是在dex加载过程(优化,解析)中,我们可以下断的函数(当然其他还有很多,不一一举例)。但这个有缺点是需要动态调试时才能dump出dex,这需要我们过加固apk的反调试,有点繁琐。新方法是修改libdvm代码去自动脱壳,参考上面看雪中的做法,下面还会详细解析。以下是dump dex的ida script command:
static main(void)
{
auto fp, begin, end, dexbyte;
fp = fopen("C:\\dump.dex", "wb");
begin = r0;
end = r0 + r1;
for ( dexbyte = begin; dexbyte < end; dexbyte ++ )
fputc(Byte(dexbyte), fp);
}
下面来看看dex运行过程中可以下断点函数(native):——/dalvik/vm/native/dalvik_system_DexFile.cpp基于源码4.4
const DalvikNativeMethod dvm_dalvik_system_DexFile[] = {
520 { "openDexFileNative", "(Ljava/lang/String;Ljava/lang/String;I)I",
521 Dalvik_dalvik_system_DexFile_openDexFileNative },
522 { "openDexFile", "([B)I",
523 Dalvik_dalvik_system_DexFile_openDexFile_bytearray },
524 { "closeDexFile", "(I)V",
525 Dalvik_dalvik_system_DexFile_closeDexFile },
526 { "defineClassNative", "(Ljava/lang/String;Ljava/lang/ClassLoader;I)Ljava/lang/Class;",
527 Dalvik_dalvik_system_DexFile_defineClassNative },
528 { "getClassNameList", "(I)[Ljava/lang/String;",
529 Dalvik_dalvik_system_DexFile_getClassNameList },
530 { "isDexOptNeeded", "(Ljava/lang/String;)Z",
531 Dalvik_dalvik_system_DexFile_isDexOptNeeded },
532 { NULL, NULL, NULL },
533};
上面的几个函数在加载dex或运行dex会执行,Dalvik_dalvik_system_DexFile_openDexFile_bytearray对于加壳的来说很熟悉吧(看我加壳中提到的文章)。这几个函数已经不能像先前一样直接到dex的addr和len来dump了。但你可以从中得到DexFile,然后在组合出dex文件。在这里你需要了解以下结构体:
DexFile、DvmDex、DexOrJar;
/*
521 * The set of DEX files loaded by custom class loaders.
522 */
523 HashTable* userDexFiles; //dvmHashTableRemove(gDvm.userDexFiles, hash, pDexOrJar)
知道userDexFiles的作用,它管理着用户加载的DexFile。
ok,有了上面的知识我们可以写代码来脱壳,你可以用xposed来函数,也可以修改源码直接dump。
修改源码脱壳:
用上面看雪上的代码来解释,它修改了dexFileParse源码,在其中直接添加脱壳代码(具体的脱壳代码执行请看源码)。代码写好了,如何编译呢(编译libdvm.so: makefile,mm)。当然事情到这里还没有结束,若修改了内存的dex结构体,那我们dump出来东西也无法执行。这时候需要我先进行修复,看参考资料3、4。dannerWorking这方面还没去研究待续。
参考资料:
1 安卓动态调试七种武器之孔雀翎 – Ida Pro
apk 脱壳的更多相关文章
- DexHunter在ART虚拟机模式下的脱壳原理分析
本文博客地址: http://blog.csdn.net/qq1084283172/article/details/78494620 DexHunter脱壳工具在Dalvik虚拟机模式下的脱壳原理分析 ...
- Dalvik模式下基于Android运行时类加载的函数dexFindClass脱壳
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78003184 前段时间在看雪论坛发现了<发现一个安卓万能脱壳方法>这篇 ...
- Android crash特殊位置定位
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 通常情况下,在我们开发的过程中遇到的crash,可以到logcat中找原因:如果做定制App,对方用 ...
- Java中的Html解析:使用jsoup
包:jsoup-1.10.2.jar import java.io.File; import java.io.IOException; import org.jsoup.Jsoup; import o ...
- Android 开发日常积累
Android 集合 Android 开源项目分类汇总 扔物线的 HenCoder 高级 Android 教程 hencoder HenCoder:给高级 Android 工程师的进阶手册 Andro ...
- 掘金 Android 文章精选合集
掘金 Android 文章精选合集 掘金官方 关注 2017.07.10 16:42* 字数 175276 阅读 50053评论 13喜欢 669 用两张图告诉你,为什么你的 App 会卡顿? - A ...
- Android中实现Activity的启动拦截之----实现360卫士的安装应用界面
第一.摘要 今天不是周末,但是我已经放假了,所以就开始我们的技术探索之旅,今天我们来讲一下Android中最期待的技术,就是拦截Activity的启动,其实我在去年的时候,就像实现这个技术了,但是因为 ...
- APK加固之静态脱壳机编写入门
目录: 0x00APK加固简介与静态脱壳机的编写思路 1.大家都知道Android中的程序反编译比较简单,辛苦开发出一个APK轻易被人反编译了,所以现在就有很多APK加固的第三方平台,比如爱加密和梆梆 ...
- 【逆向&渗透实战】Dump内存中的Dex_我是如何脱壳某公司加固过的Apk并利用其API渗透对方数据库
/作者:Kali_MG1937 QQ:3496925334 CNBLOG博客号:ALDYS4/ 某天午睡,朦朦胧胧梦到给学校提供建站模板的公司有个注射点 梦醒后,我凭借着零散的记忆日进了对面的数据库, ...
随机推荐
- pytorch(01)环境配置及安装
pytorch pytorch定位:深度学习框架 人工智能:多领域交叉科学技术 机器学习:计算机智能决策算法 深度学习:高效的机器学习算法 pytorch实现模型训练需要5个模块 数据 将数据从硬盘读 ...
- FreeBSD WIFI 配置
ee /boot/ loader.conf ee是个编辑器 中写入 rtwn_usb_load="YES" legal.realtek.license_ack=1 在 /etc/ ...
- DDD实战课--学习笔记
目录 学好了DDD,你能做什么? 领域驱动设计:微服务设计为什么要选择DDD? 领域.子域.核心域.通用域和支撑域:傻傻分不清? 限界上下文:定义领域边界的利器 实体和值对象:从领域模型的基础单元看系 ...
- 如何使用python把json文件转换为csv文件
@ 目录 了解json整体格式 转换格式 提取key和value 使用pandas写入csv 了解json整体格式 这里有一段json格式的文件,存着全球陆地和海洋的每年异常气温(这里只选了一部分): ...
- IDEA的注册方式
http://idea.lanyus.com/ 使用前请将"0.0.0.0 account.jetbrains.com"添加到hosts文件中 hosts文件在C:\Windows ...
- spring 最权威的知识点
1.Spring是什么? Spring是一个轻量级的IoC和AOP容器框架.是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求.常见的配置方 ...
- 08、元组tuple
元组(tuple) 是一个有序且不可变的容器,在里面可以存放多个不同类型的元素 元组是在最后多一个逗号,用于表示它是一个元组 tuple = (11,22,'阿斯顿','媚媚',) #后面多加一个逗号 ...
- 前端生成分享海报兼容H5和小程序
### 移动端分享海报生成 最近做项目需求是生成商品分享海报,并且保存到手机中要兼容H5和小程序<br> 与后端同学沟通后,海报在前端生成最省性能和有较好的交互体验,先看做好的效果
- python3 base64
import base64s='hello world'bytes_by_s=s.encode() #将字符串编码-->字节码,b64_encode_bytes=base64.b64encode ...
- Python基础之:Python中的内部对象
目录 简介 内置函数 内置常量 内置类型 逻辑值检测 逻辑值的布尔运算 比较运算 数字类型 整数类型的位运算 整数类型的附加方法 浮点类型的附加方法 迭代器 序列类型 集合类型 映射类型 字典视图对象 ...