游戏外挂基础-自动施法
如何实现自动施法自动加血
1 分析施法或者加血影响了哪些已知的数据,通过数据访问或修改,顺藤摸瓜定位关键call
2 代码编写、代码量太大会导致硬编码太麻烦怎么办
使用汇编语言把代码编程一个函数处理
3 如何主动执行我们写入到游戏进程的代码:
使用API来处理一个函数,用远程线程直接调用
分析数据找到施法call
首先,直接用CE附加游戏进程
这里,我猜想的是通过游戏角色的蓝量减少来寻找到减少的函数call,但是一顿操作后发现,并不行,只能找到蓝量减少的函数指令,于是想了另外一个办法
这个游戏单机右键会让角色释放上一次释放过的技能,所以这里我就一直通过CE的未知数据,然后更改的数据
就这样子一直筛选一直一直搜索
可以看到的是这几个值一直在变化
这里的话很清楚的可以看到,就前面几个红色的一直在变动,所以就分析这几个好了, 尽量先分析几个绿色的基址先,多次变换技能后,发现先修改的是第四个绿色的基址然后后面的再再在它修改后修改,果然再我修改这个值,再一次按鼠标右键释放的技能就改了,所以我猜这个值应该是记录上一次释放技能时的是哪一个技能的值
地址为 0x00537410
这里查入进去看看是哪个修改了这个值,因为这个值是记录的上一个技能放的是什么,肯定和技能有关,查看是什么改写了这个值
然后进入OD查看,这个物理地址的指令,0x0042524A
给这里对应的函数下一个断点 0x4038BF
可以看到这里我用的是技能的第一个技能,然后前面传入了0x28参数,和一个mov ecx,mov ecx一般是传入的一个类的this指针
然后再在程序里面调试看看,打下断点后直接释放技能发现,这里再在还没有放技能的时候就直接断在这里了,所以感觉这里很有可能是问题所在之处
然后我采用在这里利用一个工具:代码注入器来将这个函数远程实现一次,发现是没问题的,注入一次使用一次技能,所以这个函数应该是使用技能的call函数
然后我发现这一坨的代码都很蹊跷:
都是对应的一个款式,所以这里我猜是技能栏和物品栏,按一下下去就会有不同的push对应的number处理,多的我这里就不演示了。
这里我就演示第一个如何自动调用第一个技能处理,
也就是这里的push 0x28
把具体的代码用汇编编写成一个函数
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
__asm
{
push 0x28
mov ecx,0x00537400
mov eax,0x004251D0
call eax
}
return 0;
}
总结
1 找到对应的函数代码
2 编写自己的要调用的代码
3 申请该游戏进程的虚拟内存空间
4 把自己的代码拷贝到申请的内存空间
5 远程调用函数
#include<Windows.h>
#include<iostream>
using namespace std;
DWORD _stdcall ThreadProc(LPVOID lpParameter)
{
__asm
{
push 0x28
mov ecx, 0x00537400
mov eax, 0x004251D0
call eax
}
return 0;
}
int main()
{
HWND hWnd = FindWindowA(NULL,"Sword2 Window");//获取游戏的窗口句柄
DWORD pid = 0;
if (hWnd == NULL)
{
MessageBoxA(0, "游戏未运行", "提示", MB_OK);
return 0;
}
GetWindowThreadProcessId(hWnd,&pid);//获取进程ID
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);//获取进程句柄
LPVOID lpAllocAddr = VirtualAllocEx(hProcess,0, 0x100,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProcess, lpAllocAddr, ThreadProc, 0x100,NULL);
HANDLE hThread=CreateRemoteThread(hProcess,NULL,0, (LPTHREAD_START_ROUTINE)lpAllocAddr,0,0,0);
return 0;
}