我嘗試掛鉤某些函數,如果x86上有__stdcall或__cdecl,則無關緊要。ASM - 在「函數調用」期間修改寄存器
我想要做以下的事情:
1.保留堆棧
2.保留德註冊
3.執行我的東西
4.恢復寄存器
5.恢復堆棧
我沒有堆棧問題,但是我的註冊備份存在一些問題:我無法修改其中的一些備份寄存器(我無法使用堆棧,因爲我無法以這種方式備份堆棧)!
我可以將它們備份在堆上(我使用一些.EAX,.EBX等成員的結構),我從ASM訪問該結構,這是問題...我必須修改一些註冊表就可以做到這一點!
但是,這是我的故事。我真正想要了解的是對以下問題的回答:
是否存在關於可以修改的寄存器以及在函數調用期間未修改的寄存器的任何「規則」?
我用調試器檢查了一些函數調用。我在「調用SomeFunction」處添加一個斷點,按F8鍵「跳過函數調用」並檢查修改的寄存器。我可以看到類似這樣的東西: 1.根據調用約定(cdecl vs stdcall)可以修改ESP/EBP 2. EAX,EBX,EDX - 幾乎總是被修改! 3. EBX,EDI,ESI似乎總是保留下來!
因此,我的「僞解決方案」:如果我只保留那些寄存器(EBX,EDI,ESI),那麼可以嗎?我不會搞亂堆棧,所以EBP和ESP不是問題。但我必須修改一些寄存器(EAX,ECX,EDX)。
我對某些編譯器優化有任何問題嗎?是否有可能通過修改那些「無辜」寄存器來搞亂代碼:EAX,ECX,EDX?
謝謝
保留堆棧是什麼意思?你並沒有真正保留它,只是在完成後恢復SP。 – Andrey 2014-09-01 12:39:21
是的,我不修改EBP,我修改但恢復ESP。這個問題比我描述的更復雜。我只需要知道是否可以只保留那些寄存器:EBX,EDI,ESI。 – Ionut 2014-09-01 12:49:20
@lonut你必須保存所有寄存器。但我不明白你的問題,這聽起來很瑣碎。 – Andrey 2014-09-01 12:53:20