博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DumpSo
阅读量:3750 次
发布时间:2019-05-22

本文共 1642 字,大约阅读时间需要 5 分钟。

背景

Android如何Dump内存中的数据,比如so文件

代码

#include 
#include
#include
#include
#include
int main(int argc, char** argv) { if (argc < 2) { printf("usage:./dump ./libxx.so /system/lib/libc.so ..."); return 0; } else if (argc > 3) { } for (int i = 2; i < argc; i++) { printf("[+] dlopen %s\n", argv[i]); void* si = dlopen(argv[i], RTLD_LAZY); if (si == NULL) { printf("[-] dlopen depend so err!\n"); return 0; } } JavaVM* vm; JNIEnv* env; jint res; JavaVMInitArgs vm_args; JavaVMOption options[1]; options[0].optionString = "-Djava.class.path=."; vm_args.version = 0x00010002; vm_args.options = options; vm_args.nOptions = 1; vm_args.ignoreUnrecognized = JNI_TRUE; printf("[+] dlopen libdvm.so\n"); void* handle = dlopen("/system/lib/libdvm.so", RTLD_LAZY); // RTLD_LAZY RTLD_NOW if (!handle) { printf("[-] dlopen libdvm.so failed!!\n"); return 0; } typedef int (*JNI_CreateJavaVM_Type)(JavaVM**, JNIEnv**, void*); JNI_CreateJavaVM_Type JNI_CreateJavaVM_Func = (JNI_CreateJavaVM_Type)dlsym(handle, "JNI_CreateJavaVM"); if (!JNI_CreateJavaVM_Func) { printf("[-] dlsym failed\n"); return 0; } res = JNI_CreateJavaVM_Func(&vm, &env, &vm_args); void* si = dlopen(argv[1], RTLD_LAZY); if (si == NULL) { printf("[-] dlopen err!\n"); return 0; } void* addr = (void*)(*(int*)((size_t)si + 0x8c)); uint32_t len = *(uint32_t*)((size_t)si + 0x90); char path[257] = ""; sprintf(path, "%p_0x%x.so", addr, len); FILE* fp = fopen(path, "wb"); printf("[+] save %s\n", path); fwrite(addr, 1, len, fp); fclose(fp); return 0;}

转载地址:http://dynsn.baihongyu.com/

你可能感兴趣的文章
JSP技术的使用——好像过时了唉。。。。。
查看>>
MVC模式概述
查看>>
Web之过滤器Filter
查看>>
JSON和AJAX
查看>>
web之监听器listener
查看>>
类加载器
查看>>
数据库设计
查看>>
Java虚拟机的内存分配和运行机制(粗谈)
查看>>
web开发之BaseServlet的使用
查看>>
初识Maven
查看>>
Maven分模块构建项目
查看>>
MyBatis初识
查看>>
MyBatis【进阶详解】
查看>>
面试题集锦(七)
查看>>
注解开发——Spring整合dao/service/web
查看>>
架构的演进
查看>>
Elastic-Job的基础使用
查看>>
策略过滤器的灵活性分析
查看>>
POI的使用
查看>>
Anaconda和PyCharm的下载、安装和配置
查看>>