解密入门教学(三)--Windows程序

回复 星标
更多

解密入门教学(三)--Windows程序

Win32 是一个非常深奥的系统,目前还容不得我这种小辈在这儿说三道四,不过,我既然是要写给那些入门阶段的朋友们看的,又不是写给那些搞程序设计老鸟看的,所以,我也犯不着怕被人背后指着骂。

本章的名字就叫《Windows程序》而不是《Windows程序设计》所以,我只是讲一些关于 Windows 程序运作的原理:

Windows 为什么叫 Windows,相信所有用过的朋友都可以明白,那桌面上一个一个的窗口,就是它名字的由来。也就是这一个又一个窗口的出现,使计算机的使用一下子简单了巨多。几年前接触过电脑的朋友一定知道 DOS 吧,你还记的 DOS 下那黑乎乎的窗口吧,没见过的哥们儿可以在开始菜单中找出来看看。DOS 通过一系列的命令来进行相应的操作,如进入一个目录,删除一个目录等等等等。那种工作方式就叫做命令提示符方式,也即命令行。

现在国内不懂电脑的人还老爱说要想学电脑,必须要英语过关。(就是这个,吓跑了多少仅仅是想学习一些基本操作的朋友)可能也就是源自DOS的原因吧。

后来,随着硬件的支持以及技术上的提高,当然还有为了使电脑更方便的服务与人,慢慢的就有了所谓的视图操作系统,从此,你不用再记忆那些大堆的指令了,而且操作上,也有了相大的提高,可以说操作系统发展到今天的份儿上,操作已经够简单了,去看看那些在网吧里一把鼻涕的小孩子们吧…

当然,就像当年 DOS 之于命令提示行一样,今天的 Windows 仍和当年一样,占据着大部分的用户群。

(场外:一观众扔来一烂柿饼,你是唐僧啊,这么多废话)

马上转入正题,Windows 之所以好用,除了不用背 N 多的命令外,一个原因就是因为它本身提供了大量的标准 Windows GUI 函数。所以对于用户,面对的是同一套标准的窗口,对这些窗口的操作都是一样的,所以使用不同的应用程序时无须重新学习操作。不用像当年在 DOS 下面那样一安装新程序,就要马上看帮助,看说明。

而 Windows GUI 函数,只不过是微软提供给程序开发人员的 API(Application Programming Interface 应用编程接口)中的一小部分而以。Windows API 是一大组功能强大的函数,它们本身驻扎在 Windows 中供人们随时调用。这些函数的大部分被包含在几个动态链接库(DLL)中,譬如:kernel32.dll、 user32.dll 和 gdi32.dll。 Kernel32.dll 中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll 中的函数则负责图形方面的操作等等。

你可能多多少少听说过 API 函数,如果你不太清楚到底是怎么一回事的话,我尽量给你解释的清楚一点。

不知道你有没有想过,Windows 中的那一个又一个窗口是怎么画出来的呢?呵呵,你可能用 VB、Delphi 编过程序,你有没有想过你写的程序中的那些窗口是怎么形成的?是控件变成的。倒...呵呵,相信你当初学 VB 或 Delphi 的时候,所看的书上一定对可视化编程环境大肆赞扬了一番吧,是不是也提到过比VC++怎么怎么方便?怎么怎么不用再为生成程序的界面而花费大量无用时间了等等。

(台下上来一东北民工:小子,你找抽啊,还讲不讲了)

马上开说,其实我只是想告诉你,所有你用的 Windows 下的程序,都是通过调用一个又一个的 Windows API 来执行相应任务的,没有 API,你的程序什么也做不了。用VB、Delphi 以及 MFC 的朋友也许会说我根本没有调用什么 API 啊!其实这些 API 都是由你所用的开发环境自动进行相应的转换的。比如说你用 Delphi 新建一程序,什么也不用动就直接按 F9 来运行它,是不是出现一个空白的窗体?这就是个标准的 Windows 程序,它有 Windows 程序所具有的一切特征,如最大化按钮、最小化按钮、关闭按钮…你可以通过鼠标来移动它。

但是如果你想用 VC++ 或 MASM32 来写这样一个程序,那么你有两种方法,在 VC++ 中,你可以用 MFC 或直接调用 API,而在 MASM32 中,你就只有直接调用 API 这一种方法。所谓直接调用 API,就是指所有的操作都通过最原始的 API 来完成。通过直接调用 API 来生成这样一个程序,你必须要先注册窗口类(除非您使用 Windows 预定义的窗口类,如 MessageBox 或 dialog box);然后产生窗口;然后在桌面显示窗口(除非您不想立即显示它); 然后刷新窗口客户区;

麻烦吧,如果你想真正的让这个程序能正常地运行下来,还要再加入以下步骤:

1. 你要得到您应用程序的句柄。

2. 窗体显示后就进入无限的获取窗口消息的循环。

3. 如果有消息到达,由负责该窗口的窗口回调函数处理。

4. 如果用户关闭窗口,进行退出处理。

上面这此步骤,都需要调用相应的 API 来完成。比如说得到程序的句柄用 GetModuleHandle 注册窗口类用 RegisterClass 或 RegisterClassEx; 注册后,还要用 CreateWindowEx 函数来生成相应窗口,而后用 ShowWindow 来显示它,之后还会用 UpdateWindow 来更新客户区等等等等。这些还都不算呢,如果你真通过直接调用 API 去写一个稍大一点儿的程序的话,你会发现那是一个多么不令人愉快的事情。

上面说的这些,只不过是 API 中的一小小小小小小小小小小….部分,这才几个,真正的 API 有成百上千个,包括对系统各个方面进行的操作。没有API,你的程序什么也干不了。比如说你的程序中有一个 Edit 控件,VB 中应该叫做 Text 控件吧,你想将用户输入到里面的信息放到一个变量中去,那么 Delphi 中可以用 Str:=Edit1.text 来实现。VB 中应该是 Str=Text1.Text; 但是如果你用API,想要得到 Edit 输入框里的文本内容,就要调用 GetDlgItemInt(Edit 中输入的值当做数值来用)GetDlgItemText、GetDlgItemTextA(Edit 中输入的值当做字符串来用)。而上面我说的 VB、Delphi 得到编辑框中输入的内容的方法,最终在编译成可执行文件的时候,也会由编译器自动对其进行相应的转换。你只要明白一件事就好了,那就是你所用的程序,无时无刻都在调用着系统中的各种各样的API函数。

其实 Windows 中的 API,就相当于当年 DOS 系统中的系统功能调用,及中断21。只不过在数量上和功能上,都是 DOS 系统功能调用所不及的。

如果你还是看不明白,那我不怪你,可能是我讲的不清楚,所以,还是给你推荐老牛写的书吧。力推《 Windows 程序设计》,看过之后你会内力大增的,那时候你所知道的知识就不止是 API 而以了。

其实话说回来,我这篇文章不是教你编程的,所以关于 Windows 程序的原理,没有必要说那么多,我之所以跟你讲API,是想让你知道 Windows 程序的运行机制。免的到时候用调试器下断点的时候问什么是API。(众人(十分愤怒地)冲上台来:“拉下去PK!把我们当什么了!”)

(我再次来到台上,镜头切向脸的一侧,来个特写。只见上面有若干处大小不同的伤口)可能还有些重点的地方我没有提到,欢迎指正。如果你有什么不明白的地方,欢迎跟贴提问。只要别太那个,比如说“你能把所有的API给我列出来让我回去背背好吗?”

附上几个常用的 API 函数吧。相信你此时因该以经对 API 有个大概的了解了。

MessageBox  显示一信息对话框

MessageBoxEx  显示一信息对话框

MessageBoxIndirect 显示一定制信息对话框

(以上这三个,可以用来中断那些错误提示,比如说你注册码输入错误了,程序就可能通过这几个函数中的一个,来提示你错误)

GetDlgItemInt  得指定输入框整数值

GetDlgItemText 得指定输入框输入字符串

GetDlgItemTextA  得指定输入框输入字符串

(软件可以用这三个来得到用户输入的注册码)

GetLocalTime 得当前本地时间

GetSystemTime 得当前系统时间

(软件可以用这两个来判断软件是否过期)

RegQueryvalueA 获取一个项的设置值

RegQueryvalueExA 获取一个项的设置值

RegSetvalueA 设置指定项或子项的值

RegSetvalueExA 设置指定项的值

(如果软件用注册表存储注册信息的话,那么这几个也许会有用)

上面讲的,只是几个平时比较常见的,更多请参见看雪以前的教程或 Windows开发人员手册。

别的我也不多说什么了,这章你就知道API是什么就成了。

<本章完>

508969

2017-02-17 22:28:35更新过
此帖已被锁定,无法回复
新窗口打开 关闭