Twitter Updates

    follow me on Twitter

    December 25, 2009

    基于Windows 7内核的Chrome OS

    我们知道Google的Chrome OS是基于Linux内核的,那么我们能不能制作出基于Windows 7内核的Chrome OS呢?答案是肯定的。经过我的实验成功制作出基于Windows 7的Chrome OS,并且运行良好。我是这样制作的,

    1. 打开注册表编辑器regedit.exe
    2. 找到HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
    3. 创建一个字符串类型的value “Shell”
    4. 赋值"%userprofile%\AppData\Local\Google\Chrome\Application\chrome.exe, cmd.exe”
    5. Logoff and Logon

    你将会得到一个基于Windows 7的Chrome OS。这个OS上将会有两个窗口,一个是Chrome窗口,一个是命令行窗口。你可以通过Chrome窗口上网,命令行窗口执行各种系统命令,以及文件的管理等等。

    chrome

    November 30, 2009

    Google Chrome OS 问题解答(2)

    1. 只能用Gmail帐号登录Chrome OS吗?

    现在是这样的,不过Google至少在正式发布之前会支持OpenID的。

    2. SSO只支持Google的应用吗?

    Google至少会支持OpenID的应用,其他应用也基本肯定会支持,账户,密码会同步到服务器。

    3. 必须通过帐号,密码才能登录吗?

    Google会提供自动登录的功能。

    4. 任何人通过他们的Gmail帐号都能登录我的机器吗?

    Google会提供白名单的设置,使得你可以决定谁可以登录。

    5. 怎样更改密码?

    我发现一个更简单的方法。

    sudo –i

    mount –o remount /

    sudo passwd chronos

    6. Chrome OS 不支持硬盘?

    这是一个典型的误解。我从Google的反馈认为,Chrome OS的专用机没有硬盘,但是Chrome OS本身并不是不支持硬盘。从我的实验来看,Chrome OS支持SCSI和SATA硬盘,不支持IDE硬盘。

    We didn't say that Chromium OS doesn't support hard disks, that's a common misunderstanding.

    You should be able to install Chromium OS on pretty much any HDD.  Support for other hardware...well, check out the supported hardware list at dev.chromium.org.

    Ah, yes...but, as you say in that other thread, IDE doesn't work :-)

    7. 为什么Ping不到机器名?

    Chrome OS不支持Netbios协议。

    November 29, 2009

    成功安装Chrome OS到硬盘上

    Chrome OS open source 之后,人们有两种方式来使用它,一种是用虚拟机,另外一种就是通过U盘启动。Google说不支持硬盘,而我们最需要的就是把Chrome OS安装到自己的计算机的硬盘上直接启动,从而作为我们机器的主操作系统。那么到底有没有可能把它安装到硬盘上呢?我今天做了一个实验,成功地安装到了我的机器上,我的机器上是SCSI硬盘。步骤如下:

    1. 通过U盘启动,进入Chrome OS。
    2. Ctrl+Alt+T, 打开terminal。
    3. /usr/sbin/chromeos-install
    4. 成功之后,关机,拔下U盘,开机。机器就会从硬盘启动到Chrome了。

    Chrome在我硬盘的分区如下:

    /dev/sda1 15xxxxx Linux

    /dev/sda2 972800 EFI (FAT-12/16/32)

    /dev/sda3 972800 Linux

    /dev/sda4 972800 Linux

    不知道IDE硬盘如何,大家可以尝试一下.

    November 28, 2009

    我为什么推崇Chrome OS?

    今天看到有朋友在我以前的老文章留言,我又重新回顾了一下,这文章是我批判Live Mesh的。当时我还没有接触过Windows Azure,更加没有Google要出操作系统的消息。当时的我对于Web OS的理解以及对当时情况的迷惑,绝大部分Chrome OS都给了我一个答案,以及印证了我当时的想法。最有意思的是,我对Live Mesh最反对的一点就是那个sync,把云上的数据要sync到本地才能运行应用。而Google的Chrome OS的设计竟然是不支持硬盘,也就是说根本就不需要云和本地数据的sync(当然cache还是需要的,这跟你把所有数据都sync是不同的)。从这点来看,就知道Google的系统是多么符合我对Web OS的理解了。当初写文章的时候找不到一款符合我定义的Web OS,现在已经有答案了。网友如果感兴趣可以看看我以前的老文章。

    Live Mesh 跟我对云计算的理解格格不入 (一)

    Live Mesh 跟我对云计算的理解格格不入 (二)

    Live Mesh 跟我对云计算的理解格格不入 (三):云平台

    Live Mesh 跟我对云计算的理解格格不入 (四):云应用和云共享

    November 27, 2009

    再谈一下UI自动化吧

    本来不想再谈这些内容了,因为太基本,简单了。可是最近竟然发现一直不屑于UI自动化的我,仿佛都成为一个UI自动化专家了。我发现很多人,包括论坛上的网友,还有很多身边的同事都对UI自动化充满了一些恐惧感,从而不敢触及它。当然也有一定的原因是觉得UI自动化没太深的技术含量,这也是我讨厌UI自动化的唯一原因。但是,一旦让这些人去做UI自动化的话,是很难做好的,因为UI自动化需要一定的经验,而我个人认为一年的经验,一个正规的项目应该都能具备编写良好UI自动化测试的能力。因此,对于后来的人,我想把UI自动化关键的几条再谈一谈,UI自动化确实没什么技术含量,你掌握了以下几点也能成为一个小专家了。

    1. 用高级语言编写自动化程序,在UI的部分调用UI自动化工具。我反对纯用UI自动化工具去写自动化,因为那样就太死板了,而且功能不强大,不灵活。我推荐学好一门高级语言,把大多数的自动化都用这门高级语言实现,只在需要UI操作的时候才调用UI工具。
    2. 只在你测试的UI模块上进行自动化的测试,其他地方避免用UI去操作,使用高级语言去实现。这样你需要用UI的地方就进行了最小化,从而使得只有在真正需要UI的地方才自动化UI,因此测试程序会相对更稳定。
    3. UI自动化最基本的操作就是发现控件和操作控件。尽量避免用text来发现控件,而使用一些固定的控件属性来发现,比如Control ID等等。这样的话,测试程序会更稳定,开发改变文本不会影响到你,而你也不用担心localization的问题。
    4. 操作控件分为模拟用户操作和事件驱动。简单的例子就是,模拟用户操作就是鼠标真的去点一下,而事件驱动则是跳过点击直接引发点击的事件。我以前用过具有这种功能的工具,但是最近几年用的工具不具备这个功能。
    5. 解决好同步问题。UI自动化最不稳定的地方就是同步问题了,你不能连续点击,而需要等待到一定的情况才能进行下一次点击。各种情况都不太一样,需要一些经验进行良好的程序设计。但是,简单来讲,要做到等待的情况发生能立刻返回到程序,不能空等。
    6. 减少其他UI对你自动化程序的影响,比如关闭Windows balloon,等等。一般来说是发现了有其他UI影响你的情况,就想一下workaround, 不会有什么大问题。

    从我的经验上来看,一般UI自动化有问题都能归结于以上几点,而一旦你解决了以上几点的话,UI自动化就变成了一个熟练工的工作了,没什么挑战性。我本人的有些模块的UI自动化基本可以达到100%的通过率,而所有模块的自动化也能达到95%以上的通过率。不过我基本已经脱离UI自动化了,因为太没有技术含量了,不过我还是认为如果你刚刚进入测试的工作,或者从来没有接触过UI自动化,或者从来都没有做好过UI自动化的话,在这上边工作个2,3年会有一定的收获的。

    November 26, 2009

    Google Chrome OS 问题解答(1)

    在使用Chrome OS的时候自己也有些疑问,有些找到了解答,有些是推测,写下来想跟使用Chrome OS的网友分享。

    1. Chrome会不会支持插件,比如Flash,Silverlight等等?

    Google在Web开发上非常推荐用开放的标准和技术。他们认为使用Javascript和HTML5完全可以做到不再需要Flash,Silverlight这类插件。并且,Chrome OS是不允许安装任何程序的,因此用户也不可以安装插件。所以,像Silverlight,Java,Quicktime等等目前浏览器比较流行的插件,Chrome都不会提供官方支持。但是,我估计是因为Flash的应用实在是太广泛了,Chrome内置了对Flash的支持。这就给微软出了个难题,“如何通过Silverlight服务所有的用户?”。微软的Silverlight战略终于开始尝到些苦头了,需要看别人的脸色行事了。如果Chrome能够流行开来,还有什么开发商会选择Silverlight呢?

    2. Chrome将会怎样支持离线应用?

    目前看来,Chrome很可能会倾向于HTML5的离线支持,而不是Gears,毕竟HTML5是开发的标准。也许这也是为什么Google并没有在自己的产品里大范围使用Gears的原因。我尝试在Chrome OS上安装Gears,并没有成功。

    3. Chrome 不能安装传统的软件?

    传统的软件有一个很大的问题就是需要安装。比如,你重装了系统需要重新安装所有的软件,你使用另外一台新计算机也需要安装所有的软件才能正常工作,娱乐。Google的Chrome是不允许安装软件的,很大的原因就是想解决这个问题。但是,这并不代表你不能使用传统的软件,只是你会更方便,比如输入网址,或者点击一个链接就可以使用了。Chrome提供Native code的支持,因此,现在所有的传统软件其实都是可以通过一定的修改和特殊的编译在Chrome上运行的。当然这需要Chrome占据一定市场份额之后才有软件开发商愿意和值得去这么做。

    4. Chrome 不能打游戏?

    跟上一个问题类似,游戏商完全可以编写在Chrome上运行的游戏。虽然现在没有这样的游戏,但是Chrome并不是一个不能打游戏的系统,未来的潜力还是有的。

    5. Chrome使用Gmail帐号登录,没有网络怎么办?

    第一次登陆Chrome需要网络,你的登录信息会被cache起来,因此以后即使断网,你一样可以登录。

    6. 为什么进入Chrome之后发现很慢,点鼠标要等个2,3秒才有反应?

    很可能你的机器使用的是Nvidia显卡,而Nvidia显卡没有open source 的显卡驱动,所以Chrome都是通过软件的方式来显示,因此很慢。

    7. 怎么调分辨率?

    进入到Terminal, 然后 /usr/bin/xrandr –size 1280x1024

    8. 怎样调音量?

    进入到Terminal, 然后 /usr/bin/alsamixer

    November 25, 2009

    从Chrome来看Google和微软的战略,现状及未来展望

    互联网已经发展到了云计算时代,而云计算一个非常重要的问题就是支持多设备,比如PC,Netbook,Mobile等等,以及多系统,比如Windows,Mac,Linux等等,而一个公司能否成功,很大程度上在于对他们支持的多少。我今天就想简单分析一下微软和Google的各自战略以及对未来的展望。因为有很多话要说,所以可能会有点乱,有些没有整理好的思路,以后补上。

    毫无疑问,微软的战略核心就是Windows,因此出现了Windows 7, Windows phone, Windows Live, Windows Azure 等等术语。而微软的直接想法就是把在PC上的操作系统Windows的品牌和优势扩展到手机,互联网和云计算上来。 而Google的战略核心则是在Chrome。很多人奇怪为什么Google把OS和Browser都叫一个名字,其实这正体现了Chrome在Google战略的核心地位,跟微软一样,把什么东西都贴上了Windows的标签。那么我想从底层到上层来分析一下微软和Google的情况。

    • OS: PC windows和windows mobile其实是两个系统,而Google虽然有Chrome和Android,但是将来要合二为一,我们有理由相信合并之后的OS还是叫Chrome。看看Mac和iphone其实是用了同一个系统,而且获得了巨大的成功,因此未来微软也非常有可能把两个Windows也合并起来。在这一层来看,双方都支持多设备,不过现在还没什么交集,Chrome OS主要应用在上网本上,而微软的对策则是Windows 7 Starter。相比Chrome OS来讲,Windows的巨大优势在于桌面应用,不知道被限制了很多功能的Starter还能不能像以前的XP对Linux在上网本上产生巨大的优势呢?不过总而言之,微软在OS这一层的垄断地位目前是无人能及的,Chrome只不过是有可能通过上网本去改变一些。
    • Browser:微软的browser就是IE,只能运行在Windows上。Google的Browser是Chrome,可以运行在不同的操作系统。由于历史原因,无论IE怎么烂,兼容性也是其他浏览器不可比拟的。由于很多网站只能通过IE才能良好地浏览,使得互联网用户必须在某种程度上粘在IE上,从而也就是粘在了Windows上。由于桌面程序在不断地,快速地往Web上转移,Windows通过桌面应用来粘住用户的可能性越来越低,因此IE就显得非常重要,更像是Windows的一道护身符。而Google Chrome浏览器则是新一代的浏览器,支持不同的系统平台,甚至通过Frame可以运行在其他浏览器之上。我说过Chrome OS不是那么重要,Chrome Browser才是Google的战略关键,Google的目的就是想在Browser这一个层面一统江湖,从而确定像微软在OS上那种垄断地位。一旦这种情况发生,Google就可以通过浏览器控制Web服务提供商,就像微软通过OS来控制软件商一样。当然这是Google的目标,在实现目标之前肯定会有一番龙争虎斗,Google也未必最终会成功,但是今后几年的互联网焦点都会落在浏览器竞争上。
    • 应用: Google在Web应用这个层面是全面地取得了领先,并且比微软走得要远很多。现在微软的唯一领先之处也许就是Live Messenger了,可是它毕竟是一个桌面程序,论Web应用的话,GTalk肯定要更强。Google的Web应用是依赖所有浏览器都支持的Javascript,而微软基本放弃了Javascript而强力推自己的Silverlight。由于IE只支持Windows,而互联网又需要支持多系统,Silverlight则是微软的多系统支持的解决方案。从需要安装这个角度,我就更倾向于Javascript,但是从开发人员来说Silverlight应该更合理,方便。由于Web2.0的这股热潮正是靠AJAX推动的,使我们看到很多通过Javascript实现的Web应用典范,比如Gmail, Facebook, Twitter, 还有Javascript的巅峰之作Gwave。而我并没有看到什么热门网站是通过Silverlight来实现的,毕竟Silverlight出道的时间也不短了。因此,我很怀疑Silverlight能够改变游戏规则。而Silverlight完全是微软自己的标准,并不是开放的,而对于以开放为基础的互联网来说,还是有些格格不入。

    综上所述,目前来看,Google在Web应用是全面地领先微软,而微软在OS上的垄断地位也很难撼动,双方今后几年的争夺焦点主要会集中在浏览器上。由于微软一向是以OS为中心,而Google是很明显以Browser为中心,所以胜利的天平很可能像Google一边倾斜。而一旦Google在Browser上取得胜利,微软的OS的优势也会面临相当大的威胁。

    最后回答一下一些网友的典型提问,“Linux这么多年挑战Windows彻底失败,Chrome就是一个Linux怎么可能成功呢?”,“Firefox挑战IE只有一点小成果,Chrome怎么可能成功呢?”我们如果分析一下,Linux挑战Windows是在OS这一层来挑战的,而Firefox挑战IE是在浏览器这一层挑战的,但是Google不同,Google是在三层全面地,立体地发动挑战的。换句话说,Linux做的再好,在应用层没有支持怎么办?Firefox做的再好,应用层都去兼容IE怎么办?而Google本身就是个应用大户,不存在这个问题,它与微软公司的发展是采取了截然相反的路程。微软是通过OS来控制应用,比如通过Windows集成IE打败了Netscape,通过Windows集成Hyper-V打Vmware,通过Windows集成.NET挑战Java, 通过Windows的优势开发杀毒软件因此导致杀毒领域的一片混乱。所以说,微软是采取的自下向上的发展方式,而Google则是采取的自上向下的方式。先有了广泛的应用,比如Search的垄断,Gmail,GReader, GDocs, GVoice, GWave, GTalk, 等等。然后在这个基础之上杀入浏览器领域,并且进一步杀入OS领域。对于用户来说,首要关心的并不是什么OS,浏览器,而是应用。对于一个典型的网友来说,即使用Windows,用IE,还是离不开Google Search。而Google开发了Browser和OS之后,想用Google 的各项服务就可以不用IE和Windows。这就是Google对于微软的最大威胁,你做的再强也离不开我,而我做好了就可以不需要你。我们有理由相信,用Google的各种Web应用,Chrome OS肯定会达到最好的效果,其次就是在其他系统上用Chrome Browser。而Google可以借应用的巨大优势让用户跳过微软,而微软却很难通过Silverlight加自己或者第三方应用去挑战Google的应用。因此,未来的Web应用会决定底层浏览器和OS的成败,而微软的优势还是历史上遗留下来的桌面应用,而这个优势现在越来越小了。这也是为什么由Google去做Browser和OS很可能会产生跟Linux和Firefox不同的效果。

    最后总结,微软的打算是把Windows扩展到多设备,但是解决不了多系统的问题,就出了Silverlight。而Google则是打算通过Chrome Browser解决多设备,多系统,甚至多浏览器的问题。不得不说Google的眼光真是更高一筹。

    November 24, 2009

    Google Chrome OS 试用初步印象

    上次那个虚拟机没搞定,这次的U盘启动这个搞成功了,而且还支持我新买的一台2500廉价东芝笔记本。下面说说自己的一些体会,总的来说跟我心中的设想几乎是完全一致的,甚至更好一点。本来以为因为驱动的原因,基本不支持现有的机器,没想到Chrome现在支持的机器并不少。虽然现在bug还挺多,或者功能还不完善,但我也还没看到什么重要的原因使我不能用它做个Windows替代,毕竟对Windows的很多方面早就忍够了。

    1. 先谈界面。Chrome OS的界面几乎是Windows 7界面的一个翻版。在Web OS的概念中,应用程序就是Web应用,或者说一个个的网站/网页。因此,如果从这个角度上去看,Chrome左上角那个按键就是活生生的Windows开始菜单,虽然现在十几个图标,但是以后扩展的可能是一定的,应该会搞的非常类似开始菜单。靠右的小Tab就是Widnows 7 Pined program再加上Startup,这个设计跟我使用Chrome Browser的习惯不谋而合。我就是设置Chrome启动的时候打开我最常用的Gmail, Reader, Wave等等,因此我很喜欢这个设计。再往右就是一个个Web应用的Tab了,就像Windows Taskbar一样,你可以在应用程序中间来回切换。最后右上角就是Windows的状态条了,包括电池,网络,还有个系统菜单是Windows没有的,但是好像没太大必要出现在那里,因为地址栏右边的工具条也包括了。Home Page则相当于Windows的Desktop,上边列出了你常去网站的快捷链接,Windows里是快捷键,不知道以后会不会加入壁纸的功能呢?总的来说,Chrome Browser就相当于Windows的Desktop,而Chrome OS是支持多个Browser窗口的,但是Windows并不知道多个桌面,当然这个意义也不是很大。
    2. 用途。目前来讲Chrome肯定不能作为主OS来用,比如这个镜像是通过BT下载的,U盘的制作也是通过Windows应用,Chrome都不可能实现。但是,作为一个替代OS给上网本用,给那些像我一样使用计算机几乎100%就是上网的人群来说,我并没有看到有什么大问题。快速启动,无需安装,管理应用,自动更新/恢复系统,设置/数据同步,Single Sign On等等优点都是Windows不具备的,而相反在Windows上表现出来的缺点又是无法让我忍受的。比如,我看着Windows开机/关机那么慢就着急,很多时候还关不掉。我特别不愿意在Windows上安装应用,迫不得已要安装的时候都很恼火,而且极其不信任有些应用,用完卸载的时候也不清楚是否卸载干净了,是不是还留下什么烂七八糟的东西。系统整天自动更新让我要启动机器,系统万一有点什么问题恢复起来也是很不理想,基本就是重装系统,而重装之后又要重新安装软件和配置系统。机器自己有个帐号去登录,登录之后去网站还需要另外的账户。这些恼火的地方,在Chrome上都不存在了,我不知道我为什么不去用Chrome?
    3. 目前的问题。Bug还是很多,刚开始用的时候好像很快就会crash,要关机再开机。后来发现,有些时候不是crash,它自己会恢复,重启什么的,而且如果你老老实实看网页的话,crash不算严重,还算是可以一用,当然希望能够有一个相对稳定的版本出来。Sync现在并不work,菜单也是灰色的。分辨率会变,有的时候重启变低分辨率了,如果再重启就可能又高分辨率了。重启或者关机的时候总是有个disk I/O error。性能并不比Widnows上的Chrome Browser快,而且目前肯定不如在其他系统直接用Chrome Browser好用。
    4. 一些技巧。我基本不怎么懂Linux,因此这些技巧不知道是不是大家都知道呢?
    • 一些有用的快捷键:Ctrl+N (new windows), Shit+ESC (task manager), F11 (full screen), F8 (shortcuts), F12 (windows preview), Ctrl+Alt+T (new terminal),

    Ctrl+Shift+W (close window)。

    • 重启:Ctrl+Alt+T, sudo reboot
    • 关机:Ctrl+Alt+T, sudo shutdown –h now
    • 进入Terminal返回Windows,F12
    • 改密码:在另一台Linux机器上把passwd里的root和chronos的密码删除。
    • 中文输入:在谷奥上看一个网友发的搜狗云输入法,试了一下还不错。

    November 22, 2009

    Chrome OS 就是 Web OS

    Chrome OS发布会已经过去几天了,照理说当天我会写篇文章出来的,可是一来现在比较懒,懒得长篇大论,二来Chrome OS跟我几个月前的想法基本一致,没太多意外,因此就觉得没什么必要写这个文章了。最近这几天看了不少评论,比较意外地是绝大多数人对Chrome OS持有否定的态度。本来按我的设想正面负面的应该是五五开的局面,没想到其实绝大多数网友的思维惯性还是很大的,还深深陷入在PC OS的时代。今天看到一篇文章与我的观点及其一致《Underwhelmed By Chrome OS? That's Kinda the Point》,更觉得没必要再表达些什么,可是由于我还有一个观点没看到人提起,就随便写写表达一下我的看法。

    最近这两年大家被云的概念搞得模模糊糊的,什么是云?什么是云操作系统?这个概念都很少有人能分清楚,更让大家忘记了在炒作云之前的热门话题“Web OS”。在PC刚开始的时候就是个单机系统,后来发展到了网络应用就在PC OS上加入了相应的功能,比如RPC,DCOM等等,又后来由于Internet的发展,PC OS上又加入了浏览器,成为了现在的模样。也就是说,目前的OS实际上还是从单机OS繁衍过来的,根基还是在本地计算。另一方面,在局域网的时代我们开发应用都是C/S结构的,也就是说client/server结构,而在10年前开始往BS,browser/server的结构转变,最近几年转变的尤其快速,甚至单机应用也在很大程度上向B/S的结构转变。那么我们知道,在C/S时代我们的OS是分Client和Server的,比如XP/Server2003。可是在B/S时代,我们的OS还是老的样子,分为Client和Server,比如Windows最新的Win7和Server 2008 R2。那么是不是这个结构有点过时了呢?我的回答是肯定的。在B/S时代,我们应该在操作系统层面有一个全新的结构,那就应该是Web OS和Cloud OS。什么是Web OS?什么又是Cloud OS?有的网友竟然拿Chrome OS跟Windows Azure进行比较,简直是驴唇不对马嘴。按照我的理解,Chrome OS就是Web OS,Windows Azure则是Cloud OS。在一个新的时代,云计算的时代,OS一定要脱离PC时代的概念,而跟云的概念紧密结合起来。Cloud OS是云里的一个虚拟服务器,具体到有多少台服务器,服务器上装的什么操作系统,一点也不重要,重要的是他提供的服务。而Web OS则是云的端,也就是云的接入点。而Web OS不应该仅仅是一个PC上的OS,它可以在多种设备上安装,提供接入到云的服务,比如手机。用户也不在乎到底是用的什么设备,设备上到底装的什么系统,只要通过Web OS能访问云就可以了。因此,Chrome Browser比Chrome OS重要的多。Chrome OS是一个纯Web OS,而Chrome Browser则是其他设备和系统上的虚拟Web OS。以后的真正焦点还是应该集中在Chrome Browser上来。别忘了现在是Browser/Server的时代,Browser才应该是故事的主角。

    在Web OS这个术语很热的时候,我试用过一些所谓的Web OS,没什么满意的。他们大多是建筑在Adobe的Flash上面。而Facebook带给了我不少Web OS的感觉,可是它还远远不够。Chrome Browser的出现使我对Web OS的理解有深了一个层次,而Chrome OS的公布则是第一个让我彻底信服的Web OS。Google这一步走的可能超前了一些,可是事实上也许是微软拖后腿时间太长了,别忘了C/S到B/S的转变可是已经发生了很多年了。也许很多网友并不知道,微软正在研究开发很多Chrome OS已经实现的功能,很遗憾第一步被Google迈出去了,就像Office online一样,Google推出很多年,微软还没有完全实现。所以,Google的Chrome OS的方向是对的,无论成功与否,都是一个非常积极的尝试。(微软完全有时间和资源短时间改善Windows把Chrome打败)

    最后说一下我的失望之处就是由于驱动的问题,Chrome OS不能安装在绝大多数的PC上,而我也不太可能为了使用它而花钱买一台新机器。可是我说过了,以后的真正重点还是在浏览器上,因此Windows7+Chrome Browser也是一个很好的选择。

    August 14, 2009

    我博客的变动

    经过了几天的试验,出于以下几个原因,我决定把博客搬家了。

    1. Blogger的功能比较强大,可是排版格式很不舒服,虽然可能可调,但是由于国内网友反映经常被block,需要翻墙才能访问,因此放弃之。
    2. 测试的文章写得差不多快没的写了,以后虽然会继续写,但会比较少,主要是需要比较长一段时间才能有一些心得体会。因此,文章的主题会跟测试没太大关系,主要会集中在互联网,尤其是云计算上。因为主题的扩展,所以我希望能够跟更多的网友分享我的观点与看法。
    3. Live Space不知道怎么回事,最近的文章在各大搜索引擎上都查不到,这就使得上边的第二点成为了不可能。而看我文章的朋友主要集中在测试领域,我这些新文章未必是他们想读的,因此放弃Live Space。
    4. 由于中国的特殊国情,我还是要不得已放弃把博客放在国外网站,因为读者基本上还是身在国内的。经过CSDN,百度,新浪博客的测试,发现新浪上发表的文章搜索引擎收录还是比较快的,而且使用起来也还算顺手,觉得可以用之。

    以下是新的博客地址以及一些其他的交流方式,有兴趣继续看我文章的朋友,或者想问我问题的朋友可以通过他们和我联系,谢谢。

    其次,相关的文章我会发布到以下网站。

    August 7, 2009

    微软将要大转型

    在微软与Google的大战中,我提过微软占有优势地位,但Google占有方向的优势。也就是说各方面的实力都是微软要高Google一头,但是在两个公司的理念上,我推崇Google。Google讲的是云计算,软件即服务,而微软由于软件霸主的地位使得微软不能放弃传统软件而提出了Software+Service的口号。我其实并不赞成这个口号,以前也批判过一些,而微软在这个口号下也没做出什么优秀的产品出来。倒是Google在云计算上做的风生水起。

    最近微软的一些变化让人感到很惊喜,首先就是Steve Ballmer竟然零代价搞定了Yahoo,简直是让我对他刮目相看。然后就是战略的转变让我重新看到了希望。微软每一年度开始,CEO都会发表下一年度的公司策略,而software+service则是去年的重点。我统计了一下去年与今年的变化,列出了主要的区别如下,

      2008 2009
    Software 出现9次 出现3次
    Cloud 出现2次 出现6次
    Strategy Embrace software plus services Embrace the cloud across all of our businesses

     

    Software的出现频率下降了三分之二,而cloud的出现频率则增长了两倍。可见微软这两年正在经历Software->Software plus Services->Cloud的一个重大历史转变。希望2010年微软能够推出一些重量级的产品出来与Google更好地进行竞争。

    微软,Google云计算基础技术的比较

     

    我想现在几乎没有人没有听说过“云计算”这个术语了,但是能明白云计算是怎么回事的人可能就是少数了,而在云计算的理解上也是因人而异,可能非常不同。这也不算不正常,因为云计算只是个概念,是个方向,很多时候大家都只是看到,抓到,感受到那么一点点,好比盲人摸象。就算大公司的理解也是千差万别,更何况每一个人了。我今天想通过对比微软和Google的云计算的基础技术来阐述一下自己对云计算的理解。首先我想澄清一些概念:

    • 云计算:现在最泛泛的概念就是云计算了。由于计算是其中的重点,我们经常把云上的所有东西统称为云计算,这就很容易使人感到迷惑。我个人认为云计算有两种context,一个就是计算,发生在云上的计算。另外一个是我刚提到的泛泛的概念,比如把云存储也归于云计算了。所以大家看相关文章的时候,一旦看到云计算要搞清楚context,否则就容易迷糊。而且我发现很多文章的作者本身对这两个概念也很迷糊。我在跟很多人讨论云计算的时候,也正是这个原因使得讨论无法进行。我个人倾向于把云和云计算区分开,就像把计算机和CPU的概念区分开,虽然CPU是计算机的核心。当然,这不是由我来作主的。
    • Server和client:我发现在讨论云计算的时候,不但需要区分上边讲的两个context,还需要区分server端和client端。如果从计算的角度来说,那当然server端是重点了,毕竟计算在server上产生。可是如果从云的整体来说,server端和client端就都很重要。而如果从用户的角度来讲,那就应该是client端最重要了,因为计算的发生对用户来讲是透明的,而client端的交互最重要。很多时候在讨论云计算的时候,人们竟然把client端跟server端混着来讨论。比如我在写livemesh与云计算的文章的时候,很多人竟然把windows azure拿进来讨论。我最近还看到有些文章竟然拿Chrome OS和Winows Azure进行讨论。
    • 由于以上原因,为了减少混乱,我会把云计算按照计算的context来讲,而把泛泛的概念直接称为云。我在讨论技术的时候,会把他们分为client和server端分别进行比较的。
    • Cloud OS与Web OS。在云计算概念流行以前,人们更多的是谈论Web OS。现在人们谈论的更多的是云计算,因此Cloud OS和Web OS的概念就又混淆了。可能不少人认为是一个东西,可是从我个方面的得到的信息来看,我们基本上可以用client/server端来区分他们。Cloud OS是server端的,比如微软的windows azure就号称Cloud OS。而Web OS则是客户端的,比如市面上的各种号称Web OS的网站,比如Facebook,比如Google的Chrome Browser,Chrome OS等等。目前来讲,Web OS还没有明确的概念,所有产品基本都是试验性质的,但是Web OS在client端还是比较明确的。
    • 对于云来讲,不同的人关心的重点不同。网络服务提供商,开发人员关心的是server端的cloud OS,而用户关心的是client端的web os。因此,对于大多数人都作为普通用户来讲,就没有太大必要去注意server端的那些新技术,新术语了,也不要被他们的出现搞糊涂了。

    下面的表格列出了微软和Google公司云计算基础技术和产品,随后有我个人的讲解。

    Server/client Technique Google Microsoft
    Server Cloud OS App Engine Windows Azure
    Client Web OS Chrome OS Live Mesh
    Browser Chrome IE
    RIA Javascript+V8 Silverlight
    Offline Gears Live Mesh/Silverlight
    OOB Chrome shortcuts Live Mesh/Silverlight

     

    • Cloud OS:由于Google App Engine只支持Python和Java,而我不想学Python也不喜欢Java,所以没有任何体验。而Windows Azure则体现出了微软强大的实力。从下至上,除了hardware则清一色使用微软自己的产品。OS: Server2008, VM: Hyper-V, Host: IIS, Dev tools: Visual Studio。从Azure来看,微软在云上开发了一套开发平台,从而改变了网络服务提供商的经营和开发模式。他们不再需要买自己的服务器,而转为租用微软的虚拟机,开发则是通过微软提供的接口开发在IIS上的web服务。重点是他们不需要考虑sacalability,而是按计算的需要和使用情况向微软付钱,就好比我们现在买电一样。而云计算的提供商则相当于现在的电力公司一样,使得计算变成一种资源去交易。由于我不是搞这行的,所以,我更多的注意力放在了client端。
    • RIA:要想建立client端的Web OS,则需要依赖于rich internet application。这方面的技术主要有三种,Adobe的Flash,微软的Silverlight以及Google推崇的AJAX。以前用过一些Web OS都是建立在Flash上, 我就感觉很别扭。一是因为既然是OS还需要依赖Flash?二是因为点右键总是有个Adobe的影子,而且不能customize。其实也正是因为这个原因使得Google在很早就放弃使用Flash了,而进行了更灵活的Javascript的大力支持。微软的Silverlight则正像是Flash的翻版,到现在为止我基本上没看到过什么基于Silverlight的应用,好像主要是播放视频。而Google自己基于javascript的Gmail, reader, 以及最近公布的集大成的Ajax的顶尖作品Google Wave等,都让我在RIA这个方向上很支持Google。
    • Browser:前边说过Google大力推行Javascript,而运行速度慢是Javascript的一个致命的问题,使得在和Flash, Silverlight的竞争中处于劣势。基于这个原因,Google推出了自己的Browser Chrome,并且内嵌了V8的JS的引擎,使得javascript的运行效率大大提高,从而可以用javascript开发出更高级的界面。比如,我看过JS实现的一些SD,动画的demo,都还是比较出色。而Chrome又大力支持HTML5,其中重要的一点是支持了视频,从而使得Flash和Silverlight的竞争力进一步降低。而且,javascript的好处在于浏览器本身就支持,不用像Flash, Silverlight还需要单独安装。进一步说,Chrome对JS的优化直接推动了Firefox和IE对JS的优化,而JS的运行效率也成为了浏览器的最重要的指标之一,使得Javascript的前景更加的光明。
    • Web OS:现在已经比较明确的看出来了Google的Web OS就是即将公开源代码的Chrome OS,而对于普通用户来讲,Chrome OS和Chrome Browser基本就是一个东西。因为普通用户对那块Linux内核是透明的,也是不在乎的。所以,我们只要看Chrome Browser的发展,就应该能推断出Chrome OS大概的样子。Chrome OS最大的焦点在于替换掉Windows,而Chrome Browser将要增加的同步功能,使得Google的Web OS更加完善,而谣传了许久的GDrive如果能够稍后推出的话,则Google的Web OS将基本成形。微软目前并没有一个所谓的Web OS,而最像Web OS的产品则是Live Mesh。Live Mesh我以前已经谈论过了,就不再重复了,简单来讲我很失望。
    • Offline:云计算的一个重大问题就是离线怎么办?这也是很多人质疑云计算的一个主要原因。Google的解决方案是Google Gears, 它内嵌于Chrome里,也可以安装到其他浏览器上。Google Gears使得用户在离线的时候还可以访问,操作数据。微软的主要解决方案是Mesh, 通过同步各种设备。最新的Silverlight也加入了一定的离线支持。
    • OOB (Out of Browser): 在浏览器中运行的Web应用界面与传统桌面软件比起来总是死板,不够灵活的。因此,人们就产生了需求,想在浏览器之外运行web应用。Adobe的Air可以实现这个功能,而Google的解决方案是Chrome里的shortcuts。给Web应用建立了shortcuts之后,就可以按照人们习惯的方式启动这个应用,而界面也很传统软件非常接近了。微软的解决方案则是Mesh, 或者最新的Silverlight OOB功能。

    综上所述,我们可以清楚地看到,Google的云技术的client端的核心就是Chrome浏览器,所有相关的技术都嵌入到了浏览器中,甚至操作系统的内核也算嵌到了浏览器中,这也是为什么Google为它Browser和OS起了一个同样的名字。所以,我们可以说Google Chrome未来就是一个Web OS。而反观微软,则是把这些feature分散在了几个不同的产品中:Windows, IE, Silverlight, Live Mesh,并没有一个统一的解决方案。因此,在云计算的战略上,还是感觉Google比微软看的更高更远一些。

    还是回到Live Space吧

    一些人反映blogger被国内封了,所以我又回到了Live Space。

    peking2toronto.spaces.live.com

    May 30, 2009

    Code Review, Debugging, Windows Internals, WDM小结 (一)

    学完Silverlight之后,最近两三个星期集中在了code review, debugging, 以及Windows Internals和WDM的学习上。现在是时候做个小结了。

    逛了一些关于debug,windows内核,驱动等的论坛,发现大家主要集中在了加密/解密,逆向,系统漏洞和反病毒等等专业领域,和我所学习他们的目的并不相同。所以,文章和我所关注的知识点也不很match。对于我来说,我学习他们的主要目的集中在了Debug和Security Test上。在学习的过程中有种知识零散的感觉,昨晚才把他们互相联系起来,因此也就有个立体的感觉(请看下图)。下面想简单地谈谈。

    首先,Debug是一项软件人员应该掌握的既基本,又高级的技能。它并不属于开发人员的专利,测试人员拥有这项技能也如虎添翼。说它基本是因为在你大学学习计算机语言的时候都会或多或少用到debug的技术,是编程中一项必用的技术。说它高级是因为很多疑难杂症都需要高超的debug能力才能去解决,debug的能力很大程度上体现了一个人的软件开发测试的水平。大家debug的目的各不相同,而对于测试人员来说就是在发现一个bug的时候能够通过debug找到root cause。在debug的学习与实践中,我认为以下知识非常重要:

    1. Debugging tools: 微软提供了一套tools,而我们最常用的就是windbg了。windbg使用起来还不算麻烦,学习起来也不难,但是各项命令实在是太多了,需要时间和经验去慢慢积累。
    2. Code review:或者你做专门的code review,或者你在debug的时候做code review。总之,你对代码不熟悉是很难进行debug的。因此,code review也是debug中非常重要的一个方面,你应该熟悉你所测试产品的代码。很多时候,你甚至不用去debug,想想代码流程,或者简单地review一下就能定位bug。而对于code review方面,你需要了解Win32 API (User mode code),以及WDM,WDF (driver)。
    3. Assembly: 如果你没有源代码的访问权利,你就需要逆向的能力了,这个就对汇编的要求很高了。但是,一般来说我们都是测试自己的产品,理所当然具有源代码的访问权利。但是,即使这样,我们仍然在某些时候需要汇编的知识去debug,比如有时windbg的命令不能正确显示结果,或者调试optimized code的时候。不过这些要求不会太高,一般来讲你学习几个小时的汇编就应该够用了。
    4. Windows internals:其实Windows internals是里边最难学的,但又是比较基础的东西。比如,windbg的很多命令的使用需要你了解内核的工作原理及数据结构。而你在调试driver的时候当然需要内核的很多知识。你如果把内核学通了,其他知识都不成什么问题了,所以对内核的掌握程度也直接决定了你的debug水平。这本书我从开始看断断续续的也快三年了,最近才有了立体的感觉,一想能知道这本书都说了些什么,虽然我不确定我到底看懂了多少,但是基本上在debug需要的时候我能够直接找到相应的章节去看,也应该可以短时间内看懂。由于先看了这本书,所以在看WDM的时候就感觉很简单了,虽然作者说话很罗嗦,但是不用太多的推敲都能很快理解。有种感觉,好象是精通了C/C++以后再去学习其他语言的时候的那种感觉。

    image

    May 28, 2009

    你是不是要找病(Bing) ?

    在Google和Yahoo中搜索Bing, 出现提示"你是不是要找病"。

    image

     

     

     

     

     

     

    image

    May 24, 2009

    《Windows Internals》学习心得(2)- Windows Architecture

    Windows

    • kernel32.dll, advapi32.dll: to provide Windows APIs
    • ntdll.dll: to switch from user mode to kernel mode
    • ntoskrnl.exe and drivers: major part of Windows OS
    • hal.dll: hardware abstraction layer

    Ntoskrnl.exe and drivers

    • executive
    • kernel: KeXXX

    Executive

    • system services: NTXXX, ZWXXX
    • executive support routines: ExXXX
    • executive components and relevant services

    Executive components and relevant services

    • Object manager: ObXXX
    • Configuration manager: CmXXX
    • Process and thread manager: PsXXX
    • Memory manager: MmXXX
    • IO manager: IoXXX
    • P&P manager: PpXXX
    • Power manager: PoXXX
    • Cache manager: CcXXX
    • Security reference monitor: SeXXX

    Drivers

    • ntfs.sys
    • volmgr.sys
    • ndis.sys

    May 23, 2009

    xikug谈黑盒,灰盒,白盒,逆向


    早就想写点什么,自己都不知道一天在瞎忙什么,一直到最近才开始动手。。。我想通过这个乱谈系列跟大家分享一些心得。我打算在这个系列文章中讲点方法与思路,当然,很多方法并不是我的原创,只是我用这些方法和思路解决了我的实际问题。由于本人水平有限,很多说法只是我个人的理解,然后用我自己的语言表达出来,可能并不专业,所以在这里不负责任的乱谈一下,欢迎大家拍砖。
    什么是代码逆向
    代码逆向即是在没有源代码的情况下,对目标程序的行为、数据流、及编译器生成的代码进行分析,通过分析我们可以了解、发现程序的功能、流程、规则、及技术实现细节等,通过分析我们能对其进行优化、功能增强、漏洞填补、甚至还原成源代码等。这个分析过程我们可以称作逆向分析或逆向工程,简称逆向。
    对我们个人而言或许我们能够从逆向分析的过程得到的最大好处就是学习到优秀程序的设计思想、及技术实现细节。
    当今,逆向分析技术在很多地方都得到了应用,典型应用包括恶意软件分析、漏洞挖掘、BUG定位、技术探秘等。
    有人可能会说逆向太无耻了,自己不会写就偷别人的代码。。。我就不相信说这话的人什么都会,我就不信他没有分析过别人的东西,学习过别人的东西,我只能说他是无知的。。。殊不知逆向是一个探索未知的方法,是一种学习态度,是代表不屈服于困难的精神。如果没有逆向当前的很多科学进步不了这么快,也可能不能取得进步,科学研究就是探索未知,把我们未知的东西进行分析研究变成已知,不光是软件领域有逆向工程的应用,其他领域如:基因重组、化工、制药、电子、建筑、航空、军事等领域也存在着他们各自的逆向工程应用,逆向工程帮助科研人员把未知的东西进行分解、研究、组合、改进等,甚至创造新的东西出来等,科学就是这样一点点进步的。
    通过逆向得到的好处是显而易见的,然而任何技术都是把双刃剑,逆向分析技术也不例外。可能被人用于学习、解决技术问题或做有益于软件安全的事,也可能被人用于搞破坏。
    逆向方法
    白盒分析
    白盒分析就是从代码级别上(可能是反汇编代码、反编译的伪代码或源代码),通过动态调试或静态反汇编分析和理解程序的功能、逻辑,找到程序的安全问题等。
    黑盒分析
    黑盒分析是指从程序的外部,通过观察程序运行时候的行为,规则等来猜测和断定程序可能的实现方法,是否有存在脆弱点等。
    灰盒分析
    灰盒分析通常需要借助一些专有工具(可能需要自己编写),如api监视工具,陷阱工具,内存比较工具,文件监视工具等对目标程序进行监控,看它发生了什么操作,调用了哪些api,产生了哪些结果,在系统哪些地方安插了HOOK或过滤等,以此来猜测和断定程序可能的实现细节。
    目前越来越多的程序加了VM或进行了代码扭曲,用白盒分析此类程序可能会花很大力气也找不到突破口,而黑盒和灰盒分析往往对这类程序可能有意想不到的效果。
    逆向手段
    动态调试
    通过调试器对目标程序进行追踪分析,能够清楚的了解到程序运行起来后内部的状态,运算结果等信息。
    静态反汇编/反编译分析
    使用反汇编器或反编译器把目标程序变为可读的汇编代码或伪代码,然后分析程序的结构,流程,逻辑等。
    如何学习
    逆向并不是想像中那么难,但也不是想像中的那么简单,真正困难的是如何有效的运行这些方法和手段来更快、更好的达到我们的目的,这需要累积大量的程序设计经验和逆向经验。
    通常我们进行逆向的时候希望达到的目的大致可分为以下几种:
    技术探秘/代码还原
    软件漏洞挖掘
    软件Bug定位
    软件行为/规则分析
    解除软件的使用限制
    进行辅助程序的开发
    我们要达到的目的不同,逆向时采用的方法和手段的“细腻”程度也不会相同,譬如我们对一个win32平台下的内核驱动进行“技术探秘/代码还原”的时候可能会把白盒、黑盒和灰盒所有的方法和手段都用上,每段汇编代码我们都必须看懂,代码实现了什么功能,跟另一段代码有什么关系,理解整个代码的架构和思想等;而我们在进行“软件行为/规则分析”的时候可能只需用上黑盒或灰盒分析法就够了,知道按下这个按钮后读写了哪些文件,哪些注册表项,调用了哪些api等等。分析过程中有时候我们只需静态反汇编看一下就可以了,有时候我们可能还需要动态调试一下,总之没有固定的套路,一切视情况而定。
    扎实的编程基础是学好逆向的关键,基础打好了学什么都快。程序的基础就是算法和数据结构,语言只是一个实现的工具,绝大多数语言都是相通的,我们只要掌握一门,以后如果需要学习其他语言的话上手就会很快了,基础知识我们重点需要掌握以下内容:
    1.至少一门高级程序设计语言,推荐C语言或Pascal
    2.x86汇编语言
    3.常用算法和数据结构
    软件一般都是在特定平台下运行的,如Windows平台,Linux平台,WinCE平台,Java平台,Symbian平台,Plam平台等等。。。针对特定平台下的软件逆向,需要掌握特定平台下程序设计的相关知识,包括其SDK,进程管理,内存管理,文件系统等。这些东西不必全部精通,但要有个大致的了解,常用Api要知道,有特定平台下的程序设计经验最佳,遇到问题知道在哪里能找到自己想要的资料就够了。逆向的过程本身就是一个学习的过程,因此我们可以在逆向的过程中补充自己相关的知识,这样学习的效果是最佳的。(由于本人所接触的面比较窄,接触得最多的就是x86 Windows平台下的原生程序逆向,因此本系列文章中的内容除非特别说明都是指x86的Windows平台下原生程序和代码)
    学习逆向的最好方式就是动手实践,在实践中有针对性的学习。通常来说我们逆向时所面临的东西对我们来说是未知的或者是可能知道但不确定的,如果是已知的就没必要再去逆向了。针对性的学习就是在自己逆向的时候缺什么知识就补什么知识,日积月累过后我们的收获是相当可观的,不光是经验值的增长,还有知识面的增长和知识深度的增长。
    编程的经验对于我们实践逆向时也很重要,例如进行“漏洞挖掘”的时候我们可能会以程序设计者的角色进行思考,程序在哪些地方需要进行防范,哪些地方可能会出现漏洞等等,如果我们有足够的经验的话,可以很快定位到相关的代码部分对其进行分析,看是否存在可能的漏洞。又如在进行“技术探秘/代码还原”的时候,由于现在的程序规模越来越大,我们不可能每条指令,每段代码都去看,都去逆向,假如一个1M的程序需要这样做的话,光时间成本上来说成本都是相当高的,因此我们需要快速定位关键代码段,而丰富的编程经验有助于我们做到这一点。拓宽自己的编程知识面、积累编程经验跟积累逆向经验同样重要。丰富的编程经验能让我们事半功倍。
    另外在进行代码还原时我们最好能用原始程序的实现语言进行还原,这是为了避免麻烦,因为现代的编程语言通常都有自己的Framework,提供各种各样的类库,他们功能各异,互不兼容,如一个VCL的程序我们硬要用MFC对其还原,VCL的某一非常复杂的机制或功能在MFC中可能没有,而自己如果在MFC中实现的话工作量是相当庞大的,这时的结果可能就会是事倍功半了。因此我建议在代码还原时最好使用原语言进行,原来是C的就用C,原来是Delphi的就用Delphi,原来是Python的就用Python。。。
    逆向工程时常具有“四两拔千斤”的功效,我也不太会表述,等你有足够的实践之后大概才能体会到,这个就只能意会不能言传了
    学习资源
    上面说了那么多,是时候介绍一些学习资源的时候了,这些资源都是比较基本的,可说是学习阶段必备的,希望在大家学习和实践的过程中能帮到大家。

    《Windows程序设计(第5版)》 – Windows平台下程序设计的经验教程。URL - http://www.china-pub.com/2382
    《Windows核心编程》 – 又是一本经验的书,可以帮助你把Windows下的编程技术提升一个层次。 URL - http://www.china-pub.com/131
    《深入解析Windows操作系统(第4版)》 – 这本书是关于Windows内部机理核心的权威之作。这本书对提高你的逆向水平也是大大有帮助的,当然,前提是在你看懂之后。 URL - http://www.china-pub.com/32775
    《加密与解密》 – 不错的入门书籍,快出第三版了,http://www.china-pub.com/12210
    网站
    www.rootkit.com – 很多关于系统安全,系统内核方面的资料和代码
    www.codeproject.com – 很多程序设计的代码和文章
    msdn.microsoft.com – 包含最新的微软平台下的开发资料
    论坛
    bbs.pediy.com - 看雪论坛,国内最大的加解密论坛,已经向软件安全转型,上面汇集了国内大批高手。
    www.unpack.cn - 一蓑烟雨,国内最专业的脱壳论坛,关注面也很广,除了脱壳外还有汉化、软件安全、木马病毒、编程、游戏、文学、音乐、艺术等,上面的高手也不少。
    bbs.driverdevelop.com - 驱网论坛,驱动开发的论坛,高手不少,但是发言的比较少,可以去逛逛。
    forum.sysinternals.com – Sysinternals,很多系统方面的资料,不少高手在上面发言。
    www.debugman.com - 第8个男人,在下创建的论坛,旨在为志趣相投的朋友提供一个交流平台,目前关注方向为程序设计、逆向、代码安全和系统底层等。
    工具
    这里列出的工具只是很少一部分,对工具的选用,我的观点是哪个随手就用哪个。
    OllyDbg – 调试器,ring3下的调试器,上手快,功能强大,有很多插件。
    SoftIce – 调试器,ring0级调试器,当然ring3程序也是可以调的,功能强大,但已经不更新了,不支持vista等较新的操作系统。
    WinDbg – 调试器,MS自家的调试器,就不多介绍了,两个字 - 推荐。
    IDA – 反汇编器,最强大的静态反汇编分析工具。
    LordPE – PE工具,可编辑PE文件等。
    PEiD – PE工具,可识别PE文件的格式信息,如用什么编译器编译的,是不是被什么壳处理过了等。
    FileMon – 文件监视工具,可监视系统或程序对哪些文件做了什么操作。
    RegMon – 注册表监视工具,可监视系统或程序对哪些注册表项做了什么操作。
    SSM – HIPS,这个工具有时候可以给逆向带来很多方便,如抓取某个文件,禁止访问某个注册表项,盒灰分析等。

    May 22, 2009

    《Windows Internals》学习心得(1)

    以前做开发的时候用VC, MFC, 对于Win32和Driver是一点也不感兴趣。后来乱七八糟混了好几年,IT业大变,自己碰巧就做上了测试。测试又做了快5年了,大部分时间是自我摸索,到了现在这情况变成了一定要学习Windows internals了。
    这本书从开始看也两年多了,我很难说我看懂了多少,只是最近才开始有点立体的感觉,当然这跟工作上接触到一些相关内容还是有关系的,否则只是硬看应该是看不懂才对。我想目前由于不精通Windows internals对于我的测试工作有以下几个障碍:
    1. 跟开发人员的沟通存在Gap。
    2. 不能更好地去设计测试用例,因此不能抓到更深入,复杂的bug。
    3. 对于一些复杂点的问题很难去debug。
    4. 对于code review, code coverage, security test等等都受到了很大的限制。
    5. 职业发展也有了bottleneck。
    因此,我觉得在今后的几年应该在Windows internals上下下功夫,争取能够达到精通。今天我就想谈谈自己以前比较混乱的一些概念,windows internals, windows kernel, SDK, DDK, Win32, driver。
    • Windows internals应该是讲Windows OS实现的一些细节,它并不局限在kernel mode的模块和知识,还涉及到了user mode的一些系统进程。因此,我说学习windows internals就应该包括了所有Windows OS的知识。
    • Windows kernel,我主要是按照在kernel mode运行的模块来理解的,因为Kernel mode里还有个kernel,容易造成概念的混淆。
    • Win32 API就是windows提供的在user mode的应用程序编程接口,它的工具包叫做SDK。但是涉及到系统服务,也就是内核上的服务的时候,他们是通过ntdll.dll转到kernel mode去实现的。也就是说,实现的细节还是在kernel mode。
    • Kernel里提供了一套接口叫DDK,是给driver的开发人员使用的。如果你想在Kernel mode运行你的程序,你应该只能通过编写driver来实现,正常来说。
    由于windows internals的大部分知识都是在kernel里,因此我也想主要集中在kernel mode里的模块和知识。
    1. 对user mode开放的服务都有哪些,实现细节如何?
    2. DDK里的函数都有哪些,实现细节如何?
    3. Executive层的模块都有哪些,实现细节如何?比如,memory manager, IO manager, cache manager等等。
    4. Windows里的driver都有哪些,实现细节如何?比如我认为最重要核心的ntfs。
    学习资料:
    《Windows Internals》
    《Programming the Microsoft Windows driver model》

    最后,HAL不想学,也不知道有没有用,Hardware不想学,WDF暂时不想学。现在是新手,能想到的也就这么多了。

    May 20, 2009

    Debugging Tools for Windows 学习使用心得

    其实我的主要工作一直是UI test, UI automation, manual test 等等。曾经跟领导提过想做些深入点的测试,领导则反问 “你Kernel debugging 怎样?”。这是一个非常有趣的问题,你因为不具备良好的kernel debugging的能力,所以不给你做深入的测试工作,而因为你没有做深入的测试使你也不可能具备kernel debugging的能力。很多时候事情就是如此矛盾的,而我也曾经说过,一切最终还得靠自己。
    前几天发现一个奇怪的bug,分给这里的一个seniro dev他也没太多的办法。我在一个高手的指导下自己debug and figure out了root cause。在和这个高手的交流中,也基本明确了一下步的学习目标。以前的我主要是靠自己摸索,我想多跟高手接触,交流还是非常非常有帮助的,当然机会也不是很多。那么我的下一步的目标就是“code review, debugging, windows internal and WDM”。Debugging可以说贯穿了其他的三个,因此我今天先谈谈我对debugging tools的感受。
    我们基本都是用微软提供的几个debuggers,ntsd, cdb, kd, windbg。ntsd和cbd是user mode debugger, kd是kernel mode debugger, 他们都是command line的,而windbg是UI的debugger, 可以调试both user and kernel mode。大多数情况,我都是用windbg,但是在一些特殊的情况下,我还是需要其他的tools。今天我主要是谈windbg,我想学习windbg大概分这么几个阶段:
    1. windbg的命令,共三种命令,普通命令,加'.'的命令和加'!'的命令。Debugging tools自带的那个教程学习一下就应该差不多了,以后就靠经验积累了。
    2. 如何开始debug, 这要根据你所debug的目标和要debug的问题来决定了。你应该决定是使用user debugger 还是 kernel debugger, 是 local debugging 还是 remote debugging, 是用windbg还是ntsd, 等等。通常都有几种方式去debug,你要能够准确选择一个最合适的。
    3. 怎样进行debug。对于一个需要debug的问题,你需要有你的策略。比如,在哪里设置断点,如何设置断点,等等技巧。
    4. 利用一些tools。有些情况下只有debugger还是很难debug,你需要使用其他的tools去辅助。比如,有的时候在问题显露的时候已经太晚了,你很难追踪问题发生时的情况。这里,你可以用一些tool使得在事情发生的时候跳到debugger上去。
    5. Code review非常重要。当你发现一个bug的时候,如果你代码熟悉,你可能直接就能想到问题出在哪里,或者你稍微读读代码就能发现问题所在,根本就不需要debugger。而在你debugging的时候,常常你也需要review相关的代码来理解这个问题。
    6. 汇编语言。当你在调试optimized code的时候,你常常不能通过dv, dt等命令正确地看参数,变量等等,或者变量根本就没得显示。这就需要你具备汇编语言的阅读能力,了解calling convention, 不同cpu的汇编,以及在disassembly模式去调试。
    7. Kernel debugging。如果你具备了以上的技能以后,user mode debugging应该不成什么问题了。但是对于调试kenrel mode还是需要一些附加的知识与技能。首先,kernel debugger的命令很多跟user mode的就不一样了,你需要学习。其次,你需要了解Windows internal的知识和数据结构,以及Windows driver model。这也是为什么我把Windows internal 和 WDM作为两个学习要点。
    最后引用高手的两句话,“debug一两年,你就没什么问题debug不了了”,“只要能repro,你总能找到办法去debug”。