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

        一般一款软件的诞生会经过漫长的准备过程,比如立项、调研、交互设计、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客户端开发技术和模块有个了解。可以借助该系列博文中的模块,快速搭建自己的应用。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2014年8月5日
下一篇 2014年8月5日

相关推荐