【问题标题】:64-bit Program - Windows "Shadow Space" Trouble64 位程序 - Windows“影子空间”问题
【发布时间】:2013-04-04 12:30:25
【问题描述】:

我正在尝试用 x64 汇编语言创建一个程序,但我在理解 x64 调用约定时遇到了问题。我认为问题在于我不知道必须为调用 CopyFile 函数保留多少影子空间。当我运行程序时,它就会崩溃。我使用 MASM 创建了这个程序。请帮我修复此代码。谢谢。

includelib \Masm64\Lib\Kernel32.lib
includelib \Masm64\Lib\User32.lib
extrn GetProcessHeap : proc
extrn MessageBoxA : proc
extrn HeapAlloc : proc
extrn GetModuleFileNameA : proc
extrn ExitProcess : proc
extrn CopyFileA : proc

dseg segment para 'DATA'
file db 'C:\CopyThisFile.txt', 0
file2 db 'C:\ThisFileWasCopied.txt', 0
succ db 'Success!', 0
capt db 'Debug', 0
dseg ends

cseg segment para 'CODE'
start proc
sub rsp, 28h
xor r8, r8
mov rdx, qword ptr file2
mov rcx, qword ptr file
call CopyFileA
xor ecx, ecx 
call ExitProcess
start endp
cseg ends
end

【问题讨论】:

  • 为什么不编写和编译一个简单的 C 程序,看看它做了什么?
  • 我对 C 了解不多,但我了解第三代语言。这是因为我想先了解低级语言,然后再逐步学习高级语言。
  • mov rdx, qword ptr file2file2 的内容加载rdx。我想你想要offset 那里。与rcx 相同。
  • 谢谢,但我也很好奇通话后 RSP 是什么。当调用者负责清理堆栈时,这意味着什么?
  • 不再需要纯汇编开发人员了。你真的应该花点时间学习一些 C 语言。这将有助于你的汇编程序以及在你脑海中的一些 C 框架。

标签: windows assembly stack x86-64 shadow


【解决方案1】:

这与栈上的空间预留无关。

您的错误在于错误地获取了字符串的地址。 mov 获取内容(前 8 个字节)而不是指向字符串的指针,因此引发 AccessViolation 异常。要解决此问题,请使用lea

format PE64 GUI 5.0
entry start

include 'WIN64A.INC'

section '.data' data readable writeable

    fileStr db 'C:\\CopyThisFile.txt', 0
    file2Str db 'C:\\ThisFileWasCopied.txt', 0
    succ db 'Success!', 0

section '.text' code readable executable

    start:

    sub rsp, 28
    xor r8, r8
    lea rdx, qword ptr file2Str
    lea rcx, qword ptr fileStr
    call [CopyFileA]
    xor ecx, ecx
    call [ExitProcess]

section '.idata' import data readable

    library kernel32,'kernel32.dll',user32,'user32.dll'

    import kernel32, \
        GetProcessHeap,'GetProcessHeap', \
        HeapAlloc,'HeapAlloc', \
        GetModuleFileNameA,'GetModuleFileNameA', \
        ExitProcess,'ExitProcess', \
        CopyFileA,'CopyFileA'

    import user32, \
        MessageBoxA,'MessageBoxA'

【讨论】:

  • 您绝对应该为根据 Win64 ABI 调用的任何函数保留影子空间 - OP 有这个想法是正确的。汇编程序不会为您执行此操作。 (并且观察到某些看似有效的东西可能会产生误导。)
  • 答案有点晚了——该程序很久以前就修复了......但是,我很好奇“qword ptr”实际上做了什么。有什么帮助吗?
  • 它是一个指向某个内存的指针,地址是64位,因此是'qword'
  • 我当然知道,但是为什么与 qword ptr fiasco 相关的推送指令会推送 file2 的内容而不是推送指针本身呢?我不知道。我对 MASM 语义有点困惑。
  • 我已经在 windows 上使用汇编语言编写了一段时间,并且我体验到阴影空间对于所有 windows 函数都不相同。调用消息框的示例通常在没有堆栈空间的情况下工作。还有 PostQuitMessage 除了在子程序中,我需要 8 个字节的影子空间。 ShellAboutA 函数需要 30h(48 字节)的影子空间,否则它会一直崩溃。有人知道如何知道每个功能的正确阴影空间吗? (都在单独的子程序中调用)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多