淺談API函式呼叫的方法

看雪資料發表於2004-07-05

淺談API函式呼叫的方法

      API函式地址的查詢在很多時候都需要,比如做DIY的時候難免需要呼叫API函式。關於API函式的呼叫有不少方法,今天我大體說一些,不是具體的步驟,只是一些原理。

1、  檢視軟體的引入表。如果被修改的軟體中已經匯入了你需要用到的API函式,這最好不過,可以用PE工具察看引入表,就可以得到該函式的RVA;

2、修改引入表。
    如果軟體中沒有該函式的資訊,可以手工把該函式的資訊匯入到引入表中,手工匯入需要理解PE匯入表的相關格式,比較麻煩,但是佔用資源少。
    一般來說,用PE工具也可以匯入動態連線庫的資訊,但是前提是需要把動態連線庫的資訊重新匯入,這有很大不便。具體來說:
    假如我們需要把Messageboxa函式匯入到一個軟體中。
    因為Messageboxa函式在User32.dll,則利用PE工具匯入的時候存在2種狀況:


     1、該軟體中沒有引入了User32.dll,那麼可以利用Stu_pe等工具把User32.dll庫的資訊匯入到軟體中,順便把Messageboxa函式資訊匯入到其中。具體方法請參考那些PE軟體的說明;
     2、該軟體中已經引入了User32.dll,有時候利用PE工具(例如PEdit,Stu_pe等)把Messageboxa函式的資訊匯入到軟體中時候,如果強行按照上面的方法匯入User32.dll和Messageboxa,那麼新匯入的資訊可用,但是以前的User32.dll資訊無法使用。就是說新新增的Messageboxa是可以用了,但是人家以前匯入的Use32.dll中的函式都沒辦法使用了。導致軟體執行不正常;改進方法當然有了,據說用LordPE可以,呵呵。


3、利用Loadlibrary函式和GetProcessAddress函式相結合,然後獲取需要的函式的地址,這種方法看起來比較麻煩,事實上也比較麻煩:) ,但是我感覺比較安全,不會出什麼亂子,我一般採用這種方法;

4、搜尋軟體的匯入表。動態搜尋軟體的匯入表,這種方法是動態修改軟體的時候需要用到的,一般來說用於加殼軟體或者病毒。具體方法我就不介紹了。有興趣的可以去查查相關資料,我這也有一些。

5、直接利用Kernel32.dll中的函式,這種方法很少見到DIY方面的朋友採用。由於Kernel32.dll是系統核心,隨時都在執行,可以利用他裡面的函式地址。比如說需要用到CreateFile函式,可以查出來Kernel32.dll中匯出的CreateFile的地址,然後call這個地址就可以了。但是這種方法存在明顯缺陷:由於作業系統的不一樣(比如XP中就不是Kernel32.dll庫),會導致函式地址的不同。這一點需要注意。這種方法是我看Vbin寫的病毒的時候發現的,感覺不錯。不過我還沒用過,要有不便我以後給大家再說。

    以上介紹了一些方法,具體的方法可以查相關資料,或者和我討論(www.fcgchina.com)。這些方法各有好處,統統掌握也不是壞處,呵呵。

如果你還有什麼方法,請一定告訴我。先謝過了!我發現這個格式編輯實在太麻煩了,半天也沒處理好,大家將就著看吧。

相關文章