原文URL: http://blog.csdn.net/u012859646/article/details/16840309 [2009]
一 安装
;如果安装路径不同,可以locate或find一下。
- clipboard共享。在virtual box设置->常规->高级
共享粘贴板中,选择”双向” - 文件共享。 在virtual box”设置->数据空间”中添加数据空间,需要指定一个命名,和一个位置。假如我们使用”/media/sda3/vb”做为共享文件夹,命名为”vb”。添加完,启动虚拟window机器,在命令行下,使用命令
即可用x盘符来访问linux机器下的共享文件夹。
二
- 工具准备。工欲善其事,必先利其器,当然是要准备好一些相关工具,如spy++, ollydbg, IDA等。
- 确定窗口。首先用spy++查看,可是在hi的子窗口中,没有找到这个不可见的窗口。还好,再找spy++时,下载的一个同类工具winspector spy在某些方面功能更强大些,可以查看到,如下图
红框所示就是正在highligh中的隐藏窗口,可以看出,这个窗口标题Dialog.MainFrame.CradTipWindow。窗口定位后,后续定位窗口生成的代码才较方便。
- 确定窗口生成的时机。为了更有效设定断点,需要了解窗口生成的时机。Ollydbg或之前的winspector spy都可以查看进程的窗口列表。这里,只是简单刷新窗口来观察窗口标题为 Dialog.MainFrame.CradTipWindow的生成。通过“人肉”的方法,可以看出,窗口是在第一次展示时生成的,之后不会destroy,在需要展示的时候渐变出现,渐变隐藏。这里应该有更有效的办法,如特定的字符串断点等。
- 确定修改方案。可以考虑的修改方案有:1处理悬停消息,直接返回而不处理; 2 修改窗口的一些属使其不显示等。在定位的过程中,可以看出hi的窗口控件大部分不是标准的,而是自己开发的。如果第二种方案能奏效,肯定要比方案一简单,而且可能的副作用小,因为对应的窗口句柄很可能在其它地方被使用,这可能会引入较多的修改。另外,winspector有一个有用的功能,你可以直接修改其它窗口的属性, 如下图。 在这里尝试,将”黑块'窗口的WS_VISBLE属性去掉,发现可以解决问题,即”黑块”可以去掉。因此,可以确定按方案二的思路继续。
- API及断点。和窗口属性可能相关的几个API, 如CreateWindowEx, ShowWindow, SetWindowLong等,当然hi是unicode版本,实际关注是CreateWindowExW之类的API版本。另外,在第3步中,确定了窗口是在第一次需要时创建的,因此可以在hi登录后再去attach、设断点 并debug,这样可以跳过不少干扰,提高效率。使用ollydbg中,attach进程,对上面提到的API设置好断点。然后将鼠标悬停到某个好友之一,以触发窗口的创建。记录本过程中,进入断点的相关信息,大概有7,8次。其中,如下的信息是值得关注的。
0012FBE4
0012FBE8
0012FBEC
从窗口标题可以确认, 这个窗口就是我们关注的“黑块”。另外,由于“应用程序通过调用清除了WS_VISIBLE标志的CteateWindow函数来创建主窗口函数,并且随后调用带SW_SHOW标志的ShowWindow函数来显示窗口”是创建窗口的常用方式。而且从其它断点得到的信息,如CreateWindowExW中,可以了解到,此窗口的创建确实使用了常规的方案。而且,正是这个ShowWindow调用将窗口的WS_VISIBLE属性置上。
-
定位。在上文的ShowWindow设断点,并查看其调用栈。下页的图中,给出部分调用栈的图。另外,先截取一部分window相应头文件定义
#define SW_HIDE
可见,原程序中,调用ShowWindow的参数为数值8,我们希望将其改成0(不可见)
上图中Basement是指hi调用的是basement.dll中的函数,这个dll中应该是封装了不少常规调用。一般来说,对ShowWindow API应该也会做点封装,所以可以在附近几个栈帧中查看。在ShowWindow调用往上的第二个帧中,可以看到如下汇编代码:
005446C6
005446C8
005446C9
此处的 push 8,很可能就是将参数SW_SHOWA进栈。当然,这个可以从汇编代码的参数去证实。从这个代码猜测API ShowWindow往上的第一个函数,带两个参数,其中8是第二个参数。因为,无论是cdecl或stdcall,函数参数都是从右向左入栈。
- Patch。 可以尝试将push 8改成push 0,也就是ShowWindow时带上SW_HIDE参数,使窗口不带WS_VISBLE属性。如下图:
三 总结
2009
--EnD--