所以我正在阅读关于如何创建结构的手册。
一开始,我做了:
struc point X, Y
{
.X dw X
.Y dw Y
}
section '.code' code readable executable
main:
push ebp
mov ebp,esp
PP Point 0, 0 ;Crashes here..
mov esp, ebp
pop ebp
mov eax, 0x0
ret所以我想,因为它是一个局部变量,所以我需要sub esp, sizeof(Point),我做了,但它仍然崩溃..
所以我在Point结构中做了它,而不是崩溃,现在它被删除了:
section '.data' data readable writeable
Response db 13, 10, "Value: %d", 13, 10, 0
struc Point X, Y
{
sub esp, 0x8
mov dword[esp + 0x00], X
mov dword[esp + 0x04], Y
}
section '.code' code readable executable
main:
push ebp
mov ebp,esp
PP Point 0, 0 ;create a point
push PP
call Point_Valid
add esp, 0x04
mov esp, ebp
pop ebx
call [getchar]
mov eax, 0x00
ret
Point_Valid:
push ebp
mov ebp, esp
mov eax, [ebp + 0x8]
push eax ;Not sure how to get Point from eax or Point.X..
push Response
call [printf]
add esp, 0x08
mov esp, ebp
pop ebp
ret 然而,不仅上面的失败,它还触发了:

Windows 8.1恶意软件防御程序
我不明白为什么:S,但只有在结构中使用sub esp时才会发生这种情况。如果我使用.X dw X,它只会崩溃,但不会触发恶意软件防御程序。
有什么想法吗?我怎样才能把一个点传递给函数?还是创建一个本地点并将其传递给一个函数以及访问它的字段?
发布于 2014-03-18 12:46:08
在第一个示例中,您错误地将point拼写为Point,因此它不会组装(除非您告诉汇编程序忽略大小写)。
如果我们忽视这一点,你在这里做的是:
main:
push ebp
mov ebp,esp
PP point 0, 0 ;Crashes here..
mov esp, ebp
pop ebp
mov eax, 0x0几乎和你写的一样:
main:
push ebp
mov ebp,esp
dw 0,0
mov esp, ebp
pop ebp
mov eax, 0x0它只是将这两个单词插入到您放置它们的指令“流”中。如果您组装这个,然后分解输出,您将得到:
00000000 6655 push ebp
00000002 6689E5 mov ebp,esp
00000005 0000 add [bx+si],al ; <- the first 0
00000007 0000 add [bx+si],al ; <- the second 0
00000009 6689EC mov esp,ebp
0000000C 665D pop ebp
0000000E 66B800000000 mov eax,0x0
00000014 C3 ret您的pp变量必须在其他地方声明,以便它永远不会在代码路径中结束(也就是说,eip / rip不应该到达您的变量)。
如果确实需要堆栈分配的point,则可以使用virtual at。
virtual at esp-0x10 ; use whatever address is appropriate in your case
pp point 1,2
end virtual
mov ax,[pp.X]请注意,这既不为point分配空间,也不初始化;它只是设置名称-地址映射。
发布于 2014-03-18 12:43:46
在这两个变体中,您定义了不同的东西。在第一个变体中,您在代码中创建数据,然后尝试执行它。只要变量包含随机指令(在调试器中签入),代码就会崩溃。我建议将变量移到程序的数据部分--默认情况下它必须驻留在其中。
在第二次尝试中,您将数据替换为指令(尽管这里不需要使用结构),然后代码将被正确执行。这是有效的密码。
您的AV不喜欢此代码的事实是AV制造商的IMHO问题。我的建议是把它卸载。
事实上,FASM在AV假设什么是“好代码”和什么是病毒时经常遇到问题。注意,所有这些都是假阳性。
https://stackoverflow.com/questions/22479202
复制相似问题