微软模拟飞行2020(简称MSFS2020)的画质那是相当棒了,逼真的云、丰富的地面景色,特别是很多youtube的影片中将真实地场景和游戏的场景对比起来看也相差无几,让人觉得十分的震撼。但拿到游戏后在中国飞,就发现非常多的问题,包括地图老旧、地图缺失(生成随机的景色),让人顿时觉得失望至极。如果你平时用Google Earth,就会发现Google的整个卫星地图是十分的优秀的,全球几乎都有高清的影像,而且更新的比较快。如果能用Google Earth的影像来替换Bing的老旧地图,那就非常的赞了。

这个想法在微软的社区里面也有很多人提到,Reddit也有人尝试将Google的地图导出来,然后导入到Blender,通过创建SDK的形式在游戏中替换一小部分区域的地图。但我尝试了一下发现非常的复杂,只能替换一小部分。后来我开始研究起来了网络的流量,想到是不是游戏也在下载一些卫星图片呢?答案是肯定的。

需要用的工具有Proxifier和Charles,并且将证书装上。在Charles截获到网络的请求中,有大量的和卫星图片相关的URL。这就让我想到是不是可以用mitmproxy进行截获,将Google的图片返回回去呢?如果是的话,Google的图片和Bing的图片能对上么?

原理

最早我尝试使用Charles提供的Map Remote和Map Local等功能,都没有成功,游戏中一直报错。后来不信邪,我写了个mitmproxy脚本,将一个固定的图片返回,非常好,游戏中所有的地图都被替换。然后Google的图片和Bing的图片都遵循一样的切片规则,这就非常的方便了。

随后我做了第一版替换的脚本,可以参看这个提交。在MSFS2020的QQ群里面也有部分人尝试,但步骤复杂,很多人不成功。我后来也发现使用mitmproxy以后会造成UDP丢失,游戏中的在线玩家等就看不到了,非常的不爽。

后来看到另外一个老外做了一些前期工作,实现了Google地图的切换,但他的脚本没法运行起来。看思路来讲就是替换DNS结果,然后自己建立一个本地的服务器,将流量欺骗到本地服务中,进行处理。顺着这个思路,解决了一些和https证书认证等相关的问题后,顺利的做出来第二个版本。

现在这个版本在不断的改进,加入了自动以管理员权限运行、自动替换hosts、离线缓存等功能。在实现的过程中也学到了不少的东西:

  • 代理中使用socks5://xxxsocks5h://xxx不一样,后者可以实现在远端解析DNS,防止本地DNS污染
  • mkcert工具加上ecdsa参数生成的证书可以生成Edge信任的本地证书
  • DiskCache可以用来解决图片的缓存问题
  • PyInstaller打包的exe文件很多杀毒软件报错,目前暂时没有完整的解决方案

GitHub上的工程也在不断的更新和得到反馈。下一步可能的方向是看从哪里搞到建筑物替换掉原始的!