汇编中这些变量赋值的目的/功能是什么?

时间:2018-02-13 05:23:43

标签: assembly syntax

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

在反汇编二进制文件后,我发现它位于源文件的最顶层。它上面没有别的东西,我相当肯定它与命令行输入有关,但我不确定。那么它与命令行输入有关。另外,我想知道分配变量的等号和减号究竟是什么。

1 个答案:

答案 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