原帖:https://bbs.csdn.net/topics/392434614
自己寫個名字叫做XCDZIP35.OCX的組件,把XCDZIP35.OCX的注冊資訊替換掉,我想問一下
1.舊XCDZIP35.OCX是不是得改名(能改名嗎)
2.舊XCDZIP35.OCX的UUID是不是得改
3.新的XCDZIP35.OCX的UUID是不是應該跟未改動前的舊的XCDZIP35.OCX一樣
uj5u.com熱心網友回復:
我看了你的原貼, 首先得確認一下呼叫ocx的程式是不是你寫的?如果是你寫的, 那么你只為了記錄呼叫ocx時的引數, 那這些引數肯定通過你程式的某個方法的, 你完全可以直接記錄
但如果程式不是你寫的, 你無法直接記錄的話, 那你再做一個ocx做中轉的作用就沒什么用了, 我建議你還是去研究趙4的方法吧
舊ocx不是你寫的, 你不能重新編譯, 那就代表你無法改變它的 uuid
ocx的呼叫是根據類名去注冊表查詢ocx的資訊, 如果你把舊ocx的資訊替換成你新的ocx, 那么程式能呼叫你的ocx
但問題是你的新ocx是根據舊ocx的資訊去加載舊ocx的, 而舊ocx的注冊資訊已經替換成新ocx的資訊了, 那你猜猜會發生什么事情
uj5u.com熱心網友回復:
舊ocx不需要改名,但是注冊表里的資訊需要移動到一個新的CLSID下,這樣你的新ocx才可以創建這個舊的ocx,因為舊ocx的原CLSID被你的新OCX劫持。檔案名改不改無所謂,改的話,注冊表資訊里的檔案名也一起改。
新的ocx的CLSID必須和舊ocx的原CLSID一樣因為這個ID被宿主程式用來創建ocx。
當然你也可以這樣
舊OCX的CLSID不改
新OCX的CLSID用自建的
把宿主程式里面的舊OCX的CLSID改成新OCX的CLSID
但是這需要破解宿主程式找到CLSID的存盤格式,以及找到每一個CLSID的位置……
還是直接劫持那個CLSID一勞永逸。
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
你好!
確實都不是我寫的,是感覺有點復雜,我也查了一下,舊OCX無法改變其UUID,所以新OCX呼叫舊OCX可能導致新OCX起不到中間作用
uj5u.com熱心網友回復:
建議一個偷偷替換的方法,看是否可行。步驟如下:1.把舊的XXXX.ocx修改檔案名,然后注冊了,不告訴別人你是用這個控制元件,別人就不知道了
2.自己撰寫一個新的ocx控制元件,然后在這個控制元件內部的視窗OnCreate訊息中自己建立這個控制元件物件,顯示在新的控制元件的視窗區中
3.給新的ocx控制元件建立一些方法和訊息,實際就是轉發舊的ocx控制元件的方法和訊息,當然你可以稍微修改一下函式引數等
uj5u.com熱心網友回復:
要想人不知,除非己莫為。
uj5u.com熱心網友回復:
今天想試試修改OCX里的PutPassword的代碼,想跟進去OCX里看看這個方法的代碼是哪段,跟來跟去,跟不到,用了VS2010的tstcon,OCX加載的時候地址是在10100000上吧,結果除錯的時候一直在tstcon里轉,到不了,本來想在反匯編里截指令代碼在OCX檔案里面或用OD加載找,找不到!!頭大,不知代碼在哪,不知如何下斷點
uj5u.com熱心網友回復:
WinAPIOverride32WinAPIOverride64
uj5u.com熱心網友回復:
趙老師有沒有WinAPIOverride64的使用說明uj5u.com熱心網友回復:
一直沒有發現鉤了OCX,只看到MFC40,MFC100,是在哪設定,趙老師
uj5u.com熱心網友回復:
上面只看到呼叫都的地址,但OCX里的我猜測沒有,因為是加載到10001000上的吧uj5u.com熱心網友回復:
C:\WinApiOverride\WinAPIOverride.chmuj5u.com熱心網友回復:
我看了說明的,還是有點不明白,加載后HOOKE顯示成功,但就是不能顯示呼叫OCX的入口uj5u.com熱心網友回復:
關閉UAC、防火墻、殺毒軟體、……以管理員身份運行
……
uj5u.com熱心網友回復:
謝謝,我設定一下,還要請問一下,除錯的時候,我查了記憶體,我的OCX確實是加載在10001000地址上的,我用IDA加載TSTCON32,除錯OCX,始終到了不這個地方(代碼部分),是不是我思路有問題呢,除錯不到OCX里面uj5u.com熱心網友回復:
無法獲取,老樣子,從資訊視窗無法觀察到uj5u.com熱心網友回復:
沒有金剛鉆,別攬瓷器活。uj5u.com熱心網友回復:
不知道趙4老師有沒有這個介紹If an interface A is derived only from IUnknown we have
pInterfaceA QueryInterface
AddRef
Release
InterfaceA_Method_1
InterfaceA_Method_2
...
InterfaceA_Method_N
In this case we have pInterfaceA==pIUnknown
If an interface B is derived from IDispatch we have
pInterfaceB QueryInterface
AddRef
Release
GetTypeInfoCount
GetTypeInfo
GetIDsOfNames
Invoke
InterfaceB_Method_1
InterfaceB_Method_2
...
InterfaceB_Method_N
In this case we have pInterfaceB==pIUnknown==pIDispatch
WinAPIOverride對OCX的檔案結構分析,但各部分的大小怎么算
uj5u.com熱心網友回復:
按我的想法,我不會使用這種檔案+注冊表替換方式,而是運行時替換。簡單概括:搶先注冊類廠。
作業原理是自己有代碼在主行程中執行,自己寫的代碼好說,別人的二進制應用就下鉤子,然后預先加載自己的組件,保證在請求原組件之前加載即可。在我的組件被加載時,由組件自己注冊同CLSID的類廠,剩下的事情就不用考慮了,系統創建組件會直接使用你注冊的類廠,而不是讀注冊表尋找原組件。
這種方式的應用非常簡單成熟,早期我把V8腳本引擎封裝成符合ms的腳本規范,然后使用IE控制元件,啟動的腳本引擎是我的封裝庫,而不是jscript.dll,就是想跟IE自帶的腳本引擎做一個性能對比。
uj5u.com熱心網友回復:
嗯,都是不錯的想法,我正看COM原理與應用及技術內幕,看完再請教uj5u.com熱心網友回復:
趙四老師
uj5u.com熱心網友回復:
提醒:再牛×的老師也無法代替學生自己領悟和上廁所!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/62505.html
