#include<windows.h>
int main()
{
DWORD attFun = 0x41FD40;
char hookCode[8] = { 0xE9, 0x00 , 0x00 , 0x00 , 0x00 };
char allocFunc[] = { 0x56, 0x8B,0xF1, 0x57, 0x81, 0x7E, 0X04,0X02, 0X00, 0X00, 0X00, 0X75, 0X08, 0xC7,
0x44, 0X24, 0X0C, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x00, 0x00, 0x00, 0x00
}; //无敌函数汇编指令对应的字节码,在CE里面编辑后进行转换以及复制到此处,最后四个字节是申请的内存空间和基址之间的偏移量,先填0
// 1 找到游戏进程然后打开游戏进程
HWND hwnd = FindWindowA(NULL, "Sword2 Window");
DWORD piid = 0;
if (NULL == hwnd)
{
MessageBoxA(0, "未找到游戏窗口", "提示", MB_OK);
return 0;
}
GetWindowThreadProcessId(hwnd, &piid);
if (piid == 0)
{
MessageBoxA(0, "获取进程id失败", "提示", MB_OK);
return 0;
}
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, piid);
if (hProcess == NULL)
{
MessageBoxA(0, "打开进程失败", "提示", MB_OK);
return 0;
}
// 2 申请一段内存空间(VirtualAllocEx)
char* allocAddr = (char*)VirtualAllocEx(hProcess, 0, 0x100, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (NULL == allocAddr)
{
MessageBoxA(0, "申请内存失败", "提示", MB_OK);
return 0;
}
// 3 找到攻击函数:修改这个攻击函数的前8个字节(hook前8个字节) jmp到新开辟的内存空间
DWORD oldProtect = 0;
DWORD offset = (DWORD)allocAddr - attFun - 5;
DWORD realWrite = 0;
memcpy(&hookCode[1], &offset, 4);
VirtualProtectEx(hProcess, (char*)attFun, 8, PAGE_EXECUTE_READWRITE, &oldProtect);
WriteProcessMemory(hProcess, (char*)attFun, hookCode, 8, &realWrite);
VirtualProtectEx(hProcess, (char*)attFun, 8, oldProtect, &oldProtect);
// 4 在新开辟的内存空间里面, 实现无敌逻辑
DWORD offset2 = 0x41FD48 - (DWORD)(allocAddr + 21 + 5);
memcpy(&allocFunc[22], &offset2, 4);
WriteProcessMemory(hProcess, (char*)allocAddr, allocFunc, sizeof(allocFunc), &realWrite);
system("pause");
return 0;
}
剑侠情缘2(端游)无敌功能
于 2024-02-09 09:27:06 首次发布