使用代码更新,抱歉:
汇编:
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 - ;)
我不知道我是否足够清楚,正如我所说,我是新手,英语不是我的母语! ^^
答案 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是这样制作的,以便减少指令,并在最后使用较小的可执行文件。