新的操作员在装配中返回什么?

时间:2017-09-28 16:20:58

标签: c++ visual-studio assembly

这是我在汇编中的代码:

.text:00401000                 push    ebp
.text:00401001                 mov     ebp, esp
.text:00401003                 sub     esp, 8
.text:00401006                 push    4               ; unsigned int
.text:00401008                 call    ??2@YAPAXI@Z    ; operator new(uint)
.text:0040100D                 add     esp, 4
.text:00401010                 mov     [ebp+var_8], eax
.text:00401013                 mov     eax, [ebp+var_8]
.text:00401016                 mov     [ebp+var_4], eax
.text:00401019                 mov     ecx, [ebp+var_4]
.text:0040101C                 mov     dword ptr [ecx], offset aHttpWww_practi ; "http://www.practicalmalwareanalysis.com"...
.text:00401022                 mov     ecx, [ebp+var_4]
.text:00401025                 call    sub_401040
.text:0040102A                 xor     eax, eax
.text:0040102C                 mov     esp, ebp
.text:0040102E                 pop     ebp
.text:0040102F                 retn    10h
.text:0040102F _WinMain@16     endp

但我在这里有点困惑。之后

call ??2@YAPAXI@Z ; operator new(uint)

EAX寄存器设置为某个地址,我猜是新创建的对象的地址,我跳转到该位置,它包含nothing

但是

mov [ebp+var_8], eax

这条指令应该做什么?它应该将对象的地址放入var_8还是将对象的内容(前4个字节)放入var_8?好吧,我查了一下,这就是我got.

我无法理解为什么这个值存储在var_8

据我了解代码,它会创建一个对象并放置

http://www.practicalmalwareanalysis.com

中的字符串。但是在下面的说明之后

mov dword ptr [ecx], offset aHttpWww_practi ; "http://www.practicalmalwareanalysis.com"...

我检查了对象的地址,这就是我have.在我看来,这是字符串所在的地址,所以我跳到了305040并且nothing.然后我跳了405030那就是我找到字符串的地方。为什么地址“反转”(如果这是正确的词来描述)?

P.S 对不起,如果我的问题听起来很傻,我是装配新手。感谢。

1 个答案:

答案 0 :(得分:2)

call    ??2@YAPAXI@Z    ; operator new(uint)

eax是新对象的地址,在将字符串复制到其中之前,它还没有包含任何内容。因此,它只是指向一堆0。

mov     [ebp+var_8], eax

这将eax中的地址存储在[ebp + var_8]的堆栈中(var_8是子例程中作为局部变量的一些一致的偏移/常量)。

mov     dword ptr [ecx], offset aHttpWww_practi ; 

将字符串的偏移量(堆地址)移动到ecx中包含的地址所指向的内存块中。

call    sub_401040

这实际上将数据从现在存储在ecx所指向的地址的偏移量复制到第一部分中创建的新对象中。大概无论如何,除非在ret之后发生。