美文网首页JS破解&&Android逆向
Android的加壳与脱壳 之 修改源码实现Dalvik通用脱壳

Android的加壳与脱壳 之 修改源码实现Dalvik通用脱壳

作者: Sharkchilli | 来源:发表于2020-08-06 15:40 被阅读0次

前言

本文将基于Android4.4.2_r1修改其源码实现通用脱壳解决方案。其原理就是源程序自己在脱壳调用DexClassLoader时,会将dex或者odex映射到内存中,我们只需要找到这个映射内存的地址和dex大小就可以将其从内存中dump下来。本文将在Android源码中修改代码进行内存dump。
此次我将对以下方法进行修改从而抠出内存中的文件
dvmDexFileOpenPartial
dexFileParse
为什么是这两个函数,请查看我之前写的文章

源码下载

这个真是搞死我了,最后是用了别人的虚拟机镜像。自己的磁盘没办法分出这么大的空间来,下次可以用外置硬盘或者笔记本进行源码下载。具体下载可以查看清华大学开源软件镜像站的aosp。

源码修改

dexFileParse
/dalvik/libdex/DexFile.cpp

//add
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
/*
 * Parse an optimized or unoptimized .dex file sitting in memory.  This is
 * called after the byte-ordering and structure alignment has been fixed up.
 *
 * On success, return a newly-allocated DexFile.
 */
DexFile* dexFileParse(const u1* data, size_t length, int flags)
{
    char dexfilepath[100]={0};
    int pid=getpid();
    sprintf(dexfilepath,"/sdcard/%d_%d_dexFileParse_shark.dex",length,pid);
    //fopen
    int fd=open(dexfilepath,O_CREAT|O_RDWR,0666);
    if(fd>0)
    {
        write(fd,data,length);
        close(fd);
    }
    DexFile* pDexFile = NULL;
    const DexHeader* pHeader;
    const u1* magic;
    ...
}

dvmDexFileOpenPartial
/dalvik/vm/DvmDex.cpp

#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)
{
    char dexfilepath[100]={0};
    int pid=getpid();
    sprintf(dexfilepath,"/sdcard/%d_%d_dvmDexFileOpenPartial_shark.dex",len,pid);
    //fopen
    int fd=open(dexfilepath,O_CREAT|O_RDWR,0666);
    if(fd>0)
    {
            write(fd,addr,len);
            close(fd);
    }

    
    
    DvmDex* pDvmDex;
    DexFile* pDexFile;
    int parseFlags = kDexParseDefault;
    int result = -1;

    /* -- file is incomplete, new checksum has not yet been calculated
    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;
}

就是在这两个函数开头加了我们内存拷贝到文件的代码,很简单应该都看的懂的

编译源码

下载专用的二进制源码
https://developers.google.com/android/drivers 下载了相应的二进制驱动

image.png
运行后,会提示你查看证书,按Enter键一行行的查看,出现下面的输入提示时,输入 I ACCEPT,解压到了vendor 目录下。其它两个自解压脚本也是这样执行
设置环境
使用 build目录中的envsetup.sh 脚本初始化环境
source build/envsetup.sh
image.png
选择目标
lunch
image.png
官方给出了一份自己出厂设备的代号和编译配置选项
image.png
我们用的设备是NEXUS 5 ,所以lanch 编译配置为aosp_hammerhead-userdebug
image.png
编译代码
time make -j4

这里线程根据自己的cpu而定

刷机

手机连接到设备后,使用以下命令进入fastboot

adb reboot bootloader

参考

Android系统源码编译及刷机实战

相关文章

  • Android的加壳与脱壳 之 修改源码实现Dalvik通用脱壳

    前言 本文将基于Android4.4.2_r1修改其源码实现通用脱壳解决方案。其原理就是源程序自己在脱壳调用Dex...

  • Android源码分析 之 InMemoryDexClassLo

    前言 前面的文章已经讲解了Dalvik壳的通用解决方案,现在我们讲讨论ART的脱壳通用解决方案。 Android8...

  • 六 iOS逆向 - 脱壳

    加壳脱壳基本概念 使用dumpdecrypted工具进行iOSApp脱壳 一 加壳脱壳基本概念 一 什么是加壳? ...

  • Android加壳脱壳

    Android 加固与脱壳 加固与脱壳常用加固 so 文件特征分析 apk 加固动态调试分析 apk 加固-环境搭...

  • 加壳脱壳

    脱壳存根(stub) 脱壳存根执行了以下三个步骤: (1)将原始程序脱壳到内存中 (2)解析原始可执行文件的所有导...

  • Android 加壳与脱壳方式总结

    介绍 说到加壳,之前接触的主要都是pc端的壳,当时的脱壳就是用的esp脱壳法,大概意思就是程序运行到将当前环境保存...

  • 恶意代码分析2

    说明加过壳了(果然如此,加的是UPX壳) 使用脱壳机直接脱壳: 脱完壳以后发现变得正常了: 发现其创建了一个服务:...

  • 八、加壳脱壳

    从之前的知识可知,通过class-dump或hopper就可以知道一个app的头文件信息。 加壳的app:但如果是...

  • 手工加壳脱壳

    PE文件的Magic code(魔数、幻数)是什么? MZ头、PE头 PE文件中文件头的信息有哪些? 运行平台、时...

  • 加壳脱壳(04)

    1.什么是脱壳? 摘掉壳程序,将未加密的可执行文件还原出来(有些人也称为“砸壳”) 脱壳主要有2种方法:硬脱壳、动...

网友评论

    本文标题:Android的加壳与脱壳 之 修改源码实现Dalvik通用脱壳

    本文链接:https://www.haomeiwen.com/subject/gyjlkktx.html