2008-10-10 55 views
0

是否可以通過x86彙編語言調用COM對象?如果是這樣,怎麼樣?來自x86程序集的COM?

爲什麼我要這樣做?假設我有兩個程序,我沒有源代碼 - 我得到的都是二進制文件。其中一個實現了COM接口,另一個則沒有。我想注入代碼到第一個程序中,使用這個COM接口調用第二個程序,這需要我使用x86程序集。

回答

5

當然這是可能的 - 實際上這就是C/C++編譯器的功能。

但是爲什麼在上帝的名下你想要這樣做?如果它是爲了教育價值,那麼肯定用直接C來手動完成COM的東西就可以做到。


鑑於更新的問題,我建議你寫的東西COM DLL中並注入該DLL到要修補,然後用簡單的x86代碼的補丁到程序中調用您的DLL程序這是繁重的舉動。我不記得將DLL注入進程的地址空間的技術,但至少有一對。 AppInit註冊表設置(或類似的)是一個。然而,我認爲大多數將代碼注入進程的途徑都被認爲是安全漏洞(並且經常被惡意軟件所使用),所以我懷疑微軟可能已經刪除了很多(如果不是大多數)(或全部)更新的Service Pack或OS版本。

+0

OpenProcess/WriteProcessMemory仍然有效。它們必須像加載器在用戶空間中實現一樣。 – Joshua 2009-01-10 04:52:07

0

是的 - COM主要設計爲二進制API,雖然它有一個非常容易從C/C++實現。但是,該規範不是以C或C++的形式出現的。

你可以參考原始的COM規範,有一個副本here,它也必須被埋在微軟網站的某個地方。

更新:您的用例似乎不需要直接使用程序集,任何代碼注入技術都可以使用。如何編譯要注入的代碼與注入方式不同。

1

最簡單的方法來做你想做的事情可能是創建一個DLL來完成COM通信,然後注入代碼來強制其他應用程序加載DLL。您可以使用DLL injectino技術或只編輯應用程序本身的程序集來調用LoadLibrary/GetProcAddress等。

編輯:順便說一句,我發現OllyDbg是一個偉大的工具,用於編輯現有的程序集應用。

1

我與麥克B.這聽起來像是你不想做的事情達成一致,但是...

要在邁克乙說這件事是可能的,在最低水平COM是擴大一個ABI(應用程序二進制接口);也就是說,它定義了內存中COM對象的佈局,並且所有的COM對象都需要遵循這個佈局。 COM對象(在x86平臺上)正好像Visual C++編譯器(和大多數其他編譯器)在內存中放置對象的方式一樣佈置在內存中。這使得C++(和C語言,還有一些額外的努力)成爲使用COM的一個方便的選擇。也就是說,我從來沒有見過任何人在彙編中嘗試這個,但是有一個關於在CodeProject上使用C中的COM的教程。的概念應該是很容易轉化爲裝配:

​​

0

你可以去通過hard way或者你可以找一個tested and true解決方案。
它們都不需要彙編語言。

+0

這兩個都是我需要添加的非常簡單的功能的矯枉過正。不過謝謝 - 我已經使用DLL注入,並且我已經和Detours一起玩過,儘管不是很廣泛。 – 2008-10-21 03:07:18