gpt4 book ai didi

assembly - REPNZ SCAS 组装说明细节

转载 作者:行者123 更新时间:2023-12-03 13:15:32 27 4
gpt4 key购买 nike

我正在尝试对二进制文件进行逆向工程,下面的说明让我感到困惑,谁能澄清一下这到底是做什么的?

=>0x804854e:    repnz scas al,BYTE PTR es:[edi]
0x8048550: not ecx

在哪里:
EAX: 0x0
ECX: 0xffffffff
EDI: 0xbffff3dc ("aaaaaa\n")
ZF: 1

我看到每次迭代都会以某种方式将 ECX 递减 1,并且 EDI 沿着字符串的长度递增。我知道它计算字符串的长度,但就它究竟是如何发生的,以及为什么涉及“al”我不太确定。

最佳答案

我将尝试通过将代码反转回 C 来解释它。

Intel 的指令集引用(Software Developer's Manual 的第 2 卷)对于这种逆向工程非常宝贵。

REPNE SCASB

REPNE 和 SCASB 组合的逻辑:

while (ecx != 0) {
temp = al - *(BYTE *)edi;
SetStatusFlags(temp);
if (DF == 0) // DF = Direction Flag
edi = edi + 1;
else
edi = edi - 1;
ecx = ecx - 1;
if (ZF == 1) break;
}

或者更简单:
while (ecx != 0) {
ZF = (al == *(BYTE *)edi);
if (DF == 0)
edi++;
else
edi--;
ecx--;
if (ZF) break;
}

字符串长度

但是,以上内容不足以解释它如何计算字符串的长度。基于 not ecx的存在在您的问题中,我假设该片段属于此习语(或类似),用于使用 REPNE SCASB 计算字符串长度:
sub ecx, ecx
sub al, al
not ecx
cld
repne scasb
not ecx
dec ecx

转换为 C 并使用上一节中的逻辑,我们得到:
ecx = (unsigned)-1;
al = 0;
DF = 0;
while (ecx != 0) {
ZF = (al == *(BYTE *)edi);
if (DF == 0)
edi++;
else
edi--;
ecx--;
if (ZF) break;
}
ecx = ~ecx;
ecx--;

简化使用 al = 0DF = 0 :
ecx = (unsigned)-1;
while (ecx != 0) {
ZF = (0 == *(BYTE *)edi);
edi++;
ecx--;
if (ZF) break;
}
ecx = ~ecx;
ecx--;

注意事项:
  • 以二进制补码表示法,翻转 ecx 的位相当于 -1 - ecx .
  • 在循环中,ecx在循环中断前递减,因此递减 length(edi) + 1总共。
  • ecx在循环中永远不能为零,因为字符串必须占据整个地址空间。

  • 所以在上面的循环之后, ecx包含 -1 - (length(edi) + 1)-(length(edi) + 2) 相同,我们翻转位给出 length(edi) + 1 ,最后递减给 length(edi) .

    或者重新排列循环并简化:
    const char *s = edi;
    size_t c = (size_t)-1; // c == -1
    while (*s++ != '\0') c--; // c == -1 - length(s)
    c = ~c; // c == length(s)

    并反转计数:
    size_t c = 0;
    while (*s++ != '\0') c++;

    这是 strlen来自 C 的函数:
    size_t strlen(const char *s) {
    size_t c = 0;
    while (*s++ != '\0') c++;
    return c;
    }

    关于assembly - REPNZ SCAS 组装说明细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26783797/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com