VC开发Windows客户端软件之旅——前言

2019-01-16 14:33:25 浏览数 (1)

        从第一次拖着行李入京找活,至今已工作若干年了。这些年一直追逐自己的梦想,跑过三个城市,换了三份工作,认识了很多业内的朋友。和朋友们闲聊时,发现很多人都已经不再做客户端软件了。有的转去做管理,有的转去做IOS,有的转去做安卓,有的转去做投资,“坚守”的人真的不多。曾经朋友开玩笑,说我们都是抱着微软的大腿,如果微软倒了,我们就失业了。我们说这句话时,多半是抱着戏谑的态度。时过境迁,随着移动互联网的兴起,PC的没落是难免的。相应的PC客户端没落,从业人数减少,现在想招一个合格的windows程序员已经非常难了。或许是出于一种纪念,我想起编写该系列博客,和大家讲讲windows客户端软件开发中的点点技术。让大家可以清晰了解到一款软件的诞生之旅。(转载请指明出于breaksoftware的csdn博客)

        一般一款软件的诞生会经过漫长的准备过程,比如立项、调研、交互设计、UI设计等。出于介绍Windows客户端相关技术的目的,开发之前的所有步骤将一笔带过。各个模块使用的技术细节也不会进行详细的介绍,因为该系列博文侧重于介绍实现模块所有“用”到的技术。同时出于考虑该系列博文主要针希望了解Windows开发软件的同学,所以也不会使用一些复杂的技术——比如boost。但是为了不失去乐趣,我将介绍hook技术,并使用hook技术实现一些“不可思议”的功能。

        以下为我将介绍的模块提纲和相关的技术:

  1. 界面。Windows之所以可以占据PC端系统大部分份额,一个很重要的原因就是其有良好的界面交互。所以windows客户端程序,一个很重要的因素便是界面。我经历过很多项目,其中界面相关的重构及开发都占据很大的比例。往往一个产品做到最后一个迭代,也是界面改动需求——say goodbye。所以这块技术非常重要。目前这块技术分为如下几种:
    • 窗口控件类型。比如我们熟知的MFC和WTL,以及在这些基础上封装的金山贝壳UI引擎等。
    • 无窗口控件类型。比如DUI和Htmlayout,以及一些对浏览器内核封装后的界面引擎。
  2. 网络。在互联网如此普及的年代,假如你的软件没有联网功能,那可能就真的out了。一般情况下,我们软件会使用到如下网络行为:
    • 上传。除了一些无良的公司会偷偷上传一些用户信息外,其中一个用到上传功能的场景是:上传崩溃分析日志。
    • 下载。下载是让软件实现更新功能的必要技术。如果一款软件失去了自更新,我一般认为它就是“僵尸”了。因为它已经失去了“重生”的机会。
    • 查询。对于一些机密算法,我们放在本地自然不合适,因为破解对高手来说是easy的。那么我们通过网络向服务器提供“物料”,让保存机密算法的服务器告知我们计算结果。

    相关技术参阅: 《实现HTTP协议Get、Post和文件上传功能——设计和模块》 《实现HTTP协议Get、Post和文件上传功能——使用WinHttp接口实现》 《实现HTTP协议Get、Post和文件上传功能——使用libcurl接口实现》

  3. 数据。数据的形式非常多。如果我们一旦涉及通信,便会有数据参与。比如和服务器通信,我们可能需要对数据进行加密或者hash。我们会在之后介绍如下算法的使用:
    • MD5。它是一种hash算法,之前人们一直认为该算法是唯一性很高的算法。它一般用于做数据校验。前几年中国某大学教授发现MD5可以发生碰撞,但是MD5在计算机界的地位还是无法撼动的。可以说我们日常使用的软件里,几乎都存在MD5算法。特别是一些URL请求,其中一些字段就是某些字段组织后进行MD5计算后的结果。这对做过协议破解的人来说,应该是司空见惯的。
    • AES。它是一种加密算法,它是用于取代DES算法的。
    • DES。它也是一种加密算法,但是已经out了,尽量使用AES吧。

    数据是什么格式,是CS端相互约定的。我将介绍如下两种格式的使用:

    • XML。
    • Json。

    数据如果过大,可能要压缩或者解压。这块我将介绍两种库的使用:

    • zip
    • 7z
  4. 日志打点。日志打点的作用不可小视。对于开发同学,日志可以标识程序执行的脉络,从而方便我们定位问题。对于产品交互设计同学,打点可以帮助统计一个按钮被按下多少次,是经过什么顺序被按下的,从而我们可以依据这些数据设计出更合理的交互。有时候,我们安装一款软件后,往往会有个勾选——帮助我们改进。如果你勾选了,那么这款软件就会上传这些日志打点信息。一般,每条日志,都会携带用户标志信息。对于没有账户系统的软件,用户标志一般是若干硬件信息(硬盘序列号等)组合后的结果。相关技术参阅: 《python3编写简易统计服务器》 《WMI技术介绍和应用——查询硬件信息》
  5. 崩溃。可能除了著名的Hello World,没有哪款著名的程序可以保证自己不崩溃。对于折腾过破电脑或者安装过很多杀软的同学来说,应该见过蓝屏是什么样子——操作系统崩溃了。连操作系统都会崩溃,更何况我们写的程序呢?所以崩溃并不可怕,可怕的是我们不能收集崩溃日志和不会分析崩溃日志。这块技术,我将讲解两个模块:
    • 崩溃日志生成。
    • 崩溃日志分析。

    相关技术参阅: 《分析两种Dump(崩溃日志)文件生成的方法及比较》

  6. 数据库。如何一款软件,都可能试图在系统本地留点什么——老子到此一游。那软件怎么刻字,又刻在什么地方呢?简单点,写几个文件就行了。复杂点就要使用到数据库了。

        以上基础的模块介绍完后,我们会插入一些有意思的技术:

  1. 进程间通信。有时候,我们需要调用其他进程来完成任务。一种可能是这款软件是我们自己写的,我们可以在软件代码内部编写进程间通信代码。另一种是这款软件只有固定的输出,我们需要接管其输出,完成单向通信。相关技术参阅: 《进程间通信:同步双工管道》
  2. 云指令。这是一个非常有意思的主题。通过指令可配置化,我们可以像控制网页一样方便的控制客户端的行为——一般情况下,如果我们要改变客户端逻辑可能需要修改代码并发布新的版本。采用云指令后,我们只要改动服务器配置便可以轻易完成对客户端行为的改变,而不需要走漫长的发布和升级流程。相关技术参阅: 《在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎》 《在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统》 《在windows程序中嵌入Lua脚本引擎--编写自己的Lua库》
  3. 修改别的进程的行为(入侵)。入侵可能每个技术Geek都曾尝试过的经历。为了让我们这次开发之旅变得有意思,我会在最后做个善意的“入侵”,完成一些好玩的功能。相关技术参阅: 《使用APIHOOK实现进程隐藏》 《VC下提前注入进程的一些方法1——远线程不带参数》 《VC下提前注入进程的一些方法2——远线程带参数》 《VC下提前注入进程的一些方法3——修改程序入口点》 《VC提前注入.net软件的方法》 《PE文件和COFF文件格式分析——导出表的应用——一种摘掉Inline钩子(Unhook)的方法》

        希望经过这次旅程,大家可以对windows客户端开发技术和模块有个了解。可以借助该系列博文中的模块,快速搭建自己的应用。

0 人点赞