【问题标题】:intel x86 assembly to C [closed]英特尔 x86 汇编到 C [关闭]
【发布时间】:2015-09-29 14:30:20
【问题描述】:

我是 intel x86 程序集的新手,我正在尝试理解以下代码 sn-p 并将其转换为 C 代码。还有更多,但现在我只是想了解这里发生了什么以及它在 C 中的外观。

    mov    eax, [ebp+var_154]     ; get the address of var_154
    add    eax, 1
    mov    ecx, [ebp+var_160]     ; get the address of var_160
    sub    ecx, eax
    cmp    [ebp+var_16c], ecx
    jnb    loc_443CDF
    mov    eax, [ebp+var_176]     ; get address of var_176
    add    eax, [ebp+var_16c]
    movsx  ecx, byte ptr [eax]    ; get first byte of eax?
    and    ecx, 1
    mov    [ebp+var_18c], c1

【问题讨论】:

  • 那么,你发现了什么?注意:mov eax, [ebp+var_154] 获取的是值,而不是地址。
  • 不知道。一般情况下,无法将 assember 转换回 C。
  • 我投票决定将此问题作为离题结束,因为这是一个关于汇编程序>C 转换的问题(这通常是不可能的),并且 OP 不理解汇编程序。
  • 从这里获取 C 代码是非常简单的,但当然不会是原始 C 代码。
  • @Jester 我知道它不会是原始的 C 代码,我只是想了解发生了什么以及它在 C 中“可能”的样子。

标签: c assembly x86 reverse-engineering 32-bit


【解决方案1】:

等效的 C 代码是:

int a_1, c_1, var_154, var_160, var_16c;
char *a_2, *var_176;
char c_2, var_186;

a_1 = var_154;
a_1++;
c_1 = var_160;
c_1 -= a_1;
if (var_16c < c_1) {
    a_2 = var_176;
    a_2 += var_16c;
    c_2 = *a_2;
    c_2 &= 1;
    var_18c = c_2;

这甚至与原始代码相差无几。这些类型可能都不同,其中许多语句将合并为一个。它也可能具有误导性。您可以通过使用这些类型来获得等效代码:

int a_1, var_154, var_176;
char *a_2, *c_1, *var_160, *var_16c;
char c_2, var_186;

或者:

int var_16c;
char *a_1, *a_2, *c_1, *var_154, *var_160, *var_176;
char c_2, var_186;

要了解汇编语言,您需要学习汇编语言。没有人会为您将您看到的所有汇编程序翻译成 C。一旦你学会了汇编语言,你就会发现将它翻译成 C 语言实际上是多么的无意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2011-02-14
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多