没有合适的资源?快使用搜索试试~ 我知道了~
C++builder下Windows编程.doc

C++builder下Windows编程.doc C++builder下Windows编程.doc C++builder下Windows编程.doc C++builder下Windows编程.doc
资源推荐
资源详情
资源评论

















C++builder 下深入
windows 编程
内 容 简 介
本书是一本介绍Windows 核心技术及高级技巧的专著。从系统内核编程出
发,使用大量的例子帮助读者理解这些编程技术,讲述了线程同步及隐藏、系
统钩子深入分析、读写物理磁盘的关键技术、读写物理内存和其他进程内存的
核心技术、Windows 9x 下调用16 位实模式和保护模式代码的核心技术、直接读
写端口技术、可执行文件加壳的技巧、PE 结构分析、Ring0 的实现、Windows
API 截取技术、屏幕取词技术等方面的内容。全书对热点源代码进行了深入剖
析和讲解,同时本书汇聚了作者利用Soft-ICE 跟踪调试经验,作者多年的编程
心得和技巧一览无遗。随书附送的光盘提供了书中涉及的程序源代码。
本书可对Windows 核心编程感兴趣者提供帮助,亦可供广大编程人员及各
大专院校师生参考。
电子图书,未经许可,可以任何方式复制或抄袭本书的部分或全部内容。
版权没有,侵权不究。
前言
近些年计算机软件的发展很快,从工具软件到管理软件都有很成熟的产品。软件系统
的开发不但需要扎实的软件基础知识及团队合作精神,还需要对系统这个黑匣
子有一定的了解,以编写出高性能的、高技术含量的代码来。如果仅凭对开发语言的掌握,
不求甚解,不深入系统内核去分析、挖掘,就不会有(系统反编译调试工具)、
(魔术化分区工具)、(诺顿磁盘工具)等著名的软件。
可是对于一些核心技术,大多数程序员还是知之甚少。本书介绍的技术大部分是作者及网
友多年编程的积累和总结。把这些代码汇集在一起出版,希望能对读者有一定的帮助或启
发。本书讲述了线程同步及隐藏、系统钩子深入分析、读写物理磁盘的关键技术、读写物
理内存和其他进程内存的核心技术、下调用位实模式和保护模式代码的
核心技术、直接读写端口技术、可执行文件加壳的技巧、结构分析、的实现、
截取技术、屏幕取词技术等方面的内容。其中的屏幕取词技术是网络上许多
的热点话题,遗憾的是 上涉及到关键技术时都含糊其词。本书将介绍一个完整
的屏幕取词程序(包括位的!"#$关键技术,适用于%!%&)。
'病毒曾经一度让全球的人们谈虎色变,这也是前几年的热门话题。'病毒利用
下保护模式编程的一个技巧(漏洞),从(跳到执行一些系统
服务函数,做了一些“见不得人”的操作:用垃圾数据覆盖硬盘扇区、读写破坏 )芯片。
'病毒源代码中有许多值得学习的地方,本书中的下的物理磁盘读写技术、
时间变速器等就使用了这种技术。玩过网络游戏的人都应该听说过时间变速器,这种变速
器运行在,与操作系统同一特权级,使用特殊的指令改变计算机的时钟周期,骗过
操作系统,造成计时器(时间)高速“前进”的假象,许多网络游戏就是用这样的变速器来

作弊的。在*)下实现过汇编高级编程的人一定会对+文件很熟悉,可是
的产品未来将脱离*),不再提供对*)的支持。(&提供新的可执行文件格式,
本书将详细地说明的结构,并在文件结构的基础上实现截取、屏幕取词等技术。
全书分为10 章,内容简介如下:
第章*,,与数据共享,在(&中通过使用内存映像文件、全局原子等实现多进程共
享数据,这一章是基础,后面的很多章节都使用了本章介绍的数据共享技术。
第&章钩子原理,介绍了消息(包括键盘、鼠标消息)的截取、钩子的安装、*,,注入其
他进程的方法等技术。这一章所介绍的内容是后面截取、屏幕取词等技术的基础知识。
第(章系统内核,让读者对内核有了一定的了解,介绍了进程的枚举、线程的
同步、进程深度隐藏的种种方法及技巧、!%&的性能计数器等技术。
第-章低层操作,介绍内嵌汇编获取特权的技巧、%!%&时间变
速器的实现原理、位与(&位代码的核心接口技术等方面的内容。
第.章磁盘读写,分别提供了%!%&下逻辑扇区和物理扇区的读写,介
绍了磁盘操作中鲜为人知的核心技术。
第章回收站和,介绍了回收站的物理存贮结构、监视回收站、缓冲区数据、窗口
的监视等方面的内容。
第/章高级应用,介绍了**、消息机制、剪贴板和目录的监控、程序运行后自动删除、
只运一个实例的多种方法、移动正在使用的文件、类型转换与存储转换、可执行文件加壳
等高级应用技巧。
第0章结构分析,介绍了的文件结构,并详细分析了其中每部分的含义,
这是截取等技术的基础。
第章内存管理,介绍了物理内存的存取、进程内存的存取、内存堆的枚举等核心技术,
让读者对内存的结构有更深入的了解。
第章'$及屏幕取词,介绍了位和(&位的'$技术、
!%&的'$技术、%!%&下的屏幕取词技术(该
技术还包括位的!"#$等关键技术)。其中,如果屏幕取词技术加入英文词库就可以
实现独自开发词霸。
特别说明:在书中所有出现的地方,都适用于;所有出
现!%&的地方,都适用于+。随书附送的光盘提供了书中涉及
的程序源代码。
本书是抄写而成。由于时间仓促,书中难免有不足之处,恳请读者批评指出。如果在
阅读本书或使用书中例子的过程中有什么疑问,请自己学习解决。

第 1 章 DLL 与数据共享
与 WIN16 不同的是,在 WIN32 中不能将全局变量放在 DLL 中让两个或者两个以上的进程
共享。这是由于 win32 中 DLL 没有自己的局部堆,当一个进程装入 DLL 时,系统会自动
将 DLL 的数据和代码映射到该进程的地址空间,DLL 中的任何函数的内存分配请求都是在
被调用进程的地址空间中分配的,其他的进程无权访问这块内存。为了实现不同进程中的
数据共享,可以使用内存映像文件、注册表或文件的读写、全局原子、声明一个共享数据
段(只适用于 WINDOWS9X)、套接字、管道、远程过程调用等技术。其中使用内存映像
文件是最简单有效且实用的方法。
1.1 关于DLL
动态链接库给应用程序提供了一种调用不再其执行代码中的函数的技术。函数全部封
装在动态链接库中,动态链接库实际上是应用程序存储子程序的地方,可以把多个程序频
繁使用的公共函数集中在一起,这样方便模块重用,减少内存空间的交换。*,,可以拥有
自己的数据段,但没有自己的堆栈,而是使用应用程序(+文件)的堆栈。
系统平台提供了一种完全不同的编程和运行环境,可以把程序分为多个独立
的功能模块(*,,),需要用到某一功能即调用相应的模块,不仅减少了+文件的大小
和对内存空间的需求,而且使这些*,,模块可以同时被多个应用程序使用。可以多个模块
同时使用一个*,,1共享的内存中的单一拷贝。例如,自己就可以将一些主要
的系统功能以*模块的形式实现,再如,中的一些基本功能就是由*文件实现的,可
以被其他应用程序调用和集成。
如果与其他*之间没有冲突,该文件通常映射到每个进程虚拟空间的同一地址上。
*模块中包含各种导出函数,用于向外界提供服务。在加载*,,模块时将进程
函数的调用与*,,文件的导出函数相匹配。
在(&环境中,每个进程都复制了自己的读、写全局变量。如果想要与其他进程共
享内存,必须使用内存映像文件、注册表或文件的读写、全局原子、声明一个共享数据段
(只适用于WINDOWS9X)、套接字、管道、远程过程调用等技术。
1.1.1 DLL 的结构
每个文件都包含一个导出函数表,这些导出函数由他们的函数名或者函数编号与外
界联系起来,函数表中还包含了中函数的地址。当应用程序加载模块时,应用程序并
不知道在中的函数的实际地址,只知道函数的名字或者编号,系统在加载模块时动态
建立一个函数调用与函数地址的对应表,如果重新编译或者重建文件,并不需要修改应
用程序,除非改变了导出函数的名字或编号。简单的文件只为应用程序提供导出函数,
比较复杂的文件除了提供导出函数以外,它本身还调用其文件中的函数。这样一个特
殊的可以既有引入函数,又有导出函数。这并不会造成任何问题,因为动态链接过程可
以处理交叉引用的情况。
222链接方式
应用程序导入函数与*,,文件中的导出函数进行链接有两种方式:隐式链接和显式链
接。所谓隐式链接是指在应用程序中不需要指明文件的实际存储路径,程序员不需要关
心文件的实际装载,而显式链接则与此相反。

2隐式链接方式
采用隐式链接方式时,在代码中可以象下面这样声明导出函数:
3
4#55651
#5/57#51
88
格式是“函数名 5导出名字”。当然,如果省略了“59,则意
味着导出的名字就是函数名;如果省略了“9,则意味着由编译器自动产生编号。
在应用程序方面,要求像下面这样明确声明相应的引入函数:
#565:;56<2=:
&2显式链接方式
显示链接方式是直接调用(&的,,<6函数1并制定的路径作为参数。
,,<6返回'参数,应用程序在调用>函数时使用这个参数。
>函数将函数名或编号转换为的力量内部地址。例如,有一个导出如下函
数的文件:
#*5;;56<2=
下面是应用程序对该导出函数的显式链接的例子:
'!,**,,:%%定义一个'!变量;
%%?????????定义函数?????????????????
@A,*B)3C@*D535161
1C:
D@A,*BC@DC:
D@A,*BE#6C@D1 7!>#31 7!1"
A'1)*3C:
D@A,*BF#!5C@D1 7!>#31 7!1
"A'1)*3C:
%%D@A,*B!C@D1 7!>#31 7!1
"A'1)*3C:
D@A,*B!C@D1 7!>#31"A'1
)*3C:
D@A,*BC@D1 7!>#31 7!1
"A'1)*31*)*C:
D@A,*B>C@D1 7!>#31 7!1
"A'1)*3C:
D@A,*B "C@D1 7!>#31 7!1
"A'1)*31 7! "C:
%%D@A,*BC@D1 7!>#31 7!1
"A'1)*31"AC:
@A,*B*,4C@D1 7!>#31 7!1
"A'1)*31"AG5C:
@A$C@!631!63C:
@A,C@*36!5C:
@AC@'*1""1"""1

,!15"1313C:
@A*!5C@,!131"
A51H115C:
@AC@"A1,!15"1
31311C:
@A!C@"A1,!15"1
3131"A51H1C:
@ADC@"AG51,!1
"C:
@A#3C@,!131"
A51H1151,7!!
5C:
@A#*C@,!131"
A51H1151,7!!
5C:
%%??????????????????????????
LEDDLL = LoadLibrary("LedSender.DLL");//加载DLL库
if (LEDDLL)//如果加载dll成功
{
//LED_Startup =(void(WINAPI *)())GetProcAddress(LEDDLL,"LED_Startup");
// LED_Cleanup =(void(WINAPI *)())GetProcAddress(LEDDLL,"LED_Cleanup");
LED_Open =(long(WINAPI *)
(TDeviceParam*,long,long,long))GetProcAddress(LEDDLL,"LED_Open");//获得函数的地址
LED_Close=(void(WINAPI *)(long))GetProcAddress(LEDDLL,"LED_Close");
LED_Query=(void(WINAPI *)(long, BYTE ,BYTE, char*,
WORD))GetProcAddress(LEDDLL,"LED_Query");
LED_AdjustTime=(void(WINAPI *)(long, BYTE ,BYTE, char*,
WORD))GetProcAddress(LEDDLL,"LED_AdjustTime");
LED_SendToScreen=(void(WINAPI *)(long, BYTE , char*,
WORD))GetProcAddress(LEDDLL,"LED_SendToScreen");
LED_SetPower=(void(WINAPI *)(long, BYTE, BYTE, char*, WORD,
DWORD))GetProcAddress(LEDDLL,"LED_SetPower");
LED_GetPower=(void(WINAPI *)(long, BYTE ,BYTE, char*,
WORD))GetProcAddress(LEDDLL,"LED_GetPower");
LED_SetBrightness=(void(WINAPI *)(long, BYTE, BYTE, char*, WORD,
BYTE))GetProcAddress(LEDDLL,"LED_SetBrightness");
// LED_SetIPAddress=(void(WINAPI *)(long, BYTE , BYTE , char*, WORD,
char*))GetProcAddress(LEDDLL,"LED_SetIPAddress");
LED_DownLoadFontSet =(long(WINAPI *)(long, BYTE , BYTE, char*, WORD,
char*))GetProcAddress(LEDDLL,"LED_DownLoadFontSet");
MakeRoot =(long(WINAPI *)(long,long))GetProcAddress(LEDDLL,"MakeRoot");
剩余25页未读,继续阅读
资源评论

- Kolamu2013-11-25只有一章,要是能全点就好了
- yiranjiubao2013-10-21还行 对于C++builder新手来说还是有很多要学的
xjq2003
- 粉丝: 204
- 资源: 34

上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制
