某魔改Uworld逆向分析

某魔改Uworld逆向分析


写在前面


tx游戏共同特点就是用了ACE的ue引擎。ACE对基础结构的保护还是很猛的

历时几周的研究,哥们终于找到定位ACE魔改Uworld的方法了。

本文原创,同时也发布视频BV13YhCzBEaP.

如果你有更好的方法欢迎和我交流


静态分析


可以看到这里的特征确实发生了变化

sub_143C59B40(&off_146B76CFO,QWORD(a1+ 136));

d7e0fb04c5fddd47be236b8f78aa2185.png

正常Uworld是这样的:
6f95145b9aa7fdcfb5c740347913a042.png

这里的它将原本直接传递给Uworld的值作为一个参数,与另一个不知道什么东西的东西一起传入到函数sub_143C59B40中

跟进函数去看也没什么重要信息。

其实这里的特征点确实没什么变化,tx喜欢每次更新上小算法已经是业界常识了(cr3也一样)他不敢上难的算法。优化这一块,我只能说没得选

但是目前分析来看他确实变化了,所以这里需要动态分析

这里科普一个常识,64位程序的第一个参数是RAX,第二个参数是RDX,第三个是R8,第四个是R9

记起来,后面要考


动态分析


首先定位到sub_143C59B40

2d137b86397de819553b987b21e89fb1.png

IDA分析已经很明确了,刚刚接受Uworld的值的参数存放在RDX寄存器中

这里可以打一个断点来看RDX寄存器的值为C36C98D0

这里可以直接观察C36C98D0的结构体

cdbe41af1289d7bb17bf7ab86e93d8af.png

0x00 ,0x10,0x20,0x28,0x30

是不是很熟悉?这就是Gworld

但是这并不是正确的地址。观察一段时间后可以发现,RDX的值又变动了

指针会变动,说明这个指针并不是我们要找的指针

(后来得到大佬指点,这一块Gworld是Gworld的某个缓存,是ACE独有的,是不能用于直接定位)

这里研究了两种办法解决这个问题


方案一


由于ACE的进程保护机制,我们几乎不可能用普通调试器进行操作

主播的电脑使用DBVM很容易蓝屏。这和AMD CPU的架构有直接关系。虚拟化对AMD的支持就像婆媳关系,主打一个名存实亡。事实上DBVM对amd架构的驱动已经停留在五年前,而电脑系统已经更新到win11 23h,所谓的驱动能跑就已经是一个奇迹了

intel的VT是对的

如果你也用的是AMD的处理器,这里推荐一个狗哥的DHS调试器(BV1Q1KSz4Eqn)。DHS目前仅支持进程附加和单个硬件断点,算是驱动调试器里比较强的。(谁懂AMD用户看到虚拟化的救赎感

这里的方法涉及到了部分虚拟化的指令,极有可能导致蓝屏(80%)。如果你是intel处理器或者能正常使用DBVM不蓝屏的可以用。这里不多废话直接上方法

查看是谁访问了C36C98D0

过一段时间出现

2d1c3d907c049d5588bdfd5942b842a9.png

这里可以看到一个cmp qworld ptr[rcx],00

这是一段cmp,大概每隔30秒会有一次这个比较。从下面的mov rcx可以看出这是一段条件赋值。示例代码参考如下:

1
2
3
CMP a, b
JLE next_label
MOV a, value

这是很有趣的发现

顺着这块地址,寻找1到3层指针就能找到uworld


方案二


这个方法泛用性并不高,而且触发条件苛刻,主播目前还没摸索触发条件。

但是我个人认为这个方法还是有价值的。因为它可以用来定位一些比较特殊的情况。

从刚刚的示例我们可以有如下推测:


  1. 某个函数的参数是一个指针,但是这个指针的指向是变化的。

  2. 某个函数的参数是一个指针,但是这个指针的指向是固定的,但是这个固定的地址是变化的。

到这里如果你坚信总会有一个指针的指针,它是不变的,那么你就是对的

这就是方法二

我在8月26日的时候测试,我并没有找到这个指针

但是截止于8月30日,我使用相同的方法成功了。所以我立马抓住机会录下了视频

d8c8123a366f4adaa771a497571b8420.png


写在后面


这个项目的其他结构并没有魔改,也没有解密。唯一的难点就是这个指针问题。这里给可能需要的人特征如下:

1
2
3
4
5
6
7
8
9
10
11

"Calabiyau-Win64-Shipping.exe"

Uworld:00 00 60 51 37 2D

+2的push即为uworld


矩阵:00 00 C0 FA ?? D9 00。

基址从sar开始