March 14, 2005

C++ 逆向工程提示

剛剛在讀 CSDN 裡頭由 KKQQ 撰寫的 blog [something about reverse engineering on C++],給我很多啟發,儘管看起來沒幾個字的文章,但是這個對於 C++ Object Model 與 x86 instruction layout 很有幫助,所以吃了定心丸後,我就開始 hack Skype 了。 之前 Trolltech 才在 [Cool Applications] 提到 Skype -- [Application: Skype],這麼成功的程式當然是 Trolltech 相當好的活廣告,但是 Skype for Linux 有些地方不是很好用,特別是想將 Skype 應用在 Embedded Linux 的開發者,就會面臨無法將 Skype 整合到產品的窘境。是的,Skype 有 SDK,但是是否能跳過這些授權過程呢? 所以,我開始一個嘗試,就是改寫 Qt3/X11 的一小部份,紀錄 Skype runtime requirement,由於是直接在 Qt3/X11 下手,Skype 的 binary 根本不需要變更,但是使用者介面卻可以完全的掌握,比方說可以將 Skype 改成 Kiosk 版本 (商業應用就不需要我說了)。 天馬行空完畢,讓我們看看怎麼作,Skype 實做時有考量到 portability,所以 core API 儘可能用 pure C 撰寫,而 Qt 本身是 C++ Framework,所以 interfacing 之處就是可以讓我們有很多「想像空間」。再提一次,任何變更 binary code 的行為都有可能造成侵權,所以我們要特別審慎的作。(在我搞懂相關的授權規定前,這些 hacking 還不會釋出,儘管 Qt3 本身是 QPL/GPL 的) 這裡操作的環境是 Debian sid,首先我再次閱讀 /usr/include/qt3/qcstring.h 的 member functions,因為這是我要改寫的第一步,至少要能將傳遞給 core API 的 data field 取出。相當幸運的,這個過程我們已經取出許多重要資訊,甚至是列表項目,再來我要處理的地方則是 socket programming,在之前的 blog [Skype 尋奇],提到許多 Skype 獨特的設計,而真正的 representation 也大幅的改寫過,這些部份我不會特別去處理,因為這跟我的需求沒有直接關係,真正的難題在於如何使用這些機制。 一個有趣的途徑是透過 XTest 來對 Skype 施加指令,這樣只需要 Xfake 就可以使用 Skype,這個途徑我曾經在某套商業產品使用過,事實上證明是可行,而且效能挺不錯,因為不需要對真正的 Hardware 處理,latency 時間有效的縮短,這個途徑的問題就在於處理 response / XEvent 的議題。 不過我現在還不想這樣作,我想直接跟 Skype 內部打交道,所以繼續做了些 logging,面對眾多的 branching,就必須使出逆向工程的小手段了,這裡的逆向工程只是 tracing,並沒有作 dynamic patching,而我又發現新的東西,再度感謝 KKQQ 那篇 blog :-) 至於詳情,實在不方便說太多,不過對 qt3 下手還是最「乾淨」的作法。 由 jserv 發表於 March 14, 2005 01:13 PM
迴響

看來你滿是一位高人

sixland 發表於 July 3, 2006 12:45 PM