安卓 dex 通用脱壳技术研究(四)
- /*
- 当第一个类执行到此函数时,我们在dvmDefineClass执行之前,也就是第一个类加载之前
- 注入我们的dump代码;即DumpClass()函数
- */
- static void Dalvik_dalvik_system_DexFile_defineClassNative(const u4* args,
- JValue* pResult)
- {
- StringObject* nameObj = (StringObject*) args[0];
- Object* loader = (Object*) args[1];
- int cookie = args[2];
- ClassObject* clazz = NULL;
- DexOrJar* pDexOrJar = (DexOrJar*) cookie;
- DvmDex* pDvmDex;
- char* name;
- char* descriptor;
- name = dvmCreateCstrFromString(nameObj);
- descriptor = dvmDotToDescriptor(name);
- ALOGV("--- Explicit class load '%s' l=%p c=0x%08x",
- descriptor, loader, cookie);
- free(name);
- if (!validateCookie(cookie))
- RETURN_VOID();
- if (pDexOrJar->isDex)
- pDvmDex = dvmGetRawDexFileDex(pDexOrJar->pRawDexFile);
- else
- pDvmDex = dvmGetJarFileDex(pDexOrJar->pJarFile);
- /* once we load something, we can't unmap the storage */
- pDexOrJar->okayToFree = false;
- //------------------------added begin----------------------//
- int uid=getuid();
- if (uid) {
- if (readable) {
- pthread_mutex_lock(&read_mutex);
- if (readable) {
- readable=false;
- pthread_mutex_unlock(&read_mutex);
- pthread_t read_thread;
- pthread_create(&read_thread, NULL, ReadThread, NULL);
- }else{
- pthread_mutex_unlock(&read_mutex);
- }
- }
- }
- //每个APP都对应一个Thread
- if(uid && strcmp(dexname,"")) { //dexname非空
- char * res=strstr(pDexOrJar->fileName, dexname);
- if (res && flag) {
- pthread_mutex_lock(&mutex);
- if (flag) {
- flag = false;
- pthread_mutex_unlock(&mutex);
- DexFile* pDexFile=pDvmDex->pDexFile; //取dex file
- MemMapping * mem=&pDvmDex->memMap; //取memmory map
- //part1区,classdef前内容
- char * temp=new char[100];
- strcpy(temp,dumppath);
- strcat(temp,"part1");
- FILE *fp = fopen(temp, "wb+");
- const u1 *addr = (const u1*)mem->addr;
- int length=int(pDexFile->baseAddr+pDexFile->pHeader->classDefsOff-addr);
- fwrite(addr,1,length,fp);
- fflush(fp);
- fclose(fp);
- //data区,classdef后内容
- strcpy(temp,dumppath);
- strcat(temp,"data");
- fp = fopen(temp, "wb+");
- addr = pDexFile->baseAddr+pDexFile->pHeader->classDefsOff+sizeof(DexClassDef)*pDexFile->pHeader->classDefsSize;
- length=int((const u1*)mem->addr+mem->length-addr);
- fwrite(addr,1,length,fp);
- fflush(fp);
- fclose(fp);
- delete temp;
- param.loader=loader;
- param.pDvmDex=pDvmDex;
- pthread_t dumpthread;
- dvmCreateInternalThread(&dumpthread,"ClassDumper",DumpClass,(void*)¶m);
- //DumpClass用来生成classdef 和 extra内容
- }else{
- pthread_mutex_unlock(&mutex);
- }
- }
- }
- //------------------------added end----------------------//
- clazz = dvmDefineClass(pDvmDex, descriptor, loader); //加载类。当APP第一个类加载之前,调用我们的脱壳代码
- Thread* self = dvmThreadSelf();
- if (dvmCheckException(self)) {
- /*
- * If we threw a "class not found" exception, stifle it, since the
- * contract in the higher method says we simply return null if
- * the class is not found.
- */
- Object* excep = dvmGetException(self);
- if (strcmp(excep->clazz->descriptor,
- "Ljava/lang/ClassNotFoundException;") == 0 ||
- strcmp(excep->clazz->descriptor,
- "Ljava/lang/NoClassDefFoundError;") == 0)
- {
- dvmClearException(self);
- }
- clazz = NULL;
- }
- free(descriptor);
- RETURN_PTR(clazz);
- }
安卓 dex 通用脱壳技术研究(四)的更多相关文章
- 安卓 dex 通用脱壳技术研究(一)
注:以下4篇博文中,部分图片引用自DexHunter作者zyqqyz在slide.pptx中的图片,版本归原作者所有: 0x01 背景介绍 安卓 APP 的保护一般分为下列几个方面: JAVA/C代码 ...
- 安卓 dex 通用脱壳技术研究(二)
0x03 DexHunter代码分析 DexHunter 实现中,只需要修改一处文件:dalvik\vm\native\dalvik_system_DexFile.cpp 下面是BeyondCompa ...
- 安卓 dex 通用脱壳技术研究(三)
/* 此为DexHunter实现的主要功能,进行内存dump,将class_def_items中dump出classdef和extra部分 */ void* DumpClass(void *p ...
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究
20145307陈俊达_安卓逆向分析_Xposed的hook技术研究 引言 其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌 ...
- 【转】手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)
1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理! 我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...
- 手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)
1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理! 我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...
- 转:Android推送技术研究
Android推送技术研究 字数5208 阅读4026 评论5 喜欢35 前言 最近研究Android推送的实现, 研究了两天一夜, 有了一点收获, 写下来既为了分享, 也为了吐槽. 需要说明的是有些 ...
- .NET Core技术研究-主机
前一段时间,和大家分享了 ASP.NET Core技术研究-探秘Host主机启动过程 但是没有深入说明主机的设计.今天整理了一下主机的一些知识,结合先前的博文,完整地介绍一下.NET Core的主机的 ...
随机推荐
- Linux 环境下 网络IO模型
本文讨论的背景是Linux环境下的network IO. IO发生时涉及的对象和步骤: 对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的proce ...
- 正则表达式test()和exec()、 search() 和 replace()用法实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue中alert toast confirm loading 公用
import Vue from 'vue' import { ToastPlugin, AlertPlugin, ConfirmPlugin, LoadingPlugin } from 'vux' / ...
- corePoolSize和maxPoolSize的区别
受限于硬件.内存和性能,我们不可能无限制的创建任意数量的线程,每一台机器允许的最大线程是一个有界值.因此ThreadPoolExecutor管理的线程数量是有界的.线程池就是用这些有限个数的线程,去执 ...
- OSI七层协议概念详解
OSI七层模型 相关协议 缩写 应用层 HTTP 超文本传输协议 FTP 文件传输协议 SMTP 简单邮件传输协议 TELNET TCP/IP终端仿真协议 POP3 邮局协议第三版 Finger 用户 ...
- learning ddr RTT
Rtt: Dynamic ODT.DDR3引入的新特性.在特定的应用环境下为了更好的在数据总线上改善信号完整性, 不需要特定的MRS命令即可以改变终结强度(或者称为终端匹配).在MR2中的A9和A10 ...
- 初时Windows程序
window 操作系统中,处处是窗体 优点:简单 强大 方便 灵活 步骤: 新建项目 项目类型 visual C#项目 模板 window应用程序 用partial 将同一个窗体的代码分开放在两个文件 ...
- leetCode 典型回溯例子
39题,翻译题目:给定一组候选集和一个目标值,在c的所有组合中,找出所有总和等于T的组合. 候选数组c中同一个数可以被选择多次(不限次数) 分析: 典型的回溯法应用 对数组里面的每个数,用递归的方式相 ...
- 阿里云服务器创建swap分区
阿里云服务器使用了4核8G内存配置,但最近由于jenkins构建时执行gradle打包安卓应用,导致即时的内存严重不足,线上应用长时间无法访问. 执行free命令才发现,swap分区一直是没有创建的. ...
- xml文档的读取
#! /usr/bin/env python3 # -*- coding:utf-8 -*- import xml.dom.minidom #该模块被用来处理xml文件 #打开xml文档 dom=x ...