zoukankan      html  css  js  c++  java
  • 数据分析之游戏日志输出协助定位

    游戏日志输出协助定位

    定位游戏内关键数据的方法有多种,接下来笔者介绍一种比较巧妙的方法——根据游戏日志数据协助定位(适用于日志比较丰富的游戏)。有时候在复杂的游戏系统中定位自己想要的数据无异于大海捞针,这时结合游戏日志协助定位可能会有意想不到的效果。

    本节以LOL为例,介绍使用游戏日志在定位游戏数据中的使用方法。背景:一般制作模拟按键的外挂,首先需要获取游戏当前的分辨率(如图 1所示)来判断当前窗口的大小,方便下一步模拟鼠标点击相关代码的开发。

    图 1

    那么如何定位出游戏当前分辨率和窗口模式数据呢,接下来将结合游戏日志进行尝试分析。

    一.获取游戏日志

    有两种方法可以获取当前对局的游戏日志:

    1)直接打开“英雄联盟GameLogsGame - R3d Logs”,每局都有对应的日志文件。

    2)手动dump,首先运行DebugView,再运行游戏,然后以游戏进程ID过滤日志,如图2所示,最后将游戏日志全量保存。

    图 2

    二.日志初步分析

    LOL日志主要分为五种类型:“OKAY”,“WARN”,“ERROR”,“ALWAYS”,“COUNT”。游戏开发人员可能关注更多的是错误和警告,对于我们要想分析游戏,主要关注“ALWAYS”,它表示游戏的一些常规日志。只要细心我们便可从中发现很多蛛丝马迹,来协助我们定位游戏的关键数据或逻辑。图 3为提取的“ALWAYS”日志效果图。

    图 3

    从图3中便可以看到游戏的一些初始化信息。下面我们搜索“1920”来定位游戏分辨率相关信息,从图 4中可以看出游戏日志中确实存在分辨率和窗口模块相关数据。

    图 4

    三.日志结合逆向分析

    使用PChunter Dump LOL核心模块(League of Legends.exe,本测试用例为6.4版本),用IDA以Binary方式打开核心模块,如图 5所示。

    图 5

    根据图 4日志字符串我们可以快速定位到游戏附近代码,然后分析上下文寻找保存游戏分辨率的数据,依次对下面四个日志进行定位。

    日志1:r3dRenderer::SetMode: Trying resolution 1920x1080, bpp 32, windowMode 0, vsync off

    日志2:In Riot::Win::Resize: Initial VideoMode(8cca018) and resolution (1920 x 1080)

    日志3:In Riot::Win::Resize: Resized window to resolution 1920x1080

    日志4:rr3dRenderLayer::InitDevice(XRes = 1920, YRes = 1080, BPP = 32,  Flags=1024) enter

    根据字符串的交叉引用分别可以找到对应的代码处,通过简要分析即可发现日志4的代码上下文存在全局变量,如图6所示。

    图 6

    根据打印日志处函数可以定位到XRes和YRes,然后会发现游戏会将XRes和YRes分别写到[0x157112C] + 0x20和[0x157112C] + 0x24处。通过CE验证数据的正确性,如图7所示,改变分辨率,监控的数据也会变化。

    图 7

    这样通过日志我们就可以快速定位到游戏关键数据在内存中的基址+偏移了。我们可以编写简易Demo进行测试,核心代码如下:

    #define LOL_XYRES   0x157112C //游戏6.4版本,版本变化全局变量也会变化

    while (true)

        {

            __try

            {

                DWORD dwXRes = *(DWORD *)(*(DWORD *)LOL_XYRES + 0x20);

                DWORD dwYRes = *(DWORD *)(*(DWORD *)LOL_XYRES + 0x24);

                DBGOUT(("[ReadXYResThread]: %d X %d", dwXRes, dwYRes));

                Sleep(1000);

     

            }__except(EXCEPTION_EXECUTE_HANDLER)

            {

                DBGOUT(("[ReadXYResThread]: Except!"));

                return FALSE;

            }

        }

    验证效果:

    图 8

    如图8所示,在游戏分辨率改变时Demo可以实时监控到。

    四.总结

    结合游戏日志协助定位关键数据是一种巧妙的方法,但不一定适合所有游戏。在拿到一个游戏时,不妨先对它的日志进行大致的梳理,标记出比较重要的日志,若发现分析出比较重要的信息,便可结合字符串交叉引用快速定位。

     

    *转载请注明来自游戏安全实验室(GSLAB.QQ.COM)

  • 相关阅读:
    虎虎的小尾巴:期货长线换月损失太大怎么处理?
    虎虎的小尾巴:做期货怎么看基本面? 2020-02-27
    C++开发--在Visual Studio2013中使用boost::split()编译过程中出现error C4996
    C++开发--在Visual Studio2013中使用boost库
    Android开发--ZZ:Android APK反编译详解(附图)
    [Python]小百合十大爬虫
    Android开发-- findViewById()方法得到空指针
    Android开发-- The content of the adapter has changed but ListView did not receive a notification
    Android开发-- 简单对话框
    Python学习--判断变量的数据类型
  • 原文地址:https://www.cnblogs.com/nothx/p/8537315.html
Copyright © 2011-2022 走看看