ubuntu下用virtualbox运行百度hi

       原文URL: http://blog.csdn.net/u012859646/article/details/16840309 [2009]

     本篇为旧文,差不多整理于09年,记录的也是一个小问题的定位与解决。里面的内容可能年久失修,不见得能直接套用,但相信如果有类似问题,方法上还是可以借鉴。                    

       在unbuntu或其它linux桌面下运行baidu hi,在hi未推出linux版本前,两种常用的方式为1) wine; 2)虚拟机。

       方法1和wine及gcc等版本都有关系,步骤也较多,不一定能成功;就算成功运行,一般也有速度慢的问题,而且hi的某些功能也无法顺利使用。

       方法2,使用虚拟机的最主要缺点就是两个系统间切换及共享较为不便,无论你的虚拟机使用的是窗口或是全屏模式。

       本文介绍的方法是在virtual box虚拟机基础上的hi使用,介绍了使用过程中的两个问题:

        1 virtual box的addition功能: seamless windows、文件及clipboard共享等

        2 对hi做了点小定制以便解决此过程发现的一个小问题

 

一 安装

       virtual box里带的 Guest Additions功能是很强大的,在安装了此功能后才能实现我们要做的事。 Guest Additions功能默认是未安装(至少在我用的版本上如此),不过其安装包是附带的,文件名为VBoxGuestAdditions.iso,默认的位置应该是 /usr/share/virtualbox/VBoxGuestAdditions.iso

;如果安装路径不同,可以locate或find一下。

     可以先mount一下,这个iso

     $ sudo mount -o loop /usr/share/virtualbox/VBoxGuestAdditions.iso  /media/cdrom0/  

     之后,安装

     $sudo  sh ./VboxLinuxAdditions-x86.run

      安装后需重启virtual box。帮助文档里只要这一步安装就可以完成。实际操作中,发现在虚拟的window环境中也要安装对应的Guest Additions才能工作。具体,可以在虚拟机 “管理->虚拟介质管理“菜单中选择 VboxGuestAdditions.iso。即可在虚拟的window环境中,从光盘进行安装。安装之后也需重启window。到此,所有准备工作就已完成。

      重启虚拟的window后,ctrl+L就可以进入seamless window模式,如下图,

ubuntu下用virtualbox运行百度hi               

       可以看出,这种模式下和wine的效果其实是类似的,另外虚拟机上的其它应用也都不需变化,就可以直接像一个linux的桌面程序一样使用,如你也可以使用其它流行的输入法或使用ie。如上图linux 下的gvim和window下的hi,就像在同一个桌面上运行。

        之前提到的clipboard和文件共享的操作也简单,只需在virtual box下配置即可。

  1. clipboard共享。在virtual box设置->常规->高级  共享粘贴板中,选择”双向”
  2. 文件共享。 在virtual box”设置->数据空间”中添加数据空间,需要指定一个命名,和一个位置。假如我们使用”/media/sda3/vb”做为共享文件夹,命名为”vb”。添加完,启动虚拟window机器,在命令行下,使用命令

 > net use x:  \\vboxsvr\vb 

即可用x盘符来访问linux机器下的共享文件夹。

 

二  定制

        以上的过程是比较简单的。不过,使用中发现这么个问题。见下图。

ubuntu下用virtualbox运行百度hi   

        就是hi的左边,经常会出一个黑色的窗口,而且有时在hi最小化以后,此“黑块”还是“挥之不去”,甚是烦人。这个窗口,应该是鼠标在好友上悬停时,展示的一个详情窗口,会展示用户最新文章等。可能是hi或virtual box在某个细节处理上的问题,导致了这个黑块。 这个功能于我没有太明显的用处,因为好友最新动态里也有相关内容。

       现在想做的就是去掉这个窗口。由于已经若干年没动过window下的相关开发,下面的过程并不算顺利,因为手生的缘故。

  1. 工具准备。工欲善其事,必先利其器,当然是要准备好一些相关工具,如spy++, ollydbg, IDA等。
  2. 确定窗口。首先用spy++查看,可是在hi的子窗口中,没有找到这个不可见的窗口。还好,再找spy++时,下载的一个同类工具winspector spy在某些方面功能更强大些,可以查看到,如下图

ubuntu下用virtualbox运行百度hi

红框所示就是正在highligh中的隐藏窗口,可以看出,这个窗口标题Dialog.MainFrame.CradTipWindow。窗口定位后,后续定位窗口生成的代码才较方便。

  1. 确定窗口生成的时机。为了更有效设定断点,需要了解窗口生成的时机。Ollydbg或之前的winspector spy都可以查看进程的窗口列表。这里,只是简单刷新窗口来观察窗口标题为 Dialog.MainFrame.CradTipWindow的生成。通过“人肉”的方法,可以看出,窗口是在第一次展示时生成的,之后不会destroy,在需要展示的时候渐变出现,渐变隐藏。这里应该有更有效的办法,如特定的字符串断点等。
  2. 确定修改方案。可以考虑的修改方案有:1处理悬停消息,直接返回而不处理; 2 修改窗口的一些属使其不显示等。在定位的过程中,可以看出hi的窗口控件大部分不是标准的,而是自己开发的。如果第二种方案能奏效,肯定要比方案一简单,而且可能的副作用小,因为对应的窗口句柄很可能在其它地方被使用,这可能会引入较多的修改。另外,winspector有一个有用的功能,你可以直接修改其它窗口的属性, 如下图。 在这里尝试,将”黑块'窗口的WS_VISBLE属性去掉,发现可以解决问题,即”黑块”可以去掉。因此,可以确定按方案二的思路继续。

ubuntu下用virtualbox运行百度hi

 

  1. API及断点。和窗口属性可能相关的几个API, 如CreateWindowEx, ShowWindow, SetWindowLong等,当然hi是unicode版本,实际关注是CreateWindowExW之类的API版本。另外,在第3步中,确定了窗口是在第一次需要时创建的,因此可以在hi登录后再去attach、设断点 并debug,这样可以跳过不少干扰,提高效率。使用ollydbg中,attach进程,对上面提到的API设置好断点。然后将鼠标悬停到某个好友之一,以触发窗口的创建。记录本过程中,进入断点的相关信息,大概有7,8次。其中,如下的信息是值得关注的。

 

0012FBE4   10068104  /CALL 到 ShowWindow 来自 Basement.100680FE

0012FBE8   0035026C  |hWnd = 0035026C ('Dialog.MainFrame.CradTipWindow',class='BaseGui',parent=000303E4)

0012FBEC   00000008  \ShowState = SW_SHOWNA

 

从窗口标题可以确认, 这个窗口就是我们关注的“黑块”。另外,由于“应用程序通过调用清除了WS_VISIBLE标志的CteateWindow函数来创建主窗口函数,并且随后调用带SW_SHOW标志的ShowWindow函数来显示窗口”是创建窗口的常用方式。而且从其它断点得到的信息,如CreateWindowExW中,可以了解到,此窗口的创建确实使用了常规的方案。而且,正是这个ShowWindow调用将窗口的WS_VISIBLE属性置上。

  1.  定位。在上文的ShowWindow设断点,并查看其调用栈。下页的图中,给出部分调用栈的图。另外,先截取一部分window相应头文件定义

 

#define SW_HIDE                  0

#define SW_SHOWNA           8

可见,原程序中,调用ShowWindow的参数为数值8,我们希望将其改成0(不可见)

 

ubuntu下用virtualbox运行百度hi         

上图中Basement是指hi调用的是basement.dll中的函数,这个dll中应该是封装了不少常规调用。一般来说,对ShowWindow API应该也会做点封装,所以可以在附近几个栈帧中查看。在ShowWindow调用往上的第二个帧中,可以看到如下汇编代码:

 

005446C6    6A 08                   PUSH 8

005446C8    50                        PUSH EAX

005446C9    FF91 C8000000   CALL DWORD PTR DS:[ECX+C8]

 

此处的 push 8,很可能就是将参数SW_SHOWA进栈。当然,这个可以从汇编代码的参数去证实。从这个代码猜测API ShowWindow往上的第一个函数,带两个参数,其中8是第二个参数。因为,无论是cdecl或stdcall,函数参数都是从右向左入栈。

  1. Patch。 可以尝试将push 8改成push 0,也就是ShowWindow时带上SW_HIDE参数,使窗口不带WS_VISBLE属性。如下图:

 

ubuntu下用virtualbox运行百度hi

   再重新生成一个exe程序。测试一下,果然,悬停好友时,不再出现提示框。在linux桌面下的小“黑块”也随之消失了!

           

三 总结

       本文介绍了在unbuntu下使用virtual box的 seamless window运行hi的办法,同时通过打patch的办法解决了hi和virtual box兼容上的一个小问题。本文也可以作为修改没有代码的二进制程序的一个小demo。当然,本例可能比较简单,相信本方案也不是解决这个问题的最好办法, 权当一个用技术手段定位解决实际问题的例子吧。

 

   2009

--EnD--


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值