作者存档: admin

dedecms 时间标签多种显示方式

一、形式为:2010-07-05 12:12:51 表示 年-月-日 时:分:秒

 

 

[field:pubdate function='strftime("%Y-%m-%d %H:%M:%S",@me)'/]

 

二、形式为:10-07-05 12:12:51 表示 年(2010年简写10年)-月-日 时:分:秒

 

 

[field:pubdate function='strftime("%y-%m-%d %H:%M:%S",@me)'/]

 

三、形式为:07-05 12:12:51 表示 月-日 时:分:秒

 

 

[field:pubdate function='strftime("%m-%d %H:%M:%S",@me)'/]

 

四、形式为:07-05 12:12 表示 月-日 时:分

 

 

[field:pubdate function='strftime("%m-%d %H:%M",@me)'/]

 

五、形式为:10-07-05 表示 表示 年(2010年简写10年)-月-日

 

 

[field:pubdate function='strftime("%y-%m-%d",@me)'/]

 

六、形式为:10年07月05日 其中10年是2010年的缩写

 

 

[field:pubdate function='strftime("%y年%m月%d日",@me)'/]

 

七、形式为:2010年07月05日 12点12分51秒

 

 

[field:pubdate function='strftime("%Y年%m月%d日 %H点%M分%S秒",@me)'/]

 

八、形式为:Nov 01, 2008

 

 

[field:pubdate function='strftime("%b %d, %Y",@me)'/]

 

九、形式为:Saturday on Nov 01, 2008, 11:21:06 : 中国标准时间

 

 

[field:pubdate function='strftime("%A on %b %d, %Y, %X : %Z",@me)'/]

 

十、24内发布的文章的日期显示红色

 

 

[field:pubdate runphp="yes"]              if((time()-@me)<(60*60*24)){@me=’ <font color=”#cc0000″>’.strftime(“%m-%d”,@me).’</FONT>’;}  else {@me=strftime(“%m-%d”,@me);}              [/field:pubdate]

%a 星期几的缩写。

%A 星期几的全名。

%b 月份名称的缩写。

%B 月份名称的全名。

%c 本地端日期时间较佳表示字符串。

%d 用数字表示本月的第几天 (范围为 00 至 31)。

%H 用 24 小时制数字表示小时数 (范围为 00 至 23)。

%I 用 12 小时制数字表示小时数 (范围为 01 至 12)。

%j 以数字表示当年度的第几天 (范围为 001 至 366)。

%m 月份的数字 (范围由 1 至 12)。

%M 分钟。

%p 以 ‘AM’ 或 ‘PM’ 表示本地端时间。

%S 秒数。

%U 数字表示为本年度的第几周,第一个星期由第一个周日开始。

%W 数字表示为本年度的第几周,第一个星期由第一个周一开始。

%w 用数字表示本周的第几天 ( 0 为周日)。

%x 不含时间的日期表示法。

%X 不含日期的时间表示法。

%y 二位数字表示年份 (范围由 00 至 99)。

%Y 完整的年份数字表示,即四位数。

%Z 时区或名称缩写。

%% % 字符。

最牛B的Linux命令

引言

Shell作为Unix系操作系统当中最有魅力且不可或缺的组件,经过数十载的洗礼不仅没有被淘汰,而且愈加变得成熟稳健,究其原因,大概因为它是个非常稳固的粘合剂,能够把大量功能强大的组件任意配搭,总能很好很快地完成用户的任务。

本文的一些命令很可能看起来是“雕虫小技”,我们只好仰慕一下Shell大牛了,但是有些细节我会稍加发掘加以说明,遇到有趣的地方希望能博您一笑了。

1.以sudo运行上条命令

$ sudo !!

大家应该都知sudo,不解释。但通常出现的情况是,敲完命令执行后报错才发现忘了sudo。这时候,新手用户就会:按上箭头,按左箭头,盯着光标回到开始处,输入sudo,回车;高手用户就蛋定多了,按Ctrl-p,按Ctrl-a,输入sudo,回车。

这里介绍这个是天外飞仙级别的,对,就直接sudo !!。

当然这几种解决方式效果是完全一样的,只是款不一样,嗯,不解释。

两个感叹号其实是bash的一个特性,称为事件引用符(event designators)。!!其实相当于!-1,引用前一条命令,当然也可以!-2,!-50。默认情况下bash会在~/.bash_history 文件内记录用户执行的最近500条命令,history命令可以显示这些命令。

关于事件引用符的更多用法可以深入阅读The Definitive Guide to Bash Command Line History。

2.以HTTP方式共享当前文件夹的文件

$ python -m SimpleHTTPServer

这命令启动了Python的SimpleHTTPServer模块,考虑到Python在绝大多数的Linux发行版当中都默认安装,所以这个命令很可能是最简单的跨平台传文件的方法。

命令执行后将在本机8000端口开放HTTP服务,在其他能访问本机的机器的浏览器打开ttp://ip:8000即打开一个目录列表,点击即可下载。

3.在以普通用户打开的vim当中保存一个root用户文件

:w !sudo tee %

这题目读起来纠结,其实是很常见的,常常忘记了sudo就直接用vim编辑/etc内的文件,(不过也不一定,vim发现保存的文件无法保存时候会 提示)等编辑好了,保存时候才发现没权限。曲线方法是先保存个临时文件,退出后再sudo cp回去。不过实际上在vim里面可以直接完成这个过程的,命令就是如此。

查阅vim的文档(输入:help :w),会提到命令:w!{cmd},让vim执行一个外部命令{cmd},然后把当前缓冲区的内容从stdin传入。

tee是一个把stdin保存到文件的小工具。

而%,是vim当中一个只读寄存器的名字,总保存着当前编辑文件的文件路径。

所以执行这个命令,就相当于从vim外部修改了当前编辑的文件,好完工。

4.切换回上一个目录

$ cd -

应该不少人都知道这个,横杆-代表上一个目录的路径。

实际上cd -就是cd $OLDPWD的简写,bash的固定变量$OLDPWD总保存着之前一个目录的路径。

相对地,$PWD总保存着当前目录的路径。这些变量在编写shell脚本时候相当有用。

5.替换上一条命令中的一个短语

$ ^foo^bar^

又是另外一个事件引用符(event designator),可以把上一条命令当中的foo替换成bar。

在需要重复运行调试一道长长的命令,需要测试某个参数时候,用这个命令会比较实用;但多数人会首先选择按上箭头提出上道命令,再移动光标去修改某参数,这样更直观,但效率上就不够使用引用符高,而且在脚本中用这个方法可以简化很多。

这道命令的原始样式应该是这样的:

!!:s/foo/bar/

本文一开始介绍过!!,后面的一段大家应该很熟悉,vim、sed的替换操作都是这样的语法。

关于事件引用符的更多用法可以深入阅读The Definitive Guide to Bash Command Line History

6.快速备份一个文件

$ cp filename{,.bak}

这道命令把filename文件拷贝成filename.bak,大家应该在一些比较复杂的安装教程里面见过这样的用法。其原理就在于bash对大 括号的展开操作,filename{,.bak}这一段会被展开成filename filename.bak再传给cp,于是就有了备份的命令了。

大括号在bash里面是一个排列的意义,可以试试这个:

$ echo {a,b,c}{a,b,c}{a,b,c}

将输出三个集合的全排列:

aaa aab aac aba abb abc aca acb acc
baa bab bac bba bbb bbc bca bcb bcc
caa cab cac cba cbb cbc cca ccb ccc
关于shell当中的集合操作,可深入阅读“Set Operations in the Unix Shell”

7.免密码ssh登录主机

$ ssh-copy-id remote-machine

这个命令把当前用户的公钥串写入到远程主机的~/.ssh/authorized_keys内,这样下次使用ssh登录的时候,远程主机就直接根据这串密钥完成身份校验,不再询问密码了。前提是你当前用户有生成了公钥,默认是没有的,先执行ssh-keygen试试吧!

这个命令如果用手工完成,是这样的:

your-machine$ scp ~/.ssh/identity.pub remote-machine:
your-machine$ ssh remote-machine
remote-machine$ cat identity.pub >> ~/.ssh/authorized_keys

如果你想删掉远程主机上的密钥,直接打开authorized_keys,搜索你的用户名,删除那行,即可。

8.抓取Linux桌面的视频
1
$ ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg

我们在一些视频网站上看到别人的3D桌面怎么怎么酷的视频,通常就是这么来的,ffmpeg可以直接解码X11的图形,并转换到相应输出格式。

ffmpeg的通常用法是,根据一堆参数,输出一个文件,输出文件通常放最后,下面解析下几个参数:

-f x11grab 指定输入类型。因为x11的缓冲区不是普通的视频文件可以侦测格式,必须指定后ffmpeg才知道如何获得输入。

-s wxga 设置抓取区域的大小。wxga是1366*768的标准说法,也可以换成-s 800×600的写法。

-r 25 设置帧率,即每秒抓取的画面数。

-i :0.0 设置输入源,本地X默认在0.0

-sameq 保持跟输入流一样的图像质量,以用来后期处理。

后记
说Shell是一种编程语言,可能有些尴尬,虽然很多人每天都在用Shell,但从来没见它荣登TIOBE编程语言排行榜之类的,可以 说毫无名分,因为很多用户没意识到它是一种语言,只当做这是一个能够很好完成任务的工具,基本得理所当然,就好像GUI程序的菜单、按钮一样。

掌握Shell,通常能够让任务在数秒钟内完成,这就让Shell跟C、Perl、Python这些语言区别开来,没人否认后者更能胜任更多的任 务,但是他们是在不同的层面上去做,Shell依赖大量的系统组件黏合调用,而后者依赖各种库,各所擅长不同的应用领域,比喻就是,Shell是混凝土, 可以很方便地粘合一些建筑组件而成为稳固的高楼大厦;但同样是粘合剂,粘玻璃窗、粘书报、粘皮鞋,混凝土是绝对不合适的,Shell并不擅长一些细致操 作,比如它连浮点运算都不支持,更别提什么图形运算什么的。但这并不妨碍Shell来帮我们完成很多粗重任务。

Shell的工作方式,大多数入门用户会觉得枯燥难学,而所谓的经典教材也离不开《Advanced Bash-Scripting》、《Bash Guide for Beginners》,但类似本文这样的一些“雕虫小技”因为难登大雅之堂绝不会收录进去。这情况如果象国外一些unix用户比较多的地方会有很好改善, 即使是新手,偶尔看看别人的操作都能“偷师”一手,我编译本系列文章其实也就希望稍微改善一下这个状况。

Apache Rewrite 规则详解

PS:引自网络不同地方,供学习

在开篇之前:
我想说这篇文章其实是我刚刚接触Rewrite的时候学习的文档,应属转载,但是在这里我不想写明原地址,原因是文章中大多数给出的配置命令经实验都是错误的。需要原文的可以在谷歌上搜索一下”Apache Rewrite 规则详解”
好在我对正则表达式有所了解,把原文的代码都通过自己的理解改写了一下,并都能够达到题设的要求,并联想需求添加了例子。
本文是经过我实验后修改有效的,如果还是出现500错误请去掉 # 及后面的注释(也许有些环境不支持中文注解),如果还是错误请在下面给我留言。

1、Rewrite规则简介:

Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。

基于服务器级的(httpd.conf)有两种方法,一种是在httpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。

基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。

2、举例说明:

例一.下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.kiya.cn和70.40.213.183都跳转到主机前缀为http://www.kiya.cn,避免相同内容的网页有多个指向的域名,如http://kiya.cn。

NameVirtualHost 70.40.213.183:80
ServerAdmin slj@kiya.cn
DocumentRoot “/web”
ServerName kiya.cn

RewriteEngine on #打开rewirte功能
RewriteCond %{HTTP_HOST} !^www.kiya.cn [NC] #声明Client请求的主机中前缀不是www.kiya.cn,其中 [NC] 的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^70.40.213.183 [NC] #声明Client请求的主机中前缀不是70.40.213.183,其中 [NC] 的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空
RewriteRule ^(.*) http://www.kiya.cn/ [L] #含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.kiya.cn/,[L]意味着立即停止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用.就是引用前面里的(.*)字符。

例二.将输入 en.sicasoft.com 的域名时跳转到www.sicasoft.com

RewriteEngine on
RewriteCond %{HTTP_HOST} ^en.sicasoft.com [NC]
RewriteRule ^(.*) http://www.sicasoft.com/ [L]

例三.赛卡软件近期更换了域名,新域名为www.sicasoft.com, 更加简短好记。这时需要将原来的域名ss.kiya.cn, 以及论坛所在地址ss.kiya.cn/bbs/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的http://ss.kiya.cn/bbs/tread-60.html, 让它在新的域名下继续有效,点击后转发到http://bbs.sicasoft.com/tread-60.html,而其他网页,如原先的http://ss.kiya.cn/purchase不会到二级域名bbs.sicasoft.com/purchase上,而是到www.sicasoft.com/purchase
按照这样的要求重定向规则应该这样写:

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/bbs/
RewriteRule ^bbs/(.*) http://bbs.sicasoft.com/$1 [R=permanent,L]
RewriteCond %{REQUEST_URI} !^/bbs/
RewriteRule ^(.*) http://www.sicasoft.com/$1 [R=permanent,L]

3.Apache mod_rewrite规则重写的标志一览

1) R[=code](force redirect) 强制外部重定向
强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。
2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。
3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
4) P(force proxy) 强制使用代理转发。
5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
6) N(next round) 重新从第一条规则开始运行重写过程。
7) C(chained with next rule) 与下一条规则关联

如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。

8) T=MIME-type(force MIME type) 强制MIME类型
9) NS (used only if no internal sub-request) 只用于不是内部子请求
10) NC(no case) 不区分大小写
11) QSA(query string append) 追加请求字符串
12) NE(no URI escaping of output) 不在输出转义特殊字符
例如:RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zoo
13) PT(pass through to next handler) 传递给下一个处理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
Alias /def /ghi
14) S=num(skip next rule(s)) 跳过num条规则
15) E=VAR:VAL(set environment variable) 设置环境变量

4.Apache rewrite例子集合

URL重定向

例子一:
同时达到下面两个要求:
1.用http://www.zzz.com/xxx.php 来访问 http://www.zzz.com/xxx/
2.用http://yyy.zzz.com 来访问 http://www.zzz.com/user.php?username=yyy 的功能

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.zzz.com
RewriteCond %{REQUEST_URI} !^user.php$
RewriteCond %{REQUEST_URI} .php$
RewriteRule (.*).php$ http://www.zzz.com/$1/ [R]
RewriteCond %{HTTP_HOST} !^www.zzz.com
RewriteRule ^(.+) %{HTTP_HOST} [C]
RewriteRule ^([^.]+).zzz.com http://www.zzz.com/user.php?username=$1

例子二:

/type.php?typeid=* –> /type*.html
/type.php?typeid=*&page=* –> /type*page*.html

RewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT]
RewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&page=$2 [PT]

5.使用Apache的URL Rewrite配置多用户虚拟服务器

要实现这个功能,首先要在DNS服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如,我就把 *.kiya.us和 *.kiya.cn全部解析到了我的IP地址70.40.213.183上。

然后,看一下我的Apache中关于*.kiya.us的虚拟主机的设定。

ServerAdmin webmaster@kiya.us
DocumentRoot /home/www/www.kiya.us
ServerName dns.kiya.us
ServerAlias dns.kiya.us kiya.us *.kiya.us
CustomLog /var/log/httpd/osa/access_log.log” common
ErrorLog /var/log/httpd/osa/error_log.log”
AllowOverride None
Order deny,allow

#AddDefaultCharset GB2312

RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/www.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L]

在这段设定中,我把*.kiya.cn和*.kiya.us 的Document Root都设定到了 /home/www/www.kiya.us

继续看下去,在这里我就配置了URL Rewrite规则。

RewriteEngine on #打开URL Rewrite功能
RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$ #匹配条件,如果用户输入的URL中主机名是类似 xxxx.kiya.us 或者 xxxx.kiya.cn 就执行下面一句
RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用户输入完整的地址(GET方式的参数除外)作为参数传给下一个规则,[C]是Chain串联下一个规则的意思
RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/dev.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L]
# 最关键的是这一句,使用证则表达式解析用户输入的URL地址,把主机名中的用户名信息作为名为un的参数传给/home/www/dev.kiya.us目录下的脚本,并在后面跟上用户输入的GET方式的传入参数。并指明这是最后一条规则([L]规则)。注意,在这一句中指明的重写后的地址用的是服务器上的绝对路径,这是内部跳转。如果使用http://xxxx这样的URL格式,则被称为外部跳转。使用外部跳转的话,浏览着的浏览器中的URL地址会改变成新的地址,而使用内部跳转则浏览器中的地址不发生改变,看上去更像实际的二级域名虚拟服务器。

设置后重启Apache服务器就大功告成了!

Update May 1, 2009

今天上网看到了有人提一个问题:

求Rewrite 防盗链正则
不允许www.im286.com www.chinaz.com 这两个网站盗链 , 其它的网站都可以盗链的规则怎么写.

论坛中的答案是:

RewriteEngine On
RewriteCond %{HTTP_REFERER} chinaz.com [NC]
RewriteCond %{HTTP_REFERER} im286.com [NC]
RewriteRule .*\.(jpg|jpeg|gif|png|rar|zip|txt|ace|torrent|gz|swf)$ http://www.xxx.com/fuck.png [R,NC,L]

Update May 7, 2009

介绍一篇文章:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_rewrite.html

Update May 24, 2009

一、关于是否需要使用完全转义,比如在 RewriteCond %{HTTP_REFERER} chinaz.com [NC] 中 把 chinaz.com 改成 chinaz\.com
答案是,两者都是可以的。

二、今天在做 YOURcaddy.com (就是我去年做的PlanetCoachella的变形)的时候,在 GoDaddy 主机上无法正常转向,后来找到了问题:
在HostMonster以及我自己的机器上,是用
RewriteRule ^business/([^\.]+)$ biz/detail.php?name=$1 [L]
达到改写的。而在Godaddy主机上,是这样:
RewriteRule ^business/([^\.]+)$ /biz/detail.php?name=$1 [L]
目标文件前多了一个/
现在想想,可能是因为没有指定RewriteBase,至于到底是不是我改日再验证一下。

三、添加两个关于判断 USER AGENT 例子和自动添加.php扩展名及自动换.html到.php扩展名的例子:
1

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]
RewriteRule ^.* – [F,L] 这里”-”表示没有替换,浏览器为IE和Opera的访客将被禁止访问。

2

RewriteEngine On
RewriteBase /test
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ([^/]+)$ /test/$1.php
#for example: /test/admin => /test/admin.php
RewriteRule ([^/]+)\.html$ /test/$1.php [L]
#for example: /test/admin.html => /test/admin.php

限制目录只能显示图片
< IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !^.*\.(gif|jpg|jpeg|png|swf)$
RewriteRule .*$ – [F,L]
< /IfModule>

Update Jun 10, 2009

补充,关于特定文件扩展名的重写。

重写有某些扩展名的文件:
RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L]
如果要排除一些扩展名:
RewriteRule !\.(js|ico|gif|jpg|JPG|png|PNG|css|pdf|swf)$ index.php

 

 


 


 

Apache的rewrite的重写非常常用,现总结了一下。

 

 

 

Apache mod_rewrite规则重写的标志一览

 

 

 

R[=code](force redirect) 强制外部重定向

 

强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。

 

F(force URL to be forbidden)禁用URL,返回403HTTP状态码。

 

G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。

 

P(force proxy) 强制使用代理转发。

 

L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。

 

N(next round) 重新从第一条规则开始运行重写过程。

 

C(chained with next rule) 与下一条规则关联

 

如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。

 

T=MIME-type(force MIME type) 强制MIME类型

 

NS (used only if no internal sub-request) 只用于不是内部子请求

 

NC(no case) 不区分大小写

 

QSA(query string append) 追加请求字符串

 

NE(no URI escaping of output) 不在输出转义特殊字符

 

例如:RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed

 

PT(pass through to next handler) 传递给下一个处理

 

例如:

 

RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理

 

Alias /def /ghi

 

S=num(skip next rule(s)) 跳过num条规则

 

E=VAR:VAL(set environment variable) 设置环境变量

 

 

 

使用mod_rewrite时常用的服务器变量:

 

HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT

 

connection & request: REMOTE_ADDR, QUERY_STRING

 

server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL

 

system stuff: TIME_YEAR, TIME_MON, TIME_DAY

 

 

 

RewriteRule规则表达式的说明:

 

. 匹配任何单字符

 

[chars] 匹配字符串:chars

 

[^chars] 不匹配字符串:chars

 

text1|text2 可选择的字符串:text1或text2

 

? 匹配0到1个字符

 

* 匹配0到多个字符

 

+ 匹配1到多个字符

 

^ 字符串开始标志

 

$ 字符串结束标志

 

n 转义符标志

 

 

 

反向引用 $N 用于 RewriteRule 中匹配的变量调用(0 <= N <= 9)

 

反向引用 %N 用于 RewriteCond 中最后一个匹配的变量调用(1 <= N <= 9)

 

 

 

RewriteCond适用的标志符

 

‘nocase|NC’ (no case)忽略大小

 

‘ornext|OR’ (or next condition)逻辑或,可以同时匹配多个RewriteCond条件

 

 

 

RewriteRule适用的标志符

 

‘redirect|R [=code]’ (force redirect)强迫重写为基于http开头的外部转向(注意URL的变化) 如:[R=301,L]

 

‘forbidden|F’ (force URL to be forbidden)重写为禁止访问

 

‘proxy|P’ (force proxy)重写为通过代理访问的http路径

 

‘last|L’ (last rule)最后的重写规则标志,如果匹配,不再执行以后的规则

 

‘next|N’ (next round)循环同一个规则,直到不能满足匹配

 

‘chain|C’ (chained with next rule)如果匹配该规则,则继续下面的有Chain标志的规则。

 

‘type|T=MIME-type’ (force MIME type)指定MIME类型

 

‘nosubreq|NS’ (used only if no internal sub-request)如果是内部子请求则跳过

 

‘nocase|NC’ (no case)忽略大小

 

‘qsappend|QSA’ (query string append)附加查询字符串

 

‘noescape|NE’ (no URI escaping of output)禁止URL中的字符自动转义成%[0-9]+的形式。

 

‘passthrough|PT’ (pass through to next handler)将重写结果运用于mod_alias

 

’skip|S=num’ (skip next rule(s))跳过下面几个规则

 

‘env|E=VAR:VAL’ (set environment variable)添加环境变量

 

 

 

实战

 

例子:

 

RewriteEngine on

 

RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]

 

RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]

 

RewriteRule ^.* – [F,L] 这里”-”表示没有替换,浏览器为IE和Opera的访客将被禁止访问。

 

 

 

例子:

 

RewriteEngine On

 

RewriteBase /test

 

RewriteCond %{REQUEST_FILENAME}.php -f

 

RewriteRule ([^/]+)$ /test/$1.php

 

#for example: /test/admin => /test/admin.php

 

RewriteRule ([^/]+).html$ /test/$1.php [L]

 

#for example: /test/admin.html => /test/admin.php

 

 

 

限制目录只能显示图片

 

< IfModule mod_rewrite.c>

 

RewriteEngine on

 

RewriteCond %{REQUEST_FILENAME} !^.*.(gif|jpg|jpeg|png|swf)$

 

RewriteRule .*$ – [F,L]

 

< /IfModule>

 

苏州电信电话会议申请号码

人工服务:1600

会议申请:1602001

提前1-2天预约,预约时会产生会议编号和主持人密码,费用从主持人的电话费中收取。

费用:前30分钟100元,过后每分钟2.5元

.htaccess实现域名绑定到子目录实现多站点

有些美国空间,可以做多个子站点,但只能做一个主站。可以用.htaccess实现域名绑定到子目录实现多站点。

先设置停靠域将各域名绑定到主机,然后新建目录directory,再编辑根目录下的隐藏文件.htaccess,添加如下规则:

根目录下的.htaccess

# BEGIN Multisite
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^(www.)?abc.org$
RewriteCond %{REQUEST_URI} !^/directory/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /directory/$1 
RewriteCond %{HTTP_HOST} ^(www.)?abc.org$
RewriteRule ^(/)?$ directory/index.php [L]
</IfModule>
# END Multisite

此时装在子目录下的站点如果开启静态化,可能会在该目录下创建.htaccess文件来配置重写规则
但是这种情况下访问会出错,会访问到根目录下的index.php
解决办法很简单,列如wordpress增加的规则需要添加下面红色部分(点前后各有一空格):
注:每次重新配置固定链接重写规则后,都要重新按此修改。
 
子目录下的.htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /directory/index.php [L]
</IfModule>
# END WordPress
 
注:如果不是多站点,而只是想把wordpress放在子目录,用原来的顶级域名访问,则只须在后台设置-常规里
WordPress 地址(URL)http://abc.com//directory
站点地址(URL)http://abc.com

wordpress目录文件结构

 

根目录
|
|

wp-admin — wp-content — wp-includes
|                    |        |______________________________________________
|                    |____________________________________ |
|                                                                                                                                |                                                                 |

css — images — includes — js — maint       languages — plugins — themes         images — js — pomo — Text — theme-compat
|
Diff
|
Engine — Renderer

**********
根目录

**********

1.index.php:wordpress核心索引文件,即博客输出文件。
2.license.txt:WordPress GPL许可证文件。
3.my-hacks.php:定义了博客输出之前处理的追加程序。默认安装中并没有这个文件,但如果存在,它就会被管理页面引用。

4.readme.html:WordPress安装导言。
5.wp-atom.php:输出Atom信息聚合内容。
6.wp-blog-header.php:根据博客参数定义博客页面显示内容。
7.wp-cron.php
8.wp-comments-post.php:接收评论,并把其添加到数据库。
9.wp-commentsrss2.php:用来生成日志评论的RSS2信息聚合内容。
10.wp-config-sample.php:把WordPress连接到MySQL数据库的示例配置文件。
11.wp-config.php:这是真正把WordPress连接到MySQL数据库的配置文件。默认安装中虽不包括它,但由于WordPress运行需要这一文件,因此,用户需要编辑这个文件以更改相关设置。
12.wp-feed.php:根据请求定义feed类型并其返回feed请求文件。
13.wp-links-opml.php:生成OPML格式的链接(通过WordPress管理菜单添加)列表。
14.wp-login.php:定义注册用户的登陆页面。
15.wp-mail.php:用来获取通过邮件提交的博文。这个文件的URL通常被添加到cron任务中,这样cron就会定期检索文件并接收邮件日志。
16.wp-pass.php:审核受密码保护文章的密码并显示被保护文章。
17.wp-rdf.php:生成RDF信息聚合内容。
18.wp-register.php:允许新用户通过联机表单注册用户名。
19.wp-rss.php:生成RSS信息聚合内容。
20.wp-rss2.php:生成RSS2信息聚合内容。
21.wp-settings.php:运行执行前的例行程序,包括检查安装是否正确,使用辅助函数,应用用户插件,初始化执行计时器等等。
22.wp-trackback.php:处理trackback请求。
23.wp.php:显示博客日志的简单模板。并没有什么神奇之处,但包括了部分index.php内容。
24.xmlrpc.php:处理xmlrpc请求。用户无需通过内置的网络管理界面就可发布文章。

 

**********
wp-admin

**********
1.wp-admin/admin.php:管理文件的核心文件。用来连接数据库,整合动态菜单数据,显示非核心控制页面等。
2.wp-admin/admin-db.php
3.wp-admin/admin-footer.php:定义所有管理控制台的页脚。
4.wp-admin/admin-functions.php:定义了管理控制台使用的多种函数。5.wp-admin/admin- header.php:定义了管理控制台的上半部分内容,包括菜单逻辑 (menu logic)的 menu-header.php文件。
6.wp-admin/bookmarklet.php:使用书签功能时,定义弹出页面。撰写日志时使用默认的edit-form.php文件。
7.wp-admin/categories.php:定义管理页面的类别管理。参考: Manage – Categories
8.wp-admin/cat-js.php
9.wp-admin/edit.php:定义管理页面的日志管理。参考:  Manage – Posts
10.wp-admin/edit-comments.php:定义管理页面的评论管理。参考:  Manage – Comments
11.wp-admin/edit-form-advanced.php:定义管理页面的日志高级编辑形式管理,包括post.php。参考:  Write – Write Post – Advanced
12.wp-admin/edit-form.php:定义管理页面的日志简单编辑形式管理,包括post.php。参考:  Write – Write Post
13.wp-admin/edit-form-comment.php:编辑特定日志评论。
14.wp-admin/edit-form-ajax-cat.php
15.wp-admin/edit-link-form.php
16.wp-admin/edit-page-form.php:定义管理模块页面的页面编辑,包括post.php和page-new.php。参考: Write – Write Page
17.wp-admin/edit-pages.php:定义管理模块页面的页面管理。参考:  Manage – Pages
18.wp-admin/execute-pings.php
19.wp-admin/import.php
20.wp-admin/index.php:默认管理页面。根据用户请求显示相应的页面。
21.wp-admin/inline-uploading.php
22.wp-admin/install-helper.php:定义数据库维护函数,包括popular-in-plugins maybe_create_table() 和maybe_add_column()。
23.wp-admin/install.php:安装WordPress。
24.wp-admin/link-add.php:链接添加。参考:  Links – Add Link
25.wp-admin/link-categories.php:链接分类管理。参考: Links – Link Categories
26.wp-admin/link-import.php:导入链接。参考: Links – Import Links
27.wp-admin/link-manager.php:链接管理。参考:  Links – Manage Links
28.wp-admin/link-parse-opml.ph:导入链接时,用来解析OPML文件。
29.wp-admin/list-manipulation.js
30.wp-admin/list-manipulation.php
31.wp-admin/menu-header.php:用于在管理界面显示菜单。
32.wp-admin/menu.php:定义了默认管理菜单结构。
33.wp-admin/moderation.php:定义了评论审核函数。
34.wp-admin/options.php:升级后,用来更改所有设置。
35.wp-admin/options-discussion.php:管理评论和trackback相关选项。参考:  Options – Discussion
36.wp-admin/options-general.php:管理基本配置选项。参考: Options – General
37.wp-admin/options-head.php
38.wp-admin/options-misc.php:设置文件上传,链接跟踪,自定义”hacks”等相关选项。参考:Options – Miscellaneous
39.wp-admin/options-permalink.php:管理永久链接选项。参考: Options – Permalinks
40.wp-admin/options-reading.php:设置如何把网站信息发送到读者浏览器或其它应用程序。参考: Options – Reading
41.wp-admin/options-writing.php:管理日志撰写界面。参考:Options – Writing
42.wp-admin/page-new.php:创建新页面。
43.wp-admin/plugin-editor.php:编辑插件文件。
44.wp-admin/plugins.php:管理插件。
45.wp-admin/post.php:创建新日志。
46.wp-admin/profile-update.php
47.wp-admin/profile.php:管理个人资料或配置。
48.wp-admin/setup-config.php:安装时,用来创建wp-config.php文件。
49.wp-admin/sidebar.php
50.wp-admin/templates.php:编辑服务器可写文件。
51.wp-admin/theme-editor.php:编辑特定主题中的文件。
52.wp-admin/themes.php:管理主题。
53.wp-admin/update-links.php
54.wp-admin/upgrade-functions.php:定义了版本升级函数。
55.wp-admin/upgrade-schema.php:定义了升级中使用的默认表格结构和选项。
56.wp-admin/upgrade.php:版本升级。
57.wp-admin/user-edit.php:编辑用户。
58.wp-admin/users.php:管理用户。
59.wp-admin/wp-admin.css:定义了管理控制台的默认样式表。
60.wp-admin/xfn.js

**********
wp-includes

**********

wp-includes目录
1.wp-includes/cache.php
2.wp-includes/capabilities.php
3.wp-includes/class-IXR.php:Incutio XML-RPC库。包括了 XML RPC支持函数。由http://scripts.incutio.com/xmlrpc/提供支持。
4.wp-includes/classes.php:包括了基本的类,如核心文章提取机制WP_Query和改写管理WP_Rewrite。
5.wp-includes/class-pop3.php:包括了支持使用POP邮箱的类。可供wp-mail.php 使用。
6.wp-includes/class-snoopy.php:Snoopy是一个PHP类,用来模仿Web浏览器的功能,它能自动完成检索网页和发送表单的任务。
7.wp-includes/comment-functions.php
8.wp-includes/default-filters.php
9.wp-includes/feed-functions.php
10.wp-includes/functions-compat.php:即新版本PHP中用来支持老版本PHP的函数文件。
11.wp-includes/functions-formatting.php:用于清理XHTML和用特定字符集正确格式化文本。
12.wp-includes/functions-post.php:定义了在数据库中管理日志,查询用户权限,提取和撰写评论等函数。
13.wp-includes/functions.php:包含许多重要的支持函数,它是WordPress中最大的文件,函数数量几乎是第二大文件的两倍。
14.wp-includes/gettext.php:PHP-gettext GPL 翻译库组成部分。
15.wp-includes/kses.php:用来渲染和过滤日志或评论中的HTML。
16.wp-includes/links.php:用来管理和使用WordPress的链接功能。
17.wp-includes/locale.php:用来替代默认的星期和月份值。
18.wp-includes/pluggable-functions.php
19.wp-includes/registration-functions.php
20.wp-includes/rss-functions.php
21.wp-includes/streams.php:定义了包装文件流和字符流的类。
22.wp-includes/template-functions-author.php:包含了与日志作者或评论人相关的主题函数。
23.wp-includes/template-functions-category.php:包含了与类别相关的主题函数。
24.wp-includes/template-functions-comment.php:包含了与评论相关的主题函数。
25.wp-includes/template-functions-general.php:包含了常规主题函数。
26.wp-includes/template-functions-links.php:包含了与链接相关的主题函数。
27.wp-includes/template-functions-post.php:包含了与日志相关的主题函数。
28.wp-includes/template-functions.php:包含了以上所有”template-”文件。
29.wp-includes/template-loader.php
30.wp-includes/vars.php:用来设置杂项变量。
31.wp-includes/version.php:用来设置当前使用的WordPress版本。
32.wp-includes/wp-db.php:包含了用来连接MySQL数据库的函数。
33.wp-includes/wp-l10n.php:提供支持多语言版本的函数。

 

windows 7也能搜索文件内容,比XP搜索更强大

在进行文件搜索时,windows 7只有右上方一个搜索框,不像XP可以进行一些高级定义,似乎没法搜索内容中包含欲搜索词的文件了,难道在这点上windows 7倒退得不如XP了?


  Windows 7没那么笨,只是为了提高大部分情况下的搜索速度,Windows 7默认是不搜索文件内容的,要修改的话其实很简单,打开资源管理器,依次单击“工具→文件夹选项→搜素”,然后勾选“始终搜索文件名和内容”,单击“确定”,现在切换到F盘下,切换到右上角的搜索框,输入关键字:王晓明”回车后,很快就可以找到符合条件的文档了。

  熟悉Windows 7的朋友会说了,平时我不想搜索文件内容,只在某个目录下会搜索内容,那可不想每次都更改这个文件夹选项。那么,有这个需求,你就可以单独考虑,因为Windows 7默认只搜索已经有索引的目录下的文件内容,咱们可以只添加你时常需要搜素文件内容的目录。打开我的电脑,单击左侧的“库”,打开“文档库”,单击文档库下的包含“2个位置”链接,在打开的页面中将目录F添加到文档库中就可以了,这样你就无需更改文件夹选项,进行上面的搜索就可以了。

 

扩展阅读:


想在电脑硬盘浩如烟海的文件中找出想要的程序或文件,该怎么办?Windows 7系统自带的搜索功能模块无论在搜索速度还是在操作便捷性方面,都无人能出其右,可以方便快速地找到指定程序和文件。

 

  “开始”菜单帮你找程序

 

  1.打开“开始”菜单搜索

 

  点击系统中的“开始”菜单或者直接按下键盘上的Win按钮,便可以在弹出的菜单列表底部发现带有“搜索程序和文件”字样的搜索栏。

 

 

  2.键入搜索关键词

 

  在栏目内键入搜索关键词,如“音乐”,即可分类显示所有与音乐相关的文件或程序(图1)。在默认情况下,“开始”菜单的搜索栏只会自动在“开始”菜单、控制面板、Windows文件夹、Program File文件夹、Path环境变量指向的文件夹、Libraries、Run历史里面搜索文件,但速度非常快。

 

Windows 7系统自带超强搜索功能

 

 

  小提示:其实“开始”菜单的搜索功能非常强大。不仅可以搜索常用程序,CMD、Msconfig之类的系统程序,甚至控制面板的程序也能直接在这个搜索框里调出使用。除此以外,这个搜索框可以取代XP的“运行”功能。例如常用的定时关机命令“shutdown –s –t”、网络连通查询命令“ping 192.168.1.1”等等,都可以直接运行。

 

  使用窗口搜索栏仔细查找文件

 

  1.打开文件夹搜索栏

 

  双击桌面上“我的电脑”图标。在开启的“我的电脑”窗口顶端同样有一个搜索栏。

 

  2.输入搜索关键词

 

  单击左侧列表的“计算机”选项,在展开的下一级列表中选择相应的分区盘符或文件夹。此时在窗口顶端的导航栏内将同时出现所对应的具体分区路径,最后在搜索栏输入关键词即可得到搜索结果。例如键入“电脑报”关键词,所有包含有“电脑报”这三个字的搜索结果都会同时以黄色高亮形式显示出来,并且会标明其所在位置,非常清楚(图2)。这样能进一步节省搜索时间,实现精确定位。

 

Windows 7系统自带超强搜索功能

 

  小提示:在进行关键词搜索时,在关键词中用?可以代替单个字符,*可以代表一串字符,给关键词加上引号可以实现精确匹配搜索。

 

  一般来说,这样搜索速度会有些慢,为提高搜索速度,我们可以建立索引目录去解决。在“开始”菜单搜索框里输入“索引选项”(“开始”菜单的搜索框很强大吧),对索引位置进行添加、修改操作。添加索引后,其搜索速度将得到大大提升。

 

  使用窗口搜索栏仔细查找搜索网页特定内容

 

  1.打开网页搜索栏

 

  依次选择菜单栏上选择“编辑”→“在此页上查找”选项,即可在标签页上方出现“查找”搜索栏。

 

  2.键入关键词

 

  在搜索栏内键入某个关键词,该网页中所有与之匹配的内容都将以黄色高亮形式显示出来,并显示出匹配的结果数量(图3)。

 

  小提示:熟手玩家一般使用快捷键Ctrl+F来启动这项功能。同时,Office里的搜索方法、快捷键和网页页面关键词搜索一模一样,非常实用。

 

iPad 30个使用技巧

小白专用,高玩略过
  1. 休眠键:又称锁屏键、电源键,位于机器顶部,用于打开关闭屏幕、长按后提示关机或者与其他按键进行组合操作;
  2. Home键:位于机器屏幕下方,用于退出运行的应用程序,或者与其他按键进行组合操作;
  3. 系统死机的情况下,进行软重启:只要按住休眠键和Home键持续几秒钟,iPad将重新启动。
  4. 强制退出返回到桌面:只需按住Home键几秒钟即可强制退出应用程序返回到桌面。
  5. 错按Home键但不想退出程序:继续按住Home键不要放开,持续大约5秒,就不会退出这个程序。
  6. 快速静音方法:最快速的方法来让扬声器无声,就是按住下调音量的按钮两秒钟,即可变为静音模式。
  7. iPad屏幕截图:与iPhone一样,同时按下电源键和Home键,屏幕内容将以png格式图片储存在照片库中。
  8. iPad出现异常不能关机:可以长按“Home键”和“休眠键”直到iPad重启。
  9. iPad充电:在连接电脑的时候,如果屏幕关闭,则会进入充电状态,如果屏幕打开则会显示不在充电。
  10. 显示隐藏的指南针功能:在地图程序里,双击“我的位置”图标,隐藏的指南针功能就会出现。
  11. 激活电子相框:按电源键打开屏幕,解锁iPad之前可以通过解锁条右侧的按钮激活电子相框功能。
  12. 剪切,复制和粘贴功能:点选任何可编辑的文本4次,即可高亮选择相应的区域。
  13. 快速地返回网页顶部:阅读至文章底部,点选标题栏一次就能快速返回顶部。
  14. 强迫退出处于死机状况的应用程序:万一某个应用没有反应,按什么按钮都不能退出,这时可以尝试按住“休眠”键,直到屏幕出现“移动滑块来关机”信息,然后不管这信息,放开“休眠”键,换为按住“Home”键,5秒后,应用程序退出,并回到主页面。
  15. 方便地输入网址:在浏览器和E-Mail中输入网址时,长按“.com”按钮会出现“.edu”、“.net”、“.cn”、“.org”等选项,无需再调整输入法进行输入。
  16. Camera Connection Kit套件:iPad的Camera Connection Kit套件里的30针转USB接口是支持读卡器和USB键盘的,甚至可以接USB风扇。
  17. App Store与iTunes Store:App Store支持中国帐号,但iTunes Store是不支持的,需要用美国帐号登录,切换帐号是在“设置-Store”里。
  18. 3G版iPad上网设置:3G版的iPad支持中国联通和中国移动的SIM卡剪卡使用,但是上网前需要设置APN。联通是3GNET,移动是CMNET,在“设置-蜂窝数据 -APN设置”里填写。
  19. 误操作输入字符需要删除:可以摇晃iPad机身,屏幕上就会弹出提示可以撤销你的输入。而再次摇晃,可以重做输入。
  20. 切换后台程序:比如在QQ和微博之间切换,可以快速按2下home键,会在屏幕底部出现后台的程序。这时长按某个图标,还可以完全终止该程序。
  21. 在打开某个应用的同时,后台通过iPod程序正在播放音乐,这时候如果希望不退出现有的应用,而又想改变播放的歌曲,播放音量,或直接进入iPod播放器,可以连续按两次“Home”键。系统会弹出一个小菜单让你调整。
  22. 更多地预览您的邮件:打开“设置-邮件-联系人和通讯录”并在“预览”下选择“5行”。
  23. 用Safari浏览器浏览网页技巧:用Safari浏览网页时,遇到可以打开的链接,可以选择长按住该链接,系统会弹出小菜单,让你选择”打开“,”在新页面中打开“,或者”拷贝“等选项。这样就不会造成每次按一个链接就自动打开一个新窗口,造成满屏都是窗口的杂乱无章。
  24. 打开音乐EQ功能会更费电:如果你打开了音乐播放器iPod的EQ功能(均衡器),打开后会令歌曲更悦耳动听,但在听音乐时一直打开EQ,则会耗费不少电量。可以通过“设置”里面的“iPod”菜单,关闭该”均衡器“。
  25. iPad使用温度:iPad使用时,环境温度适合在0-35摄氏度之间,所以不要在太阳直射下使用。关机后设备存放环境的温度范围是,摄氏-20到45度,所以不使用时,不建议把iPad存放在炎热的车厢里。
  26. 禁止使用APP Store应用:如果你的iPad平时经常会有别人(或者是小孩)使用,这时候可通过“设置”里面的“通用”菜单下面的“限制”项目来禁止使用APP Store应用,以防别人误操作购买了付费应用。
  27. 使用日历时快速定位日期:如果要在日历中,要选择未来或者过去几年或十几年的某天,不断向前或向后点击年份很麻烦,另外一种办法是可以长按住年份,然后松开手,这时候年份会自动向前或向后变更。直到到达年限后,点击一次,便会自动停止。
  28. VoiceOver:用设置通用里的辅助功能里VoiceOver可以朗读iBooks里的书籍。
  29. 导入免费的书籍文件:和iTunes以及iPod一样,iPad的iBooks应用也可以导入特定格式的自定义书籍。
  30. 使用外接键盘时打开虚拟键盘:如果iPad连接上了外置键盘,虚拟键盘便会自动处于隐藏的状态。如果需要虚拟键盘,可点击一下外置键盘的弹出按键。

Windows事件日志详解–登陆类型

平时分析windows 安全日志时,经常发现登录类型的值不同。有2,3,5,8等。最常见的类型是 2 (交互式)和 3 (网络)。

下面详细列出了可能的登录类型值

登录类型2:交互式登录(Interactive)

这应该是你最先想到的登录方式吧,所谓交互式登录就是指用户在计算机的控制台上进行的登录,也就是在本地键盘上进行的登录。

登录类型3:网络(Network)

当你从网络的上访问一台计算机时在大多数情况下Windows记为类型3,最常见的情况就是连接到共享文件夹或者共享打印机时。另外大多数情况下通过网络登录IIS时也被记为这种类型,但基本验证方式的IIS登录是个例外,它将被记为类型8,下面将讲述。

成功的网络登录:

  用户名:

  域:

  登录 ID: (0×2,0xFC38EC05)

  登录类型: 3

  登录过程: NtLmSsp 

  身份验证数据包: NTLM

  工作站名: 098B11CAF05E4A0

  登录 GUID: -

  调用方用户名: -

  调用方域: -

  调用方登录 ID: -

  调用方进程 ID: -

  传递服务: -

  源网络地址: 192.168.197.35

  源端口: 0

  调用方进程名称: %16

 

登录类型4:批处理(Batch)

当Windows运行一个计划任务时,“计划任务服务”将为这个任务首先创建一个新的登录会话以便它能在此计划任务所配置的用户账户下运行,当这种登录出现时,Windows在日志中记为类型4,对于其它类型的工作任务系统,依赖于它的设计,也可以在开始工作时产生类型4的登录事件,类型4登录通常表明某计划任务启动,但也可能是一个恶意用户通过计划任务来猜测用户密码,这种尝试将产生一个类型4的登录失败事件,但是这种失败登录也可能是由于计划任务的用户密码没能同步更改造成的,比如用户密码更改了,而忘记了在计划任务中进行更改。

登录类型5:服务(Service)

与计划任务类似,每种服务都被配置在某个特定的用户账户下运行,当一个服务开始时,Windows首先为这个特定的用户创建一个登录会话,这将被记为类型5,失败的类型5通常表明用户的密码已变而这里没得到更新,当然这也可能是由恶意用户的密码猜测引起的,但是这种可能性比较小,因为创建一个新的服务或编辑一个已存在的服务默认情况下都要求是管理员或serversoperators身份,而这种身份的恶意用户,已经有足够的能力来干他的坏事了,已经用不着费力来猜测服务密码了。

已成功登录帐户。

 

主题:

安全 ID: SYSTEM

帐户名: NAUTICAR-X200$

帐户域: WORKGROUP

登录 ID: 0x3e7

 

登录类型: 5

 

新登录:

安全 ID: SYSTEM

帐户名: SYSTEM

帐户域: NT AUTHORITY

登录 ID: 0x3e7

登录 GUID: {00000000-0000-0000-0000-000000000000}

 

进程信息:

进程 ID: 0×254

进程名: C:\Windows\System32\services.exe

 

网络信息:

工作站名:

源网络地址: -

源端口: -

 

详细身份验证信息:

登录进程: Advapi  

身份验证数据包: Negotiate

传递服务: -

数据包名(仅限 NTLM): -

密钥长度: 0

在创建登录会话后在被访问的计算机上生成此事件。

“主题”字段指明本地系统上请求登录的帐户。这通常是一个服务(例如 Server 服务)或本地进程(例如 Winlogon.exe 或 Services.exe)。

 

 

登录类型7:解锁(Unlock)

你可能希望当一个用户离开他的计算机时相应的工作站自动开始一个密码保护的屏保,当一个用户回来解锁时,Windows就把这种解锁操作认为是一个类型7的登录,失败的类型7登录表明有人输入了错误的密码或者有人在尝试解锁计算机。

登录类型8:网络明文(NetworkCleartext)

这种登录表明这是一个像类型3一样的网络登录,但是这种登录的密码在网络上是通过明文传输的,WindowsServer服务是不允许通过明文验证连接到共享文件夹或打印机的,据我所知只有当从一个使用Advapi的ASP脚本登录或者一个用户使用基本验证方式登录IIS才会是这种登录类型。“登录过程”栏都将列出Advapi。

成功的网络登录:

  用户名: IUSR_HP-8DFC7CA1B32C

  域: HP-8DFC7CA1B32C

  登录 ID: (0×0,0x89F503)

  登录类型: 8

  登录过程: Advapi  

  身份验证数据包: Negotiate

  工作站名: HP-8DFC7CA1B32C

  登录 GUID: -

  调用方用户名: NETWORK SERVICE

  调用方域: NT AUTHORITY

  调用方登录 ID: (0×0,0x3E4)

  调用方进程 ID: 3656

  传递服务: -

  源网络地址: -

  源端口: -

  调用方进程名称: %16

 

登录类型9:新凭证(NewCredentials)

当你使用带/Netonly参数的RUNAS命令运行一个程序时,RUNAS以本地当前登录用户运行它,但如果这个程序需要连接到网络上的其它计算机时,这时就将以RUNAS命令中指定的用户进行连接,同时Windows将把这种登录记为类型9,如果RUNAS命令没带/Netonly参数,那么这个程序就将以指定的用户运行,但日志中的登录类型是2。

登录类型10:远程交互(RemoteInteractive)

当你通过终端服务、远程桌面或远程协助访问计算机时,Windows将记为类型10,以便与真正的控制台登录相区别,注意XP之前的版本不支持这种登录类型,比如Windows2000仍然会把终端服务登录记为类型2。

登录类型11:缓存交互(CachedInteractive)

Windows支持一种称为缓存登录的功能,这种功能对移动用户尤其有利,比如你在自己网络之外以域用户登录而无法登录域控制器时就将使用这种功能,默认情况下,Windows缓存了最近10次交互式域登录的凭证HASH,如果以后当你以一个域用户登录而又没有域控制器可用时,Windows将使用这些HASH来验证你的身份。

上面讲了Windows的登录类型,但默认情况下Windows2000是没有记录安全日志的,你必须先启用组策略“计算机配置/Windows设置/安全设置/本地策略/审核策略”下的“审核登录事件”才能看到上面的记录信息。希望这些详细的记录信息有助于大家更好地掌握系统情况,维护网络安定。

教你如何查找入侵者

一天正在发呆,QQ上的一个朋友向我求救:“我的网站被黑了,首页给换了,SOS!”。最近正好无事,索性就帮帮他吧。
收复失地
刚刚准备在浏览器上输入他网站的地址,结果却停了下来:如果入侵者在首页挂了马,我岂不是也要遭殃?所以我先用查看挂马的工具检查了一下。没有不可见窗体、没有JS调用、没有Object,OK。进了首页看到上面只有入侵者的名字和一些图片,网站里边的具体情况待会再看吧。向朋友要了管理员的密码,用 3389登录上去一探究竟。
先看看服务器用户的情况,输入“net user”后发现“tsinternetuser”这个用户比较显眼。
依稀记得tsinternetuser是Windows2000的终端用户,但在Windows2003中并不存在。怕不肯定,我去百度查询了一下,又问了问朋友,都说不应该有这个用户。看来这次入侵者弄巧成拙了,当我检查管理员组后,发现并不存在此用户,初步猜测它应该是克隆出来的。先打开 Regedt32将自己的权限提上去:打开Regedit,来到“HKEY_LOCAL_MACHINE\SAM\SAM\Domains\ account\”,对比管理员和“tsinternetuser”中二进制键F的数值,结果发现是一样的。由此断定用户 “tsinternetuser”被克隆成管理员。接着检查其他用户,没有发现被克隆的痕迹。删除“tsinternetuser”,不过事情到这里并没完。
检查后门
祭出“冰刃”,它可是后门的克星,大部分的妖魔鬼怪在它面前都会无所遁形。

先用冰刃查看进程,发现并没有隐藏进程(红色标示)。再查看端口,发现1066端口在监听。

此端口不是常用端口且启动它的程序也不常见。

在进程选项中查看“systemram.exe”,发现此进程还有个芯片图标,

难怪刚才没注意到。先把他结束掉,但别着急删除。我们先看看启动组是否正常,看了一下没什么问题。

但在查看服务时发现了一个熟悉的身影:Radmin。

程序本身也正好是监听1066端口的程序。这下好办了,删除程序、卸载服务。

Radmin还是很好清除的(在网上搜索,发现这是百世经纶修改版 Radmin,难怪没有发现admdll.exe和raddrv.dll。

但它在服务方面就做得太差了,让人一看就能知道是后门服务)。
重整河山
检查了半天没有发现别的后门,这个入侵者一点技术含量都没有。接下来该恢复网站了。
浏览了一下网站,发现许多页面被改的面目全非。我从备份文件中把网站恢复了一下,这样总算能正常访问了。

接下来的任务就是把网站的漏洞补上,因为不知道入侵者是怎么进来的,还要全面的检查一次。
翻出N多工具狂轰滥炸一番,没有明显的漏洞,又手工检查了一些“偏僻”的地方,也没找到漏洞。

入侵者到底是怎么进来的呢?旁注?不可能,网站采用的是独立服务器。

突然想到可以检查入侵者留下的WebShell位置,以判断他的入侵位置。将lake2写的查找ASP木马的工具传上去。

此工具很好用,他查找的特征码是那些危险组件和函数。

WebShell的位置在动网论坛目录里,基本上确定它是从这里进来的。可是我刚才测试时发现提权漏洞已经补上了。

再检查一下论坛也没发现跨站的代码,到底他是怎么进来的呢?难道是故意把WebShell放在论坛目录下?

向朋友询问了论坛管理员的密码……很弱智,并且前后台还都一样。有心的人猜几次就知道了,

看来安全问题大多数都是人本身的问题,最后我让朋友把密码改得强壮些。基本上“失地”已经收回了,现在该追击敌人了。
日志寻踪
做坏事就要付出代价,现在我就来捉住你。打开“事件查看器”,很不幸地发现所有日志都被清空,

IIS日志里只有我朋友和我的访问记录。我早就提醒过朋友要把日志的保存路径改一下,最好是安装专门的软件监控,可惜他就是不听。
小知识:修改日志存放位置的方法:

Windows的系统日志文件有应用程序日志,安全日志、系统日志、DNS服务器日志。应用程序日志、安全日志、系统日志、DNS日志默认位置:
%systemroot%\system32\config,默认文件大小512KB。
安全日志文件:%systemroot%\system32\config\SecEvent.EVT
系统日志文件:%systemroot%\system32\config\SysEvent.EVT
应用程序日志文件:%systemroot%\system32\config\AppEvent.EVT
DNS日志:%SystemRoot%\system32\config\DnsEvent.EVT
修改Windows系统日志的存放位置要在注册表中修改。打开注册表,

找到“HKEY_LOCAL_MACHINE\System\ CurrentControlSet\Services\Eventlog”,

此目录下的分支分别对应不同的日志,每个目录中的“file“键是日志的存放位置,修改它就可以了。
修改IIS日志保存位置:打开Internet信息服务(IIS)管理器,找到你的网站查看它的属性,选择日志旁边的属性,在这里就可以更改.“高级”选项还可以选择日志记录的信息种类。IIS日志也可以保存到数据库中。
看来入侵者还是有点“安全”意识的,这可让我犯难了,上哪去找他呀?就在我快要放弃的时候,

看到了入侵者留下的WebShell。查看他的密码(有人喜欢用自己的QQ号作为WebShell密码,我就遇到过几个这样的),

可惜没有得到我想要的资料。不过这倒让我想起了他是从动网入侵的,那么在动网的数据库里应该有记录才是。打开动网数据库,

翻看DV_LOG表,里面的记录入侵者可能忘记删除了。从这里确定了他的入侵方法:上传文件再备份成ASP,更令人高兴的是得到了他的IP。
韩城攻略
搜索了一下这个IP,发现竟然是韩国的主机。
先用端口扫描,发现主机开了21、1433、3389这几个端口。
没有开80端口,看来通过网站渗透进去是不可能了,重点放在1433端口。用MSSQL溢出测试,结果没有成功。

只能寄希望于弱口令上了。我比较喜欢用HSCAN。命令格式:“HSCAN -h ip -mssql –ftp”。
果然有一个SA空口令。用SQLTools连接成功,执行命令时发现xplog70.dll被删除了。
翻了半天硬盘也没找到xplog70.dll,问了几个朋友也说没有。看来只能用别的扩展组件执行命令了。

用SQL查询分析器连接目标主机时出现了奇怪的现象,连接成功后程序自动关闭,从网上又下载了一个也是这样,

输入错误的密码还会提示密码错误,真搞不懂是怎么回事。正当我不知所措的时候,朋友扔过来一个 SQLRootkit 。

在程序界面里添上IP,用户名和密码,点击登录后就连接成功。SqlRootkit利用四种组件来执行系统命令,

在执行前还可以先检测一下组件,并且它还具有恢复的功能。当然前提是支持组件的文件要存在,

如xplog70.dll、odsole70.dll和xpstar.dll。我们先看看组件是否存在。
xp_cmdshell缺少文件不能用、sp_oraceate显示执行成功但主机没有执行命令、xp_regwrite执行命令超时、

xp_servicecontrol执行命令虽然没有回显,但却是唯一能执行成功的。
远程登录主机,打开事件查看器,发现日志没有被删除。用动网数据库中记录的入侵时间比对了一下安全中的用户登录日志,

找到了入侵者的IP。从“C:\ Documents and Settings”目录下找到了入侵者浏览网站的历史记录,这下证据确凿,

他跑不了了(日志的图片就不给大家看了,见谅)。查看入侵者的IP得知是上海的 ADSL。临走时在CMD下执行了:“quser”,

看到管理员也在线,并且发现了这台主机已经在线三百天了。
我还没见过在线时间这么长的Windows主机,难怪入侵者那么嚣张。把入侵者的IP和相关的证据交给了朋友把并过程告诉了他,

后面的事情就随他了。
总结这次反入侵过程,基本上没碰到难处,可以说一气呵成。也没有什么新技术,都是大家知道的,就是把它们都组合起来而已。

感觉防护比入侵难多了,要从各个方面做好防护。在这里奉劝那些“黑客”,我们去入侵是印证自己的技术,不是用来搞破坏的。
追根溯源 DLL木马进程内幕大揭密
 
作者:admin    文章来源:转载    点击数:62    更新时间:2007-9-22
 
如果是位经常玩木马的朋友,那么一般情况下都会或多或少掌握一些木马的特性,然而,很多朋友还是不知道“DLL木马”是什么东东。那到底什么是“DLL木马”呢?它与一般的木马又有什么不同?带着这些疑问,一起开始这次揭密之旅吧!
  一、追根溯源从DLL说起

  要了解什么是“DLL木马”,就必须知道“DLL”是什么意思!说起DLL,就不能不涉及到久远的DOS时代。在DOS大行其道的时代,写程序是一件繁琐的事情,因为每个程序的代码都是需要独立的,这时为了实现一个普通的功能,甚至都要为此编写很多代码。后来随着编程技术发展与进步,程序员们开始把很多常用的代码集合(也就是通用代码)放进一个独立的文件里,并把这个文件称为“库”(Library)。在写程序的时候,把这个库文件加入编译器,就能使用这个库包含的所有功能而不必自己再去写一大堆代码,这个技术被称为“静态链接”(Static Link)。静态链接技术让劳累的程序员松了口气,一切似乎都很美好。然而静态链接技术的最大缺陷就是极度消耗和浪费资源,当一个程序只想用到一个库文件包含的某个图形效果时,系统将把这个库文件携带的所有的图形效果都加入程序,这样就使得程序非常臃肿。虽然这并不重要,可是这些臃肿的程序却把道路都阻塞了——静态链接技术让最终的程序成了大块头,因为编译器把整个库文件都加载进去了。

  技术永远是在发展的,静态链接技术由于无法避免的弊端,不能满足程序员和编程的需要,人们开始寻找一种更好的方法来解决代码重复的难题。随着Windows系统的出现, Windows系统使用一种被称为“动态链接库”(Dynamic Link Library)的新技术,它同样也是使用库文件,DLL的名字就是这样来的。动态链接本身和静态链接没什么区别,也是把通用代码写进一些独立文件里,但是在编译方面,微软把库文件做成已经编译好的程序文件,给它们开发一个交换数据的接口。程序员编写程序的时候,一旦要使用某个库文件的一个功能函数,系统就把这个库文件调入内存,连接上这个程序占有的任务进程,然后执行程序要用的功能函数,并把结果返回给程序显示出来。完成需要的功能后,这个DLL停止运行,整个调用过程结束。微软让这些库文件能被多个程序调用,实现了比较完美的共享,程序员无论要写什么程序,只要在代码里加入对相关DLL的调用声明就能使用它的全部功能。这样,写出来的程序就不能再携带一大堆无用的垃圾了。

  DLL技术的诞生,使编写程序变成一件简单的事情,Windows为我们提供了几千个函数接口,足以满足大多数程序员的需要。而且,Windows系统自身就是由几千个DLL文件组成,这些DLL相互扶持,组成了庞大的Windows系统。如果Windows依然使用静态链接技术,那将是不可想象的。

  二、什么是API

  在前面提到的“接口”又是什么呢?因为DLL不能像静态库文件那样塞进程序里,如何让程序知道实现功能的代码和文件成了问题,微软就为DLL技术做了标准规范,为每个DLL文件都明确地标注好它的功能名称,程序只要根据标准规范找到相关的名称进行调用就行了,这就是API(Application Programming Interface)应用程序接口,每个DLL带的接口都不尽相同,最大限度地减少了程序代码的重复。在Windows里,最基本的3个DLL文件是kernel32.dll、user32.dll、gdi32.dll。它们共同构成了基本的系统框架。

  三、DLL与木马

  DLL是编译好的代码,与一般程序没什么大差别,只是它不能独立运行,需要程序调用。那么,DLL与木马能扯上什么关系呢?如果你学过编程并且写过DLL,就会发现,其实DLL的代码和其他程序几乎没什么两样,仅仅是接口和启动模式不同,只要改动一下代码入口,DLL就变成一个独立的程序了。

  当然,DLL文件是没有程序逻辑的,其实DLL并不等于EXE。不过,依然可以把DLL看做缺少了main入口的程序,DLL带的各个功能函数可以看作一个程序的几个函数模块。DLL木马就是把一个实现了木马功能的代码,加上一些特殊代码写成DLL文件,导出相关的API,在别人看来,这只是一个普通的DLL,但是这个DLL却携带了完整的木马功能,这就是DLL木马的概念。也许有人会问,既然同样的代码就可以实现木马功能,那么直接做程序就可以,为什么还要多此一举写成DLL呢?这是为了隐藏,因为DLL运行时是直接挂在调用它的程序的进程里的,并不会另外产生进程,所以相对于传统EXE木马来说,它很难被查到。

  四、DLL的运行

  虽然DLL不能自己运行,可是Windows在加载DLL的时候,需要一个入口函数,就如同EXE的main一样,否则系统无法引用DLL。所以根据编写规范,Windows必须查找并执行DLL里的一个函数DllMain作为加载DLL的依据,这个函数不作为API导出,而是内部函数。DllMain函数使DLL得以保留在内存里,有的DLL里面没有DllMain函数,可是依然能使用,这是因为Windows在找不到DllMain的时候,会从其它运行库中找一个不做任何操作的缺省DllMain函数启动这个DLL使它能被载入,并不是说DLL可以放弃DllMain函数。

五、DLL木马技术分析
  到了这里,大家也许会想,既然DLL木马有那么多好处,以后写木马都采用DLL方式不就好了吗?话虽然是这么说没错,但是编写DLL木马并不是一些人想象的那么容易写的。要写一个能用的DLL木马,需要了解更多关于操作系统底层的知识。

  1.木马的主体

  千万别把木马模块写得真的像个API库一样,这不是开发WINAPI。DLL木马可以导出几个辅助函数,但是必须有一个过程负责主要执行代码,否则这个DLL只能是一堆零碎API函数,别提工作了。如果涉及一些通用代码,可以在DLL里写一些内部函数,供自己的代码使用,而不是把所有代码都开放成接口,这样它自己本身都难调用了,更不可能发挥作用。

  DLL木马的标准执行入口为DllMain,所以必须在DllMain里写好DLL木马运行的代码,或者指向DLL木马的执行模块。

  2.动态嵌入技术

  Windows中,每个进程都有自己的私有内存空间,别的进程是不允许对这个私人领地进行操作的,但是,实际上我们仍然可以利用种种方法进入并操作进程的私有内存,这就是动态嵌入,它是将自己的代码嵌入正在运行的进程中的技术。动态嵌入有很多种,最常见的是钩子、API以及远程线程技术,现在的大多数DLL木马都采用远程线程技术把自己挂在一个正常系统进程中。其实动态嵌入并不少见,罗技的MouseWare驱动就挂着每一个系统进程。远程线程技术就是通过在另一个进程中创建远程线程(RemoteThread)的方法进入那个进程的内存地址空间。在DLL木马的范畴里,这个技术也叫做“注入”,当载体在那个被注入的进程里创建了远程线程并命令它加载DLL时,木马就挂上去执行了,没有新进程产生,要想让木马停止惟有让挂接这个木马DLL的进程退出运行。但是,很多时候我们只能束手无策——它和Explorer.exe挂在一起了。

  3.木马的启动

  也许您会有这样的想法,直接把这个DLL加入系统启动项目不就可以了?“NO”!前面已经介绍过,DLL不能独立运行,所以无法在启动项目里直接启动它。要想让“马儿”顺利地跑起来,就需要一个EXE使用动态嵌入技术让DLL挂上其他正常进程,让被嵌入的进程调用这个DLL的DllMain函数,激活木马运行,最后启动木马的EXE结束运行,木马启动完毕。启动DLL木马的EXE非常重要,它被称为加载(Loader)。所以,一个相对比较成熟的DLL木马会想办法保护它的Loader不会那么容易被发现和毁灭。

  Loader可以是多种多样的,Windows的rundll32.exe也被一些DLL木马用来做了Loader,这种木马一般不带动态嵌入技术,它直接挂着rundll32进程运行,用rundll32的方法像调用API一样去引用这个DLL的启动函数激发木马模块开始执行,即使你杀了rundll32,木马本体还是在的,一个最常见的例子就是3721中文实名,虽然它不是木马。

  注册表的AppInit_DLLs键也被一些木马用来启动自己,如求职信病毒。利用注册表启动,就是让系统执行DllMain来达到启动木马的目的。因为它是kernel调入的,对这个DLL的稳定性有很大要求,稍有错误就会导致系统崩溃,所以很少看到这种木马。有一些更复杂点的DLL木马通过svchost.exe启动,这种DLL木马必须写成NT-Service,入口函数是ServiceMain,一般很少见,但是这种木马的隐蔽性也不错,而且Loader有保障。

  4.寥寥无几

  到这里大家也应该对DLL木马有个了解了,是不是很想写一个?别急,不知道大家想过没有,既然DLL木马这么好,为什么到现在能找到的DLL木马寥寥无几?现在让我来泼冷水,最重要的原因只有一个:由于DLL木马挂着系统进程运行,如果它本身写得不好,例如没有防止运行错误的代码或者没有严格规范用户的输入,DLL就会很容易出错并崩溃。但是DLL崩溃会导致它挂着的程序跟着遭殃,别忘记它挂接的可是系统进程啊,结局就是……惨不忍睹。所以写一个能公布的DLL木马,在排错检查方面做的工作要比一般的EXE木马多,甚至写得多了连编写者自己都会烦躁不已!

  六、DLL木马的发现和查杀

  经常看看启动项有没有多出莫名其妙的项目,这是Loader的所在。而DLL木马本体比较难发现,需要用户有一定编程知识和分析能力,在Loader里查找DLL名称,或者从进程里看有没有挂接什么陌生的DLL!但是,对于一些计算机的初级用户来说,这样的发现过程是非常困难的!因此,最简单的方法:杀毒软件和防火墙,这虽然不是万能的解决之道,但是对于不了解系统原理,没有编程经验的新手来说,总算是一种权宜之计吧!
 
揭秘图片病毒技术的内幕 被诅咒的油画
 
作者:admin    文章来源:转载    点击数:124    更新时间:2007-9-22
 
 

引言:图片病毒已经不是一个新鲜的话题, 随着病毒技术的发展,图片同样也是病毒的载体。

  一、被病毒诅咒的油画

  在网络上流传着一幅诡异的油画,据说很多人看后会产生幻觉,有人解释为油画的构图色彩导致的视觉刺激,也有人认为是心理作用,众说纷纭,却没有令人信服的答案。在网络公司上班的秘书小王也从一个网友那里得知了这幅画,她马上迫不及待的点击了网友给的图片连接。图片出来了,小王终于见识到了传说中诡异的油画,面对着屏幕上那两个看似正常的孩子,她却觉得背后凉飕飕的。那网友也很热心的和她聊这幅画的来源,小王入神的听着,丝毫没有注意到IE浏览器左下角的状态栏打开页面的进度条一直没停止过。

 

图片仅供参考

  如果说小王刚才只是背后发冷的话,那么现在她已经是全身发冷了:电脑光驱自动弹了出来,刚按回去又弹了出来,她着急的请教那个网友,那边很平静的说:“哦,也许是光驱坏了吧,我有事先下了,你找人修一下。”然后头像暗了。

  小王已经无法回复他的话了:鼠标正在不听使唤的乱跑,键盘也没了反应,过了一会儿,电脑自己重启了,而且永远停留在了“NTLDRismissing…”的出错信息上。

  显而易见,这又是一个典型的木马破坏事件,但是小王打开的是图片,难道图片也会传播病毒了?答案很简单也很出人意料:小王打开的根本不是图片。

  IE浏览器的功能很强大,它可以自动识别并打开特定格式的文件而不用在乎它是什么文件后缀名,因为IE对文件内容的判断并不是基于后缀名的,而是基于文件头部和MIME。当用户打开一个文件时,IE读取该文件的头部信息并在本机注册表数据库内查找它对应的MIME格式描述,例如打开一个MIDI文件,IE先读取文件前面一段数据,根据MIDI文件的标准定义,它必须包含以“RIFF”开头的描述信息,根据这段标记,IE在注册表定位找到了“x-audio/midi”的MIME格式,然后IE确认它自己不具备打开这段数据的能力,所以它根据注册表里的文件后缀名信息找到某个已经注册为打开后缀名为“.MID”的文件,然后提交给此程序执行,我们就看到了最终结果。

  正是因为这个原理,所以IE很容易受伤。入侵者通过伪造一个MIME标记描述信息而使网页得以藏虫,在这里也是相同的道理,小王打开的实际上是一个后缀名改为图片格式的HTML页面,它包含上述两个漏洞的病毒文件和一个高度和宽度都设置为100%的图片IMG标记,所以在小王看来,这只是一个图片文件,然而,图片的背后却是恶毒的木马。木马程序体积都比较大,下载需要一定时间,这就是IE进度条一直没停止的原因。入侵者为了确保受害者打开页面的时间可以使整个木马文件下载完毕,就采用了社会工程学,让受害者不会在很短的时间内关闭页面,当木马下载执行后,“图片”的诅咒就应验了。

二、位图特性的悲哀
  他是一家公司的网络管理员,在服务器维护和安全设置方面有足够多的经验,因此他无需惧怕那些利用浏览器漏洞实现的病毒。这天他在一个技术论坛里看到一个网友发的关于AMD某些型号的处理器存在运算瑕庇的帖子,并给出一个测试页面连接,根据官方描述,如果你用的CPU存在瑕庇,那么你会看到页面上的测试图片显示得破损错乱。他心里一惊:自己用的CPU正是这个型号。他马上点击了页面连接。 
 
  看着页面上乱七八糟的一幅图片,他心里凉了一截:这台机器的CPU居然有问题,而他还要用这台机器处理公司的重要数据的!他马上去管理部找负责人协商,把显示着一幅胡里花哨图片的机器晾在一边。 

  管理部答应尽快给他更换一台机器,让他把硬盘转移过去,因为上面有重要的业务资料。他回来时看到那幅图片还在耀武扬威,他厌恶的关闭了页面,照例打开存放资料的文件夹,他的脑袋一下子空白了:资料不见了!谁删除了?他慌乱的查找硬盘每个角落,可那些文件却像蒸发了一样。许久,他终于反应过来了:机器被入侵了!他取下硬盘直奔数据恢复公司而去。

  事后他仔细分析了原因,因为机器已经通过了严格的安全测试而且打了所有补丁,通过网页漏洞和溢出攻击是不可能的了,唯一值得怀疑的只有那个所谓的瑕庇测试网页了,他迅速下载分析了整个页面代码,看着页面源代码里后缀名为“.BMP”的IMG标记和一堆复杂的脚本代码,他知道自己是栽在了BMP木马的手上。

  那幅“测试瑕庇”的图片,无论到什么机器上都是一样有“瑕庇”,因为它根本不是图片文件,而是一个以BMP格式文件头部开始的木马程序。

  为什么看似温顺的图片文件也变成了害人的凶器?这要从位图(Bitmap)格式说起,许多朋友应该都知道流传了很久的被称为“图片藏字”的“密文”传播方式,即在位图文件尾部追加一定量的数据而不会对原位图文件造成太大破坏,这是位图格式的限制宽松而造成的。系统判断一个位图文件的方法并不是严格盘查,而是仅仅从文件头部的54字节里读取它的长宽、位数、文件大小、数据区长度就完成了图片的识别,宽松的盘查机制使得BMP木马得以诞生。  不过先要澄清一点概念,BMP木马并不是在BMP位图文件屁股后追加的EXE文件,而是一个独立的EXE可执行文件,但是它的文件PE头部已经用位图文件头部替换了,由于系统的盘查机制,这个EXE文件就被浏览器认成位图文件了。既然是位图,在浏览器的程序逻辑里,这是需要下载到Internet高速缓存文件夹然后显示在页面上的文件,但是因为这个文件本来就不是位图,它被强制显示出来以后自然会变成一堆无意义的垃圾数据,在用户眼里,它就成了一幅乱七八糟的图像。但这不是引起木马危机的原因,要留意的是这些文字:“需要下载到Internet高速缓存文件夹”!这说明浏览器已经请狼入室了——木马已经在硬盘上安家了,但是目前它还在沉睡中,因为它的文件头部被改为位图格式,导致它自身已经不能运行,既然不能运行,理所当然就不能对系统构成危害,那么这只狼在硬盘呆多久也是废物一个,入侵者当然不能任由它浪费,因此他们在做个页面给浏览器下载木马的同时,也会设置页面代码让浏览器帮忙脱去这只狼的外衣——把位图格式头部换成可执行文件的PE头部,然后运行它。经过这些步骤,一只恶狼进驻了系统。

  这个无法修补的漏洞十分可怕,用户很难知道他们正在浏览的页面是否正在偷偷下载着木马数据,因为即使他们打好了所有补丁也无济于事,木马是被IE“合法”下载的,不属于代码漏洞,而且单靠程序本身也很难判断这个图像是不是木马程序,机器靠二进制完成处理工作,而不是视网膜成象交给大脑判断。但是,由于这也是需要下载文件的入侵方式,它能否下载完毕以及用户愿不愿意去看页面就要取决于入侵者的社会工程学了,在任何一个页面里放出一个乱七八糟的图片或者来一个隐藏的图片框都不是最明智的选择,除非利用一些“暇庇声明”或更能引起人的兴趣的伎俩。那家公司的网管之所以会这么不设防,就是因为攻击者偷用了人们的“心理盲区”,因为人们对安全、漏洞、病毒、暇庇等内容会特别敏感,所以入侵者发个专业暇庇案例就欺骗了一大堆人,这次是拿真实的事件:AMD某些型号CPU会导致图像显示出问题的暇庇来做鱼饵,下一次又该拿什么了呢?

三、病毒魔鬼的诅咒
  对于某娱乐论坛的大部分用户来说,今天是个黑色的日子,因为他们在看过一个《被诅咒的眼睛》油画帖子后,系统遭到了不明原因的破坏。
 
  论坛管理层的技术人员立即对这个帖子进行了多次分析,可是整个页面就只有一个JPEG图片的连接,其他恶意代码和程序根本不存在。入侵者靠什么破坏了看帖用户的机器?难道竟是这个JPEG图片? 
  答案恐怕让人难以接受,的确就是这幅JPEG图片让用户感染了病毒。尽管病毒研究一直未曾停止,可是发展到这个地步,实在让人不能承受:再下去是不是打开一个文本文件都会被感染病毒? 

  图片带毒来袭,实在让所有人都擦了一把汗,然而我们都知道,JPEG、GIF等格式图片不具备可以执行自身并散播病毒的条件,这不符合逻辑。回忆一下2004年9月14日的事,微软发布了MS04-028安全公告:JPEG处理(GDI+)中的缓冲区溢出可能使代码得以执行。没错,就是这个漏洞,它的术语叫GDI+,对应的动态链接库为GdiPlus.dll,这是一种图形设备接口,能够为应用程序和程序员提供二维媒介图形、映像和版式,大部分Windows程序都调用这个DLL完成JPEG格式图片的处理工作。但是现在,正是这个“公众人物”成了众矢之的。  
 
  说到这里,有基础的读者应该明白了吧:并不是图片自己能传播病毒,而是系统负责图形处理工作的模块会在处理图片时发生溢出导致图片内携带的恶意指令得以执行破坏。如果某个图片工具不调用这个系统模块,而是使用自己的处理模块,那么同样包含恶意指令的图片就不能达到破坏目的。但是因为这个系统模块是默认的处理模块,所以大部分程序在“JPEG病毒”面前纷纷落马。

  这个溢出是怎么产生的呢?这要从系统如何读取JPEG格式图形的原理说起,系统处理一个JPEG图片时,需要在内存里加载JPEG处理模块,然后JPEG处理模块再把图片数据读入它所占据的内存空间里,也就是所说的缓冲区,最后我们就看到了图片的显示,然而就是在图片数据进入缓冲区的这一步出了错——Windows规定了缓冲区的大小,却没有严格检查实际容纳的数据量,这个带缺陷的边界检查模式导致了噩梦:入侵者把一个JPEG图片的数据加工得异常巨大并加入恶意指令,那么这个图片在系统载入内存时候会发生什么情况呢?图片数据会涨满整个JPEG处理模块提供的缓冲区并恰好把恶意指令溢出到程序自身的内存区域,而这部分内存区域是用于执行指令的,即核心区,于是恶意指令被程序误执行了,入侵者破坏系统或入侵机器的行为得以正常实施。有人也许会疑惑,入侵者都是神算子吗,他们为什么能准确的知道会是哪些数据可以溢出执行?答案很简单,因为Windows在分配JPEG处理模块的空间时,给它指定的内存起始地址是固定的,入侵者只要计算好这个空间大小,就能知道会有哪些数据被执行了,所以JPEG病毒迅速传播起来。 
 
  所谓JPEG病毒,并不是JPEG图片能放出病毒,而是系统处理JPEG图片的模块自己执行了JPEG图片携带的病毒,所以我们大可不必人心惶惶,只要补上了GDIPLUS.DLL的漏洞,那么即使你机器上的所有JPEG图片都带有病毒数据,它们也无法流窜出来搞破坏,正如美国马萨诸塞州立大学助理教授奥斯汀所言:“病毒不仅仅是可自我复制的代码,他们需要通过可执行代码的方式来进行传播。JPEG文件不能执行代码,他们是由应用软件打开的数据文件。应用软件不会去查找数据文件中的可执行的代码,为此不会运行这些病毒代码。”

  四、防范

  对于虚假图片文件的欺骗手法,只要用户补上了MIME和IFRAME漏洞,那么入侵者让你停留多久也无济于事;至于BMP木马,它的防范是几乎不可避免,但是它有个最大的弱点,大部分情况下只能在Win9x环境正常执行,用Win2000以上的用户不必草木皆兵了;而对于JPEG病毒来说更好办了,微软已经提供JPEG模块的更新了,你倒是去补一下啊!即使真的一点也不会,买个防病毒软件在后台监视也OK了,但是为什么国内用户却偏偏喜欢徒劳的恐慌? 

  纵观这一系列图片病毒的原理和手法,我们可以发现“社会工程学”这个身影的扩大化趋势。如何避免被骗,这只能看你自己了