Option ExplicitPrivate Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const SYNCHRONIZE = &H100000
Private Const PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
Private Sub Command1_Click()
Dim strP As String
Dim lngStartAdd As Long '进程内存起始地址
Dim lngWindowHwnd As Long '进程句柄
Dim lngPID As Long
Dim lngP As Long
Dim lngProcessHwnd As Long
Dim strValue As String * 20
On Error GoTo errSub
lngStartAdd = LoadLibrary("c:\windows\system32\calc.exe") '读取软件内存起始地址
lngWindowHwnd = FindWindow(vbNullString, "计算器") '找到窗口句柄
lngP = GetWindowThreadProcessId(lngWindowHwnd, lngPID) '取得进程PID
lngProcessHwnd = OpenProcess(PROCESS_ALL_ACCESS, False, lngPID) '读取进程句柄
lngP = ReadProcessMemory(lngProcessHwnd, lngStartAdd, strValue, 20, ByVal 0)
Exit Sub
errSub:End Sub我通过这段代码想查看一下计算器的内存地址的值,lngStartAdd、lngWindowHwnd、lngProcessHwnd都能取得,但就是ReadProcessMemory失败!返回值lngP=0。 我仔细查阅了ReadProcessMemory的使用方法,觉得没有错误。现在我怀疑我的lngStartAdd的读取有问题,百度了一下,并没有找到如何读取exe的起始地址的方法。不知道我的读取内存起始地址的方法是否正确?
lngStartAdd = LoadLibrary("c:\windows\system32\calc.exe") '读取软件内存起始地址
解决方案 »
- 用VB将EXLEL的数据按照选择的表的名字 导入 过结构不一样则返回错误的提示信息,如果结构一样那么就执行导入ACCESS求解
- 如何获得网络的ip dhpc dns 这些网络信息呢?要求全代码阿
- 高分提问:关于VB中MSFLEXGRID中数据分组汇总!
- 关于打印的问题,各位兄弟帮帮忙,急用~~~~~~~~~~~
- 数据导出出错,很急
- 寻找高手求救!
- ssTab问题,在线等,多谢!
- 快看!做一个爱国的人!
- 急啊~~~~讀取INI為什么得出來的不是想得到的值???
- 关于图片处理的一系列问题????
- vb如何 检测文本框输入的是否为字母或数字~~
- 求高手解决 怎么样用vb 调用word的邮件合并 将数据库里的人员信息合并到邮件里
参考一下下面地址的读取或写入指定地址lAddr的函数ReadWriteMemory:http://topic.csdn.net/u/20110329/10/78f7baa9-d526-4a6f-8e23-6141d9bb76d3.html
如果获取的虚拟地址,那么该怎么才能获取物理地址?没有物理地址,还是不能使用ReadProcessMemory读取数据啊。
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long,byval lpBaseAddress As long,byval lpBuffer As string, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
还有就是那些理论派人士也真够可以的,说的天花乱坠的干嘛啊
我分析过鲁大师的所有DLL文件,就是没有找到它的读CPU温度的函数。所以就想到了从内存着手的办法。我再折腾一下吧,希望能有收获。。呵呵
哥们,没有这么悲剧吧?
如果我能得到地址,不管它是内存地址,还是端口地址,我都可以读取啊
比如,如果是内存地址,我可以使用CopyMemory读取,如果是端口地址,我可以使用WinIo.dll的GetPortVal来读取。现在的关键是我无法获取地址。不过,我知道这个想法的确有些剑走偏锋了。谢谢您的热心帮忙!
汇编学过一点皮毛
但毕竟VB不能内嵌汇编对我而言,如果这条路走不通,我就干脆使用Hook方式截取鲁大师的警告消息,毕竟我只是要知道CPU温度过高了,然后关闭调一些不必要的功能而已。
我只能向往了。。唉,这个就是一个费力不讨好的事情,如果实在不行,我就在CPU的散热风扇上面给他贴上一个热电阻,搞一个温度传感器,我就不信了!呵呵我使用DLL分析器看了鲁大师的所有DLL文件,没有看出个什么结果。可能是它做了隐藏了。
和底层打交道当然是汇编最好了,但汇编对于绝大多数人来说是很难的如果真的能找到这个“地址”,即便是物理地址 使用象WinIo.dll或inpout.dll是能够完成这个任务的。难度不小啊。既然要借用鲁大师,考虑一下图片验证,它的图形规则。做起来成功率应该比较高。