装了防火墙就可以高枕无忧了吗?

    最近和几个朋友聊天,无意间又谈到了防火墙的安全性,一个朋友说看了我以前写的一篇博文“你的防火墙安全吗?”,他觉得我的文章有些言过其实,换句话说就是危言耸听。于是我们之间发生了这样一段对话:

我:“你怎么就能确定你的计算机是安全的?”
他:“我安装的防火墙软件总是能够拦截到非法的网络访问。”
我:“你有方法能够获知你计算机上全部非法的网络访问吗?如果没有,那你怎么确定你的防火墙拦截了全部非法访问?”
他:“......”
我:“你的防火墙拦截到的都是过时的技术,不要抱太高的希望。”
他:“那你的计算机安全吗?你用什么防火墙?”
我:“我用自己写的一个简陋的防火墙,但技术上肯定比大多数使用TDI Hook技术的防火墙安全。尽管如此,我也不敢掉以轻心,未曝光的漏洞很多,只要接在网络上就可能中招。”
他:“我知道漏洞很多,但是目前的情况是恶意软件很多,真正破坏计算机的病毒很少,只要能拦截非法的网络访问就可以看作是安全的。”
我:“你很相信你的防火墙软件?”
他:“当然!我以前也做过网络驱动程序,知道怎么比较防火墙,现在用的XX就是最先进的。”
我:“好,假设某恶意软件利用某个未公开的漏洞将一个驱动程序安装到你的系统中,从内核中直接访问网络呢?”
他:“那它至少要用系统的网络功能吧,只要用就可以被拦截。”
我:“如果不用呢?”
他:“怎么可能?”
我:“怎么不可能,可以不使用TDI层封装好的TCP/IP协议,直接在NDIS或更低一层上实现一个TCP/IP协议就行了。”
他:“你又骗我!”(怎么会多了个“又”呢?)
我:“打个赌吧,我可以不用任何代码注入,从内核中直接连接网络下载一个程序并执行,并让你的防火墙感知不到。”
他:“你能做到?”
我:“当然,我一年多前就实现了这样一个东东,一直放在我的计算机上没什么用,现在刚好从你身上赚点好处,嘿嘿。”
他:“赌什么?”
我:“你的PSP 30x100给我玩一个月,如果我输了,我去买一个PSP,先让你白玩一个月。”
他:“成交!”

    一周以后,我在朋友的电脑上装好了我的驱动程序,然后将他指定的一个程序用工具压进一个JPEG位图文件后上传到某网络硬盘上,并将下载链接写到注册表中的某个位置上。静静等了两三分钟后,那个程序的窗口出现在我朋友的电脑上,他深信不疑的防火墙没有任何反应。他吃惊的程度超出了我的想象,我想不是因为心疼他的PSP,而是因为精神支柱倒了,呵呵。

    我的朋友想不通我怎么有闲心和毅力在Windows内核中绕开TDI构建另一个TCP/IP协议栈,嗯,我才没有闲心从头开始搞一个TCP/IP协议栈,有很多成熟的开源TCP/IP协议栈,费点心将其移植到Windows的内核中就行了。最完整最强大的就是从开源的BSD socket移植,从linux内核移植也可以,但是工作量也是巨大的,想想就行了,千万别真的去做。我选的是某嵌入式系统中常用的一个微型TCP/IP协议栈,很小巧,占用内存也小,但是最大只支持1024个TCP连接,不过好像够用了,关键是稳定。除此之外,该协议栈源代码还提供了一套和巴克利套接字接口90%兼容的socket API,呵呵,有了这套API,能干的事情就多了,就可以在此基础上实现一个DNS协议和HTTP协议。

    扯远了,现在言归正传。我不是第一个想到直接在内核中构建TCP/IP协议绕过TDI防火墙检测的人,几年前在rootkit.com上就有人放出了一个名为NTRoot的驱动,不使用Windows的socket在内核中启动一个telnet服务,通过端口检测查看不到占用的端口,其它计算机却可以telnet到这个机器上执行一些简单的命令。当然这个TCP/IP协议栈十分简陋,没有实现TCP/IP协议中的很多特性,也很不稳定,但这个“概念”肯定会激发很多人,我可以将一个微型的开源TCP/IP协议栈移植到Windows内核,别人肯定也可以,而且是几年前就开始了。因此我一直强调一个观点,就是:不要以为装了防火墙就可以高枕无忧。

    罗嗦了这么多,如果把大家吓得不敢上网了,那一定不是我的本意。我的目的是提醒大家注意个人信息的保护,你一定不希望自己三天两头到腾讯去申诉QQ号被盗,也不希望自己辛苦几年攒下的网游行头一夜之间被人卖个精光,当然更不希望某天发现自己的银行账户上只剩几毛钱了,信息安全问题将成为新世纪网络问题的焦点。网络是精彩的,想远离网络是不现实的,恶意程序如此狡诈,到底怎么办才能安全上网?要回答这个问题,首先要了解一下恶意软件是如何攻入用户的计算机,国外某安全网站做过一个统计,42%的用户是在浏览网页时被“挂马”网页上的漏洞利用代码攻破计算机的。这些网页有的本身就是恶意网站,用各种诱人的链接欺骗用户访问,有些是正常的网站被黑客攻破,然后在网页上“挂马”,前些年就有国内某著名门户网站首页被黑客“挂马”,导致数百万用户被恶意程序攻击。另外,还有27%的用户是运行从网络上下载的来历不明的被捆绑了木马程序的软件而被攻破计算机的,某软件的破解程序,盗版的Windows安装盘,升级补丁等都是很好的木马捆绑对象。通过接收电子邮件被攻破计算机的用户比例是14%。

    当然其它还有很多方法会导致用户的计算机被攻破,但是这三项原因就占到了83%,如果能防住这三项,就能极大地增加计算机的安全性。问题是怎么防?用防火墙或其它反病毒软件吗?当然不能依赖它们,原因我前面说过,我推荐大家的方法就是隔离,或者说区别访问。现在很多家庭都有两台以上的电脑,将其中一台专门用于浏览网页,接收电子邮件和安装从网络下载的程序,另外一台电脑专用于安全网络访问,比如QQ、网上银行、网上支付等等。如果只有一台电脑的家庭怎么办?或者对于一台笔记本电脑每天从家背到公司,再从公司背回家的IT人士怎么办?难道要背两台?当然不是,你可以在一台电脑上安装两个操作系统用来区分访问,一个用于不安全的网络访问,一个用于安全的网络访问。这样做还有一个好处就是一个系统崩溃了,可以用另一个系统恢复,不过缺点就是需要不停地重启电脑,如果不想频繁重启电脑就只有用虚拟机了。虚拟机是一种模拟器类软件,可以在计算机上虚拟多个计算机,这些虚拟的计算机与主机互相是独立的,虚拟的计算机之间也是互相独立的,但是都可以通过网络接口互联,如果你的主机内存够大,可以在一台计算机上同时虚拟几台虚拟计算机组成一个小网络。虚拟机软件有很多,比较著名的有VmWare、Virtual PC和Virtual Box。VmWare和Virtual PC都是商业软件,VmWare是功能最强的虚拟机软件,通过设置可以支持DirectX 3D,最新的VmWare 7甚至支持Windows 7的玻璃效果。Virtual PC是微软出品的虚拟机软件,给测试用户提供的测试版本,包括操作系统,通常都是用虚拟机发布的,用户不需要安装,直接用虚拟机加载就可以使用。Virtual Box也是一款非常好的虚拟机软件,而且是开源的,深受很多人的欢迎。很多人可能对虚拟机有偏见,认为用虚拟机很慢,其实不然,随着计算机硬件的发展,虚拟机中间代理带来的性能损失几乎可以忽略,在一台2G内存的计算机上给虚拟机配置1G内存,并禁止虚拟机使用硬盘交换文件后运行Windows 7,感觉和主机上没什么区别。我是搞嵌入式开发的,我的主机上安装的都是嵌入式开发环境,为了防止编译器之间互相影响,我的Visual Studio 2008就是安装在虚拟机中的,最新版本的TabSiPlus就是在虚拟机上安装64位Windows 7进行开发和测试的。

    最后强调一点,对于信息安全,没有好的方法,装两个系统或使用虚拟机都只是一个形式,真正的安全取决于你的态度,“态度决定一切”,平时多了解一些计算机安全方面的知识,不要总是做“小白”。

转载于:https://www.cnblogs.com/o-r-b-i-t/archive/2010/03/09/2075801.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
封面 1 书名 2 版权 3 前言 8 目录 10 第一部份:Visual Basic 2010 环境 18 第一章 全身心投入:Visual Basic 2010 编程之旅 19 1.1 开始使用Visual Basic 2010 20 1.2 新建项目 20 1.3 理解 Visual Studio 2010 22 1.4 修改对象的属性 23 1.4.1 对象的命名 23 1.4.2 设置窗体的Text属性 24 1.4.3 保存项目 25 1.4.4 为窗体添加图标 25 1.4.5 改变窗体的大小 26 1.5 在窗体中添加控件 27 1.6 设计界面 27 1.6.1 在窗体中添加可见控件 28 1.6.2 在窗体中添加不可见控件 29 1.7 编写界面后面的代码 30 1.7.1 让用户浏览文件 30 1.7.2 使用代码终止程序 32 1.8 运行项目 33 1.9 总结 34 1.10 问与答 34 1.11 作业 35 1.11.1 测验 35 1.11.2 答案 35 1.11.3 练习 35 第二章 Visual Basic 2010导航 36 2.1 使用Visual Basic 2010起始页 36 2.1.1 创建新项目 37 2.1.2 打开现有项目 38 2.2 导航和定制Visual Basic环境 38 1. 显示和隐藏设计窗口 39 2. 浮动设计窗口 39 3. 停靠设计窗口 40 4. 自动隐藏设计窗口 41 2.3 使用工具栏 41 2.3.1 显示和隐藏工具栏 42 2.3.2 停靠工具栏及调整其大小 42 2.4 使用工具箱将控件添加到窗体 43 2.5 使用“属性”窗口设置对象属性 44 2.5.1 选择对象并查看其属性 44 2.5.2 查看和修改属性 44 2.5.3 使用颜色属性 45 2.5.4 查看属性说明 47 2.6 管理项目 47 2.6.1 使用“解决方案资源管理器”管理项目文件 47 2.6.2 使用解决方案 48 2.6.3 理解项目组件 49 2.6.4 设置项目属性 50 2.6.5 添加和删除项目文件 50 2.7 快速而简单的编程入门指南 51 2.7.1 用变量存储值 51 2.7.2 使用过程来编写代码功能单元 52 2.8 获取帮助 52 2.9 总结 53 2.10 问与答 53 2.11 作业 54 2.11.1 测验 54 2.11.2 答案 54 2.11.3 练习 54 第三章 理解对象和集合 55 3.1 理解对象 56 3.2 理解属性 56 3.2.1 获取和设置属性 57 3.2.2 使用对象及其属性 58 3.3 理解方法 61 3.3.1 触发方法 61 3.3.2 理解方法的动态性 61 3.4 创建简单的对象示例项目 62 3.4.1 为绘图项目创建界面 62 3.4.2 编写基于对象的代码 62 3.4.3 测试对象示例项目 65 3.5 理解集合 65 3.6 使用对象浏览器 67 3.7 总结 68 3.8 问与答 68 3.9 作业 69 3.9.1 测试 69 3.9.2 答案 69 3.9.3 练习 69 第四章 理解事件 70 4.1 理解事件驱动的编程 70 4.1.1 触发事件 71 4.1.2 避免递归事件 72 4.1.3 访问对象的事件 73 4.1.4 使用事件参数 74 4.2 创建事件示例项目 76 4.2.1 创建用户界面 76 4.2.2 创建事件处理程序 77 4.3 更新事件名 79 4.4 总结 79 4.5 问与答 80 4.6 作业 80 4.6.1 测试 80 4.6.2 答案 80 4.6.3 练习 81 第二部份 创建用户界面 82 第五章 创建窗体:基础知识 83 5.1 修改窗体的名称 84 5.2 改变窗体的外观 85 5.2.1 在窗体的标题栏中显示文本 85 5.2.2 改变窗体的背景色 86 5.2.3 将图像添加到窗体背景中 87 5.2.4 为窗体添加图标 88 5.2.5 为窗体添加最小化、最大化和控制框按钮 89 5.2.6 修改窗体边框的外观和行为 90 5.2.7 控制窗体最小化和最大化时的大小 91 5.3 显示和隐藏窗体 92 5.3.1 显示窗体 92 5.3.2 理解窗体的模态性 92 5.3.3 以正常、最大化或最小化状态显示窗体 93 5.3.4 指定窗体的初始显示位置 94 5.3.5 防止窗体在任务栏中出现 95 5.3.6 卸载窗体 95 5.4 总结 96 5.5 问与答 96 5.6 作业 96 5.6.1 测验 96 5.6.2 答案 97 5.6.3 练习 97 第六章 创建窗体:高级技能 98 6.1 使用控件 98 6.1.1 将控件添加到窗体中 98 6.1.2 操纵控件 99 6.1.3 创建Tab顺序 107 6.1.4 堆叠控件 109 6.2 创建位于最前面的非模态窗口 109 6.3 创建透明窗体 109 6.4 创建可滚动窗体 110 6.5 创建多文档界面 111 6.6 设置启动窗体 113 6.7 总结 114 6.8 问与答 114 6.9 作业 114 6.9.1 测验 114 6.9.2 答案 115 6.9.3 练习 115 第七章 使用传统控件 116 7.1 使用Lable控件显示静态文本 116 7.2 通过文本框让用户输入文本 117 7.2.1 指定文本对齐方式 118 7.2.2 创建多行文本框 118 7.2.3 添加滚动条 119 7.2.4 限制用户可输入的字符数 120 7.2.5 创建密码框 120 7.2.6 理解文本框的常用事件 121 7.3 创建按钮 121 7.3.1 接受按钮和取消按钮 122 7.3.2 使用复选框提供是/否选项 123 7.4 创建容器和单选按钮组 124 7.4.1 使用面板和分组框 124 7.4.2 使用单选按钮 125 7.5 使用列表框显示列表 126 7.5.1 在设计时操纵Items 127 7.5.2 在运行时操纵Items 127 7.5.3 对列表进行排序 131 7.6 使用组合框创建下?131 7.7 总结 132 7.8 问与答 133 7.9 作业 133 7.9.1 测验 133 7.9.2 答案 134 7.9.3 练习 134 第八章 使用高级控件 135 8.1 创建定时器 135 8.2 创建带选项卡的对话框 137 8.3 在图像列表(Image List)控件中存储图片 140 8.4 使用列表视图(List View)控件创建增强的列表 141 8.4.1 创建列 141 8.4.2 添加列表项 142 8.4.3 使用代码操纵List View 143 8.5 使用Tree View创建层次列表 144 8.5.1 在Tree View中添加节点 145 8.5.2 删除节点 146 8.5.3 清除所有节点 147 8.6 总结 147 8.7 问与答 147 8.8 作业 148 8.8.1 测验 148 8.8.2 答案 148 8.8.3 练习 148 第九章 给窗体添加菜单和工具栏 149 9.1 创建菜单 149 9.1.1 创建顶级菜单项 150 9.1.2 为顶级菜单创建菜单项 152 9.1.3 移动和删除菜单项 153 9.1.4 创建复选菜单项 153 9.1.5 对菜单进行编程 154 9.1.6 实现上下文菜单 156 9.1.7 为菜单项指定快捷键 157 9.2 使用Toolbar(工具栏)控件 158 9.2.1 使用按钮集合添加工具栏按钮 159 9.2.2 对工具栏进行编程 161 9.2.3 为工具栏按钮创建下?161 9.3 创建状态栏 162 9.4 总结 163 9.5 问与答 163 9.6 作业 163 9.6.1 测验 163 9.6.2 答案 164 9.6.3 练习 164 第三部份 编程 166 第十章 创建和调用过程 167 10.1 创建Visual Basic代码模块 167 10.2 编写过程 169 10.2.1 声明不返回值的过程 169 10.2.2 声明返回值的过程 172 10.3 调用过程 173 10.4 退出过程 177 10.5 避免无限递归 177 10.6 总结 178 10.7 问与答 179 10.8 作业 179 10.8.1 测验 179 10.8.2 答案 179 10.8.3 练习 180 第十一章 使用常量、数据类型、变量和数组 181 11.1 理解数据类型 182 11.1.1 确定数据类型 182 11.1.2 将数据从一种类型转换为另一种数据类型 184 11.2 定义和使用常量 185 11.3 声明和引用变量 186 11.3.1 声明变量 186 11.3.2 将字面值赋给变量 187 11.3.3 在表达式中使用变量 188 11.3.4 强制变量声明和数据类型检查 188 11.3.5 显式变量声明 188 11.3.6 严格类型检查 189 11.4 使用数组 191 11.4.1 声明数组 191 11.4.2 引用数组变量 191 11.4.3 创建多维数组 192 11.5 确定作用域 193 11.5.1 理解块作用域 193 11.5.2 理解过程级(局部)作用域 194 11.5.3 理解模块级作用域 194 11.5.4 使用全局(命名空间级)作用域 195 11.5.5 名称冲突 196 11.6 声明静态变量 196 11.7 命名规范 197 11.7.1 使用前缀表示数据类型 197 11.7.2 使用变量前缀表示作用域 198 11.7.3 其他前缀 198 11.8 在Picture Viewer项目中使用变量 198 11.8.1 为选项创建变量 198 11.8.2 初始化和使用选项变量 199 11.9 总结 201 11.10 问与答 202 11.11 作业 202 11.11.1 测验 202 11.11.2 答案 203 11.11.3 练习 203 第十二章 执行算术运算、字符串操作和日期/时间调整 204 12.1 使用Visual Basic执行基本的算术运算 204 12.1.1 执行加法运算 205 12.1.2 执行减法和求负运算 205 12.1.3 执行乘法运算 205 12.1.4 执行除法运算 205 12.1.5 执行乘方运算 206 12.1.6 执行取模算术运算 206 12.1.7 判断运算符优先级顺序 206 12.2 比较 207 12.3 理解布尔逻?208 12.3.1 使用And运算符 209 12.3.2 使用Not运算符(!) 209 12.3.3 使用Or运算符 209 12.3.4 使用Xor运算符 210 12.4 操纵字符串 210 12.4.1 连接字符串 210 12.4.2 使用基本的字符串函数 211 12.5 使用日期和时间 214 12.5.1 理解Date数据类型 214 12.5.2 增加或减少日期或时间 215 12.5.3 确定两个日期或时间之间的间隔 216 12.5.4 获取日期的组成部份 216 12.5.5 格式化日期和时间 217 12.5.6 获取当前的系统日期和时间 217 12.5.7 判断值是否为Date 218 12.6 总结 218 12.7 问与答 218 12.8 作业 219 12.8.1 测验 219 12.8.2 答案 219 12.8.3 练习 219 第十三章 使用Visual Basic代码做出决策 220 13.1 使用If...Then进行决策 220 13.1.1 当表达式为False时执行代码 222 13.1.2 使用ElseIf进行复杂的决策 223 13.1.3 嵌套的If...Else结构 224 13.1.4 在一条Case语句中考虑多个可能的值 225 13.1.5 创建Select Case示例 225 13.1.6 创造性地使用Select Case 227 13.2 在过程中使用GoTo实现分支 228 13.3 总结 230 13.4 问与答 230 13.5 作业 230 13.5.1 测验 230 13.5.2 答案 231 13.5.3 练习 231 第十四章 使用循环提高效率 232 14.1 使用For...Next执行确定次数的循环 232 14.1.1 使用Next语句结束循环 233 14.1.2 使用Step指定每次增加的值 233 14.1.3 提早结束循环 234 14.1.4 到达Next之前进入下一次循环 234 14.1.5 创建For...Next示例 235 14.2 使用Do...Loop执行次数不确定的循环 237 14.2.1 创建Do...Loop 237 14.2.2 终止Do...Loop循环 237 14.2.3 创建Do...Loop示例 238 14.3 总结 240 14.4 问与答 240 14.5 作业 241 14.5.1 测验 241 14.5.2 答案 241 14.5.3 练习 241 第十五章 调试代码 242 15.1 在代码中添加注释 243 15.2 识别两种基本的错误 244 15.3 使用Visual Basic的调试工具 246 15.3.1 使用断点 246 15.3.2 使用“即时”窗口 248 15.4 使用Try...Catch...Finally创建结构化错误处理程序 251 15.4.1 处理异常 253 15.4.2 处理预期的异常 254 15.5 总结 256 15.6 问与答 256 15.7 作业 257 15.7.1 测验 257 15.7.2 答案 257 15.7.3 练习 257 第十六章 使用类设计对象 258 16.1 理解类 259 16.1.1 使用类来封数据和代码 259 16.1.2 比较类和标准模块 259 16.1.3 创建对象接口 260 16.2 根据类实例化对象 265 16.2.1 将对象引用绑定到变量 265 16.2.2 解除对象引用 269 16.2.3 理解对象的生命周期 269 16.3 总结 270 16.4 问与答 270 16.5 作业 270 16.5.1 测验 270 16.5.2 答案 271 16.5.3 练习 271 第十七章 与用户交互 272 17.1 使用MessageBox.Show()函数显示消息 272 17.1.1 指定按钮和图标 273 17.1.2 判断单击的是哪个按钮 275 17.1.3 创建好的消息 276 17.2 创建自定义对话框 276 17.3 使用InputBox()从用户那里获取信息 279 17.4 用键盘交互 280 17.5 使用常见的鼠标事件 282 17.6 总结 284 17.7 问与答 285 17.8 作业 285 17.8.1 测验 285 17.8.2 答案 285 17.8.3 练习 286 第十八章 使用图形 287 18.1 理解Graphics对象 287 18.1.1 为窗体或控件创建Graphics对象 288 18.1.2 为新位图创建Graphics对象 288 18.2 使用?289 18.3 使用系统颜色 290 18.4 使用矩形 292 18.5 绘制形状 293 18.5.1 绘制线条 293 18.5.2 绘制矩形 293 18.5.3 绘制圆形和椭圆 293 18.5.3 清除绘图表面 294 18.6 绘制文本 294 18.7 持久化窗体上的图形 295 18.8 创建绘图示例项目 295 18.9 总结 299 18.10 问与答 300 18.11 作业 300 18.11.1 测验 300 18.11.2 答案 300 18.11.3 练习 301 第四部份 使用数据 302 第十九章 执行文件操作 303 19.1 使用OpenFileDialog和SaveFileDialog控件 303 19.1.1 使用OpenFileDialog控件 304 19.1.2 使用SaveFileDialog控件 306 19.2 使用File对象对文件进行操作 308 19.2.1 判断文件是否存在 308 19.2.2 复制文件 308 19.2.3 移动文件 309 19.2.4 重命名文件 310 19.2.5 删除文件 310 19.2.6 获取文件属性 311 19.3 使用Directory对象对目录进行操作 314 19.4 总结 315 19.5 问与答 315 19.6 作业 315 19.6.1 测验 315 19.6.2 答案 316 19.6.3 练习 316 第二十章 使用注册表和文本文件 317 20.1 使用注册表 317 20.1.1 理解Windows注册表的结构 318 20.1.2 使用My.Computer.Registry访问注册表 319 20.1.3 修改Picture Viewer项目以使用注册表 322 20.2 读写文本文件 326 20.2.1 写入文本文件 326 20.2.2 读取文本文件 328 20.2.3 修改Picture Viewer项目以使用文本文件 329 20.3 总结 332 20.4 问与答 333 20.5 作业 333 20.5.1 测验 333 20.5.2 答案 333 20.5.3 练习 334 第二十一章 使用数据库 335 21.1 ADO.NET简介 336 21.1.1 连接到数据库 337 21.1.2 关闭到数据源的连接 338 21.2 操作数据 338 21.2.1 理解DataTable 339 21.2.2 创建DataAdapter 339 21.2.3 创建和填充DataTable 340 21.2.4 引用DataRow中的字段 341 21.2.5 导航数据 342 21.2.6 编?344 21.2.7 创建新记录 344 21.2.8 删除记录 346 21.2.9 运行数据库示例 346 21.3 总结 346 21.4 问与答 347 21.5 作业 347 21.5.1 测验 347 21.5.2 答案 347 21.5.3 练习 348 第二十二章 使用自动化控制其他应用程序 349 22.1 自动化Microsoft Excel 350 22.1.1 创建指向自动化库的引用 350 22.1.2 创建自动化服务器实例 351 22.1.3 对服务器进行操作 352 22.2 自动化Microsoft Word 354 22.2.1 创建指向自动化库的引用 355 22.2.2 创建自动化服务器实例 355 22.3 总结 356 22.4 问与答 357 22.5 作业 357 22.5.1 测验 357 22.5.2 答案 357 22.5.3 练习 358 第五部份 部署应用程序及其他 360 第二十三章 部署应用程序 361 23.1 理解ClickOnce技术 361 23.2 使用发布向导来创建ClickOnce程序 362 23.3 测试Picture Viewer的ClickOnce安程序 364 23.4 卸载已安的应用程序 365 23.5 为创建ClickOnce程序设置高级选项 366 23.6 总结 367 23.7 问与答 367 23.8 作业 367 23.8.1 测验 367 23.8.2 答案 367 23.8.3 练习 368 第二十四章 广阔的视野 369 24.1 .NET Framework 369 24.2 公共语言运行时 370 24.3 微软中间语言 370 24.4 命名空间 371 24.5 通用类型系统 372 24.6 垃圾回收 372 24.7 进一步的阅读 373 24.8 总结 373 封底 374

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值