API怎么获取外部进程的起始内存地址

API怎么获取外部进程的起始内存地址,第1张

Module32First中

MODULEENTRY32

结构里modBaseAddr就是主程序模块的起始地址

最简单的方法是使用进程快照CreateToolhelp32Snapshot,列举所有的进程,然后枚高晌举找到你所需要的进程,用Module32First获取其起始地址,然后用Module32Next获取下一个进程的

基址

也就是上一个进程的结束地址。

具体还是自祥念悄己查一下MSDN,或者

百度一下

枚举所有进程的方谨渣法

首先有个基本问题需要了解一下:

这里所说java里获得一个进程的内存使用情况和cpu运行时间,是指在java内部获取一个纯外部进程的内存与cpu时间呢,还是指在java内部,由java启动的进程的内存与cpu时间。

如果是第一种情况,那你还需要在java内部再起一个进程,通过执行 *** 作系统的shell命令来查看那个进程的运行状态。比如那个外部进程的ID为3119,则执行cat /proc/3119/status | grep VmRSS就可以过滤出该进程郑肢的物理内存占用量。

如果是第二种情况,(假定你问的就是这种情况)。

先说内存占用量:一般说来,你可以使用这两种方式获取内存使用情况

方式一:

MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean()

MemoryUsage memoryUsage = memoryMXBean.getHeapMemoryUsage()//椎内存使用情况

long totalMemorySize = memoryUsage.getInit()//初始的总内存

long maxMemorySize = memoryUsage.getMax()//喊正世最大可用内存

long usedMemorySize = memoryUsage.getUsed()//已使用的内存

方式二:

Runtime rt = Runtime.getRuntime()

long totalMemorySize = rt.totalMemory()//初始的总内存

long maxMemorySiz = t.maxMemory()//最大可用内存

long freeMemorySize = rt.freeMemory()//当前可用内存

需要说明的是,这种方式获取的是整个jvm的内存使用情况,并不是某一个进程的内存使用情况,事实上,在java内部,可以使用Rumtime.getRuntime().exec(${SHELL})来开启一个外部进程(这里${SHELL}代表一个可 *** 作系统的shell命令)。而运行Java程序整个jvm,对于 *** 作系统而言,清巧也仅仅只是一个进程。也就是说,一个jvm就是一个进程,你通过java程序开启的进程都是外部进程,java内部目前还提供了一个destroy方法来销毁该进程,对于该进程的其它信息,都无法直接获取,这些信息的获取,显然需要本地化(Local)的实现。既然标准jdk库没有,就不可能再通过平台无关的代码来实现了。典型的做法就是使用前面第一种情况的方式,再启一个进程,执行shell命令来获取。

不过对于cpu使用时间,采用标准java代码倒是可以拿到。由于java的语法很啰嗦,举一个较完全的例子需要太多的代码,我这里就只写最关键的代码:

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean()

① long currentCpuTime = threadMXBean.getCurrentThreadCpuTime()//当前线程的cpu使用时间

long someThreadId = 709817L//假定有某个线程的ID是709817

② long someThreadCpuTime = threadMXBean.getThreadCpuTime(someThreadId)//获取ID为someThreadId即709817的线程的cpu时间

基于上面的核心api,你可以把由java启动的外部进程放到一个单独的线程中执行,再用代码②的方式来获取该进程的cpu使用时间,也可以将外部进程放入到当前线程中执行,用① 的方式来获得进程的cpu使用时间。

众所周知,大多数e语言教程内存读写都是通过某某模块直接从首喊外部读写的。

最常见的某某.读内存小数型(进程句柄,参数地址),但是市面上的辅助都是直接注入到游戏内存里面,这种方法就明显不适用了,这时候大家就需要埋洞在网上各种搜寻可以读写的模块,但是一般这种模块藏的很深,很难找到,我自己学习的时候深有体会。

大家有没有想过这种模块的原理是弯芹枯什么?其实就是两个函数,一个ReadProcessMemory,另一个就是WriteProcessMemory,几乎所有模块都是依据这两个函数读写。这两个函数对应的库名都是kernel32.dll

ReadProcessMemory这函数总共有5个参数HANDLE hProcess, 进程句柄

LPCVOID lpBaseAddress,内存地址

LPVOID lpBuffer,存放地址

SIZE_T nSize,读取长度

SIZE_T *lpNumberOfBytesRead,写出长度,一般默认为0

WriteProcessMemory这5个函数参数大同小异和上面,就是三四个参数变成写入内容和写入长度

有了这两个函数,就可以实现内存读取了,应该很多人都不知道,注入了内存你就是这程序的一部分了,所以你可以在里面任意妄为了,读写自己内存不是易如反掌。

下面是例子,主要关键读内存代码,

.子程序 读整数, 整数型

.参数 内存地址, 整数型

.局部变量 存放地址, 字节集

存放地址 = 取空白字节集 (4) //初始化字节集

读内存 (进程句柄, 内存地址, 存放地址, 4, 0) //读内存是自己添加的dll,这个不需要说吧!

返回 (取字节集数据 (存放地址, #整数型, ))

这里说下为啥要存放地址要是字节集,主要是方便转换各种类型。

写内存代码也是大同小异,这里就不说了,其实也很简单,和上面没啥区别。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12473444.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存