-
-
[原创]某内测中拳头公司的fps手游GName算法逆向
-
发表于:
2024-10-10 11:09
1611
-
[原创]某内测中拳头公司的fps手游GName算法逆向
前段时间研究了一下某游戏的GName算法,水一篇文章记录一下,以下简称该游戏为C手游。
首先先dump并修复libUE4.so,拖进IDA看一下。ida解析完成后,搜ByteProperty,找到引用的函数
正常来说找函数调用,这个函数的参数就是全局变量FNamePool的指针,也就是GName,但是C手游的查引用后发现,只有一个函数sub_562B820调用过这个sub_5627A0C
其中这个v1就是本该是一个GName的值,再对sub_562B820查一次调用,随便进去一个函数,发现sub_562B820这个函数的返回值貌似返回的就是fnamePool的地址
猜测他是通过byte_9B0A620这个数组,以一定的算法去动态生成FNamePool的地址,不像其他UE4游戏,内存中没有指向他的全局变量。
那既然静态分析完了,那就实际来验证一下这个想法对不对吧。
首先先搜一下ByteProperty
找到FNamePool,然后搜索一下0x7325610000引用,果然没有全局变量指向这个地址。对这个地址下个断点,查一下调用栈
进562cf34这个地方看一下
果然跟之前猜测的差不多,写个frida脚本试试能不能生成类名
在登陆界面获取看看world的类名
也是验证成功了。
这次最开始还是花了点时间,看懂了之后就感觉这个方法还挺简单的,也算是见识了一种修改GName的方式。
/
/
sub_562B20的返回算法
return
*
(_QWORD
*
)(byte_9B0A620[(unsigned
int
)off_9B0A6A0] | (unsigned __int64)(unsigned __int16)(byte_9B0A620[dword_9B0A6A4] <<
8
) | ((unsigned __int64)byte_9B0A620[dword_9B0A6A8] <<
16
) &
0xFFFF000000FFFFFFLL
| (byte_9B0A620[(unsigned
int
)off_9B0A6AC] <<
24
) | ((unsigned __int64)byte_9B0A620[dword_9B0A6B0] <<
32
) &
0xFFFF00FFFFFFFFFFLL
| ((unsigned __int64)byte_9B0A620[dword_9B0A6B4] <<
40
) | ((unsigned __int64)byte_9B0A620[dword_9B0A6B8] <<
48
) | ((unsigned __int64)byte_9B0A620[(unsigned
int
)off_9B0A6BC] <<
56
));
/
/
sub_562B20的返回算法
return
*
(_QWORD
*
)(byte_9B0A620[(unsigned
int
)off_9B0A6A0] | (unsigned __int64)(unsigned __int16)(byte_9B0A620[dword_9B0A6A4] <<
8
) | ((unsigned __int64)byte_9B0A620[dword_9B0A6A8] <<
16
) &
0xFFFF000000FFFFFFLL
| (byte_9B0A620[(unsigned
int
)off_9B0A6AC] <<
24
) | ((unsigned __int64)byte_9B0A620[dword_9B0A6B0] <<
32
) &
0xFFFF00FFFFFFFFFFLL
| ((unsigned __int64)byte_9B0A620[dword_9B0A6B4] <<
40
) | ((unsigned __int64)byte_9B0A620[dword_9B0A6B8] <<
48
) | ((unsigned __int64)byte_9B0A620[(unsigned
int
)off_9B0A6BC] <<
56
));
[
13432
|
13587
] event_addr:
0x7325610000
hit_count:
320
, Backtrace:
[
13432
|
13587
] event_addr:
0x7325610000
hit_count:
320
, Backtrace:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课