某三字游戏公司启动器的简单分析+过程

查看 104|回复 10
作者:VisionTravel   
某三字游戏公司启动器的简单分析+过程

简单分析HYP启动器,以方便后续的逆向分析。 20250401:添加简单前端分析。HYP的前端实现的具体代码我不会给出,这里只进行技术讨论。前端实际上也没什么好说的,主要是学习(借鉴)一下实现的方式吧... 我对前端实现没什么兴趣,所以有些部分可能写的比较模糊。

1. 观察启动器和启动器文件寻找分析思路
直接逆向可能会跳到思维惯性的坑里,所以我们可以先来根据启动器和启动器的文件和文件结构来进行推测,方便在逆向的时候更快得出我们想要的代码和实现。
1.1 观察启动器安装目录进行分析
来到启动器的安装位置,直接观察程序文件夹结构和文件进行猜测:
 HYP                                 使用CN版演示
     1.4.5.222                       启动器版本文件夹
         bearer                      Qt 网络模块
             qgenericbearer.dll
         ico                         一些游戏图标
            ️ bh3_cn.ico
            ️ hk4e_cn.ico
            ️ hkrpg_cn.ico
            ️ nap_cn.ico
         imageformats                Qt 图像处理
             qgif.dll
             qicns.dll
            ...
         platforms                   Qt 平台实现
             qwindows.dll
         resources                   CEF 资源文件夹
             locales
                 af.pak
                ...
             chrome_100_percent.pak
             chrome_200_percent.pak
             feapp.pak               启动器的资源文件?
             resources.pak
         styles                      Qt 页面样式
             qwindowsvistastyle.dll
         7z.dll                      7z
        ️ 7z.exe                      7z
        ⚙️ app.conf.dat                启动器配置文件
         Astrolabe.dll               未知
         chrome_elf.dll              CEF
         concrt140.dll               MSVC 运行库
        ️ crashreport.exe             崩溃日志上报用程序
         d3dcompiler_47.dll          DirectX 11 组件
         HoYoDeviceFpSDK.dll         获取设备指纹SDK
        ️ hpatchz.exe                 游戏更新用工具
         HYBase.dll                  基础框架?
         HYCommon.dll                公共工具?
         HYContainer.dll             启动器容器管理?
         HYContainerPlugin.dll       容器管理扩展?
         HYEngine.dll                引擎核心?
         HYGui.dll                   用户页面?
         HYLauncher.dll              启动器核心功能逻辑库?
         HYLauncherPlugin.dll        功能扩展?
        ️ HYP.exe                     启动器主程序
        ️ HYPHelper.exe               辅助服务程序?
         HYQComm.dll                 未知 网络相关?
         HYSysTrayPlugin.dll         系统图标插件
         HYUiKit.dll                 界面组件?
        ️ HYUpdater.exe               启动器自更新程序
         HYUpdaterPlugin.dll         自更新扩展
         icudt71l.dat                ICU
         icudtl.dat                  ICU
        ️ launcher.exe                启动器兼容性入口程序
         libcef.dll                  CEF
         libcrypto-1_1-x64.dll       OpenSSL 密码学库
         libEGL.dll                  OpenGL ES 接口库
         libGLESv2.dll               OpenGL ES2.0 兼容层
         libssl-1_1-x64.dll          OpenSSL HTTPS库
         MiHoYoMTRSDK.dll            Mi Trace Reporter SDK?
         msvcp140.dll                MSVC 运行库
         msvcp140_1.dll              MSVC 运行库
         msvcp140_2.dll              MSVC 运行库
         msvcp140_atomic_wait.dll    MSVC 运行库
         msvcp140_codeecvt_ids.dll   MSVC 运行库
         QCefView.dll                CEF相关的库
         Qt5Core.dll                 Qt5
         Qt5Gui.dll                  Qt5
         Qt5Networl.dll              Qt5
         Qt5Widgets.dll              Qt5
         snapshot_blob.bin           CEF
         sophon.dll                  未知
         telemetry.dll               数据统计上报
         v8_context_snapshot.bin     CEF
         vccorlib140.dll             MSVC 运行库
         vcruntime140.dll            MSVC 运行库
         vcruntime140_1.dll          MSVC 运行库
         vk_swiftshader.dll          Vulkan 兼容层
        ⚙️ vk_swiftshader_icd.json     驱动配置文件
         vulkan-1.dll                Vulcan
         xyvodsdk.dll                视频相关SDK?
 games                               游戏默认安装目录
     GenShen
        ...
     Honsan
        ...
     Hontie
        ...
     Zero
        ...
⚙️ config.ini                          全局配置文件?
️ launcher.exe                        启动器兼容性入口程序
️ uninstall.exe                       卸载
️ vc_redist.x64.exe                   MSVC 运行库安装程序
根据一些经验,我们可以很猜测HYP使用了Qt5作为基础框架,并使用CEF作为前端网页框架,并且使用.dll实现模块化,使用插件实现功能解耦。
不过存在一些尚未清楚用途和功能的库,这时候我们可以利用搜索引擎直接搜索来推测大概的用途:
 sophon.dll    某环智能分析工具
 xyvodsdk.dll  某域云视频SDK
 QCefView.dll  基于QWidget集成CEF的Web View 组件
其中 Astrolabe.dll 的功能当时还不知道,不过在查看启动器内有什么线索时,我在点击启动器的设置-关于页面内的查看客户端日志选项后发现打开的文件夹路径为C:\Users\VTS\AppData\Roaming\miHoYo\HYP\1_1\modules\astrolabe\Log,所以推测Astrolabe.dll是日志记录工具。
如果不熟悉其他的一些库(如telemetry.dll),最好是先使用浏览器搜索一下,实在不清楚的只能逆向分析来看了。
还存在一个似乎是HYP的资源文件的文件feapp.pak,推测是一个压缩文件,使用hashcat验证后确实是一个PKZIP压缩文件,并且有密码,暴力破解还是太吃时间了,所以看能不能在后续的逆向分析中找到密码。
我们已知QCefView是一个基于QWidget集成CEF的Web View 组件,并且feapp.pak的位置在CEF资源文件夹下,所以直接去看QCefView的官方文档有什么线索:添加本地Zip文件到URL的映射
果然还是有线索的,从QCefView的官方文档得知这个文件应该是启动器所需的WebApp资源,应该是前端实现相关的资源文件,不过暂时不知道如何解压查看,所以暂时先跳过。
得出结论,HYP采用Qt5作为基础框架,前端通过QCefView加载并运行本地打包的WebApp资源,使用.dll实现模块化开发,使用插件实现功能解耦,并使用sophon.dll作为智能分析工具,使用xyvodsdk.dll作为云视频SDK,使用Astrolabe.dll作为日志记录工具。
1.2 根据启动器的配置和数据存储猜测一些便于逆向分析的思路
前面我在启动器设置-页面中的查看客户端日志得知了启动器存放配置和数据的路径,路径为C:\Users\VTS\AppData\Roaming\miHoYo\HYP\1_1,所以尝试在这个路径下的文件夹中寻找一些便于逆向分析的思路和方式。
 cache
 crash
 data
 fedata
 fepak
 logs
 modules
查看各个文件夹后,筛选出应该有关键信息的文件夹:
 data
 fedata
 modules
1.2.1 data文件夹
 data
     appstore.dat
     appstore.dat.crc
     gamedata.dat
     gamedata.dat.crc
     notifications.dat
     notifications.dat.crc
     usersettings.dat
     usersettings.dat.crc
只看文件命名,这些文件都是启动器的配置文件+每个配置文件的校验文件,而且可以知道这里没有什么我们需要的信息,所以我们可以跳过这个文件夹。
1.2.2 fedata文件夹
 fedata
     blob_storage
     Cache
     Code Cache
     databases
     GPUCache
     IndexedDB
     Local Storage
     Network
     Sevice Worker
     Session Storage
     WebStorage
     DevToolsActivePort
     LocalPrefs.json
     Visited Links
这结构就非常明显就是浏览器的数据存储文件夹,也就是启动器的WebApp使用的浏览器数据存储文件夹,并且看到了DevToolsActivePort这个文件,且我们已知HYP使用了QCefView作为前端网页框架,所以这个文件应该是QCefView的调试端口文件,也就代表有办法直接调试前端的WebApp了。
1.2.3 moudles文件夹
 modules
     astrolabe
     sophon
     telemetry
观察这些文件夹下的内容,可以印证之前的推测,不过具体是干什么用的还是需要逆向分析。
到这里我们已经猜测出了一些便于逆向分析的思路,但是这些思路都是基于启动器的文件结构和文件名等精细猜测,所以下一步便是尝试逆向分析这些文件,看看有没有什么线索。
2. 简单逆向分析
2.1 确认启动器WebApp使用的浏览器的调试端口并启用调试
直接打开,确认端口为9222,且使用的是QCefView作为前端网页框架,那就可以使用DnSpy直接调试启动器主程序并添加参数-remote-debugging-port=9222。
启动程序后,在浏览器中打开localhost:9222,就可以看到启动器的调试页面了。
[img][/img]

Base02.png (507.36 KB, 下载次数: 0)
下载附件
2025-3-28 23:57 上传

" alt="" target="_blank" rel="noopener noreferrer nofollow" />
这个时候实际上已经可以不用关注之前发现有密码的feapp.dat资源文件,直接去DevTools中查看即可。
具体的调试就看各路大神发挥了,后续我也会写一篇关于前端实现的分析。
2.2 分析app.conf.dat
解密app.conf.dat的方法已在我的第一个帖子获取HYP(XX游启动器)的基本信息中详细解释思路和解密代码,这里就不再赘述了。
可以看到app.conf.dat的可读字段结构:(隐藏的字段可以自己去解密看)
{
  "_meta_ver": "1.4.5.222",
  "App": {
    "Region": "cn",
    "Language": "zh-cn",
    "Company": "miHoMo",
    "Product": "HYP",
    "ProductDisplayName": "\u7c73\u54c8\u6e38\u542f\u52a8\u5668",
    "Standalone": false,
    "Channel": "1",
    "SubChannel": "1",
    "LauncherId": "jGHBHlcOq1",
    "CPS": "hyp_mihoyo",
    "UAPC": "",
    "PrimaryGame": "hyp_cn",
    "ClientEnv": "production",
    "ClientPreview": false,
    "EnableBetaLogin": false,
    "WebApiBaseUrl": "https://hyp-api.mihomo.com/hyp/hyp-connect",
    "ThirdPartyLogin": null,
    "StartMenuDirName": "\u7c73\u54c8\u6e38\u542f\u52a8\u5668"
  },
  "FE": {
    "BridgeName": "HoYoPlayClient",
    "PackageKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  },
  "Launcher": {
    "LogDebugMode": false,
    "PlatApp": "ddxf5qt290cg",
    "Win7PatchUrl": "https://launcher-webstatic.mihomo.com/launcher-public/2023/06/08/fac986b82c31f75c0820803748a74af4_4452073143311314458.zip",
    "Win7PatchMd5": "fac986b82c31f75c0820803748a74af4",
    "Win7PatchEnable": true,
    "LoginMode": 3,
    "EnableMultiAccount": false
  },
  "ABTest": {
    "Url": "https://data-abtest-api.mihomo.com/data_abtest_api/config/experiment/list"
  },
  "Box": {
    "Url": "https://sdk-static.mihomo.com/combo/box/api/config/plat-launcher/plat-launcher"
  },
  "H5Log": {
    "Url": "https://h5log-api-dualstack.mihomo.com/common/h5log/log/batch?topic=h5log-plat-launcher"
  },
  "DataUpload": {
    "Url": "https://sdk-log-upload.mihomo.com/sdk/dataUpload"
  },
  "APM": {
    "AppId": "plat_Windows_xxxxxxxxxx",
    "AppKey": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  },
  "Updater": {
    "AppId": "xxxxxxxxxx",
    "AppKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "ReportUrl": "https://api-takumi.mihomo.com/ptolemaios_api/api/reportStrategyData"
  },
  "Epic": {
    "EnablePay": false,
    "ProductId": "",
    "SandboxId": "",
    "DeploymentId": "",
    "CredentialsId": "",
    "CredentialsSecret": ""
  }
}
app.conf.dat主要还是配置启动器的各类参数:(这里只写出一部分字段)
基础配置(App):
[table]
[tr]
字段[/td]
作用[/td]
[/tr]
[tr]
[td]Region

启动器, 文件

VisionTravel
OP
  


BrutusScipio 发表于 2025-3-28 23:45
技术栈不是U3D吗?启动器怎么用qt,web前端万用electron

1、Electron对前端开发者确实更友好,但是在调用系统的原生API复杂度很高,跨平台实现时需要处理不同操作系统的差异,且这个启动器会有频繁的系统级操作,这个时候Electron的缺点就体现出来了。安全也是个问题。在开发这种启动器时Electron的缺点能找出很多,我不一一列举。
2、使用Qt可能是注重性能和跨平台支持,并且结合使用QCefView后可以使用Web前端技术来开发应用的UI,同时保持使用Native的方式编写核心业务/功能逻辑。(来自QCefView的官方文档)
3、至于技术栈得看是哪方面的团队和职位啊...这个是启动器不是游戏本体...
超逸绝尘   

果然非常专业
jiemax   

厉害,感谢分享                              
8486361321   

好厉害,感谢分享,学习中。
han163426   

我嘞个崩坏3
zbfdyw   

感谢分享,分析很详实,感谢!@
taidan   

太牛了 万分感谢 学习到了
bokewangyu   

万分感谢 学习到了
myownsword   

萌新学习一下 现在还看不太懂
您需要登录后才可以回帖 登录 | 立即注册

返回顶部