ByVal是传值,Byref是传址,可以ByVal 直接数,也可以ByVal 变量,&H是16进制的意思
ByVal &HCFD3D4就是直接把16进制数CFD3D4传递给调用函数,如果不加ByVal,缺省是Byref,也就是传递该数值所在的地址,结果当然就完全不一样了,如果用变量:
Dim m As Long
m = &HCFD3D4
ReadProcessMemory pHandle, ByVal m, life, 4, 0&
我这里就只说说实现原理,而不作详细的程序了。
首先是利用ToolHelp32工具枚举获取qqexe所在的进程ID,
CreateToolhelp32Snapshot(), ProcessFirst32(), 等等,
然后根据所获得的进程ID,利用OpenProcess打开并取得其hProcess,
跟着读出该进程的数据区,利用ReadProcessMemory()实现(过程中应注意速度,作出筛选&优化)
尔后扫描所获得的数据"\msgexdb"的位置,前面的东东就是QQ号码了。
这是比较简单的方法,至于还有一些更好的,不过我这就不再多作冗言赘句了。
至于跟着怎么把他读出来显示在文本框上,Text1Text = lpszQQNumber 就行了嘛。
API:
OpenProcess
ReadProcessMemory
你应该用baidu搜索。
HANDLE OpenProcess(
DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle, // handle inheritance option
DWORD dwProcessId // process identifier
);
private function OpernProcess lib "kernel32" (byval dwDesiredAccess as long,byval bInheritHandle as long,byval dwProcessId as long) as long
BOOL ReadProcessMemory(
HANDLE hProcess, // handle to the process
LPCVOID lpBaseAddress, // base of memory area
LPVOID lpBuffer, // data buffer
SIZE_T nSize, // number of bytes to read
SIZE_T lpNumberOfBytesRead // number of bytes read
);
基址
和偏移是一样的,比如游戏可能把生命值放在这样一个地址:[[[6FA9B181]+91]+99C],他是从6FA9B181这个地址中取出数据加上91得到新的地址A,再从A这个地址取出数据加上99C得到另一个地址B,然后再从B中取出生命值。由于这个算法的中间量可能会变,所以每次开启游戏,数据都可能放在不同的地址。
以上就是关于vb使用ReadProcessMemory读取程序内存全部的内容,包括:vb使用ReadProcessMemory读取程序内存、VB 怎么获得数据所在内存地址~并监视数据~、VB怎么读取内存等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)