【发布时间】:2015-08-22 21:07:25
【问题描述】:
所以我有一个汇编代码块来初始化一个程序,解析 kernel32,找到 GetProcAddress,然后找到 LoadLibarayA 来加载 User32.dll。它可以工作到 LoadLibraryA。它在函数调用中崩溃,但我可以看到调试器中加载了 User32.dll。如果我尝试在不同的模块(例如 Kernel32.dll)上使用 LoadLibraryA,它会返回并成功。
这里是完整的源代码,如果你想查看的话 https://gist.github.com/mojobojo/921a5af897e86bb940a2
Exception thrown at 0x00007FFAFAE8E91C (ntdll.dll) in Small.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
这是尝试加载 user32 的 sn-p。
mov rcx, ActualAddress + User32DllStr ; ActualAddress is the program address in memory
call rax ; LoadLibararyA
cmp rax, 0
je EndFunction ; Failed to open user32.dll
LoadLibraryAStr:
db "LoadLibraryA", 0
这里是调用堆栈。
ntdll.dll!RtlDosPathNameToRelativeNtPathName() Unknown
ntdll.dll!LdrpResolveDllName() Unknown
ntdll.dll!LdrpFindLoadedDll() Unknown
ntdll.dll!LdrGetDllHandleEx() Unknown
ntdll.dll!LdrGetDllHandle() Unknown
KernelBase.dll!00007ffaf82d2984() Unknown
KernelBase.dll!00007ffaf82d29ef() Unknown
user32.dll!00007ffaf934e7e8() Unknown
user32.dll!00007ffaf934dc92() Unknown
ntdll.dll!LdrpCallInitRoutine() Unknown
ntdll.dll!LdrpInitializeNode() Unknown
ntdll.dll!LdrpInitializeGraph() Unknown
ntdll.dll!LdrpPrepareModuleForExecution() Unknown
ntdll.dll!LdrpLoadDll() Unknown
ntdll.dll!LdrLoadDll() Unknown
KernelBase.dll!00007ffaf82d8e4a() Unknown
KernelBase.dll!00007ffaf82d97e5() Unknown
kernel32.dll!00007ffaf8b5499a() Unknown
Small.exe!0000000140010253() Unknown
【问题讨论】:
-
再次检查
rcx在当时确实指向了一个有效的以零结尾的字符串。那就是在call rax上设置一个断点并使用调试器检查内存。 -
我已经确认指针在正确的位置并且是空终止的。
-
在我看来好像 user32.dll 中的 DllMain 在尝试引用另一个 DLL 时崩溃了。也许您需要先加载一个必备的 DLL?
-
我不确定。我将完整的源代码上传到了要点。也许这与我重叠 DOS 和 PE 标头以获得更小的 PE 输出有关? gist.github.com/mojobojo/921a5af897e86bb940a2
标签: windows assembly crash 64-bit