我只是为了教育目的而创建一个简单的黑客。一个简单的Triggerbot,从记忆中读取玩家瞄准敌人的值YES =1或NO = 0。我做了一些类似的黑客,但是我从来没有发现过这个问题。在彩虹六围城中,我有静态或动态的内存地址,但是欺骗引擎读得很好,但是当我尝试从我的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时,address指针值by参数无法读取它,无法打印if条件,而从不打印值的其他读取。
如果我将函数从If条件中移除,只为了测试是否至少指向某物,它会给出一些随机值.奇怪的是,我无法读懂记忆,它总是起作用::(有人能帮我吗?是什么安全软件之王什么的?
发布于 2016-06-09 04:22:11
首先,您必须检查OpenProcess
返回值。如果您的进程没有足够的权限,它将返回NULL
,任何使用此句柄的尝试都将失败。使用GetLastError
函数确定错误原因。很可能是ERROR_ACCESS_DENIED
。
其次,要成功地访问外部进程内存空间,应该使用PROCESS_VM_READ
权限打开它的句柄,或者为您的进程令牌启用seDebugPrivilege
。例如,如何在MSDN中看到这一点。
最后也是。如果内存地址(在本例中为0x25421AD9D6C
)无效,则ReadProcessMemory
将失败。在这种情况下,value
变量不会被初始化,任何使用它的尝试都是一种未定义的行为。
另外,如果您设法获得了流程句柄,那么在您使用完它之后,应该使用CloseHandle
函数关闭它。
Upd:如果ReadProcessMemory
返回FALSE
和GetLastError
- ERROR_PARTIAL_COPY
,这意味着发生了页面错误,您正在尝试从缓冲区读取,并且至少一部分没有分配给物理内存。如果您知道您的值偏移量,使用PSAPI GetModuleInformation
函数获取模块加载地址,然后将偏移量添加到MODULEINFO
结构的lpBaseOfDll
字段中。
https://stackoverflow.com/questions/37716529
复制相似问题