VC开发Windows客户端软件之旅——前言
? ? ? ? 從第一次拖著行李入京找活,至今已工作若干年了。這些年一直追逐自己的夢想,跑過三個城市,換了三份工作,認識了很多業內的朋友。和朋友們閑聊時,發現很多人都已經不再做客戶端軟件了。有的轉去做管理,有的轉去做IOS,有的轉去做安卓,有的轉去做投資,“堅守”的人真的不多。曾經朋友開玩笑,說我們都是抱著微軟的大腿,如果微軟倒了,我們就失業了。我們說這句話時,多半是抱著戲謔的態度。時過境遷,隨著移動互聯網的興起,PC的沒落是難免的。相應的PC客戶端沒落,從業人數減少,現在想招一個合格的windows程序員已經非常難了。或許是出于一種紀念,我想起編寫該系列博客,和大家講講windows客戶端軟件開發中的點點技術。讓大家可以清晰了解到一款軟件的誕生之旅。(轉載請指明出于breaksoftware的csdn博客)
? ? ? ? 一般一款軟件的誕生會經過漫長的準備過程,比如立項、調研、交互設計、UI設計等。出于介紹Windows客戶端相關技術的目的,開發之前的所有步驟將一筆帶過。各個模塊使用的技術細節也不會進行詳細的介紹,因為該系列博文側重于介紹實現模塊所有“用”到的技術。同時出于考慮該系列博文主要針希望了解Windows開發軟件的同學,所以也不會使用一些復雜的技術——比如boost。但是為了不失去樂趣,我將介紹hook技術,并使用hook技術實現一些“不可思議”的功能。
? ? ? ? 以下為我將介紹的模塊提綱和相關的技術:
- 界面。Windows之所以可以占據PC端系統大部分份額,一個很重要的原因就是其有良好的界面交互。所以windows客戶端程序,一個很重要的因素便是界面。我經歷過很多項目,其中界面相關的重構及開發都占據很大的比例。往往一個產品做到最后一個迭代,也是界面改動需求——say goodbye。所以這塊技術非常重要。目前這塊技術分為如下幾種:
- 窗口控件類型。比如我們熟知的MFC和WTL,以及在這些基礎上封裝的金山貝殼UI引擎等。
- 無窗口控件類型。比如DUI和Htmlayout,以及一些對瀏覽器內核封裝后的界面引擎。
- 網絡。在互聯網如此普及的年代,假如你的軟件沒有聯網功能,那可能就真的out了。一般情況下,我們軟件會使用到如下網絡行為:
- 上傳。除了一些無良的公司會偷偷上傳一些用戶信息外,其中一個用到上傳功能的場景是:上傳崩潰分析日志。
- 下載。下載是讓軟件實現更新功能的必要技術。如果一款軟件失去了自更新,我一般認為它就是“僵尸”了。因為它已經失去了“重生”的機會。
- 查詢。對于一些機密算法,我們放在本地自然不合適,因為破解對高手來說是easy的。那么我們通過網絡向服務器提供“物料”,讓保存機密算法的服務器告知我們計算結果。
《實現HTTP協議Get、Post和文件上傳功能——設計和模塊》
《實現HTTP協議Get、Post和文件上傳功能——使用WinHttp接口實現》
《實現HTTP協議Get、Post和文件上傳功能——使用libcurl接口實現》
? - 數據。數據的形式非常多。如果我們一旦涉及通信,便會有數據參與。比如和服務器通信,我們可能需要對數據進行加密或者hash。我們會在之后介紹如下算法的使用:
- MD5。它是一種hash算法,之前人們一直認為該算法是唯一性很高的算法。它一般用于做數據校驗。前幾年中國某大學教授發現MD5可以發生碰撞,但是MD5在計算機界的地位還是無法撼動的。可以說我們日常使用的軟件里,幾乎都存在MD5算法。特別是一些URL請求,其中一些字段就是某些字段組織后進行MD5計算后的結果。這對做過協議破解的人來說,應該是司空見慣的。
- AES。它是一種加密算法,它是用于取代DES算法的。
- DES。它也是一種加密算法,但是已經out了,盡量使用AES吧。
- XML。
- Json。
- zip
- 7z
- 日志打點。日志打點的作用不可小視。對于開發同學,日志可以標識程序執行的脈絡,從而方便我們定位問題。對于產品交互設計同學,打點可以幫助統計一個按鈕被按下多少次,是經過什么順序被按下的,從而我們可以依據這些數據設計出更合理的交互。有時候,我們安裝一款軟件后,往往會有個勾選——幫助我們改進。如果你勾選了,那么這款軟件就會上傳這些日志打點信息。一般,每條日志,都會攜帶用戶標志信息。對于沒有賬戶系統的軟件,用戶標志一般是若干硬件信息(硬盤序列號等)組合后的結果。相關技術參閱:
《python3編寫簡易統計服務器》
《WMI技術介紹和應用——查詢硬件信息》 - 崩潰。可能除了著名的Hello World,沒有哪款著名的程序可以保證自己不崩潰。對于折騰過破電腦或者安裝過很多殺軟的同學來說,應該見過藍屏是什么樣子——操作系統崩潰了。連操作系統都會崩潰,更何況我們寫的程序呢?所以崩潰并不可怕,可怕的是我們不能收集崩潰日志和不會分析崩潰日志。這塊技術,我將講解兩個模塊:
- 崩潰日志生成。
- 崩潰日志分析。
《分析兩種Dump(崩潰日志)文件生成的方法及比較》 - 數據庫。如何一款軟件,都可能試圖在系統本地留點什么——老子到此一游。那軟件怎么刻字,又刻在什么地方呢?簡單點,寫幾個文件就行了。復雜點就要使用到數據庫了。
? ? ? ? 以上基礎的模塊介紹完后,我們會插入一些有意思的技術:
- 進程間通信。有時候,我們需要調用其他進程來完成任務。一種可能是這款軟件是我們自己寫的,我們可以在軟件代碼內部編寫進程間通信代碼。另一種是這款軟件只有固定的輸出,我們需要接管其輸出,完成單向通信。相關技術參閱:
《進程間通信:同步雙工管道》 - 云指令。這是一個非常有意思的主題。通過指令可配置化,我們可以像控制網頁一樣方便的控制客戶端的行為——一般情況下,如果我們要改變客戶端邏輯可能需要修改代碼并發布新的版本。采用云指令后,我們只要改動服務器配置便可以輕易完成對客戶端行為的改變,而不需要走漫長的發布和升級流程。相關技術參閱:
《在windows程序中嵌入Lua腳本引擎--使用VS IDE編譯Luajit腳本引擎》
《在windows程序中嵌入Lua腳本引擎--建立一個簡易的“云命令”執行的系統》
《在windows程序中嵌入Lua腳本引擎--編寫自己的Lua庫》 - 修改別的進程的行為(入侵)。入侵可能每個技術Geek都曾嘗試過的經歷。為了讓我們這次開發之旅變得有意思,我會在最后做個善意的“入侵”,完成一些好玩的功能。相關技術參閱:
《使用APIHOOK實現進程隱藏》
《VC下提前注入進程的一些方法1——遠線程不帶參數》
《VC下提前注入進程的一些方法2——遠線程帶參數》
《VC下提前注入進程的一些方法3——修改程序入口點》
《VC提前注入.net軟件的方法》
《PE文件和COFF文件格式分析——導出表的應用——一種摘掉Inline鉤子(Unhook)的方法》
? ? ? ? 希望經過這次旅程,大家可以對windows客戶端開發技術和模塊有個了解。可以借助該系列博文中的模塊,快速搭建自己的應用。
總結
以上是生活随笔為你收集整理的VC开发Windows客户端软件之旅——前言的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows客户端C/C++编程规范“
- 下一篇: 服务器架设笔记——编译Apache及其插