Traduction small code Assembly - > C

时间:2016-09-15 18:53:47

标签: c assembly x86

使用代码更新,抱歉:

汇编:

01:  cmp    edi, 5
02:  ja         short loc_10001141
03:  jmp    ds:off_100011A4[edi*4]
04: loc_10001125:
05:  mov    esi, 40h
06:  jmp    short loc_10001145
07: loc_1000112C:
08:  mov    esi, 20h
09:  jmp    short loc_10001145
10: loc_10001133:
11:  mov    esi, 38h
12:  jmp    short loc_10001145
13: loc_1000113A:
14:  mov    esi, 30h
15:  jmp    short loc_10001145
16: loc_10001141:
17:  mov    esi, [esp+0Ch]
18: …
19: off_100011A4 dd offset loc_10001125
20:     dd offset loc_10001125
21:     dd offset loc_1000113A
22:     dd offset loc_1000112C
23:     dd offset loc_10001133
24:     dd offset loc_1000113A

伪C:

switch(edi) {
case 0:
case 1:
// goto loc_10001125;
    esi = 0x40;
    break;
case 2:
case 5:
// goto loc_1000113A;
    esi = 0x30;
    break;
case 3:
// goto loc_1000112C;
    esi = 0x20;
    break;
case 4:
// goto loc_10001133;
    esi = 0x38;
    break;
default:
// goto loc_10001141;
    esi = *(esp+0xC)
    break;
}

我必须将一个小的汇编代码翻译成C,并且在汇编编程中作为一个总的noob,我需要你的帮助。

我已经找到了解决方案(你可以在上面看到),因为练习来自一本书,但它无助于我理解。

因此,我努力了解解决方案中汇编代码与交换机之间的关系。我想这是因为我无法准确地告诉代码如何使用汇编代码执行。

(更新:尝试提出更明确/具体的问题^^):跳转表如何工作,代码如何执行 - 汇编代码,而不是C - ;)

我不知道我是否足够清楚,正如我所说,我是新手,英语不是我的母语! ^^

1 个答案:

答案 0 :(得分:1)

这是代码,开始。 装配

01:   cmp     edi, 5
02:   ja      short loc_10001141    
03:   jmp     ds:off_100011A4[edi*4]
04: loc_10001125:                   
05:   mov     esi, 40h              
06:   jmp     short loc_10001145
07: loc_1000112C:                   
08:   mov     esi, 20h              
09:   jmp     short loc_10001145
10: loc_10001133:                   
11:   mov     esi, 38h              
12:   jmp     short loc_10001145
13: loc_1000113A:                   
14:   mov     esi, 30h              
15:   jmp     short loc_10001145
16: loc_10001141:                   
17:   mov     esi, [esp+0Ch]    
18: ...
19: off_100011A4 dd offset loc_10001125
20:   dd offset loc_10001125           
21:   dd offset loc_1000113A
22:   dd offset loc_1000112C
23:   dd offset loc_10001133
24:   dd offset loc_1000113A

伪C

switch(edi) {
  case 0:
  case 1:
    // goto loc_10001125;
    esi = 0x40;
    break;
  case 2:
  case 5:
    // goto loc_1000113A;
    esi = 0x30;
    break;
  case 3:
    // goto loc_1000112C;
    esi = 0x20;
    break;
  case 4:
    // goto loc_10001133;
    esi = 0x38;
    break;
  default:
    // goto loc_10001141;
    esi = *(esp+0xC)
    break;
}
...

通过分析汇编代码,您可以看到对于edi == 1和对于edi == 0,您可以跳转到相同的指令。同样适用于edi == 2和edi == 5。在Pseudo C中,你确实有一些奇怪的case语句顺序,但是请注意其中一些语句在最后是mising break。

想象一下edi == 2,你转到伪C中的情况2,然后转到Pseudo C中的情况5并将其指定给esi。想象一下edi == 5,你转到Pseudo C中的case 5并给esi分配0x30。伪C是这样制作的,以便减少指令,并在最后使用较小的可执行文件。