在一些舊的匯編中,它使用 push 來傳遞引數,例如
push eax
push ebx
call xxx
所以我知道 origin 函式有兩個引數。
但是有些匯編使用暫存器來傳遞引數,例如在ollydbg中
MOV QWORD PTR [RSP 90],RBP
MOV RAX,QWORD PTR [RCX]
MOV R8,RDX
MOVSXD RBP,EDI
JBE SHORT 61B646C0
MOV R9,RSI
CALL QWORD PTR [RAX 10]
我知道呼叫是否有兩個引數,應該是RCX,RDX,但我不知道有多少。
我嘗試用一??些簡單的函式撰寫一些C 代碼,但是在閱讀了函式的上一行匯編后,如果不知道源代碼,我仍然找不到邏輯。
uj5u.com熱心網友回復:
在呼叫之前運行一條mov r9, rsi指令來設定 R9 是一個明確的信號,它是一個 arg,所以如果那是 Windows x64,至少有 4 個總 args,或者如果那是 x86-64 System V,至少有 6 個整數/指標 args。你提到 RCX 和RDX,而 Ollydbg 是一個 Windows 除錯器,所以大概是 Windows x64。這與在 RCX 中使用結構/類指標作為this成員函式的引數是一致的。(在這種情況下是虛擬的,通過 vtable 間接)。
R9 在兩種主流的 x86-64 呼叫約定中都被呼叫破壞了,因此沒有理由 amov r9, rsi存在于以 else 結尾的基本塊中call。(除非這是混淆代碼。) 在 Windows x64 中,RSI 是保留呼叫的,因此它很可能mov r9, rsi將一些區域變數作為函式 arg 傳遞,而 RSI 中的副本在呼叫中仍然存在。
但正如 Jester 所說,你不能總是確定堆疊上的東西是函式引數還是只是保存以備后用。所以你不能確定只有4 個引數,如果有任何商店[rsp 32](又名[rsp 0x20])。
查看被呼叫者是一個更好的跡象,但某些函式可能會忽略它們的某些引數。尤其是在這種情況下,call [RAX 0x10]可能正在索引 vtable;虛函式可能具有并非所有實體都需要的引數。但是,如果您確實在被呼叫者中看到了在沒有先寫入暫存器或記憶體位置的情況下讀取的代碼,那么這要么是代碼中的錯誤,要么是表明這是一個輸入的跡象。如果它是傳遞 arg 的暫存器之一或就在回傳地址之上,那么它就是一個函式 arg。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/521683.html
標籤:Intel Collective 部件x86-64逆向工程ollydbg
上一篇:x86架構是否支持將布林值打包為位以并行化邏輯操作?
下一篇:如何在MASM中跨段填充塊?
