
Windows网络与通信程序设计(第2版) 王艳平 这本书写的非常好,我有本王艳平写的 windows程序设计,写得很好,我自己不做网络开发,就没有买网络的那本书!不过推荐你看看,真的很不错!
本书将编程方法、网络协议和应用实例有机结合起来,详细阐明Windows网络编程的各方面内容。本书首先介绍Windows平台上进行网络编程的基础知识,包括网络硬件、术语、协议、Winsock编程接口和各种I/O方法等;然后通过具体实例详细讲述当前流行的高性能可伸缩服务器设计、IP多播和Internet广播、P2P程序设计、原始套接字、SPI、协议驱动的开发和原始以太数据的发送、ARP欺骗技术、LAN和WAN上的扫描和侦测技术、个人防火墙与网络封包截获技术等;最后讲述IP帮助函数和E-mail的开发方法。 本书结构紧凑,内容由浅入
第1章 计算机网络基础 1
11 网络的概念和网络的组成 1
12 计算机网络参考模型 2
121 协议层次 2
122 TCP/IP参考模型 2
123 应用层(Application Layer) 3
124 传输层(Transport Layer) 3
125 网络层(Network Layer) 3
126 链路层(Link Layer) 4
127 物理层(Physical Layer) 4
13 网络程序寻址方式 4
131 MAC地址 4
132 IP地址 5
133 子网寻址 6
134 端口号 8
135 网络地址转换(NAT) 8
14 网络应用程序设计基础 10
141 网络程序体系结构 10
142 网络程序通信实体 11
143 网络程序开发环境 12
第2章 Winsock编程接口 13
21 Winsock库 13
211 Winsock库的装入和释放 13
212 封装CInitSock类 14
22 Winsock的寻址方式和字节顺序 14
221 Winsock寻址 14
222 字节顺序 16
223 获取地址信息 17
23 Winsock编程详解 20
231 Winsock编程流程 20
232 典型过程图 23
233 TCP服务器和客户端程序举例 24
234 UDP编程 26
24 网络对时程序实例 28
241 时间协议(Time Protocol) 28
242 TCP/IP实现代码 29
第3章 Windows套接字I/O模型 31
31 套接字模式 31
311 阻塞模式 31
312 非阻塞模式 31
32 选择(select)模型 32
321 select函数 32
322 应用举例 33
33 WSAAsyncSelect模型 36
331 消息通知和WSAAsyncSelect函数 36
332 应用举例 37
34 WSAEventSelect模型 40
341 WSAEventSelect函数 40
342 应用举例 42
343 基于WSAEventSelect模型的服务器设计 44
35 重叠(Overlapped)I/O模型 53
351 重叠I/O函数 53
352 事件通知方式 56
353 基于重叠I/O模型的服务器设计 56
第4章 IOCP与可伸缩网络程序 67
41 完成端口I/O模型 67
411 什么是完成端口(completion port)对象 67
412 使用IOCP的方法 67
413 示例程序 69
414 恰当地关闭IOCP 72
42 Microsoft扩展函数 72
421 GetAcceptExSockaddrs函数 73
422 TransmitFile函数 73
423 TransmitPackets函数 74
424 ConnectEx函数 75
425 DisconnectEx函数 76
43 可伸缩服务器设计注意事项 76
431 内存资源管理 76
432 接受连接的方法 77
433 恶意客户连接问题 77
434 包重新排序问题 78
44 可伸缩服务器系统设计实例 78
441 CIOCPServer类的总体结构 78
442 数据结构定义和内存池方案 82
443 自定义帮助函数 85
444 开启服务和停止服务 88
445 I/O处理线程 93
446 用户接口和测试程序 99
第5章 互联网广播和IP多播 100
51 套接字选项和I/O控制命令 100
511 套接字选项 100
512 I/O控制命令 102
52 广播通信 103
53 IP多播(Multicasting) 105
531 多播地址 105
532 组管理协议(IGMP) 105
533 使用IP多播 106
54 基于IP多播的组讨论会实例 110
541 定义组讨论会协议 110
542 线程通信机制 111
543 封装CGroupTalk类 111
544 程序界面 117
第6章 原始套接字 121
61 使用原始套接字 121
62 ICMP编程 121
621 ICMP与校验和的计算 121
622 Ping程序实例 124
623 路由跟踪 126
63 使用IP头包含选项 129
631 IP数据报格式 129
632 UDP数据报格式 131
633 原始UDP封包发送实例 133
64 网络嗅探器开发实例 134
641 嗅探器设计原理 135
642 网络嗅探器的具体实现 136
643 侦听局域网内的密码 138
65 TCP通信开发实例 140
651 创建一个原始套接字,并设置IP头选项 140
652 构造IP头和TCP头 140
653 发送原始套接字数据报 142
654 接收数据 146
第7章 Winsock服务提供者接口(SPI) 147
71 SPI概述 147
72 Winsock协议目录 148
721 协议特性 149
722 使用Winsock API函数枚举协议 150
723 使用Winsock SPI函数枚举协议 151
73 分层服务提供者(LSP) 153
731 运行原理 153
732 安装LSP 154
733 移除LSP 158
734 编写LSP 159
735 LSP实例 161
74 基于SPI的数据报过滤实例 165
75 基于Winsock的网络聊天室开发 171
751 服务端 171
752 客户端 171
753 聊天室程序的设计说明 172
754 核心代码分析 172
第8章 Windows网络驱动接口标准(NDIS)和协议驱动的开发 176
81 核心层网络驱动 176
811 Windows 2000及其后产品的网络体系结构 176
812 NDIS网络驱动程序 177
813 网络驱动开发环境 178
82 WDM驱动开发基础 181
821 UNICODE字符串 181
822 设备对象 181
823 驱动程序的基本结构 183
824 I/O请求包(I/O request packet,IRP)和I/O堆栈 183
825 完整驱动程序示例 186
826 扩展派遣接口 188
827 应用举例(进程诊测实例) 191
83 开发NDIS网络驱动预备知识 198
831 中断请求级别(Interrupt Request Level,IRQL) 198
832 旋转锁(Spin Lock) 198
833 双链表 199
834 封包结构 199
84 NDIS协议驱动 200
841 注册协议驱动 200
842 打开下层协议驱动的适配器 201
843 协议驱动的封包管理 202
844 在协议驱动中接收数据 203
845 从协议驱动发送封包 204
85 NDIS协议驱动开发实例 204
851 总体设计 204
852 NDIS协议驱动的初始化、注册和卸载 206
853 下层NIC的绑定和解除绑定 209
854 发送数据 217
855 接收数据 219
856 用户IOCTL处理 225
第9章 网络扫描与检测技术 233
91 网络扫描基础知识 233
911 以太网数据帧 233
912 ARP 234
913 ARP格式 236
914 SendARP函数 237
92 原始以太封包的发送 238
921 安装协议驱动 238
922 协议驱动用户接口 238
923 发送以太封包的测试程序 244
93 局域网计算机扫描 245
931 管理原始ARP封包 246
932 ARP扫描示例 249
94 互联网计算机扫描 253
941 端口扫描原理 253
942 半开端口扫描实现 254
95 ARP欺骗原理与实现 259
951 IP欺骗的用途和实现原理 259
952 IP地址冲突 260
953 ARP欺骗示例 261
第10章 点对点(P2P)网络通信技术 264
101 P2P穿越概述 264
102 一般概念 265
1021 NAT术语 265
1022 中转 265
1023 反向连接 266
103 UDP打洞 267
1031 中心服务器 267
1032 建立点对点会话 267
1033 公共NAT后面的节点 267
1034 不同NAT后面的节点 268
1035 多级NAT后面的节点 269
1036 UDP空闲超时 270
104 TCP打洞 271
1041 套接字和TCP端口重用 271
1042 打开点对点的TCP流 271
1043 应用程序看到的行为 272
1044 同步TCP打开 273
105 Internet点对点通信实例 273
1051 总体设计 273
1052 定义P2P通信协议 274
1053 客户方程序 275
1054 服务器方程序 287
1055 测试程序 291
第11章 核心层网络封包截获技术 294
111 Windows网络数据和封包过滤概述 294
1111 Windows网络系统体系结构图 294
1112 用户模式下的网络数据过滤 295
1113 内核模式下的网络数据过滤 296
112 中间层网络驱动PassThru 296
1121 PassThru NDIS中间层驱动简介 296
1122 编译和安装PassThru驱动 297
113 扩展PassThru NDIS IM驱动——添加IOCTL接口 297
1131 扩展之后的PassThru驱动(PassThruEx)概况 297
1132 添加基本的DeviceIoControl接口 298
1133 添加绑定枚举功能 302
1134 添加ADAPT结构的引用计数 307
1135 适配器句柄的打开/关闭函数 308
1136 句柄事件通知 315
1137 查询和设置适配器的OID信息 315
114 扩展PassThru NDIS IM驱动——添加过滤规则 323
1141 需要考虑的事项 323
1142 过滤相关的数据结构 324
1143 过滤列表 326
1144 网络活动状态 327
1145 IOCTL控制代码 328
1146 过滤数据 331
115 核心层过滤实例 339
第12章 Windows网络防火墙开发技术 342
121 防火墙技术概述 342
122 金羽(Phoenix)个人防火墙浅析 343
1221 金羽(Phoenix)个人防火墙简介 343
1222 金羽(Phoenix)个人防火墙总体设计 344
1223 金羽(Phoenix)个人防火墙总体结构 345
123 开发前的准备 345
1231 常量的定义 346
1232 访问规则 348
1233 会话结构 348
1234 文件结构 349
1235 UNICODE支持 355
124 应用层DLL模块 356
1241 DLL工程框架 356
1242 共享数据和IO控制 362
1243 访问控制列表ACL(Access List) 364
1244 查找应用程序访问权限的过程 367
1245 类的接口——检查函数 370
125 核心层SYS模块 373
126 主模块工程 375
1261 I/O控制类 375
1262 主应用程序类 377
1263 主对话框中的属性页 380
1264 主窗口类 381
127 防火墙页面 383
1271 网络访问监视页面 383
1272 应用层过滤规则页面 387
1273 核心层过滤规则页面 397
1274 系统设置页面 403
第13章 IP帮助函数 406
131 IP配置信息 406
1311 获取网络配置信息 406
1312 管理网络接口 408
1313 管理IP地址 412
132 获取网络状态信息 415
1321 获取TCP连接表 415
1322 获取UDP监听表 418
1323 获取IP统计数据 420
133 路由管理 427
1331 获取路由表 427
1332 管理特定路由 431
1333 修改默认网关的例子 432
134 ARP表管理 433
1341 获取ARP表 433
1342 添加ARP入口 434
1343 删除ARP入口 434
1344 打印ARP表的例子 434
135 进程网络活动监视实例 438
1351 获取通信的进程终端 438
1352 Netstate源程序代码 439
第14章 Email协议及其编程 444
141 概述 444
142 电子邮件介绍 445
1421 电子邮件Internet的地址 445
1422 Internet邮件系统 445
1423 电子邮件信头的结构及分析 446
143 SMTP原理 448
1431 SMTP原理分析 448
1432 SMTP工作机制 449
1433 SMTP命令码和工作原理 449
1434 SMTP通信模型 450
1435 SMTP的命令和应答 451
144 POP3协议原理 452
1441 POP3协议简介 452
1442 POP3工作原理 453
1443 POP3命令原始码 454
1444 POP3会话实例 459
145 实例分析与程序设计 460
1451 总界面设计 460
1452 SMTP客户端设计 461
1453 POP3客户端设计 473
推荐使用CreateRemoteThread直接注入DLL,具体方法王艳平那本《WINDOWS程序设计》里有。如果在Win7+系统里想要注入不属于同一个Session的进程,需要直接使用NtCreateThreadEx来注。有一些注入类的工具可以在你测试时手动注入DLL。
如果目标进程是你启动的话,可以在启动时设定CREATE_SUSPENDED,然后用QueueUserAPC(强烈推荐)来加载DLL,之后再用ResumeThread恢复运行。
静态的方法也是有的,如傀儡DLL大法等,不过需要你自己分析依赖项。
注入DLL之后,其余的就太容易了。你可以HOOK掉WriteConsole之类的函数拦截向控制台的写入,也可以用GetStdHandle拿到控制名句柄写东西。
现在不流行了,书都是老书了。 Windows编程类Windows 程序设计(第5版)(上、下册)
原书名: Programming Windows (Fifth Edition)
原出版社:Microsoft Press
作者:(美)Charles Petzold
译者:北京博彦科技发展有限责任公司
出版社:北京大学出版社
出版日期:2001-03
页码:1376
定价:160:00RMB此书被认为是Windows编程最好的导论性读本。在1994年5月,此书的作者Charles Petzold被《Window Magazine》和Microsoft公司授予”Windows Pioneer”奖,以表彰他对Microsoft Windows的成功作出的贡献,可见该书的权威性,以至于“如果对Windows开发有什么问题的话,请翻阅PetZold的著作吧”几乎成了一句至理名言。
本书覆盖了WINDOWS编程的方方面面,将windows编程的每一个元素(如输入,输出及对话框,图形,多媒体,线程,文档与视图,Internet等等)讲解得很清晰、简明,采用的大多是具有代表性的示例,代码风格好并且很有实用价值。笔者认为这本书是学习WINDOWS编程的经典入门好书,每一次的细心阅读都会对WINDOWS编程有更深刻的理解, 不过笔者认为书中讲的内容都较为基础,更深层的东西可以去看《WINDOWS核心编程》。
笔者建议有条件的读者,最好阅读英文原版。Windows核心编程
原书名: Programming Applications for Microsoft Windows Fourth Editio
原出版社:Microsoft Press
作者:(美)Jeffrey Richter
译者:王建华等
出版社:机械工业出版社
出版日期:2000-05
页码:689
定价:86:00RMBJeffrey Richter 是 Windows System 程序设计的头头,他的每一本书都对 Windows 核心有很精彩的剖析,笔者从《Windows 95 程式设计指南》,《Windows高级编程指南》,《Windows核心编程》到《Applied Microsoft NET Framework Programming(影印版)》一直阅读他写的书,可以说本本经典,阿蒙是他的崇拜者,死心踏地地追随Jeffrey Richter。
本书是讲解Windows *** 作系统内部机制的专著,作者从基本概念入手,全面系统地介绍了Windows的各种基本构件,如进程、线程、DLL和内存管理等,并列举了大量应用程序,精辟地分析了构件的使用方法,为掌握Windows 编程技巧提供了一条有效的捷径。笔者写过两年的windows驱动程序, 本书的内存管理章节给我提供了很大的帮助,可见本书对内存管理讲得非常地透彻。另外本书对进程和线程的讲解也十分地经典,先说明其来龙去脉,然后描述其中的工作机制,并详细说明windows提供了哪些API函数来进行多进程与多线程的程序设计,如果能结合侯捷老师的《Win32多线程程序设计》一起研究的话,那你对进程与线程的理解将更有深度。Win32 多线程程序设计
作者:侯俊杰(侯捷)
出版社:华中科技大学出版社
出版日期:2002-01
页码:480
定价:59 80RMB
使用线程,你可以产生高效率的服务器,建立Internet服务器扩充软件,获得多CPU系统的好处,建立精巧的COM/OLE对象,并改善程序的反应度。
本书的第一篇“上路吧,线程”,为你建立必要的基础,包括线程的启动和结束、核心对象、激发和未激发状态的意义、同步机制及其用途。第二篇“多线程程序设计的工具与策略”,介绍C runtime函数库和MFC对线程的支持、如何在USER和GDI的限制之下施行多线程、如何产生一个DLL、如何对多线程程序调试。第三篇“真实世界中的多线程应用程序”,谈论如何组织一个程序,使它有效支持多线程。本篇示范两个真实世界中的应用软件,第一个是个freethreaded OLE automation server,第二个是 ISAPI程序,是个IIS(Internet Information Server)扩充软件,示范如何和JET数据库交谈。
本书从理论到实际应用讲得很全面及易懂,范例程序也很丰富并且具体生动,而且书里不时地在一些需要注意的地方给出一些总结性的建议,这不仅让读者倍感亲切,而且也加深了对所学内容的理解。
MFC编程类MFC Windows程序设计(第2版)
原书名: Programming Windows with MFC Second Edition
原出版社:Microsoft Press
作者:(美)Jeff Prosise
译者:北京博彦科技发展有限公司
出版社:清华大学出版社
出版日期:2001-09
页码:1166
定价:128:00RMB本书不仅扩展了已被认为是权威的关于Microsoft 用于windows API的功能强大的C++类库的阐述,还新增了有关COM,OLE和ActiveX等内容。本书的作者,Jeff Prosise,用其无与伦比的技巧向读者讲述了MFC程序设计中的基本概念和主要技术-再次阐释了在32位windows平台上进行快速的面向对象开发的完美方法。
笔者认为本书讲解细致而且全面,比较适合初学者,
深入浅出MFC(第二版)
作者:侯俊杰(侯捷)
出版社:华中科技大学出版社
出版日期:2001-01
页码:736
定价:80:00RMB 有关这本书及其作者,不用我多说,大家已非常清楚,网上也是众说纷坛。
本书分为四大篇。第一篇讲SDK编程,简单明了的概括了SDK程序设计的主要原理,提供进入MFC核心技术以及应用技术之前的所有技术基础,特别是Windows的消息机制,讲得很清楚。第二篇介绍Visual C++整合环境开发工具,对整个软体开发环境有全盘以及概观性的介绍,可以让初学者迅速了解手上掌握的工具,以及它们的主要功能。第三篇介绍application framework的观念,以及MFC骨干程序,所谓骨干程序,是指Visual C++的工具AppWizard所产生出来的程序码。根据我的了解,太多人使用 MFC 是编写程序只是知其然而不知其所以然,本篇详细解释 MFC 程式之来龙去脉,为初入 MFC 领域的读者奠定扎实的基础。第四篇以微软公司附于Visual C++光碟片上的一个范例程序Scribble为主轴,一步一步加上新的功能。并在其间深入介绍Runtime Type Information(RTTI)、Dynamic Creation、Persistence(Serialization)、Message Mapping、Command Routing等核心技术。这些技术正是其他书籍最缺乏的部分。
“初学者只需掌握它的精髓,而不需深究它的全部内容,否则很有可能你会看不懂,等你在不断学习过程中,返过来重复学习,你将会发现此书的奥秘所在”。COM编程类COM原理与应用
作者:潘爱民
出版社:清华大学出版社
出版日期:2001-03
页码:472
定价:39:00RMB本书不仅介绍了COM的基本原理及其扩展知识,还讲述了MTS及COM+的一些知识。全书分为三部分,第一部分为COM基础,作者在写这部分内容时,参阅了“Inside COM”一书,但对内容结构进行了重新调整,并增加了一些关于WINDOWS程序设计和MFC方面的知识;第二部分为COM扩展,第三部分为COM应用与发展,介绍了组件化程序设计思想以及多层软件结构模型。读者在学习了COM的基本原理之后,结合MTS和COM+所倡导的一些概念,就可以从更高的层次来理解和使用COM及COM+了。
对于COM初学者来说这是一本经典的书, 它由浅到深的论述使你对COM的概念及框架有较深的理解。COM本质论
原书名:Essential COM
作者:(美)Box,D
译者:潘爱民
出版社:中国电力出版社
出版日期:2001-08
页码:358
定价:49:00RMB本书由具有鬼才之称的Don Box撰写,在计算机界,“没有人能把COM阐释得比Don Box更清楚”;
本书无疑是COM领域中最负有盛名的一本书。在亚马逊的排行榜上曾盘踞数月之久,很多专家给其以极高的评价。读完这本书之后,COM对于您会“变得再明白不过了”(这是“Inside OLE”的作者Kraig Brockschmidt和本书的作者DonBox在顿悟了COM和OLE之后的境界)。期望您会有这样的感受。
本书揭示了COM(组件对象模型)的本质,旨在帮助开发人员真正理解COM的为什么,而不仅限于怎么使用。书中还提供了一个完整的分布式COM应用,演示了各种编程技术。此外,本书还涉及到许多COM高级特性,例如线程模型(或者套间模型)、名字对象、连接点等,因此,要想从本书获得最大受益,您也需要有COM的知识作基础,建议读者先阅读《COM原理与应用》之后再阅读本书。
“ 这不是一本供新手学习的书,也不是一本教您如何开发COM组件的书,而是一本在一定的基础上继续提高对COM的理解的书。如果用它来学习COM,您可能会失望,因为许多内容需要有一定的经验基础才能看得明白;但是如果用它来加深自己对COM的理解,那么这本书再合适不过了。”
引擎和rpgmaker这种不是一个概念的。引擎就是个概念而已,你自己写游戏也会要有一个框架,那也算是个简陋的引擎。
所有的游戏引擎最后都是要调用Directx和Opengl。也就是说游戏引擎只是对Directx等底层API的一种包装,方便使用,当然也提供了很多游戏编程里可能会用到的强大功能。写游戏基本上是不得不使用引擎的,因为你没有必要从头造轮子,除非你打算显示一个就要手打上百行代码,或者只是做一个超简单的游戏做练习。
如果你会dx 懂底层再学习游戏引擎会更容易理解它的原理 用着更顺手,甚至自己写一个小引擎。
只是想写些小游戏 不学DX只学学游戏引擎也是完全可以的,但是要会用游戏引擎一定要学编程。
rpgmaker这些是属于游戏制作软件 不懂编程也可以上手 说白了它背后也有一套游戏引擎,我们用软件界面去改游戏设置,比如对话地图什么的,然后引擎载入设定好的东西,运行,就成了游戏了。不过远没有用C++等语言加上游戏引擎做出来的游戏类型灵活多变,你也用过,基本上RM只能做RPG类型的游戏,虽然也有内嵌的Ruby脚本但还是太多限制 ,而一个游戏引擎只要你会编程 写出什么样的游戏完全看你自己的,比点点鼠标就能生成一个游戏的成就感大多了, 当然游戏编程更难了。。。我也在研究游戏编程 想一起交流交流就发个私信什么的吧
一、结论:
只可以间接修改
二、原因:
32位字长的Windows 环境是一个“多任务单用户” *** 作系统,运行在X86或者兼容CPU的保护模式上,此模式使每个正在运行的程序(准确的叫法是“进程”,即Windows所调度的“任务”)都有自己独立的4GB逻辑内存空间,所谓保护就是每个进程的4GB内存地址逻辑上彼此独立,CPU和Windows保护每个独立进程的4GB逻辑内存空间不被其他用户进程直接修改。
而且4GB中只有2GB属于本进程专有地址,另外2GB属于Windows系统保护的系统内存空间,受windows系统严格保护,不允许用户进程直接读写只能通过“内核对象”间接访问。
所以您通过某个软件看到了内存地址0x0467A618的内容并试图用自编的VC程序修改时,实际上只能修改自编VC程序运行实例(即“进程”)的同编号进程地址的内容,而不能修改原来的那个进程的内存地址内容。
三、解决方案:
1)思路:
a启动您希望修改其内容的进程,记下您希望修改的地址的内容;
b编写一个VC程序,先按照进程名字获取进程ID,然后搜索这个ID的进程中,非系统内存区域中匹配这个内容的内存地址(注意:从Windows 2000/XP开始的版本,系统保留区域为64K~2GB,2GB以上的才是用户进程内存区域)
c找到内容匹配的内存地址后,将其修改为你希望的值。
2)具体编程方法:
a建立一个名字为MemRepair的VC工程(选择32位控制台工程,使用预编译头)
b陆续加入以下三个文件:
MemRepairh MemRepaircpp MainProgcpp,分别键入以下源代码:
/(完整VC工程源代码,已经在WinXP+VC2008Express环境调试通过)/
/ 新文件 /
/ /
//StdAfxh
#if !defined(AFX_STDAFX_H__7438D592_DA27_443E_824E_D280AF259D3F__INCLUDED_)
#define AFX_STDAFX_H__7438D592_DA27_443E_824E_D280AF259D3F__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// TODO: reference additional headers your program requires here
#include "MemRepairh"
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line
#endif // !defined(AFX_STDAFX_H__7438D592_DA27_443E_824E_D280AF259D3F__INCLUDED_)
/ 新文件 /
/ /
//MemRepairh
#ifndef __MEMFINDER_H__
#define __MEMFINDER_H__
#include <windowsh>
class CMemFinder
{
public:
CMemFinder(DWORD dwProcessId);
virtual ~CMemFinder();
// 属性
public:
BOOL IsFirst() const { return m_bFirst; }
BOOL IsValid() const { return m_hProcess != NULL; }
int GetListCount() const { return m_nListCnt; }
DWORD operator [](int nIndex) { return m_arList[nIndex]; }
// *** 作
virtual BOOL FindFirst(DWORD dwValue);
virtual BOOL FindNext(DWORD dwValue);
virtual BOOL WriteMemory(DWORD dwAddr, DWORD dwValue);
// 实现
protected:
virtual BOOL CompareAPage(DWORD dwBaseAddr, DWORD dwValue);
DWORD m_arList[1024]; // 地址列表
int m_nListCnt; // 有效地址的个数
HANDLE m_hProcess; // 目标进程句柄
BOOL m_bFirst; // 是不是第一次搜索
};
#endif // __MEMFINDER_H__
/ 新文件 /
/ /
//MemRepaircpp
#include "MemRepairh"
#include "StdAfxh"
CMemFinder::CMemFinder(DWORD dwProcessId)
{
m_nListCnt = 0;
m_bFirst = TRUE;
m_hProcess = ::OpenProcess(PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_VM_OPERATION, FALSE, dwProcessId);
}
CMemFinder::~CMemFinder()
{
if(m_hProcess != NULL)
::CloseHandle(m_hProcess);
}
BOOL CMemFinder::FindFirst(DWORD dwValue)
{
const DWORD dwOneGB = 102410241024; // 1GB
const DWORD dwOnePage = 41024; // 4KB
if(m_hProcess == NULL)
return FALSE;
// 查看 *** 作系统类型,以决定开始地址
DWORD dwBase;
OSVERSIONINFO vi = { sizeof(vi) };
::GetVersionEx(&vi);
if (vidwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
dwBase = 410241024; // Windows 98系列,4MB
else
dwBase = 6401024; // Windows NT系列,64KB
// 在开始地址到2GB的地址空间进行查找
for(; dwBase < 2dwOneGB; dwBase += dwOnePage)
{
// 比较1页大小的内存
CompareAPage(dwBase, dwValue);
}
m_bFirst = FALSE;
return TRUE;
}
BOOL CMemFinder::CompareAPage(DWORD dwBaseAddr, DWORD dwValue)
{
// 读取1页内存
BYTE arBytes[4096];
if(!::ReadProcessMemory(m_hProcess, (LPVOID)dwBaseAddr, arBytes, 4096, NULL))
return FALSE; // 此页不可读
// 在这1页内存中查找
DWORD pdw;
for(int i=0; i<(int)41024-3; i++)
{
pdw = (DWORD)&arBytes[i];
if(pdw[0] == dwValue) // 等于要查找的值?
{
if(m_nListCnt >= 1024)
return FALSE;
// 添加到全局变量中
m_arList[m_nListCnt++] = dwBaseAddr + i;
}
}
return TRUE;
}
BOOL CMemFinder::FindNext(DWORD dwValue)
{
// 保存m_arList数组中有效地址的个数,初始化新的m_nListCnt值
int nOrgCnt = m_nListCnt;
m_nListCnt = 0;
// 在m_arList数组记录的地址处查找
BOOL bRet = FALSE; // 假设失败
DWORD dwReadValue;
for(int i=0; i<nOrgCnt; i++)
{
if(::ReadProcessMemory(m_hProcess, (LPVOID)m_arList[i], &dwReadValue, sizeof(DWORD), NULL))
{
if(dwReadValue == dwValue)
{
m_arList[m_nListCnt++] = m_arList[i];
bRet = TRUE;
}
}
}
return bRet;
}
BOOL CMemFinder::WriteMemory(DWORD dwAddr, DWORD dwValue)
{
return ::WriteProcessMemory(m_hProcess, (LPVOID)dwAddr, &dwValue, sizeof(DWORD), NULL);
}
/ 新文件 /
/ /
//主程序mainprogcpp
#include "stdafxh"
#include "windowsh"
#include "stdioh"
#include <iostream>
using namespace std;
BOOL FindFirst(DWORD dwValue); // 在目标进程空间进行第一次查找
BOOL FindNext(DWORD dwValue); // 在目标进程地址空间进行第2、3、4……次查找
DWORD g_arList[1024]; // 地址列表
int g_nListCnt; // 有效地址的个数
HANDLE g_hProcess; // 目标进程句柄
//////////////////////
BOOL WriteMemory(DWORD dwAddr, DWORD dwValue);
void ShowList();
int main(int argc, char argv[])
{
// 启动02testor进程
char szFileName[] = "\\02testor\\debug\\02testorexe";
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
::CreateProcess(NULL, szFileName, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
// 关闭线程句柄,既然我们不使用它
::CloseHandle(pihThread);
g_hProcess = pihProcess;
// 输入要修改的值
int iVal;
printf(" Input val = ");
scanf("%d", &iVal);
// 进行第一次查找
FindFirst(iVal);
// 打印出搜索的结果
ShowList();
while(g_nListCnt > 1)
{
printf(" Input val = ");
scanf("%d", &iVal);
// 进行下次搜索
FindNext(iVal);
// 显示搜索结果
ShowList();
}
// 取得新值
printf(" New value = ");
scanf("%d", &iVal);
// 写入新值
if(WriteMemory(g_arList[0], iVal))
printf(" Write data success \n");
::CloseHandle(g_hProcess);
return 0;
}
BOOL CompareAPage(DWORD dwBaseAddr, DWORD dwValue)
{
// 读取1页内存
BYTE arBytes[4096];
if(!::ReadProcessMemory(g_hProcess, (LPVOID)dwBaseAddr, arBytes, 4096, NULL))
return FALSE; // 此页不可读
// 在这1页内存中查找
DWORD pdw;
for(int i=0; i<(int)41024-3; i++)
{
pdw = (DWORD)&arBytes[i];
if(pdw[0] == dwValue) // 等于要查找的值?
{
if(g_nListCnt >= 1024)
return FALSE;
// 添加到全局变量中
g_arList[g_nListCnt++] = dwBaseAddr + i;
}
}
return TRUE;
}
BOOL FindFirst(DWORD dwValue)
{
const DWORD dwOneGB = 102410241024; // 1GB
const DWORD dwOnePage = 41024; // 4KB
if(g_hProcess == NULL)
return FALSE;
// 查看 *** 作系统类型,以决定开始地址
DWORD dwBase;
OSVERSIONINFO vi = { sizeof(vi) };
::GetVersionEx(&vi);
if (vidwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
dwBase = 410241024; // Windows 98系列,4MB
else
dwBase = 6401024; // Windows NT系列,64KB
// 在开始地址到2GB的地址空间进行查找
for(; dwBase < 2dwOneGB; dwBase += dwOnePage)
{
// 比较1页大小的内存
CompareAPage(dwBase, dwValue);
}
return TRUE;
}
BOOL FindNext(DWORD dwValue)
{
// 保存m_arList数组中有效地址的个数,初始化新的m_nListCnt值
int nOrgCnt = g_nListCnt;
g_nListCnt = 0;
// 在m_arList数组记录的地址处查找
BOOL bRet = FALSE; // 假设失败
DWORD dwReadValue;
for(int i=0; i<nOrgCnt; i++)
{
if(::ReadProcessMemory(g_hProcess, (LPVOID)g_arList[i], &dwReadValue, sizeof(DWORD), NULL))
{
if(dwReadValue == dwValue)
{
g_arList[g_nListCnt++] = g_arList[i];
bRet = TRUE;
}
}
}
return bRet;
}
// 打印出搜索到的地址
void ShowList()
{
for(int i=0; i< g_nListCnt; i++)
{
printf("%08lX \n", g_arList[i]);
}
}
BOOL WriteMemory(DWORD dwAddr, DWORD dwValue)
{
return ::WriteProcessMemory(g_hProcess, (LPVOID)dwAddr, &dwValue, sizeof(DWORD), NULL);
}
以上就是关于求推荐一本 VC++网络编程 的好书全部的内容,包括:求推荐一本 VC++网络编程 的好书、在windows中怎样实现对 cmd控制台的 程序注入、有什么关于Windows API(C++/C的)和MFC方面的好书,推荐几本等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)