Windows黑客编程基础 上面的题目带有“黑客”两个字,请大家别误会了,其实没有多少是讲黑客的,这完全是一篇菜鸟级的编程杂谈,假如您已是高手,就不必在此浪费时间了 。
前几天在网上看了“病毒”兄写的《WIN下编程须知》一文,觉得在编程方面要写出一篇适合初学者们看的入门级文章的确很重要,可惜病毒兄只在该文里介绍了线程、消息、句柄等几个基本概念。很多初学者看了对编程还是感到很迷惑,一个从来没有写过程式的人如何入门?如何在短时间内写出自己的程式来?笔者带着这些问题写了这篇文章。这也是笔者在学习编程的初期所碰到的困惑,在此根据笔者的个人理解将其整理成文,希望能引起广大菜鸟们的共鸣,对初学者们有所帮助。
从理论上说,任何一门语言都能够在任何一个系统上编程,只要找到该系统提供的“接口”和对系统内部机制有深入的了解就能够了,至少我是这么认为的。正如c语言能够在windows下编程,也同样能够在Linux上大放异彩相同。
编程是一项很繁杂的工作,除了应用编程工具之外,了解系统本身内部工作机理很重要,这是您写出稳定兼容的程式所必不可少的前提条件。您要在哪一种系统上编程就要对该系统的机制进行研究,至少您应该知道一个程式在那个系统上是如何运行的。
一、了解Windows 内部机制
Windows 是个“基于事件的,消息驱动的”操作系统。
在Windows下执行一个程式,只要用户进行了影响窗口的动作(如改变窗口大小或移动、单击鼠标等)该动作就会触发一个相应的“事件”。系统每次检测到一个事件时,就会给程式发送一个“消息”,从而使程式能够处理该事件。每个Windows 应用程式都是基于事件和消息的,而且包含一个主事件循环,他不停地、反复地检测是否有用户事件发生。每次检测到一个用户事件,程式就对该事件做出响应,处理完再等待下一个事件的发生。
Windows 下的应用程式不断地重复这一过程,直至用户终止程式,用代码来描述实际上也就是个消息处理过程的while循环语句。
下面便简单介绍一下和 Windows 系统密切相关的几个基本概念:
⒈窗口:这是我要说的第一个概念。似乎是地球人都知道的事儿了,窗口是Windows本身连同Windows 环境下的应用程式的基本界面单位,但是很多人都误以为只有具备标题栏、状态栏、最大化、最小化按钮这样标准的方框才叫窗口。其实窗口的概念很广,例如按钮和对话框等也是窗口哦,只但是是一种特别的窗口罢了。
从用户的角度看,窗口就是显示在屏幕上的一个矩形区域,其外观单独于应用程式,事实上他就是生成该窗口的应用程式和用户间的直观接口;从应用程式的角度看,窗口是受其控制的一部分矩形屏幕区。应用程式生成并控制和窗口有关的一切内容,包括窗口的大小、风格、位置连同窗口内显示的内容等。用户打开一个应用程式后,程式将创建一个窗口,并在那里默默地等待用户的需要。每当用户选择窗口中的选项,程式即对此做出响应。
⒉程式:通常说的程式都是指一个能让电脑识别的文档,接触得最多的便是.exe型的可执行文档,这个不难理解。
⒊进程:说到进程,学过《操作系统》的人都很清楚,所谓进程就是应用程式的执行实例(或称一个执行程式)。需要注意的是:进程是程式动态的描述,而上面说到的程式是静态的描述,两者有本质的区别。举个例子,从网上Down了一个瑞星杀毒软件到C盘但没有运行,那个.exe 可执行文档叫做程式,他是个二进制码的文档。一旦双击了exe文档图标运行程式,那个“正在运行着的瑞星杀毒”便称为进程,他在双击的那一刻被系统创建,当您关机或在任务栏的图标上单击鼠标右键选“退出”时,进程便消亡,完全结束了生命。进程经历了由“创建”到“消亡”的生命期,而程式自始至终存在于您的硬盘上,不管您的机器是否启动。
⒋线程:线程是进程中的一个执行单元,同一个进程中的各个线程对应于一组CPU指令、一组CPU寄存器连同一堆栈。进程本来就具备动态的含义,然而实质上是通过线程来执行体现的,从这个意义上说,Windows 中进程的动态性意义已不是很明显了,只算是给程式所占的资源划定一个范围而已(个人观点,纯属个人理解,不必引起争议!),真正具备动态性意义的是线程。以前在大二学习操作系统课的时候就有个同学跟笔者提起这点,笔者还跟他驳得面红耳赤呢!现在想想,觉得很有道理,不得不佩服那位同学对Windows内部机制了解得如此清楚。
之所以在此花那么多的篇幅说线程,是因为下面将要介绍到多线程编程技巧,假如不理解这点,那就很难应用到实践上,希望大家明白。
⒌消息:我们几乎做每一个动作都会产生一个消息,在用鼠标指点江山的今天,鼠标被移动会产生WM_MOUSEMOVE消息,鼠标左键被按下会产生WM_LBUTTONDOWN的消息,鼠标右键按下便产生WM_RBUTTONDOWN消息等等。任何的这些都能够通过GetMessage,SendMessage等函数得到,以后的操作中我们会经常接触到这些函数。
⒍事件:何谓事件?从他的字面意思我们就能够明白他的含义,如在程式运行的过程中改变窗口的大小或移动窗口等,都会触发相应的“事件”。
⒎句柄:单单一个“柄”字便能够解释他的意思了,我们天气热摇扇子的时候只要抓住扇柄便能够控制整个扇子的运动了,在程式中也差不多是这个意思。通常一个句柄就能够传递我们所要做的事情。有经验的读者肯定清楚,编写程式总是要和各种句柄打交道的,句柄是系统用来标识不同对象类型的工具,如窗口、菜单等,这些东西在系统中被视为不同类型的对象,用不同的句柄将他们区分开来。
看看C 教材中是如何给句柄下定义的:“在Win32里,句柄是指向一个无值型对象(void *)的指针,是个4字节长的数据”。虽然我对他的本质是什么还是很迷惑,但我知道句柄并不是个真正意义上的指针。从结构上看,句柄的确是个指针,尽管他没有指向用于存储某个对象的内存位置(很多书都这么说,这正是我的迷惑所在),而实际上句柄指向的是个包含了对该对象进行的引用的位置。在编程时,只要抓住了对象的句柄就能够对该对象进行操作了(我在《一个简单木马程式的编写和伪装策略》中说到的对QQ密码的截获就是要找到QQ登陆窗口的句柄后才开始截密行动的)。下面再举个例子来说明句柄的运用:编一个程式,使QQ登陆窗口的号码框和密码框均变黑,相关代码及解释:
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



