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
#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空间的范围,因此该地址可能确实指向某些特殊功能,或者该进程本身请求了此位置被分配并加载有代码,以作为混淆的一部分使用,这可能为此类调用和信任此地址提供理由。
评论
您能否提供所引用的内存位置的汇编代码?@ElianKamal,添加了它。