许多专业的逆向工程师花费大量时间在为Windows编译的32位代码上,熟悉程度会提高他们的熟练程度。反向工程64位Windows程序与32位Windows程序之间的高级区别是什么?

我所谈论的事情总是无时无刻不在盯着我,而不是,例如,API的行为略有不同。例如,


64位编译器是否采用了在32位上下文中很少看到的特定优化?
我会在64位程序中看到不同的指令吗?是32位指令集中存在还是不存在?
是否需要特别了解x64x86上的工具支持?


#1 楼

x86和x86_64之间最大的区别之一是引入了RIP相对寻址。与32位ARM相似,现在可以(容易地)从当前RIP值偏移一个数据。

例如,这是x86程序中__libc_csu_init()的前几条指令:

08048420 <__libc_csu_init>:
 8048420:       55                      push   %ebp
 8048421:       57                      push   %edi
 8048422:       31 ff                   xor    %edi,%edi
 8048424:       56                      push   %esi
 8048425:       53                      push   %ebx
 8048426:       e8 f9 fe ff ff          call   8048324 <__x86.get_pc_thunk.bx>
 804842b:       81 c3 79 12 00 00       add    
0000000000400500 <__libc_csu_init>:
  400500:       48 89 6c 24 d8          mov    %rbp,-0x28(%rsp)
  400505:       4c 89 64 24 e0          mov    %r12,-0x20(%rsp)
  40050a:       48 8d 2d 97 01 20 00    lea    0x200197(%rip),%rbp        # 6006a8 <__init_array_end>
  400511:       4c 8d 25 88 01 20 00    lea    0x200188(%rip),%r12        # 6006a0 <__frame_dummy_init_array_entry>
  400518:       48 89 5c 24 d0          mov    %rbx,-0x30(%rsp)
  40051d:       4c 89 6c 24 e8          mov    %r13,-0x18(%rsp)
  400522:       4c 89 74 24 f0          mov    %r14,-0x10(%rsp)
  400527:       4c 89 7c 24 f8          mov    %r15,-0x8(%rsp)
x1279,%ebx 8048431: 83 ec 1c sub q4312078qx1c,%esp 8048434: 8b 6c 24 30 mov 0x30(%esp),%ebp 8048438: 8d b3 0c ff ff ff lea -0xf4(%ebx),%esi


它在x86_64上(注意0x40050a和0x400511):

q4312078q

您可以找到有关此约定的更多信息,请参见:http://www.codegurus.be/codegurus/programming/riprelativeaddressing_en.htm

评论


链接死了~~~

– BlueRaja-Danny Pflughoeft
16年6月30日在20:13

#2 楼

调用约定将是一大不同之处–在64位上,某些参数在寄存器中传递;参见http://en.wikipedia.org/wiki/X86_calling_conventions和参考文献

其他明显的东西包括更大的寄存器,更多的SSE寄存器和64位算术(mov QWORD / movq等)。 。超出您的期望,实际上情况非常相似。有关较大差异的概述,请参见http://en.wikipedia.org/wiki/X86-64#Architectural_features-大多数其他新功能对于内核空间代码而不是用户空间代码更为重要。除了将32位指令逻辑扩展到64位指令外,指令集还保持静态。

#3 楼

关于工具支持,Ollydbg(和Immunity Debugger)不支持x64。 Windbg可能是最好的免费替代软件。