【Android 逆向】整体加固脱壳 ( 脱壳点简介 | 修改系统源码进行脱壳 )
一、脱壳点简介
在上一篇博客 【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 rewriteDex 函数分析 | 脱壳点 | 获取 dex 文件在内存中的首地址 ) 中 , 提到了 2 2 2 个脱壳点 :
- ① /dalvik/vm/DvmDex.cpp 的 dvmDexFileOpenPartial 方法
- ② /dalvik/libdex/DexFile.cpp 的 dexFileParse 方法
可以脱壳的 HOOK 点函数 , 不止上面 2 2 2 个 , 凡是函数中有 DEX 文件首地址的函数都可以作为脱壳点 ; 如 : DexPrepare.cpp 中 rewriteDex() 方法 也可以作为脱壳点 ;
HOOK 上面的 dvmDexFileOpenPartial 或 dexFileParse 方法 , 之后获取这两个方法的参数 , 第一个参数是 DEX 文件在内存中的首地址 , 第二个参数是 DEX 文件的字节长度 ;
使用 Xposed , Frida 可以对上述函数进行 HOOK 操作 ;
二、修改系统源码进行脱壳
这里对 Android 系统的源码进行简单的修改 , 然后进行脱壳操作 , 这里的脱壳其实就是将 dex 文件在 内存的起始地址 ;
/* 记录当前 dex 文件索引 */
int dexCount = 0;
/*
* 为“部分”DEX创建DexFile结构。这是一个在
* 被优化的过程。优化标头未完成
* 我们没有任何辅助数据表,所以我们必须这样做
* 初始化过程略有不同。
*
* 错误时返回非零。
*/
int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)
{
// 系统启动后 , 可能会生成很多 dex 文件 ,
// DEX 文件保存路径
char output[50]={0};
// 获取当前进程 ID , 这是为了区分准备的
int pid = getpid();
// 生成文件名称 , 由于单个 APK 可能有多个 DEX 文件
// 这里将每个 DEX 文件的 进程 ID 和 DEX 文件字节大小
// 放入 DEX 文件名中 , 加以识别
sprintf(output, "/sdcard/%d_%d_output.dex", pid, dexCount);
// dex 文件索引自增
dexCount++;
// 以写的方式 , 打开文件 , 如果没有就创建该文件
int fd = open(output, "wb+");
// 文件打开成功 , 则 dump 内存数据到 /sdcard/output.dex 文件中
if (fd > 0)
{
// 将 addr 地址的内存数据拷贝到 fd 文件中 , 拷贝 len 字节
write(fd, addr, len);
// 关闭文件
close(fd);
}
DvmDex* pDvmDex;
DexFile* pDexFile;
int parseFlags = kDexParseDefault;
int result = -1;
/* -- 文件不完整,尚未计算新校验和
if (gDvm.verifyDexChecksum)
parseFlags |= kDexParseVerifyChecksum;
*/
pDexFile = dexFileParse((u1*)addr, len, parseFlags);
if (pDexFile == NULL) {
ALOGE("DEX parse failed");
goto bail;
}
pDvmDex = allocateAuxStructures(pDexFile);
if (pDvmDex == NULL) {
dexFileFree(pDexFile);
goto bail;
}
pDvmDex->isMappedReadOnly = false;
*ppDvmDex = pDvmDex;
result = 0;
bail:
return result;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
源码路径 : /dalvik/vm/DvmDex.cpp
然后编译该 Android 4.4.4 源码 , 在该源码编译的 模拟器 上执行要脱壳的应用 , 或者直接将该源码刷到 Google 手机 / 开发版上 , 运行该系统 ;
在上述系统中 , 运行要脱壳的应用 , 会自动将 DEX 文件输出到 SD 卡中的指定的 /sdcard/pid_dexCount_output.dex
目录中 ;
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/121921993
- 点赞
- 收藏
- 关注作者
评论(0)