失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 游戏黑客圣经GHB1学习笔记 part4(16-20)

游戏黑客圣经GHB1学习笔记 part4(16-20)

时间:2021-06-02 04:06:05

相关推荐

游戏黑客圣经GHB1学习笔记 part4(16-20)

16.How to Hack Any Game Tutorial C++ Trainer #2 - External v2(如何破解游戏-外部2)

这次我们需要记住的是两个比较重要的WindowsAPI,之后我会解释两个外部函数。

最后记录一个新功能的实现就是freezing memory,锁定某个值,实际上就是高频写入。

两个函数代码如下,一个是补丁函数,一个是nop函数

void mem::PatchEx(BYTE* dst, BYTE* src, unsigned int size, HANDLE hProcess){DWORD oldprotect;//enable read&write to select regionVirtualProtectEx(hProcess, dst, size, PAGE_EXECUTE_READWRITE, &oldprotect);WriteProcessMemory(hProcess, dst, src, size, nullptr);//restore original protect stationVirtualProtectEx(hProcess, dst, size, oldprotect, &oldprotect);}void mem::NopEx(BYTE* dst, unsigned int size, HANDLE hProcess){BYTE* nopArray = new BYTE[size];memset(nopArray, 0x90, size);PatchEx(dst, nopArray, size, hProcess);delete[] nopArray;}

其中有一个很重要的API就是VirtualProtectEx,此函数更改调用进程虚拟地址空间中已提交页面区域的访问保护。参数包括进程句柄,地址,大小,保护参数,保存现在保护状态的地址。

这两个函数的作用就是跟CE中我们nop掉指令,或者修改指令是一样的。

冻结功能的实现逻辑如下:

while (GetExitCodeProcess(hProcess, &dwExit) && dwExit == STILL_ACTIVE)//means game still active{if (GetAsyncKeyState(VK_NUMPAD1) & 1){bHealth = !bHealth;}//Continuous writeif (bHealth){mem::PatchEx((BYTE*)healthAddr, (BYTE*)&newValue, sizeof(newValue), hProcess);}//increase ammo patchif (GetAsyncKeyState(VK_NUMPAD2) & 1){bAmmo = !bAmmo;if (bAmmo){//FF 06 = inc [esi]mem::PatchEx((BYTE*)(moduleBase + 0x637e9), (BYTE*)"\xFF\x06", 2, hProcess);}else{//FF 0E = dec [esi]mem::PatchEx((BYTE*)(moduleBase + 0x637e9), (BYTE*)"\xFF\x0E", 2, hProcess);}}//no recoil NOPif (GetAsyncKeyState(VK_NUMPAD3) & 1){bRecoil = !bRecoil;if (bRecoil){mem::NopEx((BYTE*)(moduleBase + 0x63786), 10, hProcess);}else{//50 8D 4C 24 1C 51 8B CE FF D2; the original stack setup and callmem::PatchEx((BYTE*)(moduleBase + 0x63786), (BYTE*)"\x50\x8D\x4C\x24\x1C\x51\x8B\xCE\xFF\xD2", 10, hProcess);}}if (GetAsyncKeyState(VK_END) & 1){break;}Sleep(10);}

GetExitCodeProcess用于检索指定进程的终止状态,0表示已终止。

GetAsyncKeyState用于检测按键的状态,if (GetAsyncKeyState(VK_END) & 1)就表示按下了这个键的时候。

另外,patchex不仅可以修改指令,也同样可以修改数值。

源代码地址

17.Video Tutorial - How to Hack Any Game Tutorial C++ Trainer #3 - First Internal(如何破解游戏-内部教程)

什么是内部hack?

内部hack是通过将 DLL 注入游戏进程来实现的,当您这样做时,您可以直接访问进程的内存,这意味着高性能和简单性。通常,DLL 用于导出函数并像 lib一样使用,在必要时从 lib访问函数。但是在我们的例子中,我们只是要使用它们来让我们的hack代码在目标进程中运行。通过使用不同的注入方法(例如手动映射),可以使注入的 DLL 变得更加狡猾。

我们通过编辑dll文件,再使用dll注入器或者手动编写dll注入器来实现。

先说dll注入器的方法,我们编写了dll后,在dllmain.cpp文件中的dllmain函数里设置,case DLL_PROCESS_ATTACH,也就是dll被attached to 进程的时候启动hack功能

BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:{CloseHandle(CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)HackThread, hModule, 0, nullptr));}case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;}

记录几个重要的WindowsAPI

CreateThread创建要在调用进程的虚拟地址空间内执行的线程。HackThread就是我们要写的hack主功能了。

之后我的源代码使用了recalss生成的类和Auto-Padding技巧,使得在内部修改变量或者patch,nop指令更加简单。

我们不需要再给出句柄参数了,找到内存地址的写法也更加简单,如果创建了类,可以不再使用getDMAddress函数,如下图代码所示。

//continuous writes to freeze super valueif (localPlayer){if (bHealth){//*localPlayerPtr = derference the pointer, to get the localPlayerAddr// add 0xF8 to get health address//cast to an int pointer, this pointer now points to the health address//derference it and assign the value 1337 to the health variable it points to//*(int*)(*localPlayerPtr + 0xF8) = 1337;localPlayer->health = 1337;}if (bAmmo){//We aren't external now, we can now efficiently calculate all pointers dynamically//before we only resolved pointers when needed for efficiency reasons//we are executing internally, we can calculate everything when needed/** uintptr_t ammoAddr = mem::FindDMAddress((uintptr_t)localPlayerPtr, { 0x374,0x14,0x0 });int* ammo = (int*)ammoAddr;*ammo = 1337;//or just*(int*)mem::FindDMAddress((uintptr_t)localPlayerPtr, { 0x374,0x14,0x0 }) = 1337;*/*localPlayer->curr_weapon->ammoptr = 1337;}}

另外,为了让我们的trainer更易读,我们也可以在dll代码里创建一个console窗口来显示一些必要信息。

相关API以及源码如下:

AllocConsole,为调用进程分配一个新的控制台。

之后的照做就可以了。

AllocConsole();FILE* tmp;freopen_s(&tmp, "CONOUT$", "w", stdout);std::cout << "welcom to my cheat\ncreated by Antares\n";fclose(tmp);FreeConsole();

在HakcThread函数结束的时候还需要调用函数FreeLibraryAndExitThread,将加载的动态链接库 (DLL) 的引用计数减一,然后调用 ExitThread终止调用线程。该函数不返回。

FreeLibraryAndExitThread(hModule, 0);

源代码地址

18.Simple DLL Injector Source Code (手动dll注入教程)

这是使用 VirtualAllocEx、CreateRemoteThread 和 LoadLibrary制作 DLL注入器的非常简单的代码。在计算机编程中,DLL注入是一种通过强制进程加载dll来在该进程内执行代码的技术。DLL 注入经常被外部程序用来以一种其作者没有预料到或意图的方式影响另一个程序的行为。例如,注入的代码可以hook系统函数调用,或读取密码文本框的内容,这是通常无法做到的。用于将任意代码注入任意进程的程序称为DLL 注入器。

Tips:

1.在设置,链接器,清单文件,UAC账户控制务必设置成administrator,以获取管理员权限避免程序出错。

2.在常规设置里面设置字符集为多字符集。

手动注入dll需要对dll的具体实现有深度的理解,我目前理解还不是很透彻,exe怎么执行dll过程不理解,但是整个过程应该是与PE文件格式有关。

我们的操作大体分为两部分,第一步把dll的路径和名字写入到exe的某个区域,这个过程我们要用到两个API,一个是VirtualAllocEx,另一个是OpenProcess

int main(){const char* dllPath = "D:\\dll\\ac_inject.dll";const char* procName = "ac_client.exe";DWORD procId = 0;//1.get procIdwhile (!procId){procId = GetProcId(procName);Sleep(30);}//2.get proc ACCESS_AuthorityHANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, procId);std::cout << "procid:" << procId << std::endl;if (hProc && hProc != INVALID_HANDLE_VALUE){//3.alloc virtual memory for proc,to store the name of dll,return the location pointervoid* loc = VirtualAllocEx(hProc, 0, MAX_PATH, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);//4.write the dll path&name to the pointerif (loc){WriteProcessMemory(hProc, loc, dllPath, strlen(dllPath) + 1, 0);}//5.active the dll where the pointer point toHANDLE hThread = CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, loc, 0, 0);if (hThread){CloseHandle(hThread);}}if (hProc){CloseHandle(hProc);}return 0;}

首先用OpenProcess获取进程的所有权限,VirtualAllocEx的作用是,在exe的虚拟内存区域为写入dll路径和名称开辟出空间,在指定进程的虚拟地址空间内保留、提交或更改内存区域的状态。该函数将它分配的内存初始化为零。

之后,之后用WriteProcessMemory向刚分配的空间内写入dll的路径和名称。

最后用CreateRemoteThread函数,创建一个在另一个进程的虚拟地址空间中运行的线程,激活我们的dll即可。

几个重要的参数,首先是进程句柄,然后是用LoadLibraryA函数,参数是loc,具体不太理解,之后回来修改,因为dll注入也有很多种类型。

源代码地址

19.How to Debug Your Hack or Aimbot with Visual Studio(如何用VS调试)

本教程主要介绍了一些调试用法和一些小技巧,目前我还用不到,之后需要大量调试的时候需要再看看。

20.Game Hacking with Reclass Tutorial Video 2(reclass教程2)

没什么要记录的,还是reclass怎么用的教程

如果觉得《游戏黑客圣经GHB1学习笔记 part4(16-20)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。