28.1反汇编于不正确起始位置(x86)

不同于ARM和MIPS架构(任何指令长度只有2个字节长度或者4个字节长度), x86架构的指令长度是不定长的,因此,任何反汇编器从x86指令中间开始反汇编,可能会长生不正确的结果。

举个例子:

  1. add [ebp-31F7Bh], cl
  2. dec dword ptr [ecx-3277Bh]
  3. dec dword ptr [ebp-2CF7Bh]
  4. inc dword ptr [ebx-7A76F33Ch]
  5. fdiv st(4), st
  6. ;-------------------------------------------------------------
  7. db 0FFh
  8. ;-------------------------------------------------------------
  9. dec dword ptr [ecx-21F7Bh]
  10. dec dword ptr [ecx-22373h]
  11. dec dword ptr [ecx-2276Bh]
  12. dec dword ptr [ecx-22B63h]
  13. dec dword ptr [ecx-22F4Bh]
  14. dec dword ptr [ecx-23343h]
  15. jmp dword ptr [esi-74h]
  16. ;-------------------------------------------------------------
  17. xchg eax, ebp
  18. clc
  19. std
  20. ;-------------------------------------------------------------
  21. db 0FFh
  22. db 0FFh
  23. ;-------------------------------------------------------------
  24. mov word ptr [ebp-214h], cs
  25. mov word ptr [ebp-238h], ds
  26. mov word ptr [ebp-23Ch], es
  27. mov word ptr [ebp-240h], fs
  28. mov word ptr [ebp-244h], gs
  29. pushf
  30. pop dword ptr [ebp-210h]
  31. mov eax, [ebp+4]
  32. mov [ebp-218h], eax
  33. lea eax, [ebp+4]
  34. mov [ebp-20Ch], eax
  35. mov dword ptr [ebp-2D0h], 10001h
  36. mov eax, [eax-4]
  37. mov [ebp-21Ch], eax
  38. mov eax, [ebp+0Ch]
  39. mov [ebp-320h], eax
  40. mov eax, [ebp+10h]
  41. mov [ebp-31Ch], eax
  42. mov eax, [ebp+4]
  43. mov [ebp-314h], eax
  44. call ds:IsDebuggerPresent
  45. mov edi, eax
  46. lea eax, [ebp-328h]
  47. push eax
  48. call sub_407663
  49. pop ecx
  50. test eax, eax
  51. jnz short loc_402D7B

虽然上面的代码片段一开始是从错误的起始位置反汇编的,但最终,反汇编器能够自己调整到正确的轨道上。