32位程序在Windows上的内存问题

问题描述:

32位的程序运行在Win2016上,内存增加到1.4G左右就崩溃了。


原因分析:

默认情况下,32位程序虚拟地址空间是4G,其中2G为内核空间,系统使用;2G为用户虚拟地址空间,是用户可申请的最大内存大小。但是一般情况下,由于内存碎片、程序本身的数据等原因,用户可申请的内存大约是1.4~1.8G,如果程序内存达到1.4G以上,程序可能不稳定。
(1)我对1.4~1.8G这个值有些怀疑,于是我写了一个简单的程序测试:

@Override
#include <stdio.h>
#include <list>
#include <windows.h>

int main()
{
	std::list<int*> testlist;
	while(1)
	{
		# 每次申请40M内存,直至程序崩溃
		int *ptr=new int[10*1024*1024];
		testlist.push_back(ptr);
		sleep(100); 
	}
	
	return 0;
}

发现申请内存接近于2G时,程序才崩溃。
(2)至于内存碎片的说法,当时程序其实都还没有频繁业务,只是启动时,加载某些模块内存达到了1.4G便崩溃,但是代码底层模块复杂,内存碎片也难计算出来。


解决方案:

(1)程序中加入代码,定时清理内存;
(2)程序定时重启;
总之是让程序内存在1.4G以下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows平台上,你可以使用`ctypes`模块来读取进程的内存,并在内存中搜索Meterpreter的特征。下面是一个示例程序: ```python import ctypes import re # 声明一些Windows API函数 kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) psapi = ctypes.WinDLL('psapi', use_last_error=True) # 定义一些常量 PROCESS_QUERY_INFORMATION = 0x0400 PROCESS_VM_READ = 0x0010 MAX_PATH = 260 def search_for_meterpreter(): # 获取所有进程的ID列表 process_ids = ctypes.create_unicode_buffer(MAX_PATH) bytes_returned = ctypes.c_ulong() kernel32.EnumProcesses(ctypes.byref(process_ids), ctypes.sizeof(process_ids), ctypes.byref(bytes_returned)) num_processes = int(bytes_returned.value / ctypes.sizeof(ctypes.c_ulong())) for i in range(num_processes): # 打开进程 process_id = int(process_ids[i]) process_handle = kernel32.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, False, process_id) if process_handle: # 获取进程的模块列表 module_handles = (ctypes.c_void_p * 1024)() bytes_returned = ctypes.c_ulong() psapi.EnumProcessModules(process_handle, ctypes.byref(module_handles), ctypes.sizeof(module_handles), ctypes.byref(bytes_returned)) num_modules = int(bytes_returned.value / ctypes.sizeof(ctypes.c_void_p)) for j in range(num_modules): # 获取模块的文件路径 module_file_path = ctypes.create_unicode_buffer(MAX_PATH) psapi.GetModuleFileNameExW(process_handle, module_handles[j], module_file_path, ctypes.sizeof(module_file_path)) # 读取模块的内存数据 module_data = ctypes.create_string_buffer(4096) bytes_read = ctypes.c_ulong() kernel32.ReadProcessMemory(process_handle, module_handles[j], ctypes.byref(module_data), ctypes.sizeof(module_data), ctypes.byref(bytes_read)) # 在内存数据中搜索Meterpreter特征 if re.search(b'meterpreter', module_data.raw[:bytes_read.value], re.IGNORECASE): print("[!] 检测到 Meterpreter 特征在进程 {} (PID: {}) 的内存中".format(module_file_path.value, process_id)) # 关闭进程句柄 kernel32.CloseHandle(process_handle) if __name__ == '__main__': search_for_meterpreter() ``` 这个程序使用了`ctypes`模块来调用Windows API函数。首先,它使用`EnumProcesses`函数获取当前运行的所有进程的ID列表。然后,它遍历每个进程,并打开进程的句柄。接下来,程序使用`EnumProcessModules`函数获取进程的模块列表,并遍历每个模块。对于每个模块,程序使用`GetModuleFileNameExW`函数获取模块的文件路径,并使用`ReadProcessMemory`函数读取模块的内存数据。最后,程序内存数据中搜索是否存在Meterpreter的特征。 请注意,这个程序仅用于演示目的,实际应用中可能需要更复杂的逻辑和技术来进行内存分析和特征识别。此外,这个程序需要以管理员权限运行,因为访问其他进程的内存可能需要特权。另外,这种方式只是一种简单的方式,实际上内存分析和特征识别需要更多的技术和工具支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值