【Android 逆向】整体加固脱壳 ( 脱壳点简介 | 修改系统源码进行脱壳 )

举报
韩曙亮 发表于 2022/01/12 00:53:43 2022/01/12
【摘要】 文章目录 一、脱壳点简介二、修改系统源码进行脱壳 一、脱壳点简介 在上一篇博客 【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | DexPrepa...





一、脱壳点简介



在上一篇博客 【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 rewriteDex 函数分析 | 脱壳点 | 获取 dex 文件在内存中的首地址 ) 中 , 提到了 2 2 2 个脱壳点 :

可以脱壳的 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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。