我使用VS2013以下编译器选项:Visual Studio 2013/GH/Gh _penter/_pexit 64bit如何保存寄存器?
/高华(启用_penter钩子函数)
http://msdn.microsoft.com/en-us/library/c63a9b7h.aspx
/GH(启用_pexit钩子函数) http://msdn.microsoft.com/en-us/library/xc11y76y.aspx
正如我试图为我的代码实现一些基本的分析。然而,随着64位编译它不可能使用裸属性:
http://msdn.microsoft.com/en-us/library/h5w10wxs.aspx
我不认为这是一个真正的问题,但什么是问题是,我不能找到一种方法在此编译器中不支持内联汇编的寄存器。所以如果改变任何寄存器,那么它们的值就会被丢弃。例如:
; int __cdecl DllMain(void *hModule, unsigned int ulReason, _CONTEXT *pContext)
push rbx
sub rsp, 20h
call _penter
在这里,我们必须确保_penter不会垃圾RSP的值:
; int __cdecl penter(LARGE_INTEGER PerformanceCount)
PerformanceCount= LARGE_INTEGER ptr 8
sub rsp, 28h
xor eax, eax
lea rcx, [rsp+28h+PerformanceCount] ; lpPerformanceCount
mov qword ptr [rsp+28h+PerformanceCount], rax
call cs:__imp_QueryPerformanceCounter
add rsp, 28h
retn
_penter endp
在这种情况下,其作为_penter确定被固定了RSP - 但是EAX的价值观和rcx正在被覆盖。在x86编译器中,我可以简单地添加内联asm来推送和弹出这些寄存器。我如何在x64编译器中执行此操作?
不是说你不能继续前进,编写自己的概要,但Visual Studio中附带了一个采样和检测仪器基于探查 –
我剖析绕道win32 API函数,VS分析器会从结果中删除这些 - 所以我最终什么都没有。 – paulm