嗅探原理与反嗅探技术详解

渗透实验室:大皮球

一.嗅探器的基础知识
1.1 什么是嗅探器?

嗅探器的英文写法是Sniff,可以理解为一个安装在计算机上的窃听设备它可以用来窃听计算机在网络上所产生的众多的信息。简单一点解释:一部电话的窃听装置, 可以用来窃听双方通话的内容,而计算机网络嗅探器则可以窃听计算机程序在网络上发送和接收到的数据。

可是,计算机直接所传送的数据,事实上是大量的二进制数据。因此, 一个网络窃听程序必须也使用特定的网络协议来分解嗅探到的数据, 嗅探器也就必须能够识别出那个协议对应于这个数据片断,只有这样才能够进行正确的解码。

计 算机的嗅探器比起电话窃听器,有他独特的优势: 很多的计算机网络采用的是“共享媒体"。 也就是说,你不必中断他的通讯,并且配置特别的线路,再安装嗅探器,你几乎可以在任何连接着的网络上直接窃听到你同一掩码范围内的计算机网络数据。我们称 这种窃听方式为“基于混杂模式的嗅探”(promiscuous mode) 。 尽管如此,这种“共享” 的技术发展的很快,慢慢转向“交换” 技术,这种技术会长期内会继续使用下去, 它可以实现有目的选择的收发数据。

1.2嗅探器是如何工作的

1.2.1如何窃听网络上的信息

刚才说了,以太网的数据传输是基于“共享”原理的:所有的同一本地网范围内的计算机共同接收到相同的数据包。这意味着计算机直接的通讯都是透明可见的。

正是因为这样的原因,以太网卡都构造了硬件的“过滤器”这个过滤器将忽略掉一切和自己无关的网络信息。事实上是忽略掉了与自身MAC地址不符合的信息。

嗅探程序正是利用了这个特点,它主动的关闭了这个嗅探器,也就是前面提到的设置网卡“混杂模式”。因此,嗅探程序就能够接收到整个以太网内的网络数据了信息了。

1.2.2什么是以太网的MAC地址

MAC:Media Access Control.

由 于大量的计算机在以太网内“共享“数据流,所以必须有一个统一的办法用来区分传递给不同计算机的数据流的。这种问题不会发生在拨号用户身上,因为计算机会 假定一切数据都由你发动给modem然后通过电话线传送出去。可是,当你发送数据到以太网上的时候,你必须弄清楚,哪台计算机是你发送数据的对象。的确, 现在有大量的双向通讯程序出现了,看上去,他们好像只会在两台机器内交换信息,可是你要明白,以太网的信息是共享的,其他用户,其实一样接收到了你发送的 数据,只不过是被过滤器给忽略掉了。

MAC地址是由一组6个16进制数组成的,它存在于每一块以太网卡中。后面的章节将告诉你如何查看自己计算机的MAC地址。

如 果你对网络结构不太熟悉,建议参考一下OSI 7-Layer Model,这将有助于你理解后面的东西以太网所使用的协议主要是TCP/IP,并且TCP/IP也用于其他的网络模型(比如拨号用户,他们并不是处于一 个以太网环境中)。举例一下,很多的小团体计算机用户都为实现文件和打印共享,安装了“NetBEUI” 因为它不是基于TCP/IP协议的, 所以来自于网络的黑客一样无法得知他们的设备情况。

基于Raw协议,传输和接收都在以太网里起着支配作用。你不能直接发送一个Raw数据给以太网,你必须先做一些事情,让以太网能够理解你的意思。这有点类似于邮寄信件的方法,你不可能直接把一封信投递出去,你必须先装信封,写地址,贴邮票,网络上的传输也是这样的。

下面给出一个简单的图示,有助于你理解数据传送的原理:

_________

/………

/..Internet.

+—–+ +—-+………….+—–+

|UserA|—–|路由|………….|UserB|

+—–+ ^ +—-+………….+—–+

| ………../

| ———/

+——+

|嗅探器|

+——+

UserA IP 地址: 10.0.0.23
UserB IP 地址: 192.168.100.54

现在知道UserA要于UserB进行计算机通讯,UserA需要为10.0.0.23到192.168.100.54的通讯建立一个IP包

这个IP包在网络上传输,它必须能够穿透路由器。因此, UserA必须首先提交这个包给路由器。由每个路由器考查目地IP地址然后决定传送路径。

UserA 所知道的只是本地与路由的连接,和UserB的IP地址。UserA并不清楚网络的结构情况和路由走向。

UserA必须告诉路由预备发送的数据包的情况,以太网数据传输结构大概是这样的:

+–+–+–+–+–+–+

| 目标 MAC |

+–+–+–+–+–+–+

| 源 MAC |

+–+–+–+–+–+–+

|08 00|

+–+–+———–+

| |

. .

. IP 包 .

. .

| |

+–+–+–+–+—–+

| CRC校验 |

+–+–+–+–+

理 解一下这个结构,UserA的计算机建立了一个包假设它由100个字节的长度(我们假设一下,20 个字节是IP信息,20个字节是TCP信息,还有60个字节为传送的数据)。现在把这个包发给以太网,放14个字节在目地MAC地址之前,源MAC地址, 还要置一个0x0800的标记,他指示出了TCP/IP栈后的数据结构。同时,也附加了4个字节用于做CRC校验 (CRC校验用来检查传输数据的正确性)。

现在发送数据到网络。

所有在网内的计算机通过适配器都能够发现这个数据 片,其中也包括路由适配器,嗅探器和其他一些机器。通常,适配器都具有一块芯片用来做结构比较的,检查结构中的目地MAC地址和自己的MAC地址,如果不 相同,则适配器会丢弃这个结构。这个操作会由硬件来完成,所以,对于计算机内的程序来说,整个过程时毫无察觉的。

当路由器的以太网适配器发现这个结构后,它会读取网络信息,并且去掉前14个字节,跟踪4个字节。查找0x8000标记,然后对这个结构进行处理(它将根据网络状况推测出下一个最快路由节点,从而最快传送数据到预定的目标地址)。

设想,只有路由机器能够检查这个结构,并且所有其他的机器都忽略这个 结构,则嗅探器无论如何也无法检测到这个结构的。

1.3.1 MAC地址的格式是什么?

以 太网卡的MAC地址是一组48比特的数字,这48比特分为两个部分组成,前面的24比特用于表示以太网卡的寄主,后面的24比特是一组序列号,是由寄主进 行支派的。这样可以担保没有任何两块网卡的MAC地址是相同的(当然可以通过特殊的方法实现)。如果出现相同的地址,将发生问题,所有这一点是非常重要 的。这24比特被称之为OUI(Organizationally Unique Identifier)。

可是,OUI的真实长度只有22比特,还有两个比特用于其他:一个比特用来校验是否是广播或者多播地址,另一个比特用来分配本地执行地址(一些网络允许管理员针对具体情况再分配MAC地址)。

举 个例子,你的MAC地址在网络中表示为 03 00 00 00 00 01 。第一个字节所包含的值二进制表示方法为00000011。 可以看到,最后两个比特都被置为真值。他指定了一个多播模式,向所有的计算机进行广播,使用了“NetBEUI”协议(一般的,在Windows计算机的 网络中,文件共享传输等是不使用TCP/IP协议的)。.

1.3.2 我如何得到自己计算机的MAC地址?

Win9x

Win9x自带的这个程序将告诉你答案:“winipcfg.exe”

WinNT

在命令行的状态下运行这个命令:"ipconfig /all"

它会显示出你的MAC网卡地址,下面是一个例子:

Windows 2000 IP Configuration

Host Name . . . . . . . . . . . . : bigball

Primary DNS Suffix . . . . . . . :

Node Type . . . . . . . . . . . . : Hybrid

IP Routing Enabled. . . . . . . . : No

WINS Proxy Enabled. . . . . . . . : No

Ethernet adapter 本地连接:

Connection-specific DNS Suffix . :

Description . . . . . . . . . . . : Legend/D-Link DFE-530TX PCI Fast Eth

ernet Adapter (Rev B)

Physical Address. . . . . . . . . : 00-50-BA-25-5D-E8

DHCP Enabled. . . . . . . . . . . : No

IP Address. . . . . . . . . . . . : 192.168.10.254

Subnet Mask . . . . . . . . . . . : 255.255.128.0

Default Gateway . . . . . . . . . : 192.168.10.3

Ethernet adapter SC12001:

Description . . . . . . . . : DEC DC21140 PCI Fast Ethernet

Linux

运行“ifconfig”。结果如下:

eth0 Link encap:Ethernet HWaddr 08:00:17:0A:36:3E

inet addr:192.0.2.161 Bcast:192.0.2.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:1137249 errors:0 dropped:0 overruns:0

TX packets:994976 errors:0 dropped:0 overruns:0

Interrupt:5 Base address:0x300

Solaris

用 “arp” 或者 “netstat -p” 命令

1.3.3我如何才能知道有那些计算机和我的MAC地址直接关联?

对于WinNT和Unix机器,可以直接使用“arp -a”查看。

1.3.4我能够改变我的MAC地址吗?

可以。简单的说一下:

第一种方法,你要做地址欺骗,因为MAC地址是数据包结构的一部分, 因此,当你向以太网发送一个数据包的时候,你可以覆盖源始的MAC信息。

第二种方法,很多网卡允许在一定的时间内修改内部的MAC地址。

第的三种方法, 你可以通过重新烧录EEPROM来实现MAC地址的修改。但是这种方法要求你必须有特定的硬件设备和适用的芯片才能修改,而且这种方法将永远的修改你的MAC地址。

二.反嗅探技术
2.1我如何才能检测网内是否存在有嗅探程序?

理论上,嗅探程序是不可能被检测出来的,因为嗅探程序是一种被动的接收程序,属于被动触发的,它只会收集数据包,而不发送出任何数据,尽管如此,嗅探程序有时候还是能够被检测出来的。

一个嗅探程序,不会发送任何数据,但是当它安装在一台正常的局域网内的计算机上的时候会产生一些数据流。举个例子,它能发出一个请求,始DNS根据IP地址进行反相序列查找。

下面一种简单的检测方法:

ping 方法

很多的嗅探器程序,如果你发送一个请求给哪台有嗅探程序的机器,它将作出应答

说明:

1. 怀疑IP地址为10.0.0.1的机器装有嗅探程序,它的MAC地址确定为00-40-05-A4-79-32.

2. 确保机器是在这个局域网中间。

3. 现在修改MAC地址为00-40-05-A4-79-33.

4. 现在用ping命令ping这个IP地址。

5. 没有任何人能够看到发送的数据包,因为每台计算机的MAC地址无法与这个数据包中的目地MAC不符,所以,这个包应该会被丢弃。

6. 如果你看到了应答,说明这个MAC包没有被丢弃,也就是说,很有可能有嗅探器存在。

现 在,这种方法已经得到了广泛的推崇和宣扬,新一代的黑客们也学会了在他们的代码中加入虚拟的MAC地址过滤器很多的计算机操作系统(比如Windows) 都支持MAC过滤器(很多过虑器只检查MAC的第一个字节,这样一来,MAC地址FF-00-00-00-00-00和FF-FF-FF-FF-FF- FF就没有区别了。(广播地址消息会被所有的计算机所接收)。这种技术通常会用在交换模型的以太网中。当交换机发现一个未知的MAC地址的时候,它会执行 类似“flood”的操作,把这个包发送给每个节点。

2.2本机嗅探程序的检测

本机嗅探的程序检测方法比较简单,只要检查一下网卡是否处于混杂模式就可以了,在Linux下,这个比较容易实现,而在Windows平台上,并没有现成的函数可供我们实现这个功能,我们来用一点小技巧:

#include

#define MAX_PACK_LEN 65535

#define MAX_HOSTNAME_LAN 255

#pragma comment (lib , "ws2_32.lib")

int main()

{

SOCKET SockRaw,Sock;

WSADATA wsaData;

int ret=0;

struct sockaddr_in sAddr,addr;

char RecvBuf[MAX_PACK_LEN];

char FAR name[MAX_HOSTNAME_LAN];

struct hostent FAR * pHostent;

char *Buf=(char *)malloc(128);

int settimeout=1000;//这里我们设置了一秒钟超时

printf("UNSniffer for Win2k v1.0nPower by BigBallnHomePage:http://www.patching.net/liumynEmail:liumy@patching.netnOicq:9388920nnChecking your system ,wait a moment please…n");

WSAStartup(MAKEWORD(2,2),&wsaData);

//建立一条RawSocket

SockRaw=socket(AF_INET,SOCK_RAW,IPPROTO_IP);

再建立一条UDP

Sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);

memset(&sAddr,0,sizeof(sAddr));

memset(&addr,0,sizeof(addr));

sAddr.sin_family=AF_INET;

sAddr.sin_port=htons(5257);

addr.sin_family=AF_INET;

addr.sin_port=htons(5258);

//把IP地址指向本机

addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

memset(RecvBuf,0, sizeof(RecvBuf));

pHostent=malloc(sizeof(struct hostent));

gethostname(name, MAX_HOSTNAME_LAN);

pHostent=gethostbyname(name);

//取得自己的IP地址

memcpy(&sAddr.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);

free(pHostent);

//绑定一个本机的接收端口

bind(SockRaw, (struct sockaddr *)&sAddr, sizeof(sAddr));

//虚连接到本机的一个未打开的端口

connect(Sock,(struct sockaddr *)&addr,sizeof(addr));

Buf="1234567890!@#$%^&*";

//设置超时

setsockopt(SockRaw,SOL_SOCKET,SO_RCVTIMEO,(char *)&settimeout,sizeof(int));

//向虚连接端口发送一个数据包

send(Sock,Buf,strlen(Buf),0);

//使用SockRaw尝试接收这个数据包

ret=recv(SockRaw,RecvBuf,sizeof(RecvBuf),0);

if(ret==SOCKET_ERROR || ret==0)

printf("No found any sniffer in your system!n");

else

{

//进行ChkSum

if(Buf=="1234567890!@#$%^&*")

printf("Warning!!! Found sniffer!!!n");

}

closesocket(Sock);

closesocket(SockRaw);

free(pHostent);

free(Buf);

WSACleanup();

return 0;

}

Read: 683

找工作! gangbadiesu~!!!

(TNND 本来是我同学 还玩得很好的那种,说这边有项目,叫我过来搞…哪知道过来后又叫我坐火车去吉林通化那边,再到白山..原来是搞直销…郁闷…去那待了2天听了几堂课….不干…走人….丫的..浪费老子近千块钱…顶他个肺啊…还是回北京找工作吧…现在回乙膊恢 栏墒裁戳?…原来的活都托给我哥做了..唉…..)

4月28号

呀呀…又到首都了…大城市呀…….

嗯…找工作…找工作….怎么办怎么办?……

这可不像我们那个小地方,走上门问就行了….况且….走上门问的那是个什么档次的工作场所呀

再说了….北京啷个大,,,走打落啦啷个办撒…

嗯嗯….. 姜哥给我说了上智联(zhaopin.com)看看,还真有不少…
(姜哥是我网上的朋友…对我很照顾…很感谢他…)

真是不少…是太多了…

开始还不知道该挑哪个呢…..搜索一下….网页设计相关的….

自己能达标的不是很多     不过捏     姜哥他又说了…那些都是唬人的 些那些要求的人或许都不懂的说

嗯嗯….既然如此…..那不管了…..注册了个帐号….

重新搜索一次….全选….全部申请…..

哇哈哈…谁有我强….反正资料里我都写清楚我会什么,能干什么了撒

反正撒大网 总能捞到鱼吧…

嗯…每天如此…

第二天下午 …还是没消息…没消息…郁闷了…..

这哈子姜哥给我来电话了 … 说半壁店那边有家网吧在招聘网管…据说是包住 还是怎么的…

眼下我要解决的也正是生活问题啊…不管了 去撞撞 虽然我不想做网管

…. 嗯…请坐电梯上三楼?….上就上嘛…

网星在线…装修挺好的嘛…嗯…不慌,,,先熟悉一下环境, 交了十块钱押金(心疼啊…)

…随便挑了台机器坐下…嗯…机器也挺好…P4 2.8 1G内存 7300GT的显卡 呀呀的…

开好机了…登录界面上写了个网站的地址…二维科技?…汗…登录好 去看看

怎么说也算是同行…看看北京这大地方人家的系统是咋个搞法的….

嗯…?     招贤纳士?      招人呢.?…嘿嘿 应该招技术员的吧…     直接在这种公司做可比在网吧强多了

还真有…条件全部符合…. 找QQ….加了…啊欧…不在线…不管 发个留言吧…

诶?…在呢….扯了一会…..薪水才1000块…不包吃住……那还不如个网管….

这边随便租个地下室也不少于200啊….不过相比网管我比较喜欢这个…..

算了….明天去面试…瞧瞧去…

不知道干什么….嗯…找工作要紧….再上智联上看看去…呀 …有消息

有两条只是常规回复….通知我已经收到我的申请而已…第三条是一家做P2P播放器的

要求根据他们现有的网站内容根据个人能力设计一个主页….

我晕…搞设计?…不是我的强项啊….算了…再看下一家

汗…标题就是     “请速来面试”…..     不知道是我非常符合他们的需要呢 还是他们想在放假前把人招着

看内容再说….哦 是一家做保健养生的公司….网站做得很烂….一看就出自菜鸟之手 嘿嘿…

相比之下原来我也算半个高手了…先偷笑一会

嗯…..上班时间是早上10点 – 12点 下午 2点 至 5点

嗯…已经5点半了…不管 打个电话去看看…希望他们还有人在公司…

嘟….嘟….嘟……..没人接….

唉..郁闷那…..

第二天早上 8点     我就直接往他们给的地址出发了….(之前可是查了好久的地图..)

额…到中坞村了…..好烂…..不过旁边的清华慧谷挺先进…不知道是不是在里面呢…..

晃荡晃荡去….没招着…..好热呀…这天….

继续晃荡….附近好像根本没他们说那什么玉泉山南路嘛!!!

继续…..嗯……进中坞村看看去……

找了半天没找到…..什么中坞新村我也没看到啊…

最后没办法 只好找了个大爷问了一下….

就给我指了西面…叫我一直朝西走..有一群小楼的地方…汗…东西这概念在我们南方人脑子里可不是很好啊…

还好他给我指了方向….冲啊!!!!

找啊找….嗯…发现了….原来是个小区..不过有围墙……绕了10分钟…总算绕到正门了….原来我从这经过了N次….. 我看那有块牌子写着某某汽修厂…就一直没进去….郁闷…从大路上也看不出里面有什么房子啊….唉..修那么高的围墙干嘛呀 你说

有门卫…不能随便进呀….. 先去问问是不是在里面

哦….还真是….呵呵…总算找到啦….我都快累死啦…找到的时候都是2点过了…午饭就找了家面馆随便吃了碗刀削面…..好无味….

嗯…到了…….嗯…和网站上的照片一样….外面很多竹条条包着的大粽子… 呵呵

呀…门在哪呢….我可是近视呀…走近看看….嗯? 有人呢 人家先问了…小伙子 有什么事呀?

我说 我是来应聘的….”啊? 应聘的呀 , 我们都放假了 你是来应聘什么的呀?”     网页设计师啊,,你们不是昨天才给我发的信息么? 叫我速来…

这时候出现了另一位….年轻一点的 接替了那么大妈…

等我把情况说清楚以后 她把我带到了间办公室里…嗯…接待室吧..

然后给了我张表叫我填 然后就不知道找谁去了…我想应该是BOSS吧….不过听名字是男的….

我填啊填….说起简历这东西….我之前就没填过….除了去广东的时候在一家网吧应聘网管的时候随手写过一张…….这拿起笔来我都是手抖的呀…天气又热…我在太阳底下晒了那么旧…都快熟了…

我看我放在桌子上的手下面都全是汗….手上全是汗..郁闷…搽搽吧…搽哪啊….我衣服又是白的…裤子不吸汗…随便在裤子上抹了两把…就埋头开始写简历…

不一会就进来个男的…嗯 应该就是那个大姐去叫的那位吧

写完了以后…我随口跟他打了声招呼..得到他确认以后我就将简历叫给了他…

他稍稍看了一下

就跟我谈了起来…就问了一下我的工作经验啊什么的…

然后就问我的对薪金要求的底线…..我当时填的是4000 的期望薪金….

不过想了想…现在工作对我很重要…不管了…随便说了个2500 因为姜哥在那边也是2000左右

然后他继续跟我谈待遇问题….包吃,不过每天会从工资里扣1.5元,不管你吃不吃….

然后有宿舍的..

但是工资呢      就低了….他给我说有3个月试用期…

试用期薪水是 800~2000 ..看他的意思…我估计在1000左右吧

然后叫我给他看看作品….

嗯….程序嘛他不懂…我也没空间放..而且也没现成的…

回去做一个再给他吧..不过我说的是回去找找..我说在我硬盘里的….

哎呀呀…头大啊…临时赶工…当天晚上跑到网星…包宿…继续包宿…

这机器好 装修好 还有空调 呵呵 挺好的 不过北京这地方太TMD讨厌了 包宿比我们那边高了2倍..

比市里可是高了近3倍呀…郁闷     15块..心疼…

一时没什么想法….N天没摸电脑了…PS更是放下好久了…唉…

不知道怎么做….去看看他们网站吧….嗯..算了…

随便找个素材做好了…我也选绿色….做个公益宣传页?….呵呵 谁知道呢…先乱画吧

嗯嗯…慢慢成型了…哎呀…没有内容…算了算了…反正都是绿色健康风格的…干脆就把他们站的内容放点

过来好了 就用他们站做素材

花了4个小时..真辛苦啊….算是差不多了…不过没什么内容…只好随便找了点图填充了一下…呵呵

自我感觉还不错….(图在相册里有)

…发了邮件给他们….到底是哪个邮箱啊…..bjdlybj@163.com(北京动力源保健?) bjdlbjy 北京动力保健院?….管他呢…两个都发…

汗…有一个是错的….163发不出去..呵呵…

那么应该是另一个了嘛…

第二天早上赶紧给他们打电话….哦….面试我的那个家伙在开会呢…(他姓李)

只好再等等了…我突然想起来…会不会是我邮箱写错了….

拿出他给我写的条子…汗….还真写错了….

赶紧进邮箱再转发…..呼…差点搞砸老…嘿嘿…

下午再打电话过去….呵呵 应该行了吧…叫我周一去面试…

他当时给我说的是 如果作品看了还行的话他会通知我到时候叫我跟他上级谈…

看来应该是没问题了…..

等….等…..等…..待续

============================        5   月   7    号       =================================

今天面试了,我早上去…他们一直在开会…我从9点20左右一直等到12点过…

很郁闷…

然后,好不容易等到了他们所谓的董事长…(一肥婆..)

然后..拿着我的简历就开始说了….

首先…开门见山 …..这个 ….2500的工资是绝对不可能的…..

我那会有点凉了…2500在这个行业里面绝对不高….

不过冲着那吃住都包的情况….忍了…反正又没打算做长久…

我给她说 这个没事,先看看您觉得我有多少能力,这个是可以调整的嘛..

哎…心里狠操N次…..

然后这个话题就结束了….然后就扯啊…什么…

“这个,网站这个东西吗,工程还是蛮庞大的,一个人肯定是无法完成的是吧?肯定是一个团队来做吧?”

本来我想说…这个,我看现在公司的网站好像也没什么复杂的地方,我一个人应该可以自如应付了…

…但我一看旁边 ,,就一开始面试我那个….好像无意中得知他就是这公司搞网络的…也就是有可能是未来的同事….考虑这个问题….嗯,嗯,,,不能得罪人家….

只好应声…对对,,这个肯定的,肯定得一个团队来做..

还没等我发表完我的意见,她又接着说…所以,我们要先了解你的能力有多少,才好决定你的薪水水平…

我先看看你做的那个设计吧….(原来她还没看过…晕)

然后把电脑打开….看看…嗯嗯….

然后就叫我陈述我的设计理念….

我汗…大汗….2,3个小时做的东西能有什么精髓的东西? HOHO 再说我设计本来就不行…

只好胡乱扯了一点…..那个人象征生命,,,活力,,,那个齿轮象征什么动力之类…又把为什么那么布局跟她说了…

她开始评判了….嗯…这个…你这个太乱…太杂..什么什么….反正忽悠了我半天…..

郁闷…搞得很有文化…很有深度…很懂…很明白….郁闷 …我非常郁闷….

然后叫我3天之内再做个作品出来 能突出特色…吸引人..什么什么…

然后说什么…一大堆的….

我有点晕了…不打算搞这个的…就跟她说….”这个,,,您应该知道,我主要是做程序,应该是主要负责网站的功能实现部分的…”…

汗..她又来了….貌似吃定我了…

“可你简历上写得很全面嘛,而且即使你是做程序的,你也要根美工沟通对不对…你要怎么怎么…&^%$^%@!3,………我们要的是人才…”..

听到她后面那句,,,”我们要的是人才的时候…”    我就想K她了…..不想出钱还要人才….而且还要超全能的…

比美工还要美工的程序员…..我日….就那么点$$$     ,,,     她是不是穷疯了…

不过想到生活问题…我又忍了…..

嗯…只好说…”这样吧,,我试试…”

本来我打算回去了….她说…”这样,你要是去网吧不方便的话,可以在我们这做,我可以提供你电脑…”

然后她就闪了…看来是叫那个…就一开始接待我那个…李SIR…呵呵 …就是有可能我未来同事的那位..

给我安排了….嗯…我想了想…反正做个图嘛..也花不了多少时间…就在他们那做吧..不过我要先去吃饭..

那”李SIR” 也说了…额..电脑我还要整理一台给你…这样..你先去吃饭吧..一会再来….

…..我就等这句话呢…哎..没品…我还以为他们会请我吃饭呢….呵呵…..

我赶紧飞到路口那一家小面馆叫了家凉面……额…突然想到在吉林吃那个甜不甜酸不酸,辣不辣咸不咸的凉面….汗…不过人家已经做了…算了算了….

嗯…面来了….味道还行…比吉林那个好吃多了….虽然还是没我们贵州的强…嘿嘿….

到吃饱整个过程也就15分钟左右吧…

我又回去…回到那间接待室…(准备给我用的电脑就放这地方…)  

就看到他们俩(网络部是两个人…另一个人没怎么接触..就不介绍啦..)

拿着一块网卡,一块内存在那比划什么….我凑过去一看…天…还SD的内存呀…

嗯?…那家伙(李)好像听到我说话了…凑过来问我,你知道这是什么?

我还以为他考我呢….额….”内存啊 ,应该是现代256M的…”…

…他突然转头把内存递给另一个家伙..说:”这是内存..”;;;;

我大汗…原来他们俩琢磨半天….就没搞清楚那玩意是内存啊….我的天….

本来就觉得他们俩菜,,没想到这么菜,,,无敌了….
怎么这年头混干饭这么好混..有真本事的反而混不出头呢?

接着他又给我说那台电脑上不了网…线接不到路由上,,,线不够长…

刚好我想了想也不想在他们那做….很烦,,而且姜哥还等我回去搬家呢….

我就回去了….心情无比郁闷….

啊啊啊…郁闷的一天呀……

下午 6点

搬家了……..地址: 三环新城    7栋….19楼…4单元 ? 大概这地方吧…

额…搬东西好累…..

刚准备换拖鞋休息一下….突然发现..呀…拖鞋呢……大汗…大汗….

我的拖鞋没带过来…..10快钱呀呀呀………重点是我很喜欢…..挺漂漂的….

赶紧下楼…坐公车回去….郁闷….回到那拿到拖鞋…都8点过了(我大概7点出去的,在楼下都等了20分钟的车)

…..果然北京是大地方啊…..等车…等车….呀?….

102呢?….不停?….过一辆不要紧…下一辆还有呢…

106?…..也不停…..汗….搞什么….

等过了N辆以后…我猛然发现…路线牌上写的….102,106 末班车…20:00   

我曰……太郁闷了…太郁闷了….

咋办?…先坐车到前面一点吧…看有没有其他车过去…多换几次车也可以….

等我到了定慧北桥的时候,我惊讶的发现…耶….车…车在哪……5555….

往三环的车貌似已经没有了………….只好给姜哥打电话…今天晚上看来只有在网吧过了….

哎…命苦啊…..找到网吧的时候….23点…..

我发出这篇文章的时候刚好是…0:00

…..待续…..待续…..待续…..待续…..待续

Read: 720

前世积蓄500次的回眸,才换来今世的檫间而过.

有个年轻美丽的女孩,出身豪门,家产丰厚,又多才多艺,日子过得很好,媒婆也快把她家的门槛给踩烂了,但她一直不想结婚,因为她觉得还没见到她真正想要嫁的那个男孩。
直到有一天,她去一个庙会散心,於万千拥挤的人群中,看见了一个年轻的男人,不用多说什么,反正女孩觉得那个男人就是她苦苦等待的结果了。可惜, 庙会太挤了,她无法走到那个男人的身边,就这样眼睁睁的看著那个男人消失在人群中。后来的两年里,女孩四处去寻找那个男人,但这人就像蒸发了一样,无影无 踪。女孩每天都向佛祖祈祷,希望能再见到那个男人。她的诚心打动了佛祖,佛祖显灵了。
佛祖说:"你想再看到那个男人吗?"
女孩说:"是的!我只想再看他一眼!"
佛祖:"你要放弃你现在的一切,包括爱你的家人和幸福的生活。"
女孩:"我能放弃!"
佛祖:"你还必须修炼五百年道行,才能见他一面。你不后悔??"
女孩:"我不后悔!"
女孩变成了一块大石头,躺在荒郊野外,四百多年的风吹日晒,苦不堪言,但女孩都觉得没什么,难受的是这四百多年都没看到一个人,看不见一点点希望,这让她都快崩溃了。
最后一年,一个采石队来了,看中了她的巨大,把她凿成一块巨大的条石,运进了城里,他们正在建一座石桥,於是,女孩变成了石桥的护栏。
就在石桥建成的第一天,女孩就看见了,那个她等了五百年的男人!他行色匆匆,像有什么急事,很快地从石桥的正中走过了,当然,他不会发觉有一块石头正目不转睛地望著他。男人又一次消失了。
再次出现的是佛祖。
佛祖:"你满意了吗?"
女孩:"不!为什么?为什么我只是桥的护栏?如果我被铺在桥的正中,我就能碰到他了,我就能摸他一下!"
佛祖:"你想摸他一下?那你还得修炼五百年!"
女孩:"我愿意!"
佛祖:"你吃了这么多苦,不后悔?"
女孩:"不后悔!"
女孩变成了一棵大树,立在一条人来人往的官道上,这里每天都有很多人经过,女孩每天都在近处观望,但这更难受,因为无数次满怀希望的看见一个人走 来,又无数次希望破灭。不是有前五百年的修炼,相信女孩早就崩溃了!日子一天天的过去,女孩的心逐渐平静了,她知道,不到最后一天,他是不会出现的。又是 一个五百年啊!最后一天,女孩知道他会来了,但她的心中竟然不再激动。 来了!他来了!他还是穿著他最喜欢的白色长衫,脸还是那么俊美,女孩痴痴地望著他。这一次,他没有急匆匆的走过,因为,天太热了。他注意到路边有一棵大 树,那浓密的树荫很诱人,休息一下吧,他这样想。他走到大树脚下,靠著树根,微微的闭上了双眼,他睡著了。女孩摸到他了!他就靠在她的身边!但是,她无法 告诉他,这千年的相思。她只有尽力把树荫聚集起来,为他挡住毒辣的阳光。千年的柔情啊!男人只是小睡了一刻,因为他还有事要办,他站起身来,拍拍长衫上的 灰尘,在动身的前一刻,他回头看了看这棵大树,又微微地抚摸了一下树干,大概是为了感谢大树为他带来清凉吧。然后,他头也不回地走了! 就在他消失在她的视线的那一刻,佛祖又出现了。
佛祖:"你是不是还想做他的妻子?那你还得修炼。"
女孩平静地打断了佛祖的话:"我是很想,但是不必了。"
佛祖:"哦?"
女孩:"这样已经很好了,爱他,并不一定要做他的妻子。"
佛祖:"哦!"
女孩:"他现在的妻子也像我这样受过苦吗?"
佛祖微微地点点头。
女孩微微一笑:"我也能做到的,但是不必了。"
就在这一刻,女孩发现佛祖微微地叹了一口气,或者是说,佛祖轻轻地松了一口气。
女孩有几分诧异:"佛祖也有心事?"
佛祖的脸上绽开了一个笑容:因为这样很好,有个男孩可以少等一千年了,他为了能够看你一眼,已经修炼了两千年。"
生命总是平衡的,以一种我们了解或是不了解的方式。

Read: 553

不知道谁写的 不错

这是生命中最辉煌、最奢侈、最肆无忌惮的季节。
这一年,额头上没有生活忧伤的皱纹,
手心里还满攥着大把的青春,
为个性而歌唱,为生命而率真;
对爱情,已经走过了纯真、痴迷的羞涩时代,
对生活仍怀有极大的憧憬,并毫不经心地挥霍着生活。
这一年,停留在单纯和成熟的临界点

Read: 820

PHP中的日期处理

by Allan Kent
我正打算用PHP编写一种帮助处理系统。我发现我必须知道处理完最后一位客户的问题后已经过去了多长时间?当我过去用ASP时解决这个问题相当简单,ASP有相应的函数DateDiff可以给出两个日期间间隔多少月、多少天和多少秒。当我搜寻完PHP手册后我发现PHP并没有类似的函数。

本文包含以下内容:
1、 得到目前的日期和时间-我们有多少种方式?
2、 改变日期显示的方式-日期和时间的显示形式
3、 转换现在的日期为Unix的时间戳值
4、 改变日期
a. 增加时间
b. 减去时间
c. 找出两日期之间的间隔
5、 为PHP添加DateAdd函数
6、 为PHP添加DateDiff函数

**得到目前的日期和时间

在Unix中,时间的表示方式为计算从1970年1月1日零时起所过去的秒数,这称为UNIX 时间戳(Unix Epoch)。
如果我们有这样一段的代码:
?
echo time();
?
将返回值958905820
而此时的时间为2000年5月21日12时43分。
你也许会说这相当不错。当这对我毫无帮助,或者只有一点帮助。在PHP中,对日期处理的函数都必须用到由time()返回的时间戳值。同时,由于PHP在Unix和Windows系统中均使用同样的时间戳值,这就允许你不需要修改代码即可在不同的系统间移植。另外的一个好处是time()函数返回的是一个整数,你可以将其作为整数字段或文本字段存入数据库,而不必使用特别的日期/时间字段。
你已经基本了解了Unix的时间戳值,现在让我们来展示它的实际用途。

改变日期显示的方式-日期和时间的显示形式

PHP提供两个办法来将Unix的时间戳值转换成为有用的数据。第一个是date()函数。这个函数有两个参数-第一个字符串用于设定你所希望返回的格式,第二个为Unix的时间戳值。
格式化字符串通过一些简单的特殊格式化字符来显示你所希望看到的格式的日期和时间。假设你希望日期以这样的格式显示“18h01 Sunday 21 May”。
我们需要对字符串中的每一部分使用一个特殊格式化字符,你可以从PHP手册中日期和时间函数库中找到。这样的特殊格式化字符数量不少,他们所表示的类似于星期几、月的英文名、用2位或4位数表示的年份,是否是上午(AM)或下午(PM)以及其他。对于这个例子我们需要的特殊字符为:
‘H’ -24 小时制的小时
‘i’- 分钟
‘l’- 星期几的英文全名
‘d’- 本月的第几日
‘F’- 月份的英文全名
因此我们的格式化字符串为”Hhi l d F”, PHP代码为:
?
echo date (“Hhi l d F” ,time());
?
当我们执行这段代码,我们发现我们所得到的结果为:
180609 Sunday 21 May
这样的结果看起来有些奇怪。让我们再查一下PHP手册,原来’h’所代表的是12 小时制的小时数。这再次证明了一句真理:“计算机只做你所告诉它该做的,而不是你想要它做的”。我们有两个选择。第一个是在h前使用转义字符“”:
echo date (“Hhi l d F”, time());
我们得到这样的结果:
18h12 Sunday 21 May
这正是我们所要的。但如果我们在一个十分复杂的句子中需要包含日期和时间,我们是否需要对每个字符使用转义字符?
答案当然是不。我们使用另一个函数strftime()。
strftime()有两个好处。第一个好处我们并不在本文讨论范围内-如果你使用setlocale()函数,你可以通过strftime得到相应语言的月份的名称。另外的一个好处是你可以将特别的日期和时间的格式化字符包含在你的字符串中。这同时也意味着无论你是否要学习date()函数的所有特殊格式化字符,你都必须学习一整套完全不同的格式化字符。
strftime()工作的方式和date()没有什么不同,除了特殊格式化字符的前面必须添加一个百分号%。如果用strftime()函数,前面例子的代码如下:
?
echo strftime (“%Hh%M %A %d %b” ,time());
?
结果为:
18h24 Sunday 21 May
这也许看起来将简化繁,但考虑一下如果你所需要的显示的为”Today is Sunday 21 May 2000. The time is somewhere close to 18h24.” 我想使用date()函数无疑令人感到厌烦。
在开始的时候,我提及我们有两种方式可以从Unix时间戳值中得到有用的数据。我们刚刚了解了date()和strftime()。另一个getdate()。这个函数只需要Unix 的时间戳值作为参数,而函数的返回值为日期和时间的数组。
下面是一个例子:
?
$date_time_array = getdate (time());
echo $date_time_array[ “weekday”];
?
返回的结果为:
Sunday
除了”weekday”,该数组的其他部分为:
“seconds” –秒
“minutes” –分
“hours” –小时
“mday” – 本月的第几天
“wday” -本周的第几天(数字)
“mon” -月(数字)
“year” –年
“yday” – r本年的第几天(数字)
“month” -月份全名
我们现在可以得到容易辨认的日期和时间。那么其他呢?

**转换现在的日期为Unix的时间戳值

通常你必须处理一些日期或时间格式的数据。打开M$的一个Access数据库,所有的日期都以YYYY/MM/DD的格式存储,加入目前的日前即为2000/05/27。Mktime()函数可以将一个时间转换成Unix的时间戳值。
函数的格式为:int mktime(int hour, int minute, int second, int month, int day, int year, int [is_dst] );
从左往右你必须提供小时、分、秒、月、天和年。最后一个参数用于指定你是否处于夏令时,此参数是可选的,所以我们将忽略它。
代码如下:
?
echo mktime (0, 0,0 ,5, 27,2000 );
?
由于不知道小时、分和秒同时这些参数必须填写,我将其设置为0。设置为0意味着时间为午夜。
?
$access_date = “2000/05/27”;
//explode()函数用一个字符串作为分界来分解另一个字符串。这个例子$access_date通过字符串”/”来分解
$date_elements = explode(“/” ,$access_date);
// 此时
// $date_elements[0] = 2000
// $date_elements[1] = 5
// $date_elements[2] = 27
echo mktime (0, 0,0 ,$date_elements [1], $date_elements[ 2],$date_elements [0]);
?
我们看一个比从Access数据库单纯获得日期更复杂的情况,我们得到一个以下格式的日期和时间:2000/05/27 02:40:21 PM
?
// 来自Access的字符串
$date_time_string = “2000/05/27 02:40:21 PM”;
// 将字符串分解成3部分-日期、时间和上午/下午
$dt_elements = explode(” ” ,$date_time_string);
// 分解日期
$date_elements = explode(“/” ,$dt_elements[ 0]);
// 分解时间
$time_elements = explode(“:” ,$dt_elements[ 1]);
// 如果是下午,我们将时间增加12小时以便得到24小时制的时间
if ($dt_elements [2]== “PM”) { $time_elements[ 0]+=12;}
// 输出结果
echo mktime ($time_elements [0], $time_elements[ 1], $time_elements[ 2], $date_elements[1], $date_elements[2], $date_elements[0]);
?

**修改日期

有时我们需要知道6小时以后是什么时间,35天前的日期或者从你最后一次玩Quake3后已过去多少秒。我们已经知道如何用mktime()函数从单独的日期和时间中获得Unix的时间戳值。如果我们需要的并非目前日期和时间的Unix时间戳值,我们该咋办?下面是一些练习可以帮助说明我们后面所要做的。
正如前面所见,mktime()使用以下参数:小时、分、秒、月、天和年。想想第二节,getdate()函数可以为我们获得这些参数。
?
// 将目前的时间戳值放入一数组内
$timestamp = time();
echo $timestamp;
echo “p”;
$date_time_array = getdate( $timestamp);
// 用mktime()函数重新产生Unix时间戳值
$timestamp = mktime($date_time_array [“hours”], $date_time_array[“minutes” ],$date_time_array[ “seconds”],$date_time_array [“mon”], $date_time_array[“mday” ],$date_time_array[ “year”]);
echo $timestamp;
?
看起来有一些令人感到迷惑。我将用一些变量来使上面的程序看起来更容易了解。
?
// 将目前的时间戳值放入一数组内
$timestamp = time();
echo $timestamp;
echo “p”;
$date_time_array = getdate( $timestamp);
$hours = $date_time_array[ “hours”];
$minutes = $date_time_array[“minutes”];
$seconds = $date_time_array[ “seconds”];
$month = $date_time_array[“mon”];
$day = $date_time_array[“mday”];
$year = $date_time_array[“year”];
// 用mktime()函数重新产生Unix时间戳值
$timestamp = mktime($hours ,$minutes, $seconds,$month ,$day,$year);
echo $timestamp;
?
现在我们将由getdate()所产生的时间戳值放入相对应的名称变量中,所以代码变得相对容易阅读和理解。现在如果我们需要在目前的时间上加上19个小时,我们用$hours+19代替mktime()函数中的$hours。mktime()将自动为我们将时间转到第二天。
?
// 将目前的时间戳值放入一数组内
$timestamp = time();
echo strftime( “%Hh%M %A %d %b”,$timestamp);
echo “p”;
$date_time_array = getdate($timestamp);
$hours = $date_time_array[“hours”];
$minutes = $date_time_array[“minutes”];
$seconds = $date_time_array[“seconds”];
$month = $date_time_array[“mon”];
$day = $date_time_array[“mday”];
$year = $date_time_array[“year”];
// 用mktime()函数重新产生Unix时间戳值
// 增加19小时
$timestamp = mktime($hours + 19, $minutes,$seconds ,$month, $day,$year);
echo strftime( “%Hh%M %A %d %b”,$timestamp);
echo “br~E after adding 19 hours”;
?
运行后得到:
14h58 Saturday 03 Jun
09h58 Sunday 04 Jun
~E after adding 19 hours
减少时间也是同样的-你只需要减少相应变量的值即可。
得到两个不同时间值的差同样也是非常简单。你所需要做的只是将两个时间值转换为Unix的时间戳值,然后两者相减即可。两者之差即为两个时间所相隔的秒数。另外一些算法可以很快地将秒转为天、小时、分和秒。

**为PHP添加DateAdd函数

正如在文章一开始我所说的-写本文的原因是因为我在PHP中找不到类似ASP的DateDiff函数。在介绍完PHP是如何处理日期和时间,让我们将ASP中常用的两个函数移植到PHP。第一个函数是DateAdd。
根据Vbscript的文档,DateAdd(interval,number,date)函数的定义为“返回已添加指定时间间隔的日期。”
Inetrval为表示要添加的时间间隔字符串表达式,例如分或天;number为表示要添加的时间间隔的个数的数值表达式;Date表示日期。
Interval(时间间隔字符串表达式)可以是以下任意值:
yyyy year年
q Quarter季度
m Month月
y Day of year一年的数
d Day天
w Weekday一周的天数
ww Week of year周
h Hour小时
n Minute分
s Second秒
w、y和d的作用是完全一样的,即在目前的日期上加一天,q加3个月,ww加7天。
?
function DateAdd ($interval, $number, $date) {
$date_time_array = getdate($date);
$hours = $date_time_array[“hours”];
$minutes = $date_time_array[“minutes”];
$seconds = $date_time_array[“seconds”];
$month = $date_time_array[“mon”];
$day = $date_time_array[“mday”];
$year = $date_time_array[“year”];
switch ($interval) {
case “yyyy”: $year +=$number; break;
case “q”: $month +=($number*3); break;
case “m”: $month +=$number; break;
case “y”:
case “d”:
case “w”: $day+=$number; break;
case “ww”: $day+=($number*7); break;
case “h”: $hours+=$number; break;
case “n”: $minutes+=$number; break;
case “s”: $seconds+=$number; break;
}
$timestamp = mktime($hours ,$minutes, $seconds,$month ,$day, $year);
return $timestamp;}
?
我们可以将上面的代码保存为dateadd.inc文件,然后运行以下代码:
?
include(‘dateadd.inc’);
$temptime = time();
echo strftime( “%Hh%M %A %d %b”,$temptime);
$temptime = DateAdd(“n” ,50,$temptime);
echo “p”;
echo strftime( “%Hh%M %A %d %b”,$temptime);
?
我们将得到:
15h41 Saturday 03 Jun
16h31 Saturday 03 Jun
为PHP添加DateDiff函数
现在DateAdd已经完成,那么DateDiff呢?
根据文档,DateDiff(interval,date1,date2)函数的定义为“返回两个日期之间的时间间隔”。
Intervals参数的用法与DateAdd函数中的相同。出于避免过于复杂的考虑,我们决定忽略Vbscript中DateDiff函数中其它复杂的参数,即其两个可选的参数变量[firstdayofweek[, firstweekofyear]](它们用于决定星期中第一天是星期天还是星期一和一年中第一周的常数。而且我们只允许intervals有以下五个值:”w”(周)、”d”(天)、”h”(小时)、”n”(分钟) 和”s”(秒)。

Let’s see what we can come up with: 下面的代码是我们所需要的:
?
Function DateDiff ($interval, $date1,$date2) {
// 得到两日期之间间隔的秒数
$timedifference = $date2 – $date1;
switch ($interval) {
case “w”: $retval = bcdiv($timedifference ,604800); break;
case “d”: $retval = bcdiv( $timedifference,86400); break;
case “h”: $retval = bcdiv ($timedifference,3600); break;
case “n”: $retval = bcdiv( $timedifference,60); break;
case “s”: $retval = $timedifference; break;
}
return $retval;}
?
将上面的代码存为datediff.inc文件,然后运行下面的代码:
?
include(‘datediff.inc’);
include(‘dateadd.inc’);
$currenttime = time();
echo “Current time: “. strftime(“%Hh%M %A %d %b” ,$currenttime).”br”;
$newtime = DateAdd (“n”,50 ,$currenttime);
echo “Time plus 50 minutes: “. strftime(“%Hh%M %A %d %b” ,$newtime).”br”;
$temptime = DateDiff (“n”,$currenttime ,$newtime);
echo “Interval between two times: “.$temptime;
?
如果一切顺利,你可以看到以下结果:
Current time: 16h23 Saturday 03 Jun
Time plus 50 minutes: 17h13 Saturday 03 Jun
Interval between two times: 50
如果你在Unix机器上运行PHP,你必须编译PHP支持BC高精度函数。你必须从以下地址http://www.php.net/extra/number4.tar.gz下载BC库,然后将其解压到PHP4的根目录下,重新编译PHP,编译时要加上–enable-bcmath的选项。(详细说明见PHP4中README.BCMATH)。PHP4的Windows版本则不需要做任何修补即可直接使用BC高精度函数。
现在你已经得到处理日期和时间的函数,剩下的就是如何将其运用到你的PHP程序中。

Read: 763