除虫记之十五(防御也流氓?:2小时/人)
今天碰到的虫子和第七篇中的情形很类似,都是别人的虫子,虫子发作时的现象好不奇怪。
呵呵,书归正传,从头道来。
下午快下班的时候(唉,偏偏是快下班的时候),旁边同事让我帮助解决一个奇怪的问题:一个好好的程序,
刚从vss上取了一个文件的新版本,编译后一条很正常的语句出错了,就是下面这条语句:
sendFile = fopen(str.c_str(), "rb");
原来可以正常打开,现在每次都会失败,查看GetLastError(),为1168,对于这个错误的描述为:找不到元素。
找不到元素?
奇怪,什么意思?我是第一次碰到这个错误现象。
直观上没有任何定位,因为打开文件的操作不应该出现这样的描述。
猜吧,
难道文件不存在?到资源管理器里面查看,好好的在呢。
难道string类型的参数str出了异常?换成fopen("f:\\1.jpg", "rb"),编译、运行,错误依然。
难道rb参数不对?换成"r"等等其他,编译、运行、错误依然。
难道fopen操作进入系统CreateFileA调用后参数错了?在CreateFileA上下断点,查看各个参数,正常。
把fopen调用直接换成CreateFile打开,编译、运行,错误依然。
因为到这行代码调用的时候,前面已经走了好多流程了,难道是前面有对这个文件的操作,把文件给锁住了或者其他怎么了?换成一个毫不相干的文件,fopen("f:\\11.jpg", "rb"),编译、运行,错误依然。
tnnd,见鬼了。。。,就一个普普通通的文件操作,撞到哪路神仙了?
上网搜索,
“CreateFile 找不到元素”,没有搜索到有效的信息。
“GetLastError 1168”,google出了几条,发现有人也碰到了这个错误,并且贴到了微软的msdn论坛里面,打开看了看,没看出所以然来。。
晕啊。
同样的工程,在其他两个人的机器上运行是正常的,那两人强烈要求从vss上更新所有代码,他们说是工程编译设置的问题。
我没有同意,我说如果更新所有的文件后,如果没有了这个现象,这个bug就很难找到原因了。
既然怀疑工程的设置有问题,那就比较dsp文件好了。
整个工程包括一个控制台的exe和三个静态链接的lib,挨个的比较这四个dsp文件,2个相同,2个不同,但2个不同的设置和编译及链接选项毫无关系。
哪里出了问题?
再猜。
难道是增量编译的问题?clean、rebuild all,中间出了一个pch的编译错误,解决后,运行,靠,还是出错。
这时,一个同事说,是不是病毒搞的鬼?这两天熊猫烧香病毒势头正猛,并且我们部门也有中毒发生。
我没有理会,这和病毒有什么关系,如果病毒搞的鬼,那么在资源管理器里面也不应该能够打开的。
嘿嘿,偶就不信邪了,重新建立一个mfc的工程,把这两行代码拷贝进去,运行,靠,过了!
哈,这就说明这行代码是可以的了,问题就出在那个程序里面。
可到底出现在哪儿呢?
想了一会儿,把这行代码移动到main函数初始(相当有点自恋的说,能想到这个手法,没有些调试经验是不行滴:)),编译、运行,ft,没问题!!!!!
哈哈,这就好办了!
把这行代码逐渐的向后移动,看看到底在那行调用后出的错误。
挪动几行,编译、运行,没有问题!
再挪到几行,编译、运行,没有问题!
重复上述过程 n 次,出问题了!
进入到那个出问题的调用函数中,再逐渐的向后移动,
又重复上述过程 n 次,
。。。
又重复上述过程 n 次,
终于。。。终于定位到了:
执行一个udp套接字的connect调用后,fopen就必然失败!
额滴神呐~~~~~~~终于逮着了~~~~。
可。。。可这行代码也没看出来毛病呀。。。。。。
connect返回了一个成功的值。也没有出现什么内存溢出导致堆栈被破坏的事情啊。
看到WSAStartUP中使用的版本是2,2,难道版本高,换成1,1,还是出错!
难道是IP地址问题?换一个其他的IP,还是出错!
难道是端口有问题?换一个端口,还是出错!
真是要疯了,家里老婆还等着,偏偏碰到这见鬼的bug!
同事要重启机器,说重启机器应该就没这现象了。
我仍然没有同意,我还是想知道是什么原因。
呵呵,那个同事又在喋喋不休的嘟哝“肯定是病毒的问题”。
权且看看有没有病毒吧。
打开任务管理器,我靠,还真有不少不明进程。光svchost.exe就有10个!
拣几个看着不正常的进程,杀了!
运行程序,还是出错!
再看进程管理器,又发现几个MPSvc.exe、MPSvc1.exe、MPSvc2.exe,问那个同事,他说也不知道是什么进程,nnd,这样的文件名,字母加数字,明显就是病毒及其变种啊!!
杀了!
运行,哈哈,好了!
再运行,正常!
哈,还真是tmd病毒搞的鬼!
到百度上搜搜看,这是啥病毒。
我倒~~~~~~~,竟然不是病毒,是微点公司的主动防御程序!
那公司把进程名设计成这样的产品经理或者其他人,应该使劲的撞几下墙,偏偏用这么像病毒的进程名!
同事说,他昨天从网上看到有人用这个咚咚,就下载了一个装上了,没想到会出这问题。
重新启动这个软件,然后再运行我们程序,呵,不一样了,在执行connect操作的时候,那个咚咚弹出一个对话框询问是阻止还是放行网络通讯,选阻止,nnd,我们的进程还在调试状态就给他杀了。
再运行,选放行,后面的fopen操作正常打开了。
再运行,既不选阻止也不选放行,关闭对话框,connect调用也执行了,但后面又给莫名其妙的给杀掉了。
再运行,选放行,选信任程序,后面的都正常了。
再运行,不出对话框了,正常运行了。
为了再重现刚才的现象,想去掉信任设置,结果怎么也不知道如何从他们的设置中把信任进程去掉了,翻了好久好久才找到一个按钮(这个咚咚的易用性够差),把我们的进程从信任进程中删除。
再运行,既不选阻止也不选放行,关闭对话框,connect调用后,fopen正常!呵呵,怎么又正常了???
刚才那个嘟哝的同事又发话了,看,你把这个程序给搞傻了吧。
我ft。
再杀掉这几个疑似病毒!
运行我们的进程,一切正常!
再运行疑似病毒。发现了蹊跷:他们在托盘上有一个图标,是MPMon.exe的,看名字像是监视器之类的咚咚。点右键,选退出,点确定!这个监控进程是退出了,但那几个疑似病毒还在运行!
这时再运行我们的进程,connect的时候,没有了对话框让我选择阻止还是放行,connect返回了另一个成功值,但fopen就没那么幸运了,“找不到元素”就出现了!
再运行几次,都是上面的现象。
于是,我们讨论,得出,这个咚咚有bug:用户执行退出,它竟然不退,老赖型,并且默认的处理策略有点违背用户感受。
但还有一个问题解释不通:出问题的时候是5点半左右,在此之前,网络也正常,问题操作也正常。
难道,它在5点半左右的时候,升级了什么策略?
不管怎么样,作为一个用户,我选择了退出,仍然在搞我,这算不算流氓?
且不管了,回家了。
想想,感觉,这家公司应该给我一点费用,毕竟我今天帮他们测试了2个小时耶。
想想看,自己按8个小时考勤的话,每个小时也要好几个几十元呐。
今天的心得:1、碰到了“找不到元素”这千载难逢的现象。
2、前面的哪些猜想都是无哩头。