我一直在学习如何在C ++甚至C中使用NOP函数,但是很少有关于它的在线教程。我现在一直在谷歌搜索过去几个小时,我只是被卡住了。这是我的代码。
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
using namespace std;
//#define NOP 0x90
byte NOP[] = {0x90};
void enableDebugPrivileges() {
HANDLE hcurrent=GetCurrentProcess();
HANDLE hToken;
BOOL bret=OpenProcessToken(hcurrent,40,&hToken);
LUID luid;
bret=LookupPrivilegeValue(NULL,"SeDebugPrivilege",&luid);
TOKEN_PRIVILEGES NewState,PreviousState;
DWORD ReturnLength;
NewState.PrivilegeCount =1;
NewState.Privileges[0].Luid =luid;
NewState.Privileges[0].Attributes=2;
AdjustTokenPrivileges(hToken,FALSE,&NewState,28,&PreviousState,&ReturnLength);
}
DWORD GetProcId(char* ProcName)
{
PROCESSENTRY32 pe32;
HANDLE hSnapshot = NULL;
pe32.dwSize = sizeof( PROCESSENTRY32 );
hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if( Process32First( hSnapshot, &pe32 ) )
{
do{
if( strcmp( pe32.szExeFile, ProcName ) == 0 )
break;
}while( Process32Next( hSnapshot, &pe32 ) );
}
if( hSnapshot != INVALID_HANDLE_VALUE )
CloseHandle( hSnapshot );
return pe32.th32ProcessID;
}
void WriteMem(DWORD Address, void* Value, size_t Size) {
DWORD Protect = NULL;
VirtualProtect((LPVOID)Address, 3, PAGE_READWRITE, &Protect);
memcpy((void*)Address, Value, 3);
VirtualProtect((LPVOID)Address, 3, Protect, &Protect);
}
void nop_(PVOID address, int bytes){
DWORD d, ds;
VirtualProtect(address, bytes, PAGE_EXECUTE_READWRITE, &d);
memset(address, 144, bytes);
VirtualProtect(address,bytes,d,&ds);
}
void MemCopy(HANDLE pHandle, void* Dest, const void* Src, int Len)
{
DWORD OldProtect;
DWORD OldProtect2;
VirtualProtect(Dest, Len, PAGE_EXECUTE_READWRITE, &OldProtect);
memcpy(Dest, Src, Len);
VirtualProtect(Dest, Len, OldProtect, &OldProtect2);
FlushInstructionCache(pHandle, Dest, Len);
}
int main()
{
enableDebugPrivileges();
DWORD pid;
HANDLE phandle;
// Obtain the process ID
pid = GetProcId("gr.exe");
if(GetLastError())
{
cout << "Error_PID_: " << GetLastError() << endl;
system("pause");
return -1;
}
// Obtain the process handle
phandle = OpenProcess(PROCESS_ALL_ACCESS,0,pid);
if(GetLastError())
{
cout << "Error_HANDLE_: " << GetLastError() << endl;
system("pause");
return -1;
}
// Debug info, 0 = bad
cout <<"pid : " << pid << endl;
cout <<"HANDLE: " << phandle << endl << endl;
system("pause");
// Change value to
short iValue = -1;
int choice = 0;
BYTE * bGodMode = (BYTE *) (0x409A7E); // Lives Address
bool hack = true;
while(hack)
{
system("cls");
cout << "What hack?\n0. Exit\n1. Lives\n\n!> ";
cin >> choice;
switch(choice)
{
case 0:
{
hack=false;
break;
}
case 1:
// Modify Time
cout << "God Mode On\n!> ";
// cin >> iValue;
// nop_((PVOID)(0x409A7E), 3);
// MemCopy(phandle, (PVOID)0x409A7E, &NOP, 1);
WriteMem((DWORD)(0x00409A7E), (void*)NOP, sizeof NOP);
if(GetLastError())
{
cout << "Error: " << GetLastError() << endl;
system("pause");
}
break;
default:
cout << "ERROR!\n";
break;
}
Sleep(100);
}
system("pause");
return 0;
}
这是假设NOP的DEC函数长3个字节,防止我失去生命。但是,每次我尝试它,它都会破坏黑客并说我有访问权限。我试图查找原因,其中大部分都处理了我写的位置的大小以及我正在复制的内容。否则,我完全不知道。你能帮忙的话,我会很高兴。游戏是GunRoar,基地址“0x409A7E”是DEC功能的地方。
答案 0 :(得分:1)
我对Windows调试不太熟悉(如果这是你在这里试图利用的),但我认为你没做你认为你在做的事情:)
每个进程都有自己的虚拟内存(这就是虚拟的原因)。您正在尝试在当前进程的虚拟地址空间中写入0x00409A7E
,而不是您正在尝试攻击的游戏进程。获取另一个进程的句柄并不会奇怪地将其地址映射到您的地址 - 您必须通过一些额外的Win API调用来完成它。
我认为你需要作为调试器附加到受害者进程,例如DebugActiveProcess
。否则,您的过程无法写入游戏的文本段(指令所在的位置)。
答案 1 :(得分:1)
一些快速点:
'VirtualProtect'仅适用于您当前的流程。使用“VirtualProtectEx”更改目标进程的权限。我建议您设置权限'PAGE_EXECUTE_READWRITE' - 可写,但仍可执行。
如前所述,你需要使用'WriteProcessMemory'来编写那些NOP; memset是不够的。
要执行你在这里正确讨论的hack类型,你应该在使用它的代码之前暂停目标进程中的线程,然后在完成后恢复它们。但在这个特殊情况下,这种关心可能并不重要。
答案 2 :(得分:0)
您确定您尝试写入的页面实际上具有写入权限吗?
答案 3 :(得分:0)
如果我错了,请纠正我,但你刚刚从ABA Games玩GunRoar吗?如果是这样,代码显然是开源的,实际上是在zip文件中提供的。从快速查看,您可能只需要在InGameState的shipDestroyed()方法中使用“left”成员(请参阅gamemanager.d)。进行必要的修复,你想要'godmode',构建,然后发送邮件来整合你的更改。 :)