hook api方法不外乎有修改匯入表和修改目標函式**,讓其調整到hook函式處執行。這裡僅僅說下後者。『
後者主要實現為:通過鉤子將**注入到目標程序(簡單點就通過鉤子載入dll的方式來hook;複雜點的話就
使用建立遠端執行緒的方式來進行),然後通過修改要注入的目標函式其實幾個位元組(一般來說是5個位元組),替換
為乙個無條件跳轉指令,讓其跳轉到目標函式來執行。
一般來說,我們可以這樣:
假設要截獲的原函式
void srcfn(...)
解惑的目標函式dstfn()。
我們修改srcfn的前面幾個位元組,讓其執行jmp dstfn執行。
然後在目標函式中進行我們自己的處理,處理完畢後我們要進行恢復處理。這塊需要考慮兩種情況:
(1) 目標函式中要執行srcfn的正常恢復
(2) 目標函式不執行srcfn的正常恢復。
看看detours的**,很詳細很直觀。
那messageboxa來簡單介紹下:
下面看看我們呼叫messagebox(null, "xx", "***", mb_ok)為啥能正常進行。
在呼叫此函式的時候,首先會將4個引數壓入堆疊,導致sp變小16。執行messagebox函式時會直接跳轉到我們的mymessageboxa函式處執行,注意,到mymessageboxa函式呼叫是直接進行指令調整的,沒有任何引數壓棧操作。
此函式內部會維持堆疊平衡,在最後返回時根據stdcall約定會調整sp,根據引數數量將sp加16。這樣整個函式呼叫不會導致sp值在函式呼叫的前後出現不一致的情況,一切ok。
從上面的過程也可以看到,關鍵是需要我們的hook函式需要和被hook的原函式要保持原型一致性,包括函式呼叫約定和函式引數個數等等...
另外,這種方式是用於簡單的hookapi,因為在hook後的函式如果需要呼叫原函式的話,我們需要恢復hook之前的函式**,然後在呼叫完畢後又要hook此函式。這樣每次呼叫我們的原函式都需要進行這樣的處理,因為存在這樣的乙個事實:我們不能保證hook後的函式不會呼叫原函式。如果不這麼做的話就可能會出現死迴圈。detours解決這個問題的辦法是引入了乙個變遷函式。具體就不在這裡廢話了。
kvo 的一點記錄
observevalueforkeypath ofobject change context 呼叫方法是裡 object 被觀察物件 observer 觀察物件 forkeypath裡面帶上property的name,如uiview的frame center等等 options 有4個值,分別是 n...
oracle一點記錄
檢視資料庫例項名 service name sql select instance name from v instance 如何知道oracle客戶端是32位還是64的。windows下啟動sqlplus,看到是sqlplus32即32位,看到sqlplus即是64位。pl sql在64為客戶端不...
整合finereport的一點記錄
最近工作需要,使用到了finereport,但是之前只用過jfreechart,專案需要用到finereport,那麼也就只能是有了,不過感覺挺好的,至少和jfreechart相比感覺好看多了,而且頁面上有了動態效果,純頁面 而且基本上只用寫sql,所以感覺還是很不錯的。簡單地弄了個柱狀的介面,然後...