CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  API

关于VB对内存数据搜索!

楼主xbingboy(新月浪子)2003-09-04 07:31:55 在 VB / API 提问

小弟,想用VB   写一个   找到指定数据的内存地址(找到应用程序进程这些都已经明白,关键是如何搜索这段内存来确定数据在虚拟内存中的地址。)   类似FPE等个工具的搜索功能  
  关键之处   不是很明白望有这方面经验的朋友能详细解释下,万分感激! 问题点数:100、回复次数:13Top

1 楼xbingboy(新月浪子)回复于 2003-09-04 13:44:10 得分 0

 
  顶哦!请各位高手指教一下!Top

2 楼ww94307(外星人)回复于 2003-09-04 13:55:56 得分 0

upTop

3 楼rainstormmaster(暴风雨 v2.0)回复于 2003-09-04 21:51:05 得分 40

Public   lngHwnd   As   Long   '程序句柄    
  Public   pHandle   As   Long   '进程句柄    
  Public   pId   As   Long   '   进程标志    
  Public   Const   PROCESS_ALL_ACCESS   =   2035711    
  Declare   Function   GetWindowThreadProcessId   Lib   "user32"   (ByVal   hwnd   As   Long,   lpdwProcessId   As   Long)   As   Long    
  Declare   Function   OpenProcess   Lib   "kernel32"   (ByVal   dwDesiredAccess   As   Long,   ByVal   bInheritHandle   As   Long,   ByVal   dwProcessId   As   Long)   As   Long    
  Declare   Function   WriteProcessMemory   Lib   "kernel32"   (ByVal   hProcess   As   Long,   ByVal   lpBaseAddress   As   Any,   ByVal   lpBuffer   As   Any,   ByVal   nSize   As   Long,   lpNumberOfBytesWritten   As   Long)   As   Long    
  Declare   Function   ReadProcessMemory   Lib   "kernel32"   (ByVal   hProcess   As   Long,   ByVal   lpBaseAddress   As   Any,   ByVal   lpBuffer   As   Any,   ByVal   nSize   As   Long,   lpNumberOfBytesWritten   As   Long)   As   Long    
  Declare   Function   CloseHandle   Lib   "kernel32"   (ByVal   hObject   As   Long)   As   Long    
   
   
  lngHwnd   =   GetHwnd("NeoRAGEx   Emulator")    
  GetWindowThreadProcessId   lngHwnd,   pId    
  pHandle   =   OpenProcess(PROCESS_ALL_ACCESS,   False,   pId)    
   
   
  '*****************************    
  '根据窗体部分名称取得句柄    
  '*****************************    
  Public   Function   GetHwnd(strWinText   As   String)   As   Long    
  Dim   l   As   Long,   k   As   Long,   rlt   As   Long    
  Dim   strLen   As   Long    
  Dim   str   As   String   *   255    
          l   =   GetForegroundWindow    
          l   =   GetWindow(l,   GW_HWNDFIRST)    
          Do   Until   l   =   0    
                  strLen   =   SendMessage(l,   WM_GETTEXTLENGTH,   0,   0&)    
                  If   strLen   <>   0   Then    
                          rlt   =   SendMessage(l,   WM_GETTEXT,   strLen   +   1,   ByVal   str)    
                          If   Mid(str,   1,   Len(strWinText))   =   strWinText   Then    
                                GetHwnd   =   l    
                          End   If    
                  End   If    
                  l   =   GetWindow(l,   GW_HWNDNEXT)    
          Loop    
  End   Function    
   
  '**************************************    
  '从内存指定位置读取数据    
  '**************************************    
  Public   Function   ReadMem(MemAddress   As   Long)   As   Long    
  Dim   lngRlt   As   Long    
  Dim   l   As   Long    
          If   pHandle   <>   0   Then    
                  lngRlt   =   ReadProcessMemory(pHandle,   MemAddress,   ByVal   VarPtr(l),   2,   0&)    
                  ReadMem   =   l    
          Else    
                  ReadMem   =   0    
          End   If    
  End   Function    
   
   
  '**************************************    
  '把数据写入内存    
  '**************************************    
  Public   Sub   WriteMem(MemAddress   As   Long,   val   As   Long)    
  Dim   lngRlt   As   Long    
  Dim   l   As   Long    
  l   =   val    
  lngRlt   =   WriteProcessMemory(pHandle,   MemAddress,   ByVal   VarPtr(l),   2,   0&)    
  End   Sub    
   
  Top

4 楼rainstormmaster(暴风雨 v2.0)回复于 2003-09-04 21:53:46 得分 20

http://vip.6to23.com/NowCan1/tech/VirtualQ.htmTop

5 楼bu_wen(不文)回复于 2003-09-04 22:50:28 得分 20

获取了进程PId,打开了进程..  
  然后的事情就是用ReadProcessMemory循环读取一段地址的内容,和你想得到的值做比对啊..  
  如果相=,这时候的地址便可能是你需要找的地址,当然你可能会获取好几个,所以要不段的筛选Top

6 楼James0001(虾米—什么时候成大虾?)回复于 2003-09-05 06:56:39 得分 20

搜索   &H00000000&   到   &H7FFFFFFF&   这段区域。Top

7 楼xbingboy(新月浪子)回复于 2003-09-05 11:28:13 得分 0

谢谢大家的帮忙   ,已经有基本的思路了  
  但详细处还是不是很明白   打个比方  
  我要找2a7d01这个16进制数据的地址   该如何写这段代码?  
   
  谢谢各位的帮忙了!Top

8 楼jlum99(闲人)回复于 2003-09-05 11:36:36 得分 0

注意高低位的顺序,其他还能有什么??Top

9 楼jlum99(闲人)回复于 2003-09-05 11:38:38 得分 0

得到进程的内存空间使用情况,一个范围.然后打开.搜索.Top

10 楼xbingboy(新月浪子)回复于 2003-09-05 17:25:59 得分 0

先把内存数据读出   然后比较?!  
  但一次读出多少呢?全部读出   还是分段读出?Top

11 楼xbingboy(新月浪子)回复于 2003-09-05 17:28:25 得分 0

比如2a7d01这个数据要比较?!  
  我一次从内存中怎么读数据好一点/1?Top

12 楼Gelim(Gelim)回复于 2003-09-06 01:04:37 得分 0

upTop

13 楼xbingboy(新月浪子)回复于 2003-09-06 14:45:18 得分 0

问题解决了!  
  但就是搜索速度太慢     不敢大范围的搜索!Top

相关问题

  • VB中怎么做内存搜索
  • 内存数据库 ?
  • 内存数据库MMDB
  • 内存数据的修改
  • 如何用VB在access数据库中搜索内容?
  • 关于VB中搜索数据库的问题!!!
  • VB$数据库
  • vb数据库!
  • VB提示内存溢出
  • 数据库操作内存不足?

关键词

  • 内存
  • 数据
  • lngrlt
  • memaddress
  • byval
  • readmem
  • 搜索
  • 读出
  • 进程
  • as long

得分解答快速导航

  • 帖主:xbingboy
  • rainstormmaster
  • rainstormmaster
  • bu_wen
  • James0001

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo