16.在目标进程构建CALL执行代码

上一个内容: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; // 打开进程失败
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值