上一个内容:15.使用Ollydbg分析处理hp减伤害的函数
通过调用游戏本身处理hp-伤害的函数来实现秒杀与无敌,首先通过 15.使用Ollydbg分析处理hp减伤害的函数 它里面找到的游戏本身调用hp-伤害函数位置以及写法,把他们放到我们的辅助程序中
打开 13.优化界面化的游戏辅助 它里面的代码,用它的代码添加上图红框的辅助代码
然后Ollydbg的ctrl加g快捷键跳转到相应内存地址的位置可能跳不过去,因为Ollydbg认为进程中没有这个内存地址,需要断点jmp过去
修改的代码:新加了callData变量
int GaameCracker::OpenGame(DWORD pid)
{
hProcecss = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (hProcecss) {
LPVOID 在其它进程开辟的空间 = VirtualAllocEx(hProcecss, NULL, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (在其它进程开辟的空间) {
char callData[] = {
0x51, // push ecx
0x50, // push eax
0x6A, 0x00, // push 攻击者下标, push 2
0x68, 0x00, 0x00, 0x00, 0x00, // 伤害, push 222
0xb9, 0x00, 0x00, 0x00, 0x00, // 被攻击者地址,mov ecx,被攻击者地址
0xb8, 0x00, 0x00, 0x00, 0x00, // hp-伤害函数的地址, mov eax, 伤害函数的地址
0xFF, 0xD0, // call eax
0x58, // pop eax
0x59 // pop ecx
};
char* gongJiZheIndex = (char *)(callData + 3);
int* shangHai = (int *)(callData + 5);
int* beiGongJiZheThis = (int *)(callData + 10);
int* hpJianShangHaiHanShu = (int *)(callData + 15);
gongJiZheIndex[0] = (char)0x02;
shangHai[0] = 0x99999;
beiGongJiZheThis[0] = 0x4CEF08;
hpJianShangHaiHanShu[0] = 0x41FD40;
char data[]{ 0x81,0xFE, // cmp esi
0x00,0x00,0x00,0x00, // 角色的this
0x75, 0x02, // jne 跳两个字节
0x31,0xFF, // xor edi, edi
0x8B,0xD0, // mov eax, eax
0x29,0xFA, // sub edx, edi
0x39,0xCA,// cmp edx, ecx
0xE9,// jmp
0x00,0x00,0x00,0x00, // 返回地址
0x00,0x00,0x00,0x00, // 存储用来判断是否无敌的值
0x83,0x3D, // cmp
0x00,0x00,0x00,0x00, // 存储用来判断是否无敌值的内存地址
0x00,
0x75,0xDE,
0xEB,0xE6
};
int jmpReturnDiZhi = 0x41FD67 - ((int)在其它进程开辟的空间 + 0x10) - 0x5;
// 用来存放不确定的内存地址的值比如,角色的this值,返回地址
int* nCode = (int*)(data + 0x11);
nCode[0] = jmpReturnDiZhi;
nCode = (int*)(data + 0x2);
nCode[0] = 0x4CEF08;
wuDiAdr = (int)在其它进程开辟的空间 + 0x15;
nCode = (int*)(data + 0x1B);
// 存储用来判断是否无敌值的内存地址 赋值
nCode[0] = wuDiAdr;
// 把实现无敌的代码写入内存
WriteProcessMemory(hProcecss, 在其它进程开辟的空间, data, sizeof(data), NULL);
WriteProcessMemory(hProcecss, (LPVOID)((int)在其它进程开辟的空间 + 500), callData, sizeof(callData), NULL);
// 实现外挂逻辑代码中的返回我们修改了的游戏地址
jmpReturnDiZhi = ((int)在其它进程开辟的空间+0x19) - 0x41FD61 - 0x5;
nCode = (int*)(E9Code + 0x1);
nCode[0] = jmpReturnDiZhi;
// 跳转到实现无敌代码
DWORD dPro = 0;
VirtualProtectEx(hProcecss, (LPVOID)0x41FD61, 0x6, PAGE_EXECUTE_READWRITE, &dPro);
// ReadProcessMemory(hProcecss, (LPVOID)0x41FD61, oldE9, 0x6, NULL);
WriteProcessMemory(hProcecss, (LPVOID)0x41FD61, E9Code, sizeof(E9Code), NULL);
// 实现秒杀
VirtualProtectEx(hProcecss, (LPVOID)0x41FD86, 4, PAGE_EXECUTE_READWRITE, &dPro);
// WriteProcessMemory(hProcecss, (LPVOID)0x41FD86, miaoSha, 0x4, NULL);
ReadProcessMemory(hProcecss, (LPVOID)0x41FD86, lodMiaoSha, 0x4, NULL);
return OPEN_OK;
}
else {
return ALLOC_MEMOPRY; // 分配内存失败
}
}
return OPEN_PROCESS_FAILE; // 打开进程失败
}