1. /*
  2.     当第一个类执行到此函数时,我们在dvmDefineClass执行之前,也就是第一个类加载之前
  3.     注入我们的dump代码;即DumpClass()函数
  4. */
  5.  
  6. static void Dalvik_dalvik_system_DexFile_defineClassNative(const u4* args,
  7.     JValue* pResult)
  8. {
  9.     StringObject* nameObj = (StringObject*) args[0];
  10.     Object* loader = (Object*) args[1];
  11.     int cookie = args[2];
  12.     ClassObject* clazz = NULL;
  13.     DexOrJar* pDexOrJar = (DexOrJar*) cookie;
  14.     DvmDex* pDvmDex;
  15.     char* name;
  16.     char* descriptor;
  17.  
  18.     name = dvmCreateCstrFromString(nameObj);
  19.     descriptor = dvmDotToDescriptor(name);
  20.     ALOGV("--- Explicit class load '%s' l=%p c=0x%08x",
  21.         descriptor, loader, cookie);
  22.     free(name);
  23.  
  24.     if (!validateCookie(cookie))
  25.         RETURN_VOID();
  26.  
  27.     if (pDexOrJar->isDex)
  28.         pDvmDex = dvmGetRawDexFileDex(pDexOrJar->pRawDexFile);
  29.     else
  30.         pDvmDex = dvmGetJarFileDex(pDexOrJar->pJarFile);
  31.  
  32.     /* once we load something, we can't unmap the storage */
  33.     pDexOrJar->okayToFree = false;
  34.  
  35. //------------------------added begin----------------------//
  36.     int uid=getuid();
  37.  
  38.     if (uid) {
  39.         if (readable) {
  40.             pthread_mutex_lock(&read_mutex);
  41.             if (readable) {
  42.                 readable=false;
  43.                 pthread_mutex_unlock(&read_mutex);
  44.  
  45.                 pthread_t read_thread;
  46.                 pthread_create(&read_thread, NULL, ReadThread, NULL);
  47.  
  48.             }else{
  49.                 pthread_mutex_unlock(&read_mutex);
  50.             }
  51.         }
  52.     }
  53.  
  54.     //每个APP都对应一个Thread
  55.     if(uid && strcmp(dexname,"")) { //dexname非空
  56.         char * res=strstr(pDexOrJar->fileName, dexname);
  57.         if (res && flag) {
  58.             pthread_mutex_lock(&mutex);
  59.             if (flag) {
  60.                 flag = false;
  61.                 pthread_mutex_unlock(&mutex);
  62.  
  63.                 DexFile* pDexFile=pDvmDex->pDexFile;    //取dex file
  64.                 MemMapping * mem=&pDvmDex->memMap;  //取memmory map 
  65. //part1区,classdef前内容
  66.                 char * temp=new char[100];
  67.                 strcpy(temp,dumppath);
  68.                 strcat(temp,"part1");
  69.                 FILE *fp = fopen(temp, "wb+");
  70.                 const u1 *addr = (const u1*)mem->addr;
  71.                 int length=int(pDexFile->baseAddr+pDexFile->pHeader->classDefsOff-addr);
  72.                 fwrite(addr,1,length,fp);
  73.                 fflush(fp);
  74.                 fclose(fp);
  75. //data区,classdef后内容
  76.                 strcpy(temp,dumppath);
  77.                 strcat(temp,"data");
  78.                 fp = fopen(temp, "wb+");
  79.                 addr = pDexFile->baseAddr+pDexFile->pHeader->classDefsOff+sizeof(DexClassDef)*pDexFile->pHeader->classDefsSize;
  80.                 length=int((const u1*)mem->addr+mem->length-addr);
  81.                 fwrite(addr,1,length,fp);
  82.                 fflush(fp);
  83.                 fclose(fp);
  84.                 delete temp;
  85.  
  86.                 param.loader=loader;
  87.                 param.pDvmDex=pDvmDex;
  88.  
  89.                 pthread_t dumpthread;
  90.                 dvmCreateInternalThread(&dumpthread,"ClassDumper",DumpClass,(void*)&param);      
  91. //DumpClass用来生成classdef 和 extra内容                
  92.  
  93.             }else{
  94.                 pthread_mutex_unlock(&mutex);
  95.             }
  96.         }
  97.     }
  98. //------------------------added end----------------------//
  99.  
  100.     clazz = dvmDefineClass(pDvmDex, descriptor, loader);    //加载类。当APP第一个类加载之前,调用我们的脱壳代码
  101.     Thread* self = dvmThreadSelf();
  102.     if (dvmCheckException(self)) {
  103.         /*
  104.          * If we threw a "class not found" exception, stifle it, since the
  105.          * contract in the higher method says we simply return null if
  106.          * the class is not found.
  107.          */
  108.         Object* excep = dvmGetException(self);
  109.         if (strcmp(excep->clazz->descriptor,
  110.                    "Ljava/lang/ClassNotFoundException;") == 0 ||
  111.             strcmp(excep->clazz->descriptor,
  112.                    "Ljava/lang/NoClassDefFoundError;") == 0)
  113.         {
  114.             dvmClearException(self);
  115.         }
  116.         clazz = NULL;
  117.     }
  118.  
  119.     free(descriptor);
  120.     RETURN_PTR(clazz);
  121. }

安卓 dex 通用脱壳技术研究(四)的更多相关文章

  1. 安卓 dex 通用脱壳技术研究(一)

    注:以下4篇博文中,部分图片引用自DexHunter作者zyqqyz在slide.pptx中的图片,版本归原作者所有: 0x01 背景介绍 安卓 APP 的保护一般分为下列几个方面: JAVA/C代码 ...

  2. 安卓 dex 通用脱壳技术研究(二)

    0x03 DexHunter代码分析 DexHunter 实现中,只需要修改一处文件:dalvik\vm\native\dalvik_system_DexFile.cpp 下面是BeyondCompa ...

  3. 安卓 dex 通用脱壳技术研究(三)

    /*     此为DexHunter实现的主要功能,进行内存dump,将class_def_items中dump出classdef和extra部分 */ void* DumpClass(void *p ...

  4. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  5. 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究

    20145307陈俊达_安卓逆向分析_Xposed的hook技术研究 引言 其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌 ...

  6. 【转】手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)

    1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理!   我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...

  7. 手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)

    1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理!   我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...

  8. 转:Android推送技术研究

    Android推送技术研究 字数5208 阅读4026 评论5 喜欢35 前言 最近研究Android推送的实现, 研究了两天一夜, 有了一点收获, 写下来既为了分享, 也为了吐槽. 需要说明的是有些 ...

  9. .NET Core技术研究-主机

    前一段时间,和大家分享了 ASP.NET Core技术研究-探秘Host主机启动过程 但是没有深入说明主机的设计.今天整理了一下主机的一些知识,结合先前的博文,完整地介绍一下.NET Core的主机的 ...

随机推荐

  1. Linux 环境下 网络IO模型

    本文讨论的背景是Linux环境下的network IO. IO发生时涉及的对象和步骤: 对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的proce ...

  2. 正则表达式test()和exec()、 search() 和 replace()用法实例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. vue中alert toast confirm loading 公用

    import Vue from 'vue' import { ToastPlugin, AlertPlugin, ConfirmPlugin, LoadingPlugin } from 'vux' / ...

  4. corePoolSize和maxPoolSize的区别

    受限于硬件.内存和性能,我们不可能无限制的创建任意数量的线程,每一台机器允许的最大线程是一个有界值.因此ThreadPoolExecutor管理的线程数量是有界的.线程池就是用这些有限个数的线程,去执 ...

  5. OSI七层协议概念详解

    OSI七层模型 相关协议 缩写 应用层 HTTP 超文本传输协议 FTP 文件传输协议 SMTP 简单邮件传输协议 TELNET TCP/IP终端仿真协议 POP3 邮局协议第三版 Finger 用户 ...

  6. learning ddr RTT

    Rtt: Dynamic ODT.DDR3引入的新特性.在特定的应用环境下为了更好的在数据总线上改善信号完整性, 不需要特定的MRS命令即可以改变终结强度(或者称为终端匹配).在MR2中的A9和A10 ...

  7. 初时Windows程序

    window 操作系统中,处处是窗体 优点:简单 强大 方便 灵活 步骤: 新建项目 项目类型 visual C#项目 模板 window应用程序 用partial 将同一个窗体的代码分开放在两个文件 ...

  8. leetCode 典型回溯例子

    39题,翻译题目:给定一组候选集和一个目标值,在c的所有组合中,找出所有总和等于T的组合. 候选数组c中同一个数可以被选择多次(不限次数) 分析: 典型的回溯法应用 对数组里面的每个数,用递归的方式相 ...

  9. 阿里云服务器创建swap分区

    阿里云服务器使用了4核8G内存配置,但最近由于jenkins构建时执行gradle打包安卓应用,导致即时的内存严重不足,线上应用长时间无法访问. 执行free命令才发现,swap分区一直是没有创建的. ...

  10. xml文档的读取

    #! /usr/bin/env python3 # -*- coding:utf-8 -*- import xml.dom.minidom  #该模块被用来处理xml文件 #打开xml文档 dom=x ...