vb读取进程内存问题

甜甜婚礼纪 2024-06-06 13:55:15
最佳回答
虽然楼主已经有答案了,但还是科普一下,哈哈!在win32中,每个应用程序都可“看见”4gb的线性地址空间,其中最开始的4mb和最后的2gb由操作系统保留,剩下不足2gb的空间用于应用程序私有空间。具体分配如下:0xffffffff-0xc0000000的1gb用于vxd、存储器管理和文件系统;0xbfffffff-0x80000000的1gb用于共享的win32 dll、存储器映射文件和共享存储区;0x7fffffff-0x00400000为每个进程的win32专用地址;0x003fffff-0x00001000为ms-dos 和 win16应用程序;0x00000fff-0x00000000为防止使用空指针的4,096字节。以上都是指逻辑地址,也就是虚拟内存。 虚拟内存通常是由固定大小的块来实现的,在win32中这些块称为“页”,每页大小为4,096字节。在intel cpu结构中,通过在一个控制寄存器中设置一位来启用分页。启用分页时cpu并不能直接访问内存,对每个地址要经过一个映射进程,通过一系列称作“页表”的查找表把虚拟内存地址映射成实际内存地址。通过使用硬件地址映射和页表win32可使虚拟内存即有好的性能而且还提供保护。利用处理器的页映射能力,操作系统为每个进程提供独立的从逻辑地址到物理地址的映射,使每个进程的地址空间对另一个进程完全不可见。win32中也提供了一些访问进程内存空间的函数,但使用时要谨慎,一不小心就有可能破坏被访问的进程。本文介绍如何读另一个进程的内存,写内存与之相似,完善一下你也可以做个 fpe 之类的内存修改工具。好吧,先准备好编程利器delphi 和 参考手册 msdn ,now begin! readprocessmemory 读另一个进程的内存,原形如下: bool readprocessmemory( handle hprocess, // 被读取进程的句柄; lpcvoid lpbaseaddress, // 读的起始地址; lpvoid lpbuffer, // 存放读取数据缓冲区; dword nsize, // 一次读取的字节数; lpdword lpnumberofbytesread // 实际读取的字节数; ); hprocess 进程句柄可由openprocess 函数得到,原形如下: handle openprocess( dword dwdesiredaccess, // 访问标志; bool binherithandle, // 继承标志; dword dwprocessid // 进程id; ); 当然,用完别忘了用 closehandle 关闭打开的句柄。读另一个进程的内存 dwdesiredaccess 须指定为 process_vm_read ,写另一个进程的内存 dwdesiredaccess 须指定为 process_vm_write ,继承标志无所谓,进程id可由 process32first 和 process32next 得到,这两个函数可以枚举出所有开启的进程,这样进程的信息也就得到了。 process32first 和 process32next是由 tlhelp32 单元提供的,需在 uses 里加上tlhelp32。toolshelp32 封装了一些访问堆、线程、进程等的函数,只适用于win9x,原形如下: bool winapi process32first( handle hsnapshot // 由 createtoolhelp32snapshot 返回 的系统快照句柄; lpprocessentry32 lppe // 指向一个 processentry32 结构; ); bool winapi process32next( handle hsnapshot // 由 createtoolhelp32snapshot 返回 的系统快照句柄; lpprocessentry32 lppe // 指向一个 processentry32 结构; ); hsnapshot 由 createtoolhelp32snapshot 返回的系统快照句柄; createtoolhelp32snapshot 原形如下: handle winapi createtoolhelp32snapshot( dword dwflags, // 快照标志; dword th32processid // 进程id; ); 现在需要的是进程的信息,所以将 dwflags 指定为 th32cs_snapprocess, th32processid 忽略;processentry32 结构如下: typedef struct tagprocessentry32 { dword dwsize; // 结构大小; dword cntusage; // 此进程的引用计数; dword th32processid; // 进程id; dword th32defaultheapid; // 进程默认堆id; dword th32moduleid; // 进程模块id; dword cntthreads; // 此进程开启的线程计数; dword th32parentprocessid;// 父进程id; long pcpriclas**ase; // 线程优先权; dword dwflags; // 保留; char szexefile[max_path]; // 进程全名; } processentry32; 至此,所用到的主要函数已介绍完,实现读内存只要从下到上依次调用上述函数即可,具体参见原代码: procedure tform1.button1click(sender: tobject); var fsnapshothandle:thandle; fprocessentry32:tprocessentry32; ret : bool; processid : integer; processhndle : thandle; lpbuffer:pbyte; nsize: dword; lpnumberofbytesread: dword; i:integer; s:string; begin fsnapshothandle:=createtoolhelp32snapshot( th32cs_snapprocess,0); //创建系统快照 fprocessentry32.dwsize:=sizeof(fprocessentry32); //先初始化 fprocessentry32 的大小 ret:=process32first(fsnapshothandle,fprocessentry32); while ret do begin s:=extractfilename(fprocessentry32.szexefile); if s='kernel32.dll' then begin processid:=fprocessentry32.th32processid; s:='; break; end; ret:=process32next(fsnapshothandle,fprocessentry32); end; //循环枚举出系统开启的所有进程,找出“kernel32.dll” closehandle(fsnapshothandle); memo1.lines.clear ; memo1.lines.add('process id '+inttohex( fprocessentry32.th32processid,8)); memo1.lines.add('file name '+fprocessentry32.szexefile); ////输出进程的一些信息 nsize:=4; lpbuffer:=allocmem(nsize); processhndle:=openprocess(process_vm_read,false,processid); memo1.lines.add ('process handle '+inttohex(processhndle,8)); for i:=$00800001 to $0080005f do begin readprocessmemory( processhndle, pointer(i), lpbuffer, nsize, lpnumberofbytesread ); s:=s+inttohex(lpbuffer^,2)+' '; //读取内容 if (i mod 16) =0 then begin memo1.lines.add(s); s:='; end; //格式化输出 end; freemem(lpbuffer,nsize); closehandle(processhndle); //关闭句柄,释放内存 end; 20210311
汇率兑换计算器

类似问答
  • 150001瑞福进取的问题
    • 2024-06-06 02:19:48
    • 提问者: 未知
    150001只有风险承受能力很强的投资人能玩的。
  • 怎么解决读取txt文件读取时中文乱码问题
    • 2024-06-06 01:58:08
    • 提问者: 未知
    从sdcard保存的txt文件读文到android系统中会出现乱码,如何解决这个乱码问网上有解答方法,譬如说利用string temp1 =encodingutils.getstring(strline.getbytes(),"gb2312"); 但并非对所有的情况都适用,解决乱码问题首先要明白为什么会乱码。究其原因,是因为txt文件在win系统上保存时默认为ansi格式,而a...
  • 用vb如何获取数据内容并汇总成一张表
    • 2024-06-06 04:37:07
    • 提问者: 未知
    不是很明白你的意思?是生成网页的表格还是excel表?但是都不难, 生成网页表格 只要把 <td> <tr>套在读数据库的循环里面就好了。excel表 要用vba吧 具体怎么连asp我就不知道了 呵呵不过 是不是可以用vba生成excel表 在用asp表头标注一下....
  • 内存条的问题
    • 2024-06-06 13:24:24
    • 提问者: 未知
    维修人员骗你钱呢 首先第二代的ddr 2 接口跟第一代的ddr 接口不一样 所以第二代的你用不上(ddr2 800 1g 新货150元左右)第一代的ddr 1g 只有旧货 二手市场也是卖100到150左右(一般是两条ddr ...
  • 内存条的问题
    • 2024-06-06 23:48:23
    • 提问者: 未知
    找一根别人的能用的内存条插到你的主板上用用看,是不是也出现同样的问题。如果换上别人的正常,那就说明是你的内存有问题,换了。如果别人的也出一样的问题,那可能是你...
  • 关于提高**额度流程的问题,内行进
    • 2024-06-06 04:36:33
    • 提问者: 未知
    核实你的信用情况,看你有没有逾期还款过,看你的信用状态!如果信用好的话,就可以提升额度!
  • 内存问题
    • 2024-06-06 02:11:17
    • 提问者: 未知
    不能。845主板只能使用184pin的ddr一代内存条。ddrii代是240pin的,无法使用。845主板只有两个内存插槽,每个最大支持1g。如果单独使用,金士顿、hy都可以。256m的100元,512m的180-200元。首先...
  • 关于零存整取的问题.
    • 2024-06-06 04:48:41
    • 提问者: 未知
    零存整取的利率比同档次定期存款低,而且中间连续漏存两次即失效。建议你到银行开立一个定期一本通,每月存入一次定期一年,自动转存。连续存三年。三年后每月都有存款到期,不耽误使用。如果你...
  • 急求以下vb问题答案、。
    • 2024-06-06 08:32:05
    • 提问者: 未知
    d 潜伏性 传播性 破坏性 变异性 文件夹 d 代码窗口 c d 双击word快捷方式 字处理 a a 不想写了!太多了!看着都累
  • 银行打印取存单问题?
    • 2024-06-06 12:48:04
    • 提问者: 未知
    一张是给客户的,一张是银行处理业务的存根。就象**有多联是一个道理。
汇率兑换计算器

热门推荐
热门问答
最新问答
推荐问答
新手帮助
常见问题
房贷计算器-九子财经 | 备案号: 桂ICP备19010581号-1 商务联系 企鹅:2790-680461

特别声明:本网为公益网站,人人都可发布,所有内容为会员自行上传发布",本站不承担任何法律责任,如内容有该作者著作权或违规内容,请联系我们清空删除。