# goldberg_emulator 硬编码头像

# 已有实现

在编辑本文的时候才意识到去项目的issue搜索看看,当初还真是搞得晕头转向,丢人。确实有个老哥实现 (opens new window)了自定义头像。

# 前情提要

在联机游玩神界原罪2的时候,因为队伍管理界面并不显示名称而是头像导致每次上线的时候时不时角色错误,重新分配也是靠猜,并且玩破解博德3的游戏头像也固定为绝命毒师里的海森堡。开始对这件事感兴趣。

# 入手

首先当然是上网搜索,用goldberg_emulator搜索头像相关的问题并没有什么收获,但关联到了“Change Codex Walter White picture”这个帖子,于是开始往破解游戏的这方面搜索。其中了解到一些信息:

以下均为reddit帖回复:

just_another_flogger:

No, you need to use a different steam emulator. The profile picture is baked into their steam_api DLL and I forget how to change it. I did it once to see if it could be done but I completely forget now.

yet_another_flogger:

Yes, you can use a different Steam emulator as long as it's compatible with the game. Several have custom avatar support, I believe SmartSteamEmu and ALI213's emu do at least. Or you could compile your own from one of the open source ones available. The cs.rin.ru/forum/ website is the best place to find Steam emulators. I recall taking CODEX's emu apart and finding the image is baked into the Steam API function of their emulator that returns the player's avatar to the game when requested. It's stored/returned as base64 data if I recall, so you could fairly easily swap it out by modifying CODEX's compiled Steam emu as long as your image fits into the same or smaller bytes of base64 data.

(这俩老哥真不是同一个人吗?)

先使用过论坛中的其他steam模拟器,但并不是期待的效果。目光转回codex的dll。这张海森堡的图片是硬编码在steam_api64.dll里面的,将博德3里的steam_api64.dll替换掉神界原罪2里的,头像确实变成海森堡。于是最初的想法是:替换掉codex的dll中的头像数据。

# 曲折

因为yet_another_flogger说道头像数据是base64形式存在dll中的,于是用010editor看dll,但并未能定位到数据的位置。也进行了一些反编译dll的尝试,中途花费不少时间但都未能成功,逆向这些真是不熟悉。不过这期间更加理解steam emulator的意思,也从导出的全部函数中筛选出了一些可疑的函数,确实便利了下一步。一顿撞墙之后,果然还是滚回去看源码吧。

# 回归正题

dll是做什么的略知一二,那到底emulator模拟了什么?从这次的需求来看,当游戏向steam索取玩家的名称、头像等等,steam便会返回对应的数据,而与游戏对接的便是这个dll。而goldberg_emulator (opens new window)做的便是

Lets you play games that use the steam multiplayer apis on a LAN without steam or an internet connection.

goldberg_emulator的dll并不真的跟steam交互,而是对游戏的调用直接返回。这次的关键就是一个名为add_friend_avatars (opens new window)的函数。

从代码上看原有的实现是直接生成全部透明的图片数据填充。知道要干什么就好办了,不过倒没有真的实现这个功能的计划,本身也急着用来打游戏。两个想法:

  • 根据id随机出一个纯色头像
  • 硬编码头像数据 第一个当然是最合理的,不过毕竟自己用,倒是奔着第二个去了,硬塞了5个steam id的数据进去。代码位于lraty-li/goldberg_emulator (opens new window)

# 后记

之前以为gitlab只能自建,看样子不是,而且实现了自定义头像的古巴老哥还会因为政治原因用不了gitlab,不知道GitHub如何,但加上发现自己的jira看板因为过期全部被清空,一顿感慨。而且注册账号之后,search gitlab就消失了,很神秘。