在华为3COM呆了一年,有付出,有收获,有很多辛酸,也有些许欢乐。一个老实人终究无法融入其中,但离开后回首,却发现不乏苦中作乐的点滴,摘录一二。
老实人在华为 1? 思想学习
办事处无论多忙,办事处每月总是要组织周六日时间学习公司文化的。这天学习内容是任总正非的文章《英雄好汉站起来》。 我看了两分钟就放下了,我始终对此类文字提不起兴致。但立即被主任盯上了。
众人都读完了,二十多人里主任第一个拎出我来:
“**, 看完了有没有什么感想?”
有。”我认真地说
“什么感想?”
“写的挺好的。”我继续一脸诚恳,秘书女孩已经偷偷开始笑了。
“这还用你说?别的呢?”
我沉思一刻,开口说道:
“写的比我好多了。。。。。。。。”?
老实人在华为 2 谈话
刚去华为3com的时候,正是年底,一到这个时候,就开始考核办事处的销售业绩,一般来说,最后一个月的业绩一般要占到全年的三分之一以上。华为本身就是加班文化的产地,非常时期就更加不要讲人性化了,一 般每天都要加到12点以后。
这个时段被华为各个办事处称为冲刺时段。 偏偏这时一个销售的老婆来看他,在华为,异地化是一项基本国策, 办事处人员是不能在家庭所在地工作的,为的是能够全身心投入到工作中去。所以,小别胜新婚,那个销售兄弟自然加班的时间就短了。
这时领导看不下去了,偏偏我和那个销售关系较好,就让我去找那个销售谈话。
我是个老实人,不懂拐弯,于是就把原话给转了过去:
“ ** , 领导让我转告你,不要因为晚上的冲刺耽误了白天的冲刺。。。。。。”
老实人在华为 3 华为的名声
说实话,华为的员工名声不是很好。当时有一件事能充分说明。
一个中兴的工程师,在一个列车上没买到座,就跑到餐车,一边吃饭,一边调戏女服务员。半黄不黄的话说了一路,逗得小姑娘红着脸吃吃笑,等到这位西装革履的兄弟下车,拎起笔记本的时候,
小姑娘突然跟他说:“你是华为的吧。”
由此可见,华为的名声还是很大的。当然,zte那个兄弟很不厚道的承认了。其实,华为也是这么干的,办事处内部规定,去各种娱乐场所,不得穿带有公司logo的衣服,并尽可能败坏竞争对手的声誉。 以致我第一次陪客户进夜总会,不好意思搂小姐的时候,小姐居然对我说:“你们老大说,让你不要丢你们港湾公司的脸。”
老实人在华为 4 华为的名声
这里要推出另一个华为的老实人,我的部门经理,老实程度比我有过之而无不及。因为总是替我们几个工程师强出头,所以处处被尊称为老大。
当时,几个兄弟聚餐,在一个比较高档的饭店里,老大刚刚因为不认同华为某些文化被领导批评,正郁闷着。不期帮我们点菜的服务员长得国色天香,老大就开始有事没事的开始跟她聊了起来。
我看出端倪,自然在点菜时能磨蹭些就磨蹭些。结果老大当天的确太过了,挺大声的问那个女孩:“你们这里的服务员是不是都像你这么漂亮啊?”引得旁边几桌人都往这边看。
一个销售急忙打圆场:“老* ,注意点,别丢咱们港湾公司的脸。”声音大小也正好能让刚才的几桌人听到。
老大大怒,一拍桌子,吼道:“什么港湾,我们是华为的。”
那个销售连忙拿起手机,装打电话跑了出去,我则在旁边笑的差点岔了气。
老实人在华为 5 华为3com的老底
华为3com是华为和3com合资的公司,05年底3com买走2%的股份持股51%,成为外企。但是我们出去推销产品时,还是以国产品牌自居,打民族企业牌。
结果有个客户消息比较灵通,当时就问我们的销售:“现在3com股份高了,利润也都被美国人拿走了大部分,我支持民族产业也不是这么支持的吧。”
我比较老实,一看销售语塞,急忙上前说明:“*总,您放心,我们任老板有个公司,专门从华为3com往出洗钱的。。。。。。”
销售当场面如死灰。
老实人在华为 6 老大的十一
华为3com有个规定,手机必须24小时on call,3次关机降薪500那个十一,领导有事找老大,打了好几天,总是无法接通,但是并不能确定老大关机,所以非常恼火。上班之后,责问老大,到底。
老大很诚恳:“家里太偏僻,没信号。”
“那你会家干什么去了?”
“收苞谷,苞谷都熟了,家里缺人手。”老大家是农村的。
“那你怎么回的家?”主任很好奇。
“可麻烦了,先坐飞机到**。。。。。。。”
作者:grassgrass
Email:? kityest@163.com
1、问题描述
Radmin是一个绝佳的远程控制软件,用来做跳板的后门再好不过了,不过每次连过跳板后,察看跳板连线,可以仍然看见我们和跳板上Radmin的连接,只不过显示为TIME_WAIT,且一直这样。
ProtoLocal Address?Foreign AddressState
TCP?0.0.0.0:1350.0.0.0:0LISTENING
TCP?0.0.0.0:4450.0.0.0:0LISTENING
TCP?0.0.0.0:1030? 0.0.0.0:0LISTENING
TCP?127.0.0.1:1031 0.0.0.0:0LISTENING
TCP?192.168.11.1:139 0.0.0.0:0LISTENING
TCP?192.168.72.1:139 0.0.0.0:0LISTENING
TCP?192.168.168.220:1030 192.168.168.221:1034 TIME_WAIT
UDP?0.0.0.0:445*:*
UDP?0.0.0.0:1026? *:*
UDP?127.0.0.1:123?*:*
UDP?127.0.0.1:1900 *:*
UDP?192.168.11.1:123 *:*
UDP?192.168.11.1:137 *:*
UDP?192.168.11.1:138 *:*
UDP?192.168.11.1:1900*:*
UDP?192.168.72.1:123 *:*
UDP?192.168.72.1:137 *:*
UDP?192.168.72.1:138 *:*
UDP?192.168.72.1:1900*:*
UDP?192.168.168.220:123?*:*
UDP?192.168.168.220:1900 *:*
2、问题分析
初步猜测应该是setsocketopt设置超时有问题,可能是设置了无限超时?
调试Radmin服务端,下断点在setsocketopt,结果如下:
第一次断下来
71A42E30 >8BFFMOV EDI,EDI
71A42E32?55PUSH EBP
71A42E33?8BECMOV EBP,ESP
71A42E35?837D 0C 00CMP DWORD PTR SS:[EBP+C],0
71A42E39?0F84 25010000 JE WSOCK32.71A42F64
71A42E3F?8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
71A42E42?837D 0C 06CMP DWORD PTR SS:[EBP+C],6
71A42E46?8B4D 14 MOV ECX,DWORD PTR SS:[EBP+14]
71A42E49?74 75? JE SHORT WSOCK32.71A42EC0
71A42E4B?FF75 18 PUSH DWORD PTR SS:[EBP+18]
71A42E4E?51PUSH ECX
71A42E4F?50PUSH EAX
71A42E50?FF75 0C PUSH DWORD PTR SS:[EBP+C]
71A42E53?FF75 08 PUSH DWORD PTR SS:[EBP+8]
71A42E56?E8 09000000? CALL <JMP.&WS2_32.#21__setsockopt@20>
71A42E5B?5DPOP EBP
71A42E5C?C2 1400 RETN 14
71A42E5F?90NOP
71A42E60?90NOP
71A42E61?90NOP
71A42E62?90NOP
71A42E63?90NOP
71A42E64- FF25 0010A471 JMP DWORD PTR DS:[<&WS2_32.#21__setsocko>; WS2_32.setsockopt
察看堆栈:
0012F808 0096D367/CALL 到 setsockopt 来自 0096D362
0012F80C 0000007C|Socket = 7C
0012F810 0000FFFF|Level = SOL_SOCKET
0012F814 00000080|Option = SO_LINGER
0012F818 0012F844|Data = 0012F844
0012F81C 00000004\DataSize = 4
0012F820 0000FFFF
0012F824 0012F84C
0012F828/0012F850
0012F82C|009652F2返回到 009652F2 来自 0096D340
0012F830|00000080
0012F834|0012F844
0012F838|00000004
0012F83C|0012F870
0012F840|001D0406
0012F844|00010001
0012F848|0012F870
0012F84C|0000007C
0012F850]0012F884
可以看到,它设置了SO_LINGER选项,值为0×00010001
第二次断点:
71A42E30 >8BFFMOV EDI,EDI
71A42E32?55PUSH EBP
71A42E33?8BECMOV EBP,ESP
71A42E35?837D 0C 00CMP DWORD PTR SS:[EBP+C],0
71A42E39?0F84 25010000 JE WSOCK32.71A42F64
71A42E3F?8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
71A42E42?837D 0C 06CMP DWORD PTR SS:[EBP+C],6
71A42E46?8B4D 14 MOV ECX,DWORD PTR SS:[EBP+14]
71A42E49?74 75? JE SHORT WSOCK32.71A42EC0
71A42E4B?FF75 18 PUSH DWORD PTR SS:[EBP+18]
71A42E4E?51PUSH ECX
71A42E4F?50PUSH EAX
71A42E50?FF75 0C PUSH DWORD PTR SS:[EBP+C]
71A42E53?FF75 08 PUSH DWORD PTR SS:[EBP+8]
71A42E56?E8 09000000? CALL <JMP.&WS2_32.#21__setsockopt@20>
71A42E5B?5DPOP EBP
71A42E5C?C2 1400 RETN 14
堆栈:
0012F80C 0096D367/CALL 到 setsockopt 来自 0096D362
0012F810 00000078|Socket = 78
0012F814 0000FFFF|Level = SOL_SOCKET
0012F818 00000080|Option = SO_LINGER
0012F81C 0012F84C|Data = 0012F84C
0012F820 00000004\DataSize = 4
0012F824 0000FFFF
0012F828 0012F848
0012F82C/0012F850
0012F830|00965419返回到 00965419 来自 0096D340
0012F834|00000080
0012F838|0012F84C
0012F83C|00000004
0012F840|0012F864
0012F844|0012F870
0012F848|00000078
0012F84C|00010001
0012F850]0012F884
可见第一次与第二次相同
F9,没有下个断点,可见只有这两处,上网搜索SO_LINGER选项,其描述如下:
/* 当连接中断时,需要延迟关闭(linger)以保证所有数据都
* 被传输,所以需要打开SO_LINGER这个选项//注:大致意思就是说SO_LINGER选项用来设置当调用closesocket时是否马上关闭socket
* linger的结构在/usr/include/linux/socket.h中定义://注:这个结构就是SetSocketOpt中的Data的数据结构
* struct linger
* {
* int l_onoff; /* Linger active */ //低字节,0和非0,用来表示是否延时关闭socket
* int l_linger; /* How long to linger */? //高字节,延时的时间数,单位为秒
* };
* 如果l_onoff为0,则延迟关闭特性就被取消。如果非零,则允许套接口延迟关闭。
* l_linger字段则指明延迟关闭的时间
*/
更具体的描述如下:
若设置了SO_LINGER(亦即linger结构中的l_onoff域设为非零,参见2.4,4.1.7和4.1.21各节),并设置了零超时间隔,则closesocket()不被阻塞立即执行,不论是否有排队数据未发送或未被确认。这种关闭方式称为“强制”或“失效”关闭,因为套接口的虚电路立即被复位,且丢失了未发送的数据。在远端的recv()调用将以WSAECONNRESET出错。
若设置了SO_LINGER并确定了非零的超时间隔,则closesocket()调用阻塞进程,直到所剩数据发送完毕或超时。这种关闭称为“优雅的”关闭。请注意如果套接口置为非阻塞且SO_LINGER设为非零超时,则closesocket()调用将以WSAEWOULDBLOCK错误返回。
若在一个流类套接口上设置了SO_DONTLINGER(也就是说将linger结构的l_onoff域设为零;参见2.4,4.1.7,4.1.21节),则closesocket()调用立即返回。但是,如果可能,排队的数据将在套接口关闭前发送。请注意,在这种情况下WINDOWS套接口实现将在一段不确定的时间内保留套接口以及其他资源,这对于想用所以套接口的应用程序来说有一定影响。
这是网上的解释
主要是影响close socket时的动作
知道了问题的原因,我们就动手修改一下试试
0012F80C 0096D367/CALL 到 setsockopt 来自 0096D362
0012F810 00000078|Socket = 78
0012F814 0000FFFF|Level = SOL_SOCKET
0012F818 00000080|Option = SO_LINGER
0012F81C 0012F84C|Data = 0012F84C
0012F820 00000004\DataSize = 4
0012F824 0000FFFF
0012F828 0012F848
0012F82C/0012F850
0012F830|00965419返回到 00965419 来自 0096D340
0012F834|00000080
0012F838|0012F84C
0012F83C|00000004
0012F840|0012F864
0012F844|0012F870
0012F848|00000078
0012F84C|00010100//原来的00010001表示延时256秒,将延时改为1秒
F9运行,用客户端连接,连上后再断开,察看服务端连线,发现以前总是显示为TIME_WAIT的连接,现在马上消失了,至此问题解决:)
3、Radmin修改
Radmin的保护措施做的还是很不错的,它的真正的执行程序是一个RES资源,主程序只负责将其解压缩到内存中并执行,如果要修改就需要自己解压缩,修改后再自己压缩了放回去,具体怎么做我就不说了:)
提示:如果要重复我一样步骤,直接下setsocketopt是断不下来的,先下jmp eax ,断下来后F8一次,再下setsoketopt断点,好了,就提示这么多了。