【发布时间】:2020-09-20 03:42:54
【问题描述】:
首先,我是一名学生,我对C、C++和汇编程序的知识还不是很全面,所以我非常努力地理解它。
我有一段来自 Intel x86-32 位处理器的汇编代码。
我的目标是将其转换为源代码。
0x80483dc <main>: push ebp
0x80483dd <main+1>: mov ebp,esp
0x80483df <main+3>: sub esp,0x10
0x80483e2 <main+6>: mov DWORD PTR [ebp-0x8],0x80484d0
0x80483e9 <main+13>: lea eax,[ebp-0x8]
0x80483ec <main+16>: mov DWORD PTR [ebp-0x4],eax
0x80483ef <main+19>: mov eax,DWORD PTR [ebp-0x4]
0x80483f2 <main+22>: mov edx,DWORD PTR [eax+0xc]
0x80483f5 <main+25>: mov eax,DWORD PTR [ebp-0x4]
0x80483f8 <main+28>: movzx eax,WORD PTR [eax+0x10]
0x80483fc <main+32>: cwde
0x80483fd <main+33>: add edx, eax
0x80483ff <main+35>: mov eax,DWORD PTR [ebp-0x4]
0x8048402 <main+38>: mov DWORD PTR [eax+0xc],edx
0x8048405 <main+41>: mov eax,DWORD PTR [ebp-0x4]
0x8048408 <main+44>: movzx eax,BYTE PTR [eax]
0x804840b <main+47>: cmp al,0x4f
0x804840d <main+49>: jne 0x8048419 <main+61>
0x804840f <main+51>: mov eax,DWORD PTR [ebp-0x4]
0x8048412 <main+54>: movzx eax,BYTE PTR [eax]
0x8048415 <main+57>: cmp al,0x4b
0x8048417 <main+59>: je 0x804842d <main+81>
0x8048419 <main+61>: mov eax,DWORD PTR [ebp-0x4]
0x804841c <main+64>: mov eax,DWORD PTR [eax+0xc]
0x804841f <main+67>: mov edx, eax
0x8048421 <main+69>: and edx,0xf0f0f0f
0x8048427 <main+75>: mov eax,DWORD PTR [ebp-0x4]
0x804842a <main+78>: mov DWORD PTR [eax+0x4],edx
0x804842d <main+81>: mov eax,0x0
0x8048432 <main+86>: leave
0x8048433 <main+87>: ret
这是我从代码中了解到的:
有4个变量:
a = [ebp-0x8] ebp
b = [ebp-0x4] eax
c = [eax + 0xc] edx
d = [eax + 0x10] eax
价值观:
0x4 = 4
0x8 = 8
0xc = 12
0x10 = 16
0x4b = 75
0x4f = 79
类型:
char (8 bits) = 1 BYTE
short (16 bits) = WORD
int (32 bit) = DWORD
long (32 bits) = DWORD
long long (32 bit) = DWORD
这是我能够创建的:
#include <stdio.h>
int main (void)
{
int a = 0x80484d0;
int b
short c;
int d;
c + b?
if (79 <= al) {
instructions
} else {
instructions
}
return 0
}
但我被困住了。我也无法理解“cmp al ..”这个句子与什么相比,“al”是什么?
这些说明如何工作?
编辑1:
也就是说,正如你评论的那样,大会似乎是错误的,或者正如某些 cmets 所说,这太疯狂了!
代码和练习来自以下书籍:“逆向,逆向工程”第 140 页(3.8 建议练习)。我永远不会想到这是错误的,如果是这样,这显然让我难以学习......
所以不能逆向获取源代码,因为它不是一个好的汇编?也许我没有被压迫?可以优化吗?
编辑2:
嗨!
我确实问过,最后她说这应该是 c 代码:
inf foo(void){
char *string;//ebp-0x8
unsigned int *pointerstring//[ebp-0x4]
unsigned int *position;
*position = *(pointerstring+0xc);
unsigned char character;
character=(unsigned char) string[*position];
if ((character != 0x4)||(character != 0x4b))
{
*(position+0x4)=(unsigned int)(*position & 0x0f0f0f0f);
}
return(0);
}
这对你有任何意义吗?有人可以向我解释一下吗? 真的有人这样编程吗?
非常感谢!
【问题讨论】:
-
long long (32 bit) = DWORD不正确。 C++ 标准要求long long为 64 位。 (嗯,不完全是,但它必须支持的最大值是它需要 64 位来存储它) -
如果您需要询问
al是什么,那么您需要对处理器进行更深入的研究,然后才能理解反汇编或汇编列表。al寄存器是eax寄存器的最低有效 8 位,ax是 l.s.eax的 16 位。bl、cl、dl、bx、cx和dx类似。ah也是eax的下 8 位,因此ah和al一起构成ax。 -
Here's a link to the documentation。查找标题为“基本程序执行寄存器”的部分
-
@PeterCordes 我不认为你在放屁。我认为那个大会有一些非常奇怪的地方。特别是在
0x80483f2 <main+22>: mov edx,DWORD PTR [eax+0xc]之后,在我看来,返回地址最终会出现在edx中,考虑到随后的代码如何处理它,这似乎是不可取的。 -
除非章节是关于混淆代码的,否则我会写信给作者。代码中有一个微不足道的逻辑错误,而且这本书没有在 Google 上弹出(你给我们的名字是对的吗?)所以我倾向于相信这本书要么有一个关于控制流混淆的精彩章节,要么有是由不应该写的人写的。
标签: c assembly x86 reverse-engineering