很久不见的朋友发来一条短信,给了我一个Skype的号码,叫我网上见。赶紧下载、安装、运行,迎接我是一个冷冰冰的对话框:“Skype is not compatible with system debuggers like SoftICE.”,既然不想让SoftIce下课,自然就要向Skype开刀了。
杀鸡焉用牛刀?先用Ollydbg试试,如果不行再请SoftIce出马,更何况在应用级调试中Ollydbg有更良好的操作特性。
用Ollydbg调入Skype的执行文件,先偷个懒,不去找MessageBox函数的调用点,直接寻找“Skype is not compatible with system debuggers like SoftICE”。运气不错,在“所有的参考文本字符串”中找到了该字符串,然后双击它,直接跳到了00B7CB62,往下一看正是我们要找的MessageBox!是不是很爽,像精确制导炸弹一样?代码如下:
===================================================================================
00B7CB4D . E8 F6FB89FF call <jmp.&ole32.OleInitialize>
00B7CB52 . E8 1193A6FF call Skype.005E5E68
00B7CB57 84C0 test al,al
00B7CB59 . 74 1A je short Skype.00B7CB75
00B7CB5B . 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00B7CB5D . 68 3CDDB700 push Skype.00B7DD3C ; |Title = "Skype"
00B7CB62 . 68 44DDB700 push Skype.00B7DD44 ; |Text = "Skype is not compatible with system debuggers like SoftICE."
00B7CB67 . 6A 00 push 0 ; |hOwner = NULL
00B7CB69 . E8 C2BF88FF call <jmp.&user32.MessageBoxA> ; /MessageBoxA
===================================================================================
注意到在00B7CB59处有一个条件转移语句,如果寄存器al等于0则跳过MessagBox,赶紧在此处放置一个断点,按F9执行程序,马上在00B7CB59停了下来,我们可以看到al不等于0,CPU的Z标志位为0,je不执行跳转。要想je跳转很简单,只要在标志位Z的数值0上双击一下,Z就等于1了,可以清楚的看到je发生跳转的红色箭头了,继续往下执行,呵呵~~Skype开始执行了,只是闪了一下主窗口就因为异常而中止执行了,看来跳过了对SoftIce的检测。下面就对Skype动手术,看看能否成功。
要想跳过MessageBox可以将je语句改成jmp或者让al=0,我不喜欢硬生生的jmp,还是随着程序的脉络斯文一点,的所以我选择了后者,将“test al,al”改成“xor al,al”即可,也就是将“84c0”改成“32c0”。用十六位编辑器Skype搜索特征信息,我们不妨取长一点,搜索“84 c0 74 1a 6a 00 68”,结果令人满意,该串在全局是唯一的,把“84”改成“32”然后存盘运行,Bingo!搞定!
看来对SoftIce的判断确实是由Skype.005E5E68完成的,我们不妨进去看看,到底它是怎么检测的?重新的设置断点,进入该子程序,大步的执行就是了,反正我只是看看而已。一些熟悉的字符串闪过屏幕“//./SiwvidSTART”、“//./NTICE”、“//./Siwvid”、“//./SICE”,看来是通过SoftIce的一系列服务来判断是否安装了SoftIce。
(注:拿来做试验Skype是2.0版的,包括原版和Tom版)