系列文章目录
前言
在前面两篇博客中,都是借助系统api实现了模拟按键来达到一个简单的自动加血的操作,但是在实际的开发中,往往需求的功能都是非常复杂的,简单的按键模拟已经不能够满足需要,因此,本篇博客将会从一个外挂制作的角度,分析游戏源码和call,并使用C#开发语言来远程调用call,进而实现复杂的功能制作
正文开始
本篇记录了使用 Ollydbg调试分析找到地图传送Call, 并使用C#语言远程调用传送Call实现一个地图传送的功能
具体步骤为:
- 找到地图传送call
- 在pbsend下断,目的是在使用游戏中的传送功能时,能够断点
- 使用地图传送功能,断点后,向上追踪传送call
- 验证传送call是否正确
- 使用C#注入相关汇编代码,远程调用
- 使用构建汇编方法,压入正确的堆栈数据(堆栈平衡)
- C#注入汇编方法到指定进程并调用
1.Ollydbg
Ollydbg 是一款非常常用的反汇编工具,可能调试目标程序汇编代码,从而实现对一个软件的破解解密工作,本博客不会对ollydbg的相关功能和调试过程做过多描述和教学,感兴趣的可以自行学习。
1.1 对bp seng断点
游戏中任何一个操作,基本都会向服务器发送相应的数据包,因此只要在系统的发包方法send中下断,就能捕获需要的传送包
下断后,会发现send方法不断被命中,因为客户端不断的在向服务器发送数据包,如ping包,请求相关数据包等,此时,可以按空格键,禁用断点,然后在使用翅膀的瞬间,放开断点,这样命中的包就是需要的传送的数据包了,可以多次尝试
1.2 向上追踪分析源码
这个步骤非常枯燥和繁琐,需要极大的耐心,并小心地求证,一步一步直到找到正确的call为止
1.3 验证call
当锁定一个call之后,可以在此call调用call下断点,并返回游戏,看看使用相关的功能,看看是否会命中,来确定call的正确性
2.远程调用
这里使用C#来远程调用call,由于c#是高级语言,因此,需要借助asm工具类,来将汇编代码转换成相应的字节码,再将字节码注入到目标进程,才能在游戏环境正常成功的调用call
2.1 编写汇编代码
AsmTool asm = new AsmTool();
asm.Mov_EDX(0x453028);
asm.Mov_EAX(0x456d68);
asm.Mov_EAX_DWORD_Ptr_EAX();
asm.Mov_ECX(0x452E98);
asm.Call_ECX();
asm.Popad();
asm.Ret();
asm.RunAsm(mProcessId);
2.2 注入到目标进程
具体流程为:
将汇编代码转换成相应的字节码数组
然后打开进程句柄
在目标进程中开辟相应大小的内存空间
将字节码数组写入到该空间
远程执行
具体代码为:
int addre, threadhwnd;
// 将汇编代码转换成字节码数组
byte[] buffer = AsmWriteBytes(asmcode);
if (pid != 0)
{
//打开一个已存在的进程对象 0x1F0FFF 最高权限 WM_SUPER
IntPtr hwnd = WinAPI.OpenProcess(0x1F0FFF, false, pid);
if (hwnd != IntPtr.Zero)
{
// 开辟内存
addre = VirtualAllocEx(hwnd, 0, buffer.Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (addre != 0)
{
//在指定内存中写入字节集数据
int result = WriteProcessMemory(hwnd, (IntPtr)addre, buffer, buffer.Length, IntPtr.Zero);
if (result != 0)
{
uint dwThreadId;
// Create a thread in the first process.
IntPtr hThread = CreateRemoteThread(hwnd, IntPtr.Zero, 0, (IntPtr)addre, IntPtr.Zero, 0, out dwThreadId);
// 释放内存
VirtualFreeEx(hwnd, addre, buffer.Length, MEM_RELEASE);
CloseHandle(hThread);
CloseHandle(hwnd);
}
}
}
}
4.最终效果
总结
以上就是本篇博客讲述的内容了,本文简单的讲解了使用od反汇编游戏程序,断点分析找call,使用C#程序远程注入并执行call,还是非常复杂的,涉及到的领域非常多,反汇编,汇编,注入执行,看着东西不多但也花了半年,实际上研究和分析一款游戏的运行,对程序员来说还是大有裨益的,它能帮助我们看到代码是如何在计算机中运行的,不得不感叹计算机先辈们的智慧!