那么,對于自動化測試框架來說,只需要隨意作為一個Dll,并注入到原系統中就可以了。如果原系統提供了注入的擴展,那是最好。因為這樣調試起來很方便。否則就做成遠程注入,不過調試的時候只能Attach了,很麻煩。
這個時候,只需要將包含自動化測試框架代碼的測試用例代碼,對VCL的包,帶包編譯,就可以做到對包中函數的HOOK了。不過這里面還是有一些細節需要注意的。原先我用的是FastCode的HOOK代碼,但是在代表編譯的時候就失效了。經過追查,發現代表編譯和非帶包編譯的代碼不一樣。由于VCL的代碼,編譯到了包中,那么本Dll在調用包中的方法的時候,加上了跳轉指令。簡單的就是一個call操作。在包裝載的時候,call后的地址會更新。
經過一些探索,發現中國的cnPack(www.cnpack.org)中早就針對這個問題有了解決方案。其實方法也很簡單,就是判斷一下是否存在地址跳轉,如果有的話,就取跳轉后的地址,否則取當前地址。
完成了鉤子后,我們就會發現,在我的測試用例的Dll中,對Bpl中的方法,進行了HOOK。請注意,這里面有一個選擇,就是在Dll內部HOOK,還是在Bpl內部HOOK。在Dll內部HOOK,只需要修改跳轉地址即可,鉤子的方法很簡單。在Bpl中HOOK,則需要修改函數代碼的前5個字節,這種方法復雜,但是使得入口單一,一處修改,全面有效。