一、背景 朋友公司有款老軟件,運行在windows下,C/S架構。客戶端為很久前外包開發的。這個客戶端為GUI界面。朋友想定時自動讓軟件做些事情。這個客戶端以前設計時沒有提供這種定時功能,只有每次執行當次的操作。朋友自己對軟件開發不熟,如是找到我。
二、朋友給的解決方案
他表示做個按鍵腳本之類的,定時的去模擬在客戶端上的單次操作。
三、我的解決方案
(一)了解需求
這是C/S架構,之前是每次鼠標點擊后,客戶端給服務器發送相應的網絡包。現在要做的是破解這個協議,然后自己寫程序定時發送對應協議的網絡包即可。
(二)解決方案
朋友的解決方案,對于擅長客戶端的人是可以的。但是我不怎么擅長,會花不少時間。
所以我選擇我自己更擅長的網絡編程。如上邊說的,先破解協議,然后想干啥就非常方便了。
四、解決過程
(一)破解協議
本想找個協議監聽軟件,我來遠程操作就行了,但是他們使用環境公網無法連入。如果我寫文檔讓他來按步驟走,對于非專業人士來說也挺費事的。
隨后我想到他們的行業不那么互聯網,他們聯系的外包素質應該不是那么高。估計也就是windows那套.net搞的,頂多也就java搞的。所以讓他把客戶端拷出外網,我來反編譯試試。同時我去網上查下.net的反編效果,有網游表示沒有混效果的C#代碼反編出來跟源代碼基本沒啥區別,另外以前反編譯過java,反編得的代碼也跟原工程差不多。所以開始淡定的祈禱反編順利。
看了眼客戶端里的各文件,感覺到是C#,找了個dotPeek,反編譯出來相當清晰。(這玩意的反編譯效果比以前反編譯flash的代碼還清晰,flah反編譯后的變量名基本編程local1之流了,這個C#反編出來變量名都是好的)
(二)分析協議
C#代碼雖沒寫過,但是語法跟Java/C++非常像。分析起來不是很費勁。
果然代碼寫的很windows的.net,客戶端直接連接的數據庫,然后在客戶單發起select之類的查詢語句。數據庫表和字段名基本是中文拼音首字母。
后來具體邏輯也懶得看,直接找到數據庫的配置,讓朋友在內網裝個數據庫客戶端,連數據庫看表里數據了。讓他比對表里數據和客戶端軟件上顯示的數據對比,找出咱們要的哪幾個字段。
(三)實現需求
這個是整個過程里最簡單的了。用了自己最喜歡的golang寫了個沒有GUI的程序,定時給他去數據庫查想要的數據。
五、后記
整個過程的順利多虧給他們寫外包的公司用的C#,還沒有做代碼混淆之類的。