为了深入理解游戏安全中的CALL分析,特别是针对参数的解析,我们将采用x86dbg工具进行操作。本文将通过具体实例来阐述如何在写汇编时正确地将参数写入CALL指令中,并解释如何调用这些参数。以“喊话CALL”为例,我们将分步骤进行分析。
首先,启动x86dbg并加载游戏。
设置send函数断点,运行游戏,输入特定内容如“123456”,然后再次运行。
查看调用堆栈,复制表格数据,仅保留主线程,从第三层开始分析。
运行后,断点禁用或删除,通过Ctrl+G返回调用处,确定参数位置。
在“call”指令处下断点,通过游戏内输入文字观察参数。发现参数主要存在于“rdx”、“r8d”(32位的r8)和“rcx”中,分别对应不同模式。
通过多次尝试,确定“r8”参数为发送的文本。复制寄存器内容,并仅保留通用寄存器,分析rcx、rdx、r8、r9参数,确认r8是字符串地址。
接着,寻找rdx参数。测试发现rdx在不同模式下的变化,判定其为说话方式的编码。当前模式为0,组队模式为2,团队模式为12。
进一步查找r9参数,多次尝试后发现r9值不变,推断为固定值-FFFFFFFF。
继续寻找rcx参数,通过复制rcx,重启游戏并重新加载x86dbg,设置断点后发现其值会变化。通过分析找到rcx源自rbp+620的位置,并使用x64dbg或ida进行进一步的调试。
在64位客户端中使用64ida打开,通过跳转至返回位置进行分析。发现rcx的赋值点,进而找到rbx对rcx的赋值,以及通过rbx对rcx赋值后,如何直接调用“喊话CALL”的方法。
通过这一系列步骤,我们成功找到了“喊话CALL”指令中的四个参数:字符串地址(r8)、说话方式(rdx)、固定值(r9)和rcx,其值来源于rbx和rbp+620。至此,我们已经全面解析了参数如何被正确写入CALL指令中,并如何调用。