var_30= qword ptr -30h
var_24= dword ptr -24h
var_20= dword ptr -20h
var_1C= dword ptr -1Ch
var_18= dword ptr -18h
var_14= dword ptr -14h
var_10= dword ptr -10h
var_8= qword ptr -8
在反汇编二进制文件后,我发现它位于源文件的最顶层。它上面没有别的东西,我相当肯定它与命令行输入有关,但我不确定。那么它与命令行输入有关。另外,我想知道分配变量的等号和减号究竟是什么。
答案 0 :(得分:1)
为了使列表更容易理解,一些反汇编程序试图解释常见的代码模式。
这种模式之一是访问具有相对于frame pointer的负偏移的局部变量,但这也可以由处理堆栈中没有帧指针的数据的代码触发。
这个有目的的未经优化的32位程序 1 使用帧指针和两个本地变量来计算第n个三角形数字:
push ebp
mov ebp, esp
sub esp, 08h
push ebx
mov DWORD PTR [ebp-04h], 1
mov DWORD PTR [ebp-08h], 0
_loop:
mov ebx, DWORD PTR [ebp-04h]
cmp ebx, DWORD PTR [ebp+08h]
ja _end
mov ebx, DWORD PTR [ebp-04h]
add DWORD PTR [ebp-08h], ebx
inc DWORD PTR [ebp-04h]
jmp _loop
_end:
mov eax, DWORD PTR [ebp-08h]
pop ebx
add esp, 08h
pop ebp
ret 04h
1 程序结构,循环的布局和局部变量的使用被夸大了用于教学目的。
反汇编程序会看到对[ebp-xx]
的访问并为其命名:
;var_8 = DWORD PTR -8
;var_4 = DWORD PTR -4
;par_8 = DWORD PTR 8
push ebp
mov ebp, esp
sub esp, 08h
push ebx
mov DWORD PTR [ebp+var_4], 1
mov DWORD PTR [ebp+var_8], 0
_loop:
mov ebx, DWORD PTR [ebp+var_4]
cmp ebx, DWORD PTR [ebp+par_8]
ja _end
mov ebx, DWORD PTR [ebp+var_4]
add DWORD PTR [ebp+var_8], ebx
inc DWORD PTR [ebp+var_4]
jmp _loop
_end:
mov eax, DWORD PTR [ebp+var_8]
pop ebx
add esp, 08h
pop ebp
ret 04h
通常,人们可以在进行逆向工程时重命名这些var:
;sum = DWORD PTR -8
;i = DWORD PTR -4
;n = DWORD PTR 8
push ebp
mov ebp, esp
sub esp, 08h
push ebx
mov DWORD PTR [ebp+i], 1 ;Start from i=1...
mov DWORD PTR [ebp+sum], 0 ;Result is 0 initially
_loop:
mov ebx, DWORD PTR [ebp+i]
cmp ebx, DWORD PTR [ebp+n]
ja _end ;... to i <= n
mov ebx, DWORD PTR [ebp+i]
add DWORD PTR [ebp+sum], ebx ;sum += i
inc DWORD PTR [ebp+i] ;i++
jmp _loop
_end:
mov eax, DWORD PTR [ebp+sum]
pop ebx
add esp, 08h
pop ebp
ret 04h