在“实用逆向工程x86 - x64 ARM,内核和混淆”的第25页中,我发现了一个重新编译为粗略C的汇编代码示例,其中lodsd和stosd指令“translate”似乎是反转的。因为我对汇编语言不熟悉,所以我想知道它是不是真的是一个勘误表,或者还有一些我可能没有考虑的事情。 这是简单的代码:
装配
01: 8B CA mov ecx, edx
02: loc_CFB8F:
03: AD lodsd
04: F7 D0 not eax
05: AB stosd
06: E2 FA loop loc_CFB8F
粗糙C
while (ecx != 0) {
eax = *edi;
edi++;
*esi = ~eax;
esi++;
ecx--;
}
在我读到的关于lods指令的每个在线解释中,都说SI / ESI中的任何值都存储在AL / AX / EAX中,然后递增ESI。
同样地,stos应该表示粗略的高级“memset”,其中AL / AX / EAX中的任何内容都写入DI / EDI然后递增寄存器。
但是看起来我错了,因为在上面的翻译中,eax被赋予了EDI的取代引用而不是ESI,并且在ESI指向的值的正下方获得了stos的反向eax。我在这里错过了什么吗?
答案 0 :(得分:3)
您的说法是正确的,因为C“翻译”似乎已交换edi
和esi
。但即便如此,翻译仍有一些问题。首先,汇编代码将始终执行一个副本,因此相应的C构造实际上将是do ... while
。其次,指针是递增还是递减实际上由方向标志确定,方向标志未指示其状态。我将代码翻译为:
// note: this assumes that the direction flag is clear (increment mode)
do {
eax = *esi;
esi++;
*edi = ~eax;
edi++;
ecx--;
} while (ecx != 0);