【问题标题】:What do these instructions mean? (Disassembly)这些说明是什么意思? (拆卸)
【发布时间】:2016-07-12 17:24:57
【问题描述】:

我几乎可以肯定ebp+0x8 指向一个字符串(程序实际上通过提示询问它,但我不确定它的存储位置)。线条的一般概念是什么?为什么要在 ebp+8 的 32 位部分加 1?

 mov    eax,DWORD PTR [ebp+0x8]
 movzx  eax,BYTE PTR [eax]
 mov    BYTE PTR [ebp-0x11],al
 add    DWORD PTR [ebp+0x8],0x1
 mov    eax,DWORD PTR [ebp+0x8]
 movzx  eax,BYTE PTR [eax]
 test   al,al

【问题讨论】:

  • 它显然是在测试字符串是否只是一个字符,并将第一个字符复制到ebp-0x11+1 是检查终止零的if (string[1] == 0) 条件的一部分。
  • 那是一些严重的脑死代码。这是一个调试/未优化的构建,对吧?你有这个但没有来源很奇怪。合理的代码会做mov edx, [ebp+8]/movzx eax, byte ptr [edx+1]/test al,al。 (我省略了将第一个字节复制到[ebp-0x11] 的本地数组,因为这个片段不使用它。如果不需要复制,即使cmp byte ptr [edx+1], 0 也可以工作。对于代码大小,使用movsblodsb 会起作用。

标签: assembly x86 reverse-engineering disassembly objdump


【解决方案1】:

EBP 寄存器用于您的函数变量。

我认为EBP + 0x8 是您的第一个函数参数。 add DWORD PTR [ebp+0x8],0x1 是这样的:

proc01(char *c01){
''''
c01++;//add DWORD PTR [ebp+0x8],0x1
...
}

【讨论】:

  • 作为关于“NOT EBP”的旁注,EBP 有时也用作通用寄存器,尤其是在 FPO 优化的情况下。
  • @Amir 请更正答案中的语法错误!
  • @SepRoland 我用 mingw 编译器在代码块中编译了我的代码,它运行良好,没有错误。
  • 语法错误在汇编指令中。你遗漏了一些方括号!
  • @SepRoland 修复了它。
猜你喜欢
  • 2014-12-24
  • 1970-01-01
  • 2013-05-09
  • 2014-09-20
  • 2022-12-05
  • 2010-11-03
  • 2012-01-05
相关资源
最近更新 更多