展开全部

主编推荐语

Windows内核安全编程技术实用教程,覆盖32/64位操作系统,适合计算机软件安全从业者。

内容简介

本书重点围绕Windows操作系统的机制介绍内核安全编程技术,除少数特殊章节外,大部分内容均适用于Windows 2000至Windows 10操作系统,体系结构覆盖32位以及64位。同时本书也深入浅出地介绍了汇编基础和系统内核机制。本书共分为三篇,分别从不同的角度介绍内核编程技术。第1篇面向零基础的读者,其中“内核编程环境”“内核驱动运行与调试”“内核编程基础”重点介绍与内核编程相关的基本知识、开发环境搭建,以及基本的编程机制。“应用与内核通信”和“64位和32位内核开发差异”主要介绍应用层编程与内核编程的数据交互。最后,介绍了编程过程所需注意的事项,以及设计技巧。第2篇结合操作系统的机制,从最简单的“串口的过滤”开始,介绍了“键盘的过滤”‘“磁盘的过滤”“文件系统的过滤”“Windows过滤平台”“NDIS协议驱动”“NDIS小端口驱动”,以及“NDIS中间层驱动”。覆盖了整个Windows系统的主流过滤框架,并且深入剖析了文件透明加密解密的原理。第3篇侧重安全技术,重点介绍了安全编程所需要使用到的知识,如“IA-32汇编基础”“Windows内核挂钩”“Windows通知与回调”“保护进程”,以及“代码注入与防注入”。本书由具有十多年终端安全开发经验的从业人员编写,以简洁实用为准则,理论与实际案例相结合。适用于计算机软件安全从业人员、有一定C语言基础且对计算机安全感兴趣的爱好者。

目录

  • 封面
  • 前折页
  • 书名页
  • 内容简介
  • 版权页
  • 推荐序
  • 前言
  • 本书的作者和贡献者
  • 特别致谢
  • 目录
  • 第1篇 基础篇
  • 第1章 内核编程环境
  • 1.1 下载开发编译环境
  • 1.1.1 编译环境介绍
  • 1.1.2 下载Visual Studio与WDK
  • 1.2 编写第一个C文件
  • 1.2.1 通过Visual Studio新建工程
  • 1.2.2 内核入口函数
  • 1.2.3 编写入口函数体
  • 1.3 编译第一个驱动
  • 1.3.1 通过Visual Studio编译
  • 1.3.2 通过WDK直接编译
  • 第2章 内核驱动运行与调试
  • 2.1 驱动的运行
  • 2.2 服务的基本操作
  • 2.2.1 打开服务管理器
  • 2.2.2 服务的注册
  • 2.2.3 服务的启动与停止
  • 2.2.4 服务的删除
  • 2.2.5 服务的例子
  • 2.2.6 服务小结
  • 2.3 驱动的调试
  • 2.3.1 基于VS+WDK环境调试
  • 2.3.2 基于Windbg调试
  • 第3章 内核编程基础
  • 3.1 上下文环境
  • 3.2 中断请求级别
  • 3.3 驱动异常
  • 3.4 字符串操作
  • 3.5 链表
  • 3.5.1 头节点初始化
  • 3.5.2 节点插入
  • 3.5.3 链表遍历
  • 3.5.4 节点移除
  • 3.6 自旋锁
  • 3.6.1 使用自旋锁
  • 3.6.2 在双向链表中使用自旋锁
  • 3.6.3 使用队列自旋锁提高性能
  • 3.7 内存分配
  • 3.7.1 常规内存分配
  • 3.7.2 旁视列表
  • 3.8 对象与句柄
  • 3.9 注册表
  • 3.9.1 注册表的打开与关闭
  • 3.9.2 注册表的修改
  • 3.9.3 注册表的读取
  • 3.10 文件操作
  • 3.10.1 文件的打开与关闭
  • 3.10.2 文件的读写
  • 3.11 线程与事件
  • 3.11.1 使用系统线程
  • 3.11.2 使用同步事件
  • 第4章 应用与内核通信
  • 4.1 内核方面的编程
  • 4.1.1 生成控制设备
  • 4.1.2 控制设备的名字和符号链接
  • 4.1.3 控制设备的删除
  • 4.1.4 分发函数
  • 4.1.5 请求的处理
  • 4.2 应用方面的编程
  • 4.2.1 基本的功能需求
  • 4.2.2 在应用程序中打开与关闭设备
  • 4.2.3 设备控制请求
  • 4.2.4 内核中的对应处理
  • 4.2.5 结合测试的效果
  • 第5章 64位和32位内核开发差异
  • 5.1 64位系统新增机制
  • 5.1.1 WOW64子系统
  • 5.1.2 PatchGuard技术
  • 5.1.3 64位驱动的编译、安装与运行
  • 5.2 编程差异
  • 5.2.1 汇编嵌入变化
  • 5.2.2 预处理与条件编译
  • 5.2.3 数据结构调整
  • 第6章 内核编程技巧
  • 6.1 初始化赋值问题
  • 6.2 有效性判断
  • 6.3 一次性申请
  • 6.4 独立性与最小化原则
  • 6.5 嵌套陷阱
  • 6.6 稳定性处理
  • 6.6.1 事前处理
  • 6.6.2 事中处理
  • 6.6.3 事后处理
  • 第2篇 过滤篇
  • 第7章 串口的过滤
  • 7.1 过滤的概念
  • 7.1.1 设备绑定的内核API之一
  • 7.1.2 设备绑定的内核API之二
  • 7.1.3 生成过滤设备并绑定
  • 7.1.4 从名字获得设备对象
  • 7.1.5 绑定所有串口
  • 7.2 获得实际数据
  • 7.2.1 请求的区分
  • 7.2.2 请求的结局
  • 7.2.3 写请求的数据
  • 7.3 完整的代码
  • 7.3.1 完整的分发函数
  • 7.3.2 如何动态卸载
  • 7.3.3 代码的编译与运行
  • 第8章 键盘的过滤
  • 8.1 技术原理
  • 8.1.1 预备知识
  • 8.1.2 Windows中从击键到内核
  • 8.1.3 键盘硬件原理
  • 8.2 键盘过滤的框架
  • 8.2.1 找到所有的键盘设备
  • 8.2.2 应用设备扩展
  • 8.2.3 键盘过滤模块的DriverEntry
  • 8.2.4 键盘过滤模块的动态卸载
  • 8.3 键盘过滤的请求处理
  • 8.3.1 通常的处理
  • 8.3.2 PNP的处理
  • 8.3.3 读的处理
  • 8.3.4 读完成的处理
  • 8.4 从请求中打印出按键信息
  • 8.4.1 从缓冲区中获得KEYBOARD_INPUT_DATA
  • 8.4.2 从KEYBOARD_INPUT_DATA中得到键
  • 8.4.3 从MakeCode到实际字符
  • 8.5 Hook分发函数
  • 8.5.1 获得类驱动对象
  • 8.5.2 修改类驱动的分发函数指针
  • 8.5.3 类驱动之下的端口驱动
  • 8.5.4 端口驱动和类驱动之间的协作机制
  • 8.5.5 找到关键的回调函数的条件
  • 8.5.6 定义常数和数据结构
  • 8.5.7 打开两种键盘端口驱动寻找设备
  • 8.5.8 搜索在KbdClass类驱动中的地址
  • 8.6 Hook键盘中断反过滤
  • 8.6.1 中断:IRQ和INT
  • 8.6.2 如何修改IDT
  • 8.6.3 替换IDT中的跳转地址
  • 8.6.4 QQ的PS/2反过滤措施
  • 8.7 直接用端口操作键盘
  • 8.7.1 读取键盘数据和命令端口
  • 8.7.2 p2cUserFilter的最终实现
  • 第9章 磁盘的虚拟
  • 9.1 虚拟的磁盘
  • 9.2 一个具体的例子
  • 9.3 入口函数
  • 9.3.1 入口函数的定义
  • 9.3.2 Ramdisk驱动的入口函数
  • 9.4 EvtDriverDeviceAdd函数
  • 9.4.1 EvtDriverDeviceAdd的定义
  • 9.4.2 局部变量的声明
  • 9.4.3 磁盘设备的创建
  • 9.4.4 如何处理发往设备的请求
  • 9.4.5 用户配置的初始化
  • 9.4.6 链接给应用程序
  • 9.5 FAT12/16磁盘卷初始化
  • 9.5.1 磁盘卷结构简介
  • 9.5.2 Ramdisk对磁盘的初始化
  • 9.6 驱动中的请求处理
  • 9.6.1 请求的处理
  • 9.6.2 读/写请求
  • 9.6.3 DeviceIoControl请求
  • 9.7 Ramdisk的编译和安装
  • 9.7.1 编译
  • 9.7.2 安装
  • 9.7.3 对安装的深入探究
  • 第10章 磁盘的过滤
  • 10.1 磁盘过滤驱动的概念
  • 10.1.1 设备过滤和类过滤
  • 10.1.2 磁盘设备和磁盘卷设备过滤驱动
  • 10.1.3 注册表和磁盘卷设备过滤驱动
  • 10.2 具有还原功能的磁盘卷过滤驱动
  • 10.2.1 简介
  • 10.2.2 基本思想
  • 10.3 驱动分析
  • 10.3.1 DriverEntry函数
  • 10.3.2 AddDevice函数
  • 10.3.3 PnP请求的处理
  • 10.3.4 Power请求的处理
  • 10.3.5 DeviceIoControl请求的处理
  • 10.3.6 bitmap的作用和分析
  • 10.3.7 boot驱动完成回调函数和稀疏文件
  • 10.3.8 读/写请求的处理
  • 第11章 文件系统的过滤与监控
  • 11.1 文件系统的设备对象
  • 11.1.1 控制设备与卷设备
  • 11.1.2 生成自己的一个控制设备
  • 11.2 文件系统的分发函数
  • 11.2.1 普通的分发函数
  • 11.2.2 文件过滤的快速IO分发函数
  • 11.2.3 快速IO分发函数的一个实现
  • 11.2.4 快速IO分发函数逐个简介
  • 11.3 设备的绑定前期工作
  • 11.3.1 动态地选择绑定函数
  • 11.3.2 注册文件系统变动回调
  • 11.3.3 文件系统变动回调的一个实现
  • 11.3.4 文件系统识别器
  • 11.4 文件系统控制设备的绑定
  • 11.4.1 生成文件系统控制设备的过滤设备
  • 11.4.2 绑定文件系统控制设备
  • 11.4.3 利用文件系统控制请求
  • 11.5 文件系统卷设备的绑定
  • 11.5.1 从IRP中获得VPB指针
  • 11.5.2 设置完成函数并等待IRP完成
  • 11.5.3 卷挂载IRP完成后的工作
  • 11.5.4 完成函数的相应实现
  • 11.5.5 绑定卷的实现
  • 11.6 读/写操作的过滤
  • 11.6.1 设置一个读处理函数
  • 11.6.2 设备对象的区分处理
  • 11.6.3 解析读请求中的文件信息
  • 11.6.4 读请求的完成
  • 11.7 其他操作的过滤
  • 11.7.1 文件对象的生存周期
  • 11.7.2 文件的打开与关闭
  • 11.7.3 文件的删除
  • 11.8 路径过滤的实现
  • 11.8.1 取得文件路径的三种情况
  • 11.8.2 打开成功后获取路径
  • 11.8.3 在其他时刻获得文件路径
  • 11.8.4 在打开请求完成之前获得路径名
  • 11.8.5 把短名转换为长名
  • 11.9 把sfilter编译成静态库
  • 11.9.1 如何方便地使用sfilter
  • 11.9.2 初始化回调、卸载回调和绑定回调
  • 11.9.3 绑定与回调
  • 11.9.4 插入请求回调
  • 11.9.5 如何利用sfilter.lib
  • 第12章 文件系统透明加密
  • 12.1 文件透明加密的应用
  • 12.1.1 防止企业信息泄密
  • 12.1.2 文件透明加密防止企业信息泄密
  • 12.1.3 文件透明加密软件的例子
  • 12.2 区分进程
  • 12.2.1 机密进程与普通进程
  • 12.2.2 找到进程名字的位置
  • 12.2.3 得到当前进程的名字
  • 12.3 内存映射与文件缓冲
  • 12.3.1 记事本的内存映射文件
  • 12.3.2 Windows的文件缓冲
  • 12.3.3 文件缓冲:明文还是密文的选择
  • 12.3.4 清除文件缓冲
  • 12.4 加密标识
  • 12.4.1 保存在文件外、文件头还是文件尾
  • 12.4.2 隐藏文件头的大小
  • 12.4.3 隐藏文件头的设置偏移
  • 12.4.4 隐藏文件头的读/写偏移
  • 12.5 文件加密表
  • 12.5.1 何时进行加密操作
  • 12.5.2 文件控制块与文件对象
  • 12.5.3 文件加密表的数据结构与初始化
  • 12.5.4 文件加密表的操作:查询
  • 12.5.5 文件加密表的操作:添加
  • 12.5.6 文件加密表的操作:删除
  • 12.6 文件打开处理
  • 12.6.1 直接发送IRP进行查询与设置操作
  • 12.6.2 直接发送IRP进行读/写操作
  • 12.6.3 文件的非重入打开
  • 12.6.4 文件的打开预处理
  • 12.7 读/写加密和解密
  • 12.7.1 在读取时进行解密
  • 12.7.2 分配与释放MDL
  • 12.7.3 写请求加密
  • 12.8 crypt_file的组装
  • 12.8.1 crypt_file的初始化
  • 12.8.2 crypt_file的IRP预处理
  • 12.8.3 crypt_file的IRP后处理
  • 第13章 文件系统微过滤驱动
  • 13.1 文件系统微过滤驱动简介
  • 13.1.1 文件系统微过滤驱动的由来
  • 13.1.2 Minifilter的优点与不足
  • 13.2 Minifilter的编程框架
  • 13.2.1 微文件系统过滤的注册
  • 13.2.2 微过滤器的数据结构
  • 13.2.3 卸载回调函数
  • 13.2.4 预操作回调函数
  • 13.2.5 后操作回调函数
  • 13.2.6 其他回调函数
  • 13.3 Minifilter如何与应用程序通信
  • 13.3.1 建立通信端口的方法
  • 13.3.2 在用户态通过DLL使用通信端口的范例
  • 13.4 Minifilter的安装与加载
  • 13.4.1 安装Minifilter的INF文件
  • 13.4.2 启动安装完成的Minifilter
  • 第14章 网络传输层过滤
  • 14.1 TDI概要
  • 14.1.1 为何选择TDI
  • 14.1.2 从socket到Windows内核
  • 14.1.3 TDI过滤的代码例子
  • 14.2 TDI的过滤框架
  • 14.2.1 绑定TDI的设备
  • 14.2.2 唯一的分发函数
  • 14.2.3 过滤框架的实现
  • 14.2.4 主要过滤的请求类型
  • 14.3 生成请求:获取地址
  • 14.3.1 过滤生成请求
  • 14.3.2 准备解析IP地址与端口
  • 14.3.3 获取生成的IP地址和端口
  • 14.3.4 连接终端的生成与相关信息的保存
  • 14.4 控制请求
  • 14.4.1 TDI_ASSOCIATE_ADDRESS的过滤
  • 14.4.2 TDI_CONNECT的过滤
  • 14.4.3 其他的次功能号
  • 14.4.4 设置事件的过滤
  • 14.4.5 TDI_EVENT_CONNECT类型的设置事件的过滤
  • 14.4.6 直接获取发送函数的过滤
  • 14.4.7 清理请求的过滤
  • 14.5 本书例子tdifw.lib的应用
  • 14.5.1 tdifw库的回调接口
  • 14.5.2 tdifw库的使用例子
  • 第15章 Windows过滤平台
  • 15.1 WFP简介
  • 15.2 WFP框架
  • 15.3 基本对象模型
  • 15.3.1 过滤引擎
  • 15.3.2 垫片
  • 15.3.3 呼出接口
  • 15.3.4 分层
  • 15.3.5 子层
  • 15.3.6 过滤器
  • 15.3.7 呼出接口回调函数
  • 15.4 WFP操作
  • 15.4.1 呼出接口的注册与卸载
  • 15.4.2 呼出接口的添加与移除
  • 15.4.3 子层的添加与移除
  • 15.4.4 过滤器的添加
  • 15.5 WFP过滤例子
  • 第16章 NDIS协议驱动
  • 16.1 以太网包和网络驱动架构
  • 16.1.1 以太网包和协议驱动
  • 16.1.2 NDIS网络驱动
  • 16.2 协议驱动的DriverEntry
  • 16.2.1 生成控制设备
  • 16.2.2 注册协议
  • 16.3 协议与网卡的绑定
  • 16.3.1 协议与网卡的绑定概念
  • 16.3.2 绑定回调处理的实现
  • 16.3.3 协议绑定网卡的API
  • 16.3.4 解决绑定竞争问题
  • 16.3.5 分配接收和发送的包池与缓冲池
  • 16.3.6 OID请求的发送和请求完成回调
  • 16.3.7 ndisprotCreateBinding的最终实现
  • 16.4 绑定的解除
  • 16.4.1 解除绑定使用的API
  • 16.4.2 ndisprotShutdownBinding的实现
  • 16.5 在用户态操作协议驱动
  • 16.5.1 协议的收包与发包
  • 16.5.2 在用户态编程打开设备
  • 16.5.3 用DeviceIoControl发送控制请求
  • 16.5.4 用WriteFile发送数据包
  • 16.5.5 用ReadFile发送数据包
  • 16.6 在内核态完成功能的实现
  • 16.6.1 请求的分发与实现
  • 16.6.2 等待设备绑定完成与指定设备名
  • 16.6.3 指派设备的完成
  • 16.6.4 处理读请求
  • 16.6.5 处理写请求
  • 16.7 协议驱动的接收回调
  • 16.7.1 和接收包有关的回调函数
  • 16.7.2 ReceiveHandler的实现
  • 16.7.3 TransferDataCompleteHandler的实现
  • 16.7.4 ReceivePacketHandler的实现
  • 16.7.5 接收数据包的入队
  • 16.7.6 接收数据包的出队和读请求的完成
  • 第17章 NDIS小端口驱动
  • 17.1 小端口驱动的应用与概述
  • 17.1.1 小端口驱动的应用
  • 17.1.2 小端口驱动示例
  • 17.1.3 小端口驱动的运作与编程概述
  • 17.2 小端口驱动的初始化
  • 17.2.1 小端口驱动的DriverEntry
  • 17.2.2 小端口驱动的适配器结构
  • 17.2.3 配置信息的读取
  • 17.2.4 设置小端口适配器上下文
  • 17.2.5 MPInitialize的实现
  • 17.2.6 MPHalt的实现
  • 17.3 打开ndisprot设备
  • 17.3.1 IO目标
  • 17.3.2 给IO目标发送DeviceIoControl请求
  • 17.3.3 打开ndisprot接口并完成配置设备
  • 17.4 使用ndisprot发送包
  • 17.4.1 小端口驱动的发包接口
  • 17.4.2 发送控制块(TCB)
  • 17.4.3 遍历包组并填写TCB
  • 17.4.4 写请求的构建与发送
  • 17.5 使用ndisprot接收包
  • 17.5.1 提交数据包的内核API
  • 17.5.2 从接收控制块(RCB)提交包
  • 17.5.3 对ndisprot读请求的完成函数
  • 17.5.4 读请求的发送
  • 17.5.5 用于读包的WDF工作任务
  • 17.5.6 ndisedge读工作任务的生成与入列
  • 17.6 其他的特征回调函数的实现
  • 17.6.1 包的归还
  • 17.6.2 OID查询处理的直接完成
  • 17.6.3 OID设置处理
  • 第18章 NDIS中间层驱动
  • 18.1 NDIS中间层驱动概述
  • 18.1.1 Windows网络架构总结
  • 18.1.2 NDIS中间层驱动简介
  • 18.1.3 NDIS中间层驱动的应用
  • 18.1.4 NDIS包描述符结构深究
  • 18.2 中间层驱动的入口与绑定
  • 18.2.1 中间层驱动的入口函数
  • 18.2.2 动态绑定NIC设备
  • 18.2.3 小端口初始化(MpInitialize)
  • 18.3 中间层驱动发送数据包
  • 18.3.1 发送数据包原理
  • 18.3.2 包描述符“重利用”
  • 18.3.3 包描述符“重申请”
  • 18.3.4 发送数据包的异步完成
  • 18.4 中间层驱动接收数据包
  • 18.4.1 接收数据包概述
  • 18.4.2 用PtReceive接收数据包
  • 18.4.3 用PtReceivePacket接收
  • 18.4.4 对包进行过滤
  • 18.5 中间层驱动程序查询和设置
  • 18.5.1 查询请求的处理
  • 18.5.2 设置请求的处理
  • 18.6 NDIS句柄
  • 18.6.1 不可见的结构指针
  • 18.6.2 常见的NDIS句柄
  • 18.6.3 NDIS句柄误用问题
  • 18.6.4 一种解决方案
  • 18.7 生成普通控制设备
  • 18.7.1 在中间层驱动中添加普通设备
  • 18.7.2 使用传统方法来生成控制设备
  • 第3篇 应用篇
  • 第19章 IA-32汇编基础
  • 19.1 x86内存、寄存器与堆栈
  • 19.1.1 _asm关键字
  • 19.1.2 x86中的mov指令
  • 19.1.3 x86中的寄存器与内存
  • 19.1.4 赋值语句的实现
  • 19.2 x86中函数的实现
  • 19.2.1 一个函数的例子
  • 19.2.2 堆栈的介绍
  • 19.2.3 寄存器的备份和恢复
  • 19.2.4 内部变量与返回值
  • 19.3 x86中函数的调用与返回
  • 19.3.1 函数的调用指令call
  • 19.3.2 通过堆栈传递参数
  • 19.3.3 从函数返回
  • 19.3.4 三种常见的调用协议
  • 19.4 从32位汇编到64位汇编
  • 19.4.1 Intel 64与IA-32体系架构简介
  • 19.4.2 64位指令与32位指令
  • 19.4.3 通用寄存器
  • 19.5 64位下的函数实现
  • 19.5.1 函数概览
  • 19.5.2 32位参数的传递
  • 19.5.3 64位参数与返回值
  • 19.5.4 栈空间的开辟与恢复
  • 第20章 Windows内核挂钩
  • 20.1 系统服务描述符表挂钩
  • 20.1.1 系统服务描述符表(SSDT)
  • 20.1.2 系统服务描述符表挂钩的意图
  • 20.1.3 寻找要挂钩的函数的地址
  • 20.1.4 函数被挂钩的过程
  • 20.1.5 具体实现的代码
  • 20.2 函数导出表挂钩
  • 20.2.1 内核函数的种类
  • 20.2.2 挂钩IoCallDriver
  • 20.2.3 对跳转地址进行修改
  • 20.3 Windows 7系统下IofCallDriver的跟踪
  • 20.4 Windows 7系统下内联挂钩
  • 20.4.1 写入跳转指令并拷贝代码
  • 20.4.2 实现中继函数
  • 20.5 中断与中断挂钩
  • 20.5.1 IA-32体系结构中的中断
  • 20.5.2 中断处理过程
  • 20.5.3 64位模式下的中断处理机制
  • 20.5.4 多核下的中断
  • 20.5.5 Windows中断机制
  • 20.5.6 IDT Hook
  • 20.5.7 IDT Hook实现安全防护
  • 第21章 Windows通知与回调
  • 21.1 Windows的事件通知与回调
  • 21.2 常用的事件通知
  • 21.2.1 创建进程通知
  • 21.2.2 创建线程通知
  • 21.2.3 加载模块通知
  • 21.2.4 注册表操作通知
  • 21.3 Windows回调机制
  • 21.3.1 回调对象
  • 21.3.2 回调对象的创建
  • 21.3.3 回调对象的注册
  • 21.3.4 回调的通告
  • 21.4 安全的死角,回调的应用
  • 第22章 保护进程
  • 22.1 内核对象简介
  • 22.2 内核对象的结构
  • 22.3 保护内核对象
  • 22.3.1 处理对象的打开
  • 22.3.2 处理句柄的复制
  • 22.3.3 处理句柄的继承
  • 22.4 进程的保护
  • 22.4.1 保护原理
  • 22.4.2 Vista以后的进程对象保护
  • 22.4.3 进程的其他保护
  • 第23章 代码注入与防注入
  • 23.1 注入与防注入简介
  • 23.2 常用的注入方式
  • 23.3 主动注入
  • 23.3.1 AppInit注入
  • 23.3.2 SPI注入
  • 23.3.3 消息事件注入
  • 23.3.4 其他注入
  • 23.4 被动注入
  • 23.4.1 远线程注入
  • 23.4.2 APC注入
  • 23.4.3 父子进程注入
  • 23.5 防注入
  • 23.5.1 防止主动注入
  • 23.5.2 防止被动注入
  • 23.6 总结
  • 附录A 如何使用本书的源码
  • 附录B 练习题
  • 反侵权盗版声明
  • 后折页
  • 封底
展开全部

评分及书评

评分不足
1个评分

出版方

电子工业出版社

电子工业出版社成立于1982年10月,是国务院独资、工信部直属的中央级科技与教育出版社,是专业的信息技术知识集成和服务提供商。经过三十多年的建设与发展,已成为一家以科技和教育出版、期刊、网络、行业支撑服务、数字出版、软件研发、软科学研究、职业培训和教育为核心业务的现代知识服务集团。出版物内容涵盖了电子信息技术的各个分支及工业技术、经济管理、科普与少儿、社科人文等领域,综合出版能力位居全国出版行业前列。