以英文版v7.80.8.218來研究,這個應該是目前最新的公開發布的版本了。
安裝程式是最新的Inno Setup 5.2.2製作的安裝程式,Inno Setup是用Delphi 2編譯的,因此與Delphi做的應用軟體是很配的,就如用C++做的程式喜歡用NSIS打包一樣。Inno Setup 5.2.2也是目前發布的最新版本了,最近的幾次更新,Inno Setup也是一直在改進對於Vista系統的支援。Inno Setup還有一個優點,就是可以設定壓縮方式為lzma/ultra,這樣可以產生最小的安裝包,節約使用者的下載時間。
接下來就開始解剖安裝程式,請出Universal Extractor這個工具(當然直接用命令列工具innounp.exe也可以),解包完成,來看看解出來的檔案。
Setup.e32 真正的安裝執行檔案,作用相當於Installshield的Engine了
flist.bin 看起來像是script.bin的索引檔案
script.bin 指令碼編譯後的二進位檔案,重點來看看這個檔案
看到安裝開始就刪除了不少的中文的捷徑,可能是方便那些測試人員,免得他們一會裝中文版,一會裝英文版,開始菜單和案頭上出現一堆重複的捷徑。然後我看到了有一個網址:http://login.wopti.net/install.php?Ver=7.80.8.218.5,相信是用來記錄連網使用者的軟體安裝情況的以便統計分析。接下來就是往系統複製檔案了,其中{sys}\Iosubsys\Smartvsd.vxd是只有在Win9x下才會安裝,{app}\WoptiDefrag.dll是在非Win9x和非Vista下才會安裝,{app}\WoptiDefragVista.dll是在Vista下才會安裝。{tmp}\WoptiInfo.dll其實原本叫SendInfoDLL的,其作用就是發出一個HTTP Request到之前我提到的那個網址。(因為這是一個Delphi編譯的DLL,並且引用了WinInet這個單元)
{sys}\Iosubsys\Smartvsd.vxd是支援SMART IOCTL介面的虛擬設備驅動程式,因為Windows被設計為應用程式不能直接存取底層硬體,因此需要從裝置驅動中擷取相關硬體信息。Win9x可以直接使用Smartvsd.vxd即可訪問硬碟資訊;Windows NT及以後的作業系統,管理員是可以管理硬體裝置的,因此可以用ATA/APAPI的IDENTIFY DEVICE來取得所需資訊,但是考慮到使用者權限不一定是管理員,所以在WinNT/2K/XP下非管理使用者可以用SCSI後門的方式讀取IDE硬碟資訊(Vista下面這招就不靈了)。
{app}下的所有執行檔案和DLL都做了數位簽章,這應該是國際化的需要吧,畢竟國外更看重這一點。簽名是用的WoSign(深圳沃通)的認證,好像也不便宜,1年要1000多。不知為什麼,WoptiDefragVista.dll沒有版本資訊,WoptiUpdate.exe的描述竟然是中文,天呐,不會沒有專門做英文版的升級程式吧,看起來像是如此。版本資訊裡的公司有的是SSN,有的是Wopti,著作權資訊也是不一致,有的產品名稱裡還是中文名稱。且有的[語言]是中文,有的[語言]是英文,這說明一點,發布出去的產品的檔案並不是全在同一台機器上編譯的。
LIGHTMAP.PNG應該是作為Texture,與D3DX81ab.dll一起來完成圖形顯示(DirectX)效能的檢測。
UpdateServer.ini是一個設定檔,定義了升級伺服器位址,看得出這樣可以支援以後加入多台升級伺服器以滿足使用者數增長後的升級需求。
PortsList.inf這個定義檔案定義了常見服務的連接埠使用情況,可以不斷補充新的定義。
ActiveXImmunity.ini (ActiveX外掛程式免疫資料庫) 這個檔案是收集的外掛程式的CLSID,讓使用者可以有選擇的免疫外掛程式以防中招。
SelfRegChg.ini這個檔案是原來存放自訂最佳化設定,預設帶2個設定,一個是支援Win2000使用超過137G大硬碟,另一個是取消磁碟容量警告的設定,應該是讓使用者將自己特殊的最佳化設定定義後在軟體中應用。
Empty.ico 是用來隱藏捷徑上的箭頭的透明表徵圖。
WoptiHWDetect.sys 就是原來的gwiopm.sys,是用來在NT下做I/O連接埠操作的服務程式。
WoptiHelp.chm 協助檔案,是用Help & Manual(專業的協助製作工具,雖然安裝程式不到30M,可比起Adobe RoboHelp來說算是苗條多了)製作的,裡面沒有一副圖片,所以協助檔案才100多K。
Big5.dat, Devs.Dat, JEDEC.dat, MonV.Dat 開始我還以為是什麼加密格式,後來仔細一看,檔案開頭的兩個位元組"78 DA"(最大壓縮率), "78 9C"不是標準的ZLib壓縮格式的標誌嗎,顯然這裡的壓縮也起到了一定的加密效果(因為沒有檔案頭,所以壓縮公用程式都不能開啟檔案)。這些Dat檔案會在運行後需要時自動解壓為同名的.tmp臨時檔案。MonV.Dat解壓產生MonV.tmp後,又迅速的被刪除了。
Devs.tmp (晶片檢測資料庫) 臨時檔案,開啟是一個文字檔,裡面是裝置ID與名稱的對照表。
JEDEC.tmp (SPD 廠商資料庫) 臨時檔案?
[ 註:JEDEC = Joint Electron Device Engineering Council (電子元件工業聯合會) ]
Big5.dat 應該是註冊驗證需要的東西吧。
MonV.Dat 不知道幹什麼用的,也是註冊驗證需要的東西?
Set.ini 運行後才會產生,裡面是儲存的使用者佈建,看起來所有的外置工具都是存取的這個設定檔案。
Wopti.log 運行後才會產生,是記錄的動作記錄。
D3DX81ab.dll 這個檔案被ASPack壓縮過,可其他的exe和dll都沒有被壓縮。
WoptiDefrag.dll和WoptiDefragVista.dll (磁碟整理組件) 都是用VC的MIDL編譯的,而且還是ActiveX控制項。裡面提供的是DefragControl Class。
WoptiCDRomContmenu.dll 也是可以註冊的COM檔案,但是是用Delphi開發的。作用是Context Menu Handler,就是利用Windows提供的介面做外殼擴充,為所有檔案類型的右鍵菜單上增加2個項目,分別是開啟光碟機和關閉光碟機。但是我這裡選中菜單時下面的狀態列上會出現亂碼(不知道是不是Delphi不支援Unicode的原因)。regsvr32 WoptiCDRomContmenu.dll 執行後則增加菜單,regsvr32 WoptiCDRomContmenu.dll /u 執行後則移除菜單。核心代碼當然是對winmm.dll的mciSendCommand, mciSendString的調用。
Woptiglobe.dll 是用Delphi 7開發的,三個匯出函數:WoptiChkFileIsOK,WoptiCtrlHomepage,WoptiSetMaxthon
WoptiP2P.dll (進程功能庫) 是用Delphi 7開發的,也是三個匯出函數:WomTerminateProFromName,WomTerminateProcess,GetPort2ProcessList
WoptiUtils.dll 是用VC7開發的,只有一個匯出函數:ClearTracksForVista
WoptiMem.exe (記憶體整理) 是用Delphi 7開發的,可以看出整理記憶體還是採用的請求大記憶體迫使作業系統將不常用進程所佔用的內容轉移到虛擬記憶體,以達到整理記憶體片段的作用。
WoptiProcess.exe (進程管理器) 是用Delphi 7開發的,靜態連結了WoptiP2P.dll的GetPort2ProcessList函數。
WoptiUpdate.exe (線上升級) 是用Delphi 7開發的,升級資訊地址是:http://liveupdate.wopti.net/updatefilelist.zip,奇怪的是定義了.zip尾碼,返回的卻是文字檔。這個檔案只有中文資訊,應該是放錯了版本。
WoptiUtilities.exe (主程式) 是用Delphi 7開發的,靜態連結了WoptiP2P.dll的GetPort2ProcessList函數。所用第三方控制項大概如下:
Fast Memory Manager 優秀的記憶體管理程式,使用其帶來的額外好處是可以很容易發現程式中代碼引起的記憶體流失
TRegExpr Delphi下唯一有公開原始碼的Regex控制項
SimpleTimer 輕量級的定時器,精度雖然與TTimer一樣,但是它是從TObject繼承下來的,而且多個執行個體可以共享同一控制代碼
MaxMem 記憶體深度整理
MiTeC System Information Component 系統資訊檢測
CoolTrayIcon 托盤控制項
ActivePorts 查看系統連接埠的使用方式
DhCheckFolder 可供選擇的系統目錄及磁碟查看控制項
TMS Components 一套功能很全的介面功能控制項
APNetscapeLabel 仿Netscape Communicator的效能對話方塊的標籤的控制項,作標題列用
mxOutlookBar Pro 左邊的欄目選擇組件
Virtual Treeview 功能強大的樹形控制項,也可以當作表格用
FlatStyle 按鈕,輸入框等平面風格控制項
Magenta Systems WMI and SMART Component 通過WMI,SMART,SCSI擷取更詳細準確的系統資訊
IPInfo 利用IP Helper API擷取網路設定以及適配器資訊
DelphiX DirectX的Delphi介面控制項
ZLib 提供壓縮功能
Indy 網路通訊控制項
TeeChart 用來顯示餅圖等
md5,Blowfish,FGIntRSA,RC6 都是密碼學相關的演算法實現單元,可以用到註冊驗證以及加密檔案。
有開發人員是用微軟拼音的,很容易就會把輸入框控制項的ImeName自動化佈建成"中文 (簡體) - 微軟拼音"。
可以肯定的是,註冊驗證一定是用到了RSA演算法,沒有對主程式做加殼等保護處理,就是說不太可能被人分析代碼而寫出註冊機,但是被爆破還是難免的。曾經的敵人名單:-Arongsoft.com.htm,Keygen.exe,wom60_Keygen.exe依然在代碼中定義著。
介面:
表單的Tab鍵也沒有設定按順序跳轉,ESC不能關閉對話方塊。APNetscapeLabel上實現的類比標題列的功能有點小問題:當在最大化雙擊恢複時會導致表單位置被粘連。APNetscapeLabel沒有實現右鍵菜單,左上方的表徵圖沒有實現雙擊事件關閉,這與普通的表單行為不一致。
下方的狀態列是自畫Panel,實現了上下漸層效果。左邊的mxOutlookBar被修改了原始碼以實現項目與外部連成一體的效果以及圓角效果。VirtualStringTree被繼承實現TWomccVT。FlatButton修改成更加平面與實現圓角效果。
我自己根據其執行檔案,寫了一個介面的示範(Source include):
http://files.cnblogs.com/Icebird/WoptiUtilitiesDemo.rar