这是我在汇编中的代码:
.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 对不起,如果我的问题听起来很傻,我是装配新手。感谢。
答案 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之后发生。