【发布时间】: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也可以工作。对于代码大小,使用movsb或lodsb会起作用。
标签: assembly x86 reverse-engineering disassembly objdump