游戏基础—Android平台进程模块信息获取

news2024/11/27 23:55:00

记得学习编程时的第一个helloworld程序:

#include<stdio.h>
Int main(int argc, char **argv)
{
printf(“Hello World”);
return 0;
}

打印” Hello World”,使用的是printf函数。但是,我们并没有去实现printf函数的功能,而是由C语言标准库去实现,我们直接加载该库就可以了。像这样的例子,还有很多。

在开发软件时,我们通常只实现软件的核心逻辑功能,而把基础的功能交给第三方完成,这样的好处是代码体积更小、占用更小的存储空间,而且更方便管理。如果我们想要知道软件加载了哪些库,就需要进行内存模块遍历。

Android内存模块遍历的原理

在Android系统上,要进行内存模块遍历,必须要了解proc文件系统。在linux系统上,把一切信息通过文件的形式输出。proc也是文件系统的一种,但是,它是伪文件系统,不占用磁盘空间,而是由内核挂载到内存中。proc文件系统提供了内核配置、进程状态输出等功能。

关于进程内存模块的信息,存放到proc文件系统下以pid为目录名称下的maps文件中,可以通过”cat /proc/21358/maps”命令打印(21358为假设的进程号)出,如下图:
在这里插入图片描述
maps文件中每份模块信息的组织方式为:

第1列:模块内容在内存中的地址范围,以16进制显示。

第2列:模块内容在内存中的读取权限,r代表可读,w代表可写,x代表可执行,p代表私有,s代码共享。

第3列:模块内容对应模块文件中的偏移。

第4列:模块文件在文件系统中的主次设备号。

第5列:模块文件在文件系统中的节点号。

第6列:模块文件在文件系统中的路径。

即linux内核的mm.h里面的vm_area_struct数据结构内容。Linux内核中,关于虚存管理的最基本的管理单元应该是struct vm_area_struct了,它描述的是一段连续的、具有相同访问属性的虚存空间,该虚存空间的大小为物理内存页面的整数倍。vm_area_struct的详细解析可参考这篇文章(超链接至http://blog.csdn.net/ywf861029/article/details/6114794)

Android内存模块遍历的实现

下面将结合代码讲解获取模块信息的实现,GetModuleBase函数可进程中某一模块基地址,GetModuleFullName可获取某一模块的全路径名,实现如下:

/*****************************************************************************

Function: GetModuleBase

Description: 获取进程中某一模块的基址

Input: pid,是进程ID;pszModName,是要查找的模块名称

Output: ulModBase,用来输出模块的基址。

Return:如果获取模块的基址成功,返回true;否则,返回false

*****************************************************************************/

bool GetModuleBase(unsigned long &ulModBase, pid_t pid, const char *pszModName) {

bool bRet = false;

FILE *fp = NULL;

char szMapFilePath[32] = {0};

char szMapFileLine[1024] = {0};

if (pszModName == NULL)

{

return bRet;

}

if (pid < 0) // 获取自己进程的模块信息

{

sprintf(szMapFilePath, “/proc/self/maps”);

}

else // 获取其它进程的模块信息,此时需要root权限

{

sprintf(szMapFilePath, “/proc/%d/maps”, pid);

}

fp = fopen(szMapFilePath, “r”);

if (fp != NULL)

{

while (fgets(szMapFileLine, 1023, fp) != NULL)

{

if (strstr(szMapFileLine, pszModName))

{

char *pszModAddrStart = strtok(szMapFileLine, “-”);

if (pszModAddrStart)

{

ulModBase = strtoul(pszModAddrStart, NULL, 16);

if (ulModBase == 0x8000)

ulModBase = 0;

bRet = true;

break;

}

}

}

fclose(fp);

}

return bRet;

}

/*****************************************************************************

Function: GetModuleFullName

Description: 获取进程中某一模块的绝对路径

Input: pid,是进程ID;pszModName,是要查找的模块名称;nBuffSize是pszFullModName的内存大小,防止溢出。

Output: pszFullModName,用来输出模块的绝对路径。

Return:如果获取模块的绝对路径成功,返回true;否则,返回false

*****************************************************************************/

bool GetModuleFullName(pid_t pid, const char *pszModName, char *pszFullModName, int nBuffSize)

{

bool bRet = false;

FILE *fp = NULL;

char szMapFilePath[32] = {0};

char szMapFileLine[1024] = {0};

char *pszFullName = NULL;

if (pszModName == NULL || pszFullModName == NULL || nBuffSize <= 0 )

{

return bRet;

}

if (pid < 0) // 获取自己进程的模块信息

{

sprintf(szMapFilePath, “/proc/self/maps”);

}

else // 获取其它进程的模块信息,此时需要root权限

{

sprintf(szMapFilePath, “/proc/%d/maps”, pid);

}

fp = fopen(szMapFilePath, “r”);

if (fp != NULL)

{

while (fgets(szMapFileLine, 1023, fp) != NULL)

{

if (strstr(szMapFileLine, pszModName))

{

if (szMapFileLine[strlen(szMapFileLine) - 1] == ‘\n’) // 去掉末尾的换行符

{

szMapFileLine[strlen(szMapFileLine) - 1] = 0;

}

pszFullName = strchr(szMapFileLine, ‘/’);

if (pszFullName == NULL)

{

continue;

}

strncpy(pszFullModName, pszFullName, nBuffSize - 1);

bRet = true;

}

}

fclose(fp);

}

return bRet;

}

三、Android内存模块遍历的运用场景

模块遍历的运用场景非常广泛,如:

l 获取自己进程的内存模块信息。

l 获取目标进程的内存模块信息。

l 检查注入模块的信息。

l 检查Hook模块的信息。

总之,通过内存模块遍历拿到模块的基础信息,结合文件操作,可以对模块的情况掌握得很清楚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

javascrip语法

JavaScript 语法涉及到很多方面&#xff0c;以下是常见的详细语法&#xff1a; 1. 变量 变量用于存放值&#xff0c;关键字 var 可以定义变量。 // javascript var x 5; // 定义变量 x&#xff0c;并赋值为 52. 数据类型 JavaScript 中有多种数据类型&#xff0c;包括&…

iOS 紧急通知

一般通知 关于通知的各种配置和开发&#xff0c;可以参考推送通知教程&#xff1a;入门 – Kodeco&#xff0c;具有详细步骤。 紧急通知表现 紧急通知不受免打扰模式和静音模式约束。当紧急通知到达时&#xff0c;会有短暂提示音量和抖动&#xff08;约2s&#xff09;。未锁…

一文速学数模-K-means聚类算法实战:信用卡用户画像聚类分析

目录 前言 一、用户画像概述 1.用户画像 2.为何用聚类算法作用户画像 二、数据质量校验 1.数据背景 2.数据说明 三、数据预处理 1.数据空缺值检验 2.数据归一化 四、K-means聚类 step1:选取K值 手肘法 step2:计算初始化K点 step3:迭代计算重新划分 五.画像分析 …

【LeetCode:221. 最大正方形 | 暴力递归=>记忆化搜索=>动态规划 | 二维dp】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Flutter - 实现防抖和节流

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 什么是防抖和节流&#xff1f; 函数节流&#xff08;throttle&#xff09;与 函数防抖&#xff08;debounce&#xff09;都是为了限制函数的执行频次&#xff0c;以…

AgentGPT,免费易用的 Auto-GPT 平替

你问 ChatGPT 答&#xff0c;属于单线问答式交互。但如果你问Auto-GPT&#xff0c;他会分解成N个任务&#xff0c;并且在遇到任务无法完成后&#xff0c;会尝试其它的方式来完成任务&#xff0c;很像老板交待你一个任务&#xff0c;中间的过程他不过问&#xff0c;遇到问题你自…

性能测评:腾讯云轻量服务器4核8G12M带宽流量CPU主频型号

腾讯云轻量4核8G12M应用服务器带宽&#xff0c;12M公网带宽下载速度峰值可达1536KB/秒&#xff0c;折合1.5M/s&#xff0c;每月2000GB月流量&#xff0c;折合每天66GB&#xff0c;系统盘为180GB SSD盘&#xff0c;地域节点可选上海、广州或北京&#xff0c;4核8G服务器网来详细…

【LeetCode】917. 仅仅反转字母、387. 字符串中的第一个唯一字符

作者&#xff1a;小卢 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 917. 仅仅反转字母 387. 字符串中的第一个唯一字符 917. 仅仅反转字母 917. 仅仅反转字母…

光栅和矢量图像处理SDK:Graphics Mill 11.7Crack

Graphics Mill 是适用于 .NET 和 ASP.NET 开发人员的最强大的成像工具集。它允许用户轻松地向 .NET 应用程序添加复杂的光栅和矢量图像处理功能。 光栅图形 加载和保存 JPEG、PNG PSD 和其他 8 种图像格式 调整大小、裁剪、自动修复、色度键和 30 多种其他图像处理 使用任何维度…

大电流的走线和过孔

工程师在设计的时候&#xff0c;很容易忽略走线宽度的问题&#xff0c;因为在数字设计时&#xff0c;走线宽度不在 考虑范围里面。通常情况下&#xff0c;都会尝试用最小的线宽去设计走线&#xff0c;这时&#xff0c;在大电流时&#xff0c;将会导致很严重的问题。下面的公式用…

Vue3文字滚动(TextScroll)

可自定义设置以下属性&#xff1a; 滚动文字数组&#xff08;sliderText&#xff09;&#xff0c;类型&#xff1a;Array<{title: string, link?: string}>&#xff0c;必传&#xff0c;默认[] 滚动区域宽度&#xff08;width&#xff09;&#xff0c;类型&#xff1a;…

智能汽车迈进中央计算“芯”时代

全新一代的中央计算E/E架构正在加速到来。《高工智能汽车研究院》认为&#xff0c;伴随着整车电子电气架构从分布式架构、域控制器架构到中央计算架构演变&#xff0c;整个智能汽车供应链体系即将发生重构。 其中&#xff0c;车规芯片是至关重要的一环&#xff0c;从底层支撑着…

海创高科及时充系列共享充电宝 打开共享充电宝行业新局面

---让行业更加透明&#xff0c;更加真诚 在当下&#xff0c;电子产品很普遍。在使用电子产品的时候&#xff0c;需要进行充电。因此&#xff0c;各种充电宝有很大的市场需求。有些创业者感兴趣&#xff0c;那么&#xff0c;充电宝加盟哪个牌子好些&#xff1f;我们推荐海创高科…

【C语言】volatile关键字

文章目录一. 基本介绍二. 演示实验三. const 能否和 volatile 一起使用一. 基本介绍 volatile用来修饰变量&#xff0c;告知编译器不要对这个变量进行优化&#xff0c;每次要用到这个变量时都必须从内存中读取它的值。 看下面一段代码&#xff1a; 在 C/C 中被 const 修饰的…

激活函数(Activation Function)

目录 1 激活函数的概念和作用 1.1 激活函数的概念 1.2 激活函数的作用 1.3 通俗地理解一下激活函数&#xff08;图文结合&#xff09; 1.3.1 无激活函数的神经网络 1.3.2 带激活函数的神经网络 2 神经网络梯度消失与梯度爆炸 2.1 简介梯度消失与梯度爆炸 2.2 梯度不稳…

Java基础——缓冲流

&#xff08;1&#xff09;缓冲流概述&#xff1a; 缓冲流也称高效流&#xff0c;或者高级流。&#xff08;字节流可称原始流&#xff09;作用&#xff1a;缓冲流自带缓冲区&#xff0c;可以提高原始字节流&#xff0c;字符流读写数据的性能。&#xff08;2&#xff09;字节缓…

水质站房式在线监测系统集方案要点

水质在线自动监测系统是一套高度集成的一体化水质自动监测系统&#xff0c;其中包含水样采集处理、水质自动分析、数据采集传输、远程操作监控于一体的在线全自动监控系统。 本次方案整体系统采用一体化集成方式&#xff0c;辅助设备工艺制作精细&#xff0c;同时系统工艺流程…

阿木动态 | 阿木实验室亮相第58·59届中国高等教育展(重庆)

4月10日&#xff0c;第58.59届中国高等教育博览会在重庆国际博览中心圆满结束。本届展会中&#xff0c;各大科技企业、研发机构和教育组织都集中展示了最新的教育科技成果和应用。 阿木实验室作为一家注重提高客户研发效率的企业&#xff0c;此次展会中&#xff0c;阿木实验室 …

MinIO安装配置访问以及SpringBoot整合MinIO

MinIO 1.MinIO安装 Minio 是个基于 Golang 编写的开源对象存储服务&#xff0c;存储非结构化数据&#xff0c;如&#xff1a;图片&#xff0c;视频&#xff0c;音乐等 官网地址&#xff1a;https://min.io/ 中文地址&#xff1a;http://minio.org.cn 官网文档&#xff08; …

行业首选|墨菲安全实力入选《开发安全产品及服务购买决策参考》

十分钟快速部署&#xff0c;为企业提供最高效可靠的软件供应链安全解决方案&#xff01; 近日&#xff0c;GoUpSec 深入调研了14家国内开发安全“酷厂商”&#xff08;包括专业厂商和综合安全厂商&#xff09;&#xff0c;从产品功能、应用行业、成功案例、安全策略等维度对各厂…