首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >这个汇编x86代码的反编译(C)代码构造是什么?

这个汇编x86代码的反编译(C)代码构造是什么?
EN

Stack Overflow用户
提问于 2019-04-19 17:28:11
回答 1查看 317关注 0票数 2

此代码将字符串的每个字符(位于ebp+arg_0)与不同的常量(ASCII字符)进行比较,如'I‘、'o’和'S‘。我猜,基于其他代码部分,这段代码最初是用C语言编写的。

这个比较代码部分看起来非常低效。My think ,你认为这段代码在C中会是什么样子?最初使用的是什么代码构造?到目前为止我的想法

  • 它不是循环。因为我没有看到任何向上跳转和stop-condition.
  • It's,也没有看到while/case/switch代码构造
  • ,所以我最好的猜测是这是很多连续的if/stop-condition.
  • It‘s语句。你能帮忙吗?

是的,这是挑战的一部分,我已经有了旗帜/解决方案,不用担心。只是想更好地理解代码。

EN

回答 1

Stack Overflow用户

发布于 2019-04-19 18:04:31

第一个参数(arg_0)是指向给定密码字符串的指针,例如const char *arg_0。该指针(第一个字符的地址)被加载到eax寄存器(mov eax, [ebp+arg_0])中,然后添加当前字符的索引以将其前进到该索引(add eax, 4等)。然后,该地址处的单字节被加载到eax (movzx eax, byte ptr [eax])中。

然后将该字节/字符与正确的字节/字符(cmp eax, 'I'等)进行比较。如果结果不为零(即,如果它们不相等),程序将跳转到“错误密码”分支(如果不是零,则为jnz- jump ),否则将继续进行下一次比较(并最终成功)。

因此,最接近的直接C等价物应该是这样的:

代码语言:javascript
复制
void check(const char *arg_0) {
    // presumably comparisons 0-3 are omitted
    if (arg_0[4] != 'I') goto fail;
    if (arg_0[5] != 'o') goto fail;
    if (arg_0[6] != 'S') goto fail;
    printf("Gratz man :)");
    exit(0);
fail:
    puts("Wrong password");
}

(当然,实际的C代码不太可能是这样的,因为goto fail排列不是典型的。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55759599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档