首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >局部变结构FASM

局部变结构FASM
EN

Stack Overflow用户
提问于 2014-03-18 12:19:53
回答 2查看 1.4K关注 0票数 4

所以我正在阅读关于如何创建结构的手册。

一开始,我做了:

代码语言:javascript
复制
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结构中做了它,而不是崩溃,现在它被删除了:

代码语言:javascript
复制
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,它只会崩溃,但不会触发恶意软件防御程序。

有什么想法吗?我怎样才能把一个点传递给函数?还是创建一个本地点并将其传递给一个函数以及访问它的字段?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-18 12:46:08

在第一个示例中,您错误地将point拼写为Point,因此它不会组装(除非您告诉汇编程序忽略大小写)。

如果我们忽视这一点,你在这里做的是:

代码语言:javascript
复制
main:
push ebp
mov ebp,esp

PP point 0, 0   ;Crashes here..

mov esp, ebp
pop ebp
mov eax, 0x0

几乎和你写的一样:

代码语言:javascript
复制
main:
push ebp
mov ebp,esp

dw 0,0

mov esp, ebp
pop ebp
mov eax, 0x0

它只是将这两个单词插入到您放置它们的指令“流”中。如果您组装这个,然后分解输出,您将得到:

代码语言:javascript
复制
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

代码语言:javascript
复制
virtual at esp-0x10  ; use whatever address is appropriate in your case
  pp point 1,2
end virtual

mov ax,[pp.X]

请注意,这既不为point分配空间,也不初始化;它只是设置名称-地址映射。

票数 1
EN

Stack Overflow用户

发布于 2014-03-18 12:43:46

在这两个变体中,您定义了不同的东西。在第一个变体中,您在代码中创建数据,然后尝试执行它。只要变量包含随机指令(在调试器中签入),代码就会崩溃。我建议将变量移到程序的数据部分--默认情况下它必须驻留在其中。

在第二次尝试中,您将数据替换为指令(尽管这里不需要使用结构),然后代码将被正确执行。这是有效的密码。

您的AV不喜欢此代码的事实是AV制造商的IMHO问题。我的建议是把它卸载。

事实上,FASM在AV假设什么是“好代码”和什么是病毒时经常遇到问题。注意,所有这些都是假阳性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22479202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档