我的外挂之路【三】远程调用

系列文章目录


我的外挂之路一按键精灵

我的外挂之路二读取内存

我的外挂之路三远程调用


前言

在前面两篇博客中,都是借助系统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,还是非常复杂的,涉及到的领域非常多,反汇编,汇编,注入执行,看着东西不多但也花了半年,实际上研究和分析一款游戏的运行,对程序员来说还是大有裨益的,它能帮助我们看到代码是如何在计算机中运行的,不得不感叹计算机先辈们的智慧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值