游戏外挂基础-自动施法

如何实现自动施法自动加血

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;
}