3.游戏逆向-pxxx-对照UE源码和IDA分析GName偏移(ida中calloff开头地址的说明)
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
上一个内容:2.游戏逆向-pxxx-分析UE源码中的GName
找法跟之前一样,还是通过下图红框引入的头文件来找

首先使用ida打开之前x64dbg Dump下的exe文件

然后再搜索字符串之前需要设置一下ida的编码,鼠标在下图红框里拖动(要慢点拖),然后就可以看到下图蓝框里的内容UTF-16LE,这个就是游戏中使用的编码(注意要IDA加载完成,加载不完成可能看不到)

然后设置ida编码

首先在下图红框输入一个数字,输入完可以看到下图蓝框的内容

然后再选择Unicode C-style(16bits)这里是设置的编码,然后点击ok就行了

打开Names

然后搜索UnrealNames.inl里面的内容,如下图红框

然后双击下图红框

然后再按F5就能看到下图的代码

然后对比源码

然后观察特征,可以发现上图红框就是AddZeroed函数

鼠标右击选择Rename可以重命名

如下图

点击ok后,就变了,这个函数不是我们要找的,所以返回,返回按ESC键

我们要找的是GetNames函数,如下图红框它应该是GetNames函数,但是它是off_7FF7DF739028,不是sub开头的,off开头call的内存地址里的值

双击是没办法跳转的,如下图双击跳转的位置,不是个正常的代码,现在使用的ida静态分析的,没有内存怎么办?

只能运行游戏,使用CE看,但是游戏有保护CE看不了内存,过保护后面写,现在还是不要使用steam来运行游戏,通过双击游戏的exe文件不正常的运行游戏,然后使用OpenArk暂停线程的方式,这种方法游戏不会加载保护,任何CE都可以看,但是只能看开头的,游戏运行后的数据看不了,如下图来到游戏的模块首地址,也就是通过游戏exe文件名得到的地址

然后计算GetNames的偏移,查看ida里的模块首地址点击Rebase

下图红框里的就是

然后找到off_7FF7DF739028这一行代码的地址,如下图,首先点击下图红框,然后找到下图黄框,然后复制下图蓝框

然后得到偏移0x34F9C0

然后来到CE如下图

然后选择Disassemble,进行反汇编

然后就可以看到从ida看到的代码了,它call的是7FF4DE571819这个地址

按CTRL+G可以弹出跳转弹框,然后跳转到7FF4DE571819这个地址,如下图红框,很明显它并不是从UE源码中看到的GetNames函数

代码注释
| Address | Bytes | Opcode | Comment |
|---|---|---|---|
| 7FF4DE571819 | 48 8D 05 75840000 | lea rax,[7FF4DE579C95] | 将地址7FF4DE579C95加载到RAX寄存器 |
| 7FF4DE571820 | 48 8B CA | mov rcx,rdx | 将RDX寄存器的值移动到RCX寄存器 |
| 7FF4DE571823 | 48 81 C1 D0DF054B | add rcx,4805DFD0 | 将RCX寄存器的值加上立即数4805DFD0 |
| 7FF4DE57182A | 48 29 C1 | sub rcx,rax | 用RCX寄存器的值减去RAX寄存器的值,结果存回RCX |
| 7FF4DE57182D | C0 C1 01 | rol cl,01 | 将CL(RCX 的低 8 位)寄存器的值循环左移 1 位 |
| 7FF4DE571830 | 48 81 C1 A126705D | add rcx,5D7026A1 | 将RCX寄存器的值加上立即数5D7026A1 |
| 7FF4DE571837 | 48 29 C1 | sub rcx,rax | 用RCX寄存器的值减去RAX寄存器的值,结果存回RCX |
| 7FF4DE57183A | 48 C1 C1 A2 | rol rcx,-5E | 将RCX寄存器循环左移 - 5E 位(等价于循环右移 5E 位) |
| 7FF4DE57183E | 48 8B C1 | mov rax,rcx | 将RCX寄存器的值移动到RAX寄存器 |
| 7FF4DE571841 | C3 | ret | 函数返回 |

