我正在创建一个简单的HACK,仅用于教育目的。一个简单的Triggerbot,从内存中读取玩家的目标是敌人YES = 1或NO = 0.我已经做了一些其他类似的HACKS然而我从来没有发现这个问题..在Rainbow Six Siege我有内存地址既静态也有动态然而作弊引擎读得很好但是当我尝试从我的C ++程序中读取它时它不起作用。不确定为什么它可以与其他游戏一起使用。我是新手,也许我做错了。
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#define F6Key 0x75
using namespace std ;
int value ;
int main()
{
cout << "Open Game .." << endl ;
system("Pause") ;
LPCWSTR gameone = L"Rainbow Six";
HWND hwnd = FindWindow(0, gameone);
if (gameone == 0)
{
cout << "Not Found." << endl ;
system("Pause") ;
}
else
{
cout << "Success finding game." << endl;
DWORD processid ;
GetWindowThreadProcessId(hwnd, &processid) ;
HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processid) ;
cout << processid ;
if (!ReadProcessMemory(process, (void *)0x25421AD9D6C, (void *)&value, sizeof(value), NULL)) {
cout << "Unable to read memory proccess";
}
else {
cout << "\n Read: " << value;
}
system("Pause");
}
return 0 ;
}
这是代码简单的按名称查找窗口,得到它的PID没问题。 OpenProcess然后当我用进程调用方法ReadProcessMemory时,地址指针值通过参数无法读取它打印if条件并且从不读取其他值。
如果我从If条件中删除函数只是为了测试,如果至少指向它给出一些随机值的东西......很奇怪,我无法读取内存它始终工作::( 有人可以帮我吗?它是安全软件之王还是什么?
答案 0 :(得分:0)
首先,您必须检查OpenProcess
返回值。如果您的进程没有足够的权限,它将返回NULL
并且任何使用此句柄的尝试都将失败。使用GetLastError
函数确定错误原因。
最有可能的是ERROR_ACCESS_DENIED
。
辅助,要成功访问外部进程内存空间,您应该使用PROCESS_VM_READ
权限打开其句柄,或为您的进程令牌启用seDebugPrivilege
。示例如何在MSDN中看到。
最后。如果内存地址(在您的情况下为0x25421AD9D6C
)无效,则ReadProcessMemory
将失败。在这种情况下,value
变量不会被初始化,任何使用它的尝试都是未定义的行为。
此外,如果您设法获得进程句柄,则在使用完毕后应使用CloseHandle
函数关闭它。
更新:如果ReadProcessMemory
返回FALSE
而GetLastError
- ERROR_PARTIAL_COPY
表示发生了网页错误,那么您正试图阅读从缓冲区开始,至少部分缓冲区未分配给物理内存。如果您知道值偏移量,请使用PSAPI GetModuleInformation
函数获取模块加载地址,并将偏移量添加到lpBaseOfDll
结构的MODULEINFO
字段。