我已经使用Explorer Explorer提取了游戏的转储,并在IDA中查看了游戏PE文本部分的混淆部分,同时看到了遵循以下格式的代码:

mov rbp, 7FF633CE2790h
jmp rbp


据我所知,代码是可重定位的,那么为什么要在此处使用硬编码地址-似乎是指直到运行时才知道的虚拟地址?

要处理这些“硬编码”跳转地址,我是否需要将IDA中的PE重新设置为程序运行时所在的虚拟地址?我相信我使用的自卸车的基准重新设置为1.4亿,这当然会使IDA无法分析上述代码。

编辑:这是一个具体示例:

 game.exe+1B9E0E1E - 45 85 C0              - test r8d,r8d              ; ZF = r8d == 0
 game.exe+1B9E0E21 - 48 89 6C 24 F8        - mov [rsp-08],rbp          ; rsp = &a
 game.exe+1B9E0E26 - E9 D8897FFF           - jmp game.exe+1B1D9803

 game.exe+1B1D9803 - 48 8D 64 24 F8        - lea rsp,[rsp-08]          ; rsp = &b
 game.exe+1B1D9808 - 48 BD 7527F508F77F0000 - mov rbp,game.exe+1382775 ; rbp = addr1
 game.exe+1B1D9812 - 48 87 2C 24           - xchg [rsp],rbp            ; b = addr1, rbp = rbp
 game.exe+1B1D9816 - E9 E6F33C02           - jmp game.exe+1D5A8C01

 game.exe+1D5A8C01 - 48 8D 64 24 F8        - lea rsp,[rsp-08]          ; rsp = &c
 game.exe+1D5A8C06 - 48 89 1C 24           - mov [rsp],rbx             ; c = rbx
 game.exe+1D5A8C0A - 48 89 44 24 F8        - mov [rsp-08],rax          ; d = rax
 game.exe+1D5A8C0F - 48 8D 64 24 F8        - lea rsp,[rsp-08]          ; rsp = &d
 game.exe+1D5A8C14 - E9 D8151C00           - jmp game.exe+1D76A1F1

 game.exe+1D76A1F1 - 48 8B 5C 24 10        - mov rbx,[rsp+10]          ; rbx = b
 game.exe+1D76A1F6 - 48 B8 9027F508F77F0000 - mov rax,game.exe+1382790 ; rax = addr2
 game.exe+1D76A200 - E9 CA476400           - jmp game.exe+1DDAE9CF

 game.exe+1DDAE9CF - 48 0F44 D8            - cmove rbx,rax             ; rbx = (r8d == 0) ? addr2 : addr1
 game.exe+1DDAE9D3 - 48 89 5C 24 10        - mov [rsp+10],rbx          ; b = rbx (addr1 or addr2)
 game.exe+1DDAE9D8 - 48 8B 04 24           - mov rax,[rsp]                      
 game.exe+1DDAE9DC - 48 8D 64 24 08        - lea rsp,[rsp+08]          ; rsp = &c
 game.exe+1DDAE9E1 - E9 08F408FD           - jmp game.exe+1AE3DDEE              

 game.exe+1AE3DDEE - 48 8B 1C 24           - mov rbx,[rsp]
 game.exe+1AE3DDF2 - 48 8D 64 24 08        - lea rsp,[rsp+08]          ; rsp = &b
 game.exe+1AE3DDF7 - 48 8D 64 24 08        - lea rsp,[rsp+08]          ; rsp = &a
 game.exe+1AE3DDFC - FF 64 24 F8           - jmp qword ptr [rsp-08]    ; r8d == 0: jmp addr2, else jmp addr1

 ; addr1
 game.exe+1382775 - E9 234F0800           - jmp game.exe+140769D

 ; addr2
 game.exe+1382790 - E9 FDAD991C           - jmp game.exe+1DD1D592


评论

您能否提供所引用的内存位置的汇编代码?

@ElianKamal,添加了它。

#1 楼

通过阅读有关此处使用的混淆工具的信息,这是一种使分析更加困难的技术。

现在的问题是如何解决这个问题:
我想我可以使用脚本在转储的PE中找到这些绝对地址,并将其转换为IDA可以找到的地址。

还有其他想法吗?

编辑:

将转储的可执行文件加载到具有两个不同基址的IDA中之后,我发现地址常量已更改。我还在game.exe+1B1D980A的可执行文件的重定位目录中找到了一个条目(这是代码示例中的地址常量所在的位置)。

如果我可以禁止IDA在这些地址上执行的重定位,则分析将正常进行。我将对此提出一个新问题。

评论


您阅读了我答案的最后一段吗?另外,解决方法应该是一个不同的问题,这个问题是关于确定这种呼叫的原因,并且两个答案都可以解决。

– Elian Kamal
18年5月27日在5:24

@ElianKamal,是的,请参阅更新后的答案。

–P。Private
18年5月27日在5:43

#2 楼

一种可能的解释是处理包含绝对代码的游戏。

通常,在日常的日常计算机上运行的大多数游戏都是完全可重定位的,以确保在不同计算机上的最大稳定性。但是,特别是在ROM(例如用于控制台的游戏)的情况下,制造商/ OS可以提供​​/指定一些预定义的内存位置,例如,以便更轻松,更快地运行特定于控制台的功能。

基本上,这样的代码通常依赖于链接器/程序员信任的已知内存位置,并确定它包含适当的代码,这些位置可以在机器文档/开发人员指南中明确指定。

因为这是Windows上的PE,所以看起来有点奇怪,尤其是因为该地址是每个进程VA空间的范围,因此该地址可能确实指向某些特殊功能,或者该进程本身请求了此位置被分配并加载有代码,以作为混淆的一部分使用,这可能为此类调用和信任此地址提供理由。