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