越狱检测/越狱检测绕过—xCon

一直忽略了越狱检测与越狱检测绕过的问题,因为我认为在app争抢装机率的环境下,是不会在乎对方的设备越狱与否的。但很显然,我忽略了一个问题,app在设计的时候或许会依照设备是否越狱而采取不同的流程,比如说对越狱的设备采取更多的安全措施,在这种场景下,越狱检测是否可靠就成为了关键问题。本篇文章主要介绍越狱检测的常见方法(并配有相应的测试代码),以及最流行的越狱检测绕过插件xCon(会分析该工具会绕过哪些检测方法),最后总结了个人认为的比较可靠的越狱检测方法。

一、越狱检测

(一)《Hacking and Securing iOS Applications》这本书的第13章介绍了以下方面做越狱检测
1. 沙盒完整性校验
根据fork()的返回值判断创建子进程是否成功
(1)返回-1,表示没有创建新的进程
(2)在子进程中,返回0
(3)在父进程中,返回子进程的PID
沙盒如何被破坏,则fork的返回值为大于等于0.
我在越狱设备上,尝试了一下,创建子进程是失败,说明不能根据这种方法来判断是否越狱。xCon对此种方法有检测
代码如下:
1344605963764714110

2. 文件系统检查
(1)检查常见的越狱文件是否存在
以下是最常见的越狱文件。可以使用stat函数来判断以下文件是否存在

/Library/MobileSubstrate/MobileSubstrate.dylib 最重要的越狱文件,几乎所有的越狱机都会安装MobileSubstrate

/Applications/Cydia.app/ /var/lib/cydia/绝大多数越狱机都会安装

/var/cache/apt /var/lib/apt /etc/apt

/bin/bash /bin/sh

/usr/sbin/sshd /usr/libexec/ssh-keysign /etc/ssh/sshd_config

代码如下

6597697587796059517

(1)返回0,表示指定的文件存在
(2)返回-1,表示执行失败,错误代码存于errno中
错误代码:
ENOENT         参数file_name指定的文件不存在
ENOTDIR        路径中的目录存在但却非真正的目录
ELOOP          欲打开的文件有过多符号连接问题,上限为16符号连接
EFAULT         参数buf为无效指针,指向无法存在的内存空间
EACCESS        存取文件时被拒绝
ENOMEM         核心内存不足
ENAMETOOLONG   参数file_name的路径名称太长
struct stat {
dev_t         st_dev;       //文件的设备编号
ino_t         st_ino;       //节点
mode_t        st_mode;      //文件的类型和存取的权限
nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
uid_t         st_uid;       //用户ID
gid_t         st_gid;       //组ID
dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
off_t         st_size;      //文件字节数(文件大小)
unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
unsigned long st_blocks;    //块数
time_t        st_atime;     //最后一次访问时间
time_t        st_mtime;     //最后一次修改时间
time_t        st_ctime;     //最后一次改变时间(指属性)
};
该方法最简单,也是流程最广的,但最容易被破解。在使用该方法的时候,注意使用底层的c函数 stat函数来判断以下路径名,路径名做编码处理(不要使用base64编码),千万不要使用NSFileManager类,会被hook掉

 

(2) /etc/fstab文件的大小
该文件描述系统在启动时挂载文件系统和存储设备的详细信息,为了使得/root文件系统有读写权限,一般会修改该文件。虽然app不允许查看该文件的内容,但可以使用stat函数获得该文件的大小。在iOS 5上,未越狱的该文件大小未80字节,越狱的一般只有65字节。
代码如下
6597704184865825988
在安装了xCon的越狱设备上运行,result的大小为803705776 ;卸载xCon后在越狱设备上运行,result的大小为66
个人觉得该方法不怎么可靠,并且麻烦,特别是在app在多个iOS版本上运行时。xCon对此种方法有检测,不能采用这种办法
(3)检查特定的文件是否是符号链接文件
iOS磁盘通常会划分为两个分区,一个只读,容量较小的系统分区,和一个较大的用户分区。所有的预装app(例如appstore)都安装在系统分区的/Application文件夹下。在越狱设备上,为了使得第三方软件可以安装在该文件夹下同时又避免占用系统分区的空间,会创建一个符号链接到/var/stash/下。因此可以使用lstat函数,检测/Applications的属性,看是目录,还是符号链接。如果是符号链接,则能确定是越狱设备。
以下列出了一般会创建符号链接的几个文件,可以检查以下文件
6598150586586535859

代码如下:

6597655806354205806
没有检测过未越狱设备的情况,所以不好判断该方法是否有效
(二)http://theiphonewiki.com/wiki/index.php?title=Bypassing_Jailbreak_Detection 给出了以下6种越狱监测方法
1、检测特定目录或文件是否存在
检测文件系统是否存在越狱后才会有的文件,例如/Applications/Cydia.app, /privte/var/stash
一般采用NSFileManager类的- (BOOL)fileExistsAtPath:(NSString *)path方法(很容易被hook掉)
或者采用底层的C函数,例如fopen(),stat() or access()
《Hacking and Securing iOS Applications》的方法2文件系统检查相同
xCon对此种方法有检测
2、检测特定目录或文件的文件访问权限
检测文件系统中特定文件或目录的unix文件访问权限(还有大小),越狱设备较之未越狱设备有太多的目录或文件具备写权限
一般采用NSFileManager类的- (BOOL)isWritableFileAtPath:(NSString *)path(很容易被hook掉)
或者采用底层的C函数,例如statfs()
xCon对此种方法有检测
3、检测是否能创建子进程
检测能否创建子进程,在非越狱设备上,由于沙箱保护机制,是不允许进程的
可以调用一些会创建子进程的C函数,例如fork(),popen()
《Hacking and Securing iOS Applications》的方法1沙盒完整性检查相同
xCon对此种方法有检测
4、检测能否执行ssh本地连接
检测能否执行ssh本地连接,在绝大多数的非越狱设备上,一般会安装OpenSSH(ssh服务端),如果能检测到ssh 127.0.0.1 -p 22连接成功,则说明为越狱机
xCon对此种方法有检测
5、检测system()函数的返回值
检测system()函数的返回值,调用sytem()函数,不要任何参数。在越狱设备上会返回1,在非越狱设备上会返回0
sytem()函数如果不要参数会报错
6597409515750961892
6、检测dylib(动态链接库)的内容

这种方法是目前最靠谱的方法,调用_dyld_image_count()和_dyld_get_image_name()来看当前有哪些dylib被加载

测试结果:
使用下面代码就可以知道目标iOS设备加载了哪些dylib

#include

#import

#import

#import


void printDYLD()

{

//Get count of all currently loaded DYLD


uint32_t count = _dyld_image_count();


for(uint32_t i = 0; i < count; i++)


{


//Name of image (includes full path)


const char *dyld = _dyld_get_image_name(i);

//Get name of file


int slength = strlen(dyld);

 

int j;


for(j = slength – 1; j>= 0; –j)


if(dyld[j] == ‘/’) break;

 

printf(“%s\n”,  dyld);


}


printf(“\n”);


}


int main(int argc, char *argv[])

{


printDYLD();

 

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];


int retVal = UIApplicationMain(argc, argv, nil, nil);


[pool release];


return retVal;


}

下图显示了我的iOS设备当前加载的dylib的路径,最下面就可以看到xCon

6597237991936914762
此种方法存在一个问题,是否能通过app store审核呢?
二、越狱检测绕过——xCon
可以从Cydia中安装,是目前为止最强大的越狱检测工具。由n00neimp0rtant与Lunatik共同开发,它据说patch了目前所知的所有越狱检测方法(也有不能patch的应用)。估计是由于影响太大了,目前已不开放源码了。
安装xCon后,会有两个文件xCon.dylib与xCon.plist出现在设备/Library/MobileSubstrate/DynamicLibraries目录下
(1)xCon.plist
该文件为过滤文件,标识在调用com.apple.UIKit时加载xCon.dylib
6597805339935558059
(2) xCon.dylib
可以使用otool工具将该文件的text section反汇编出来从而了解程序的具体逻辑(在windows下可以使用IDA Pro查看)

DANI-LEE-2:iostools danqingdani$ otool -tV xCon.dylib >xContextsection

可以根据文件中的函数名,同时结合该工具的原理以及越狱检测的一些常用手段(文章第一部分有介绍)来猜其逻辑,例如越狱检测方法中的文件系统检查,会根据特定的文件路径名来匹配,我们可以使用strings查看文件中的内容,看看会有哪些文件路径名。

DANI-LEE-2:IAP tools danqingdani$ strings xCon.dylib >xConReadable

以下是xCon中会匹配的文件名

/usr/bin/sshd
/usr/libexec/sftp-server
/usr/sbin/sshd

/bin/bash
/bin/sh
/bin/sw
/etc/apt
/etc/fstab
/Applications/blackra1n.app
/Applications/Cydia.app
/Applications/Cydia.app/Info.plist
/Applications/Cycorder.app
/Applications/Loader.app
/Applications/FakeCarrier.app
/Applications/Icy.app
/Applications/IntelliScreen.app
/Applications/MxTube.app
/Applications/RockApp.app
/Applications/SBSettings.app
/Applications/WinterBoard.app
/bin/bash/Applications/Cydia.app
/Library/LaunchDaemons/com.openssh.sshd.plist
/Library/Frameworks/CydiaSubstrate.framework
/Library/MobileSubstrate
/Library/MobileSubstrate/
/Library/MobileSubstrate/DynamicLibraries
/Library/MobileSubstrate/DynamicLibraries/
/Library/MobileSubstrate/DynamicLibraries/LiveClock.plist
/Library/MobileSubstrate/DynamicLibraries/Veency.plist
/Library/MobileSubstrate/DynamicLibraries/xCon.plist
/private/var/lib/apt
/private/var/lib/apt/
/private/var/lib/cydia
/private/var/mobile/Library/SBSettings/Themes
/private/var/stash
/private/var/tmp/cydia.log
/System/Library/LaunchDaemons/com.ikey.bbot.plist
/System/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist

NzI0MS9MaWJyYXJ5L01vYmlsZVN1YnN0cmF0ZQ==  (对应7241/Library/MobileSubstrate)

通过分析,xCon会绕过以下越狱检测方法

(1)    根据是否存在特定的越狱文件,及特定文件的权限是否发生变化来判断设备是否越狱

 

 

fileExistsAtPath:

fileExistsAtPath:isDirectory:

filePermission:

fileSystemIsValid:

checkFileSystemWithPath:forPermissions:

mobileSubstrateWorkaround

detectIllegalApplication:

(2)       根据沙箱完整性检测设备是否越狱

canUseFork

(3)       根据文件系统的分区是否发生变化来检测设备是否越狱

partitionsModified

(4)       根据是否安装ssh来判断设备是否越狱

ssh root@127.0.0.1

 

三、总结
总之,要做好越狱检测,建议使用底层的c语言函数进行,用于越狱检测的特征字符也需要做混淆处理,检测函数名也做混淆处理。第一部分介绍的以下三种方法,可以尝试一下
(1)检查常见的越狱文件是否存在,使用stat(),检查以下文件是否存在

/Library/MobileSubstrate/MobileSubstrate.dylib 最重要的越狱文件,几乎所有的越狱机都会安装MobileSubstrate

/Applications/Cydia.app/ /var/lib/cydia/绝大多数越狱机都会安装

/var/cache/apt /var/lib/apt /etc/apt

/bin/bash /bin/sh

/usr/sbin/sshd /usr/libexec/ssh-keysign /etc/ssh/sshd_config

(2)检查特定的文件是否是符号链接文件,使用lstat(),检查以下文件是否为符号链接文件

/Applications

/Library/Ringtones

/Library/Wallpaper

/usr/include

/usr/libexec

/usr/share

   (3)检差dylib(动态链接库)的内容,使用_dyld_image_count与_dyld_get_image_name,检查是否包含越狱插件的dylib文件

参考:
http://theiphonewiki.com/wiki/index.php?title=XCon
http://theiphonewiki.com/wiki/index.php?title=Bypassing_Jailbreak_Detection

WordPress 的 .htaccess 规则

原文:wpshout.com

我们知道 .htaccess 文件能轻松地强化你的博客,减少带宽并增加可用性。我曾经写过一篇简易的 .htaccess 教程:《四个例子实战讲解.htaccess文件rewrite规则》。如果你还想继续了解 .htaccess 文件,那么不妨看看下面这26个规则:

但是请先记住一条黄金法则:先备份,再折腾!

A – WP- Admin – 管理员页面

你可以限制访问 WP- Admin 页面的 IP 地址

1
2
3
order deny,allow
allow from a.b.c.d # This is your static IP
deny from all

来源 –BlogSecurity.net

B – Blacklist – 黑名单

.htaccess 的一个重要功能是你能把它作为 IP 黑名单来使用:

1
2
3
4
5

order allow,deny
allow from all
deny from 123.456.789

来源 – Perishable Press

C – WP-Config Protection – 保护 Config 页

WP-Config 文件里包含了你的数据库名、数据库用户名与密码。这样的文件你敢让别人看到吗?所以你会需要用 .htaccess 来保护它。

1
2
3
4
5
# protect wpconfig.php
order allow,deny
deny from all

来源 – Josiah Cole

D – Disable Directory Browsing – 禁止浏览目录

WP-Config 文件里包含了你的数据库名、数据库用户名与密码。这样的文件你敢让别人看到吗?所以你会需要用 .htaccess 来保护它。

1
2
# disable directory browsing
Options All -Indexes

来源- Josiah Cole

E – Explanation – 释疑

如果我问你 .htaccess 是什么,我猜你一定很难说明白。老实说,我自个儿也不明白。好在维基百科给了个明确的解释:

.htaccess 是Apache HTTP Server的文件目录系统级别的配置文件的默认的名字。它提供了在主配置文件中定义用户自定义指令的支持。

维基百科也给出了一些特定的例子,你可以访问:http://zh.wikipedia.org/w/index.php?title=.htaccess&variant=zh-cn 了解更多。

F – Feedburner – RSS烧制

Feedburner 是各位博主的好帮手,通过这个例子你能把原来的 RSS 地址转向到烧制后的地址。

1
2
3
4
5
6
7
# temp redirect wordpress content feeds to feedburner

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT}!FeedBurner [NC]
RewriteCond %{HTTP_USER_AGENT}!FeedValidator [NC]
RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds.feedburner.com/perishablepress [R=302,NC,L]

来源 – Perishable Press

G – Get an RSS Feed on a static page – 获取静态页的RSS

通过下面这个链接,你能学习到利用 .htaccess 获取静态页 RSS 的办法。

链接 – adityaspeaks.com

H – Disable hotlinking – 防止盗链

所谓盗链,就是别人私自用了你服务器上的图片、声音等文件,占用了你的带宽。你可以通过下面这个 .htaccess 规则来阻止盗链:

1
2
3
4
5
6
#disable hotlinking of images with forbidden or custom image option
RewriteEngine on
RewriteCond %{HTTP_REFERER}!^$
RewriteCond %{HTTP_REFERER}!^http://(www\.)?yourdomain.com/.*$ [NC]
#RewriteRule \.(gif|jpg)$ -[F]
#RewriteRule \.(gif|jpg)$ http://www.yourdomain.com/stealingisbad.gif [R,L]

来源 – Josiah Cole

I – Important! – 重要提示!

是啊,呵呵,“I”开头的词是有些难找,但是它同样重要,very Important!

备份,要记住备份。当你把东西搞得一团糟时,只有备份文件能救你!

J – Jauntily show the admin’s email address in error message

*抱歉,本词条有误*

K – Keep RSS ‘content thieves’ away – 防范“RSS小偷”

你一定不希望有人窃取你网站的内容吧?他们只要有你的 RSS 地址就能复制内容。如果你有对方网站的IP地址(怎么获取?很简单,google 它),就能屏蔽该网站对你的 RSS 的读取。如果有不止一家网站复制你的内容,你只要增加 IP 地址就行了。

1
2
3
RewriteEngine on
RewriteCond %{REMOTE_ADDR}^69.16.226.12
RewriteRule ^(.*)$ http://newfeedurl.com/feed

来源 – Seo Black Hat

L – Limiting number of simultaneous connections – 限制并发连接数

如果你要限制并发连接数(就是同时访问你的网站的人数),就使用下面这个代码。

1 MaxClients < number-of-connections>

M – Maintenance – 制作临时维护页面

无论什么原因,可能是维护、更新,你都可能会要暂时停止你的网站。这时你就需要一个维护页。无论访客访问的是你网站的任一 URL 还是 IP 地址,都能转向到维护页面。

1
2
3
4
RewriteEngine on
RewriteCond %{REQUEST_URI}!/maintenance.html$
RewriteCond %{REMOTE_ADDR}!^123\.123\.123\.123
RewriteRule $ /maintenance.html[R=302,L]

来源 – CatsWhoCode/Woueb.net

N – Deny no referer requests [stop spam comments!] – 拒绝垃圾留言!

这是一个比下文“S”词条更简便的防 Spam 方法。其原理是,如果留言者不公开来源,即是用机器留言的,就屏蔽之。就这么简单。

1
2
3
4
5
6
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
RewriteCond %{HTTP_REFERER}!.*yourblog.com.*[OR]
RewriteCond %{HTTP_USER_AGENT}^$
RewriteRule (.*)^http://%{REMOTE_ADDR}/$ [R=301,L]

来源 – WPRecipes

O – Force files when opening to ‘save as’ – 用“另存为”方式打开文档

有时候你空间里的一些文件,比如音乐、视频文件,点开后会有软件自动打开这个文件。如果你不想自动打开,这个规则能把文件强制为另存为方式下载。

1 AddType application/octet-stream .avi .mpg .mov .pdf .xls .mp4

来源 – AskApache

P – Protect your .htaccess file – 保护 .htaccess 文件

如果你的博客已经做好的十足的防护措施,是不是也要考虑一下保护你的 .htaccess 文件呢?黑客也可能通过这个文件发起攻击。下面这个规则能禁止下载 .htaccess 文件。

1
2
3
4
5
6
# STRONG HTACCESS PROTECTION
\.([Hh][Tt][Aa])”>
order allow,deny
deny from all
satisfy all

来源 – Perishable Press

Q – Quicken your site’s loading time by caching – 设置缓存

下面这个链接有详细的教程,教你如何给 WordPress 博客设置缓存。

链接 – Samaxes

R – Redirect to other pages on your site – 301重定向

1 RedirectMatch 301^/blog/.*$ http://domain.tld/target.html

来源 – Perishable Press

S – Spam! – 阻止垃圾留言

通过 .htaccess 来禁止 Spam 是个好办法。下面这个链接给出了一个 Spam 黑名单,复制到你的 .htaccess 里,你就能防止绝大部分的垃圾留言。

来源 – perishablepress.com

T – Set the Timezone of the server – 设置服务器时区

译者:代码给出的是把TZ值设置为美国时间的代码,如果服务器在中国,你可以改为Asia/Shanghai。

1 SetEnv TZ America/Indianapolis

来源 – AskApache

U – Remove /category/ from your category URL – 简化 WP 分类页面地址

WordPress 的分类页面地址里有一个 /category/ ,会不会觉得这很多余呢?下面这个代码就能去掉它!

1 RedirectMatch 301^/category/(.+)$ http://www.askapache.com/$1

或者

1 RewriteRule ^category/(.+)$ http://www.askapache.com/$1 [R=301,L]

来源 – AskApache

V – Valiantly automatically fix URL spelling mistakes – 修复错误地址

这个代码能自动检查英文地址的拼写错误。

1
2
3

CheckSpelling On

来源 – Vortex Mind

W – Redirect from http://Www.whatever to http://Whatever – 去掉网址前面的www.

使用301转跳,实现网址标准化。

1
2
3
4
5
# permanently redirect from www domain to non-www domain
RewriteEngine on
Options +FollowSymLinks
RewriteCond %{HTTP_HOST}^www\.domain\.tld$ [NC]
RewriteRule ^(.*)$ http://domain.tld/$1 [R=301,L]

来源 – Stupid htaccess tricks

X – Make your wp-login.php page Xenophobic – 限制他人访问 wp-login

Xenophobic: “排外,仇视陌生人”

我觉得你应该适当使用这个规则。如果你不是多人博客,可以限制他人访问登录页面,以达到更高的安全性。

1
2
3
4
5

Order deny,allow
Deny from All
Allow from 123.456.789.0

来源 – Reaper-X

Y – Easily rename your .htaccess file – 重命名 .htaccess 文件

如果你的服务器不接受以句点开头的文件怎么办?重命名它呗!下面这个代码能实现 .htaccess 文件的重命名。

1
2
# rename htaccess files
AccessFileName ht.access

来源 – Perishable Press

Z – Say Zygote in your .htaccess file – 在 .htaccess 里写注释

你可能会想在 .htaccess 文件里做些解释,好让别人能看懂。那怎么做注释呢?请看下面的代码:

1 # see -thisis a comment - you can only use letters and numbers and - and _ That is why there are no commas

要注意的是注释里只能写字母、数字与下划线

译者后记:原文的作者看样子也是经过收集才写成这篇文章的。如果你看了原文,请你注意,原文的有些代码里有一些多余或错误代码。我在本译文里都已做了修正。

WordPress优化之设置浏览器端缓存:Leverage browser caching

网站上的静态内容,诸如:图片、CSS、JS、flash等,一般变动很小,甚至几个月都不会有所更改,这些体积庞大的静态内容占据了大部分网页加载时间。如何降低静态内容加载时间,甚至不需要(二次)加载静态内容,Leverage browser caching(浏览器端缓存)可以有效地解决这一问题,他使得浏览器可以缓存静态内容,使得浏览器不需要二次加载这些内容。

实现方法很简单,向.htaccess文件中添加以下代码:

#Expire Header
ExpiresActive on
ExpiresByType text/css "access 1 month"
ExpiresByType text/plain "access 2 days"
ExpiresByType text/html  "access 2 days"
ExpiresByType application/javascript "access 1 month"
ExpiresByType image/jpeg "access 1 month"
ExpiresByType image/x-icon "access 1 month"
ExpiresByType image/gif "access 1 month"
ExpiresByType image/png "access 1 month"
ExpiresByType image/ico "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresDefault "access 1 month"

#Expire Header
ExpiresActive on //开启缓存
ExpiresByType text/css “access 1 month”//css文件缓存1个月
ExpiresByType text/plain “access 2 days”//纯文本内容缓存2天
ExpiresByType text/html “access 2 days”//html文件缓存2天
ExpiresByType application/javascript “access 1 month”//JS文件缓存1个月
ExpiresByType image/jpeg “access 1 month”//jpeg图片缓存1个月
ExpiresByType image/x-icon “access 1 month”//icon缓存1个月
ExpiresByType image/gif “access 1 month”//gif图片缓存一个月
ExpiresByType image/png “access 1 month”//png图片缓存一个月
ExpiresByType image/ico “access 1 month”//ico缓存1个月
ExpiresByType application/pdf “access 1 month”//pdf文件缓存一个月
ExpiresByType application/x-shockwave-flash “access 1 month”//flash缓存一个月
ExpiresDefault “access 1 month”// 默认(未提及的可缓存文件)缓存1个月

 

保存后刷新网页,用Yslow测试可以看到,绝大部分内容都被缓存了。也就是说:读者第一次打开网页加载所有静态文件,以后再访问该页面,就不需要加载了。如果其他页面也使用相同的静态文件(比如js和css),那么访问其他页面也会很快(直接在浏览器的缓存里提取相应的静态内容)。

读者第一次打开网页加载静态文件并缓存,以后再访问该页面,就不需要加载

该方法需要apache的mod_expires,Ubuntu下用a2enmod expires开启。

分析特征码修改技术

如果你想学习免杀技术:
1.基础的汇编语言
2.修改工具(不指那些傻瓜式软件)。如:
OllyDbg . PEditor. C32ASM . MYCCL复合特征码定位器。UE .OC. 资源编辑器等。还有一些查壳 脱壳软件(如:PEID RL脱壳机等) . 以下是常用的几种免杀方法及工具:
一、要使一个木马免杀
首先要准备一个不加壳的木马,这点非常重要,否则 免杀操作就不能进行下去。 然后我们要木马的内存免杀,从上面分析可以看出,目前的内存查杀,只有瑞星最强,其它杀毒软件内存查杀现在还不起作用所以我们只针对瑞星的内存查杀,要进行内存特征码的定位和修改,才能内存免杀。
二、对符其它的杀毒软件
比如江民,金山,诺顿,卡巴。我们可以采用下面的方法,或这些方面的组合使用。
1>.入口点加1免杀法。
2>.变化入口地址免杀法
3>.加花指令法免杀法
4>.加壳或加伪装壳免杀法。
5>.打乱壳的头文件免杀法。
6>.修改文件特征码免杀法。
第三部分:免杀技术实例演示部分
一、入口点加1免杀法:
1.用到工具:PEditor
2.特点:非常简单实用,但有时还会被卡巴查杀。
3.操作要点:用PEditor打开无壳木马程序,把原入口点加1即可。
二、变化入口地址免杀法:
1.用到工具:OllyDbg,PEditor
2.特点:操作也比较容易,而且免杀效果比入口点加1点要佳。
3.操作要点:用OD载入无壳的木马程序,把入口点的前二句移到零区域去执行,然后又跳回到入口点的下面第三句继续执行。最后用PEditor把入口点改成零区域的地址。
三、加花指令法免杀法:
1.用到工具:OllyDbg,PEditor
2.特点:免杀通用性非常好,加了花指令后,就基本达到大量杀毒软件的免杀。
3.操作要点:用OD打开无壳的木马程序,找到零区域,把我们准备好的花指令填进去填好后又跳回到入口点,保存好后,再用PEditor把入口点改成零区域处填入花指令的着地址。
四、加壳或加伪装壳免杀法:
1.用到工具:一些冷门壳,或加伪装壳的工具,比如木马彩衣等。
2.特点:操作简单化,但免杀的时间不长,可能很快被杀,也很难躲过卡巴的追杀。
3.操作要点:为了达到更好的免杀效果可采用多重加壳,或加了壳后在加伪装壳的免杀效果更佳。
五、打乱壳的头文件或壳中加花免杀法:
1.用到工具:秘密行动 ,UPX加壳工具。
2.特点:操作也是傻瓜化,免杀效果也正当不错,特别对卡巴的免杀效果非常好。
3.操作要点:首先一定要把没加过壳的木马程序用UPX加层壳,然后用秘密行动这款工具中的SCramble功能进行把UPX壳的头文件打乱,从而达到免杀效果。
六、修改文件特征码免杀法:
1.用到工具:特征码定位器,OllyDbg
2.特点:操作较复杂,要定位修改一系列过程,而且只针对每种杀毒软件的免杀,要达到多种杀毒软件的免杀,必需修改各种杀毒软件的特征码。但免杀效果好。
3.操作要点:对某种杀毒软件的特征码的定位到修改一系列慢长过程。
第四部分:快速定位与修改瑞星内存特征码
一、瑞星内存特征码特点:由于技术原因,目前瑞星的内存特征码在90%以上把字符串作为病毒特征码,这样对我们的定位和修改带来了方便。
二定位与修改要点:
1>.首先用特征码定位器大致定位出瑞星内存特征码位置
2>.然后用UE打开,找到这个大致位置,看看,哪些方面对应的是字符串,用0替换后再用内存查杀进行查杀。直到找到内存特征码后,只要把字符串的大小写互换就能达到内存免杀效果。
第五部分:木马免杀综合方案
修改内存特征码——>1>入口点加1免杀法——> 1>加压缩壳——>1>再加壳或多重加壳
2>变化入口地址免杀法 2>加成僻壳 2>加壳的伪装。
3>加花指令法免杀法 3>打乱壳的头文件
4>修改文件特征码免杀法
注:这个方案可以任意组合各种不同的免杀方案。并达到各种不同的免杀效果。
第六部分:免杀方案实例演示部分
1.完全免杀方案一:
内存特征码修改 + 加UPX壳 + 秘密行动工具打乱UPX壳的头文件。
2.完全免杀方案二:
内存特征码修改 + 加压缩壳 + 加壳的伪装 )
3.完全免杀方案三:
GD内存特征码修改 + 修改各种杀毒软件的文件特征码 + 加压缩壳
4.完全免杀方案四:
内存特征码修改 + 加花指令 + 加压壳
5.完全变态免杀方案五:
内存特征码修改 + 加花指令 + 入口点加1 + 加压缩壳UPX + 打乱壳的头文件
还有其它免杀方案可根据第五部分任意组合

修复数据库中被SyntaxHighlighter替换的特殊符号

< > " & '修改自http://quartergeek.com/fix-special-char-replaced-by-syntaxhighlighter

代码增加了单引号的替换,同时增加几个变量提醒用户修改。

自从换上了Crayon Syntax Highlighter,发现原来<>&”’符号被WP替换成了<  > " & ‘而Crayon Syntax Highlighter又不能转换,只好转回来,于是写了下面这个脚本,成功地替换回来了。

set_charset("utf8");
$result = $conn->query("SELECT post_content, ID FROM ".$ta);
$stmt = $conn->prepare("UPDATE ".$ta." SET post_content = ? WHERE ID = ?"); 

$search  = array("<", ">", """, "&", "'");
$replace = array("<"   , ">"   , "\""    , "&"    ,"'");
while ($row = $result->fetch_array())
{
  $id = $row['ID'];
  $post_content = str_replace($search, $replace, $row['post_content']);
  $stmt->bind_param('si', $post_content, $id);
  if (!$stmt->execute())
  {
    die("\n[ERROR!]".$id."\n");
  }
  else
  {
    echo "[Success]".$id."\n";
  }
}

$result->free();
$conn->close();
?>

 

PHP 使用 GeoLiteCity 库解析 IP 为地理位置

关于把 IP 地址转换为地理位置可以使用网络上很多的 API,好处就是不用在本地存储一个 IP 数据库,而且一般网络上的 IP 库会自动更新,不利的地方就是太依赖于网络,性能表现也可能会弱些。比如像下面的 API:

http://api.hostip.info/get_html.php?ip=58.63.236.31
http://api.hostip.info/flag.php?ip=58.63.236.31

这里介绍 PHP 如何使用 GeoLiteCity.dat 库把 IP 转换为地理位置,GeoLiteCity.dat 可以在 http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz 下,解压出 GeoLiteCity.dat,即可,我们可以手动去更新新的 IP 库。

下面 PHP 解析 IP 的过程参考自 WordPress 插件 Visitor Maps and Who’s Online 的实现。可以找到该插件的两个文件 include-whos-online-geoip.php 和 visitor-maps.php 告诉了我们怎么做。你可以点击这里的链接下载到这两个文件,我这里把 include-whos-online-geoip.php 改名为 geoipcity.inc.php,然后参考 visitor-maps.php 中的 get_location_info($user_ip) 函数,那么我们可以写出自己的解析 IP 地址的程序 resolve_ip.php:

city)) ? $record->city : '';  //城市
    $location_info['state_name']   = (isset($record->country_code) && isset($record->region)) //州名
          ? $GEOIP_REGION_NAME[$record->country_code][$record->region] : '';
    $location_info['state_code']   = (isset($record->region)) ? strtoupper($record->region) : ''; //州代号
    $location_info['country_name'] = (isset($record->country_name)) ? $record->country_name : '--'; //国家名
    $location_info['country_code'] = (isset($record->country_code)) ? strtoupper($record->country_code) : '--'; //国家代号
    $location_info['latitude']     = (isset($record->latitude)) ? $record->latitude : '0';   //维度
    $location_info['longitude']    = (isset($record->longitude)) ? $record->longitude : '0'; //经度
    //php 站点设置了 utf-8 字符集必要时进行转码
    $charset = 'utf-8';
    // this fixes accent characters on UTF-8, only when the blog charset is set to UTF-8
    if ( strtolower($charset) == 'utf-8' && function_exists('utf8_encode') ) {
        if ($location_info['city_name'] != '' ) {
            $location_info['city_name'] = utf8_encode($location_info['city_name']);
        }
        if ($location_info['state_name'] != '') {
            $location_info['state_name'] = utf8_encode($location_info['state_name']);
        }
        if ($location_info['country_name'] != '') {
            $location_info['country_name'] = utf8_encode($location_info['country_name']);
        }
    }
    return $location_info;
}
//查询一个 IP 测试下
$record = get_ip_record("206.19.49.154");
var_dump($record);
$location = get_location_info("206.19.49.154");
var_dump($location);
?>

执行后输出如下(可以作为系统脚本直接用 php resolve_ip.php 来执行):

object(geoiprecord_VMWO)#2 (10) {
  ["country_code"]=>
  string(2) "US"
  ["country_code3"]=>
  string(3) "USA"
  ["country_name"]=>
  string(13) "United States"
  ["region"]=>
  string(2) "TX"
  ["city"]=>
  string(10) "Richardson"
  ["postal_code"]=>
  string(5) "75080"
  ["latitude"]=>
  float(32.9722)
  ["longitude"]=>
  float(-96.7376)
  ["area_code"]=>
  int(972)
  ["dma_code"]=>
  float(623)
}
array(7) {
  ["city_name"]=>
  string(10) "Richardson"
  ["state_name"]=>
  string(5) "Texas"
  ["state_code"]=>
  string(2) "TX"
  ["country_name"]=>
  string(13) "United States"
  ["country_code"]=>
  string(2) "US"
  ["latitude"]=>
  float(32.9722)
  ["longitude"]=>
  float(-96.7376)
}

 

只要取你想要的数据就是了,里面还有诸如区号,邮编等数所,GeoLiteCity.dat 是个二进制文件,比普通文本要紧凑省空间。

不知道您有没有多留一份心,有无浏览链接:http://geolite.maxmind.com/download/geoip/api/php/,是这样的:

geopi_11

看到 GeoIp 给我们提供了不少的例子,那么多 sample.php,而实际上前面用到的 geoipcity.inc.php,就是 geopip.inc、geoipcity.inc 和 geoipregionvars.php 三个程序的内容合体。

再往上看:

geopi_21

官方提供的 API 何止 PHP 啊,几乎能全线满足您的实际需求了,c、java、perl、python、vb、ruby、tcl 等……,放其他程序里以后也不用愁了。

再进到 http://geolite.maxmind.com/download/geoip/database/ 瞧瞧:

geopi_31

正考虑着呢,不是说 IPv4 快用净了吗?IPv6 的数据也正为我们准备着呢?当然,天朝的 IPv9 恐怕永远不会有的。

本只是把 Visitor Maps and Who’s Online 里的解析 IP 的做法抽出来用用,可总能不断 深入再深入,不知道可喜还是可怕了。

其實很久以前就注意到,某些計數器可以很準確的判定IP來源的位置,甚至連所在城市都可以顯示出來
後來才知道是因為有GeoIP這樣的東西
MaxMind – GeoIP | IP Address Location Technology
這是MaxMind開發的東西,有不同平台的API和定期更新的”IP-位置”資料庫
如果要在網站上應用的話,可以找Apache module,perl和php的API

在Apache上面的模組叫”mod_geoip
さすが,租用的主機空間不可能給我隨便安裝模組,所以先在自己的電腦試…
不過仔細看才發現那檔案是linux上面用的,只有個c檔要自己make install
好吧…只好跳過…不想為了這東西去裝linux

再來試試perl,它的module是”Geo::IP
這也是要安裝的,所以先在自己的電腦試..
不過不知道是不是activeperl的版本問題,根本就裝不起來…orz
在目前的主機上面雖然可以自己安裝perl module,但是卻限制CPAN上面的東西,還好搜尋了一下就發現這個模組
Apache2::Geo::IP 
但是不知道為什麼,安裝到最後出現錯誤:

 CODE:
  CPAN.pm: Going to build R/RK/RKOBES/Apache-GeoIP-1.99.tar.gz

Please install either mod_perl 1 or mod_perl 2 first at Makefile.PL line 118.
No 'Makefile' created  RKOBES/Apache-GeoIP-1.99.tar.gz
/usr/bin/perl Makefile.PL PREFIX=/home/jwintaiw/perl/usr -- NOT OK
Running make install
Make had some problems, won't install

呃阿…orz
還好仔細看,發現主機裡面有預裝另外一個類似功能的”Geo::IPfree
它會從ip或主機名尋找之後回傳三個變數的陣列:二文字國碼,國家全名,IP
小試了一下可以動作,不過速度無敵慢!

最後嘗試PHP API
網頁上面有geoip和geoipcity兩種,前者是從ip/主機名尋找之後回傳二文字國碼和國家全名;後者是回傳更詳細的位置資訊,包含國家,程式和經緯度
不過兩者資料庫差很多,geoip需要的資料庫大約1MB附近,但是geocity的資料庫快30MB…|||
這邊照著該網頁上放的範例自己弄了一個測試的程式,有興趣可以試試…
http://snow-sugar.net/lookup.php (會放多久不確定,因為database太大)
同樣的東西也在自己電腦的自架網站動作確認,感覺大概像這樣
8184315216_f2s

其實最重要的應用不在這裡,而是可以利用辨識來源IP的國家進而讓server作不同的動作,例如台港的IP就自動轉入中文頁面,歐美的IP就自動轉入英文頁面,韓國的IP就block等等…因為IP對應位置的資料庫有持續更新,也讓誤動做的可能減少

Setting up awstats with apache 2 & geoip on debian-ubuntu

Awstats is a web log analyzer. It gives really useful statistics about traffic on your web sites.This log analyzer works as aCGI or from command line and shows you all possible information your log contains, in few graphical web Awstats Monthly Viewpages.

yesterday, it took me many hour to configure it on my server, I took help from many blogs to complete it.

Hope this can help someone.

1. Installing Awstats:

ab@web1:~$ sudo apt-get install awstats

This command will install awstats.Now we have to configure Apache.

2. Configuring Apache2:

Now make the following changes inawstats.conf file.

ab@web1:~$ sudo vi /etc/apache2/awstats.conf

Alias /awstatsclasses “/usr/share/awstats/lib/”
Alias /awstats-icon/ “/usr/share/awstats/icon/”
Alias /awstatscss “/usr/share/doc/awstats/examples/css”
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
ScriptAlias /awstats/ /usr/lib/cgi-bin/
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch

After, Making these changes, we have to include this file (/etc/apache2/awstats.conf) in to our apache.conf file, so we can access it over http.

ab@web1:~$ sudo vi /etc/apache2/apache2.conf

Include /etc/apache2/awstats.conf

Now, reload the apache.

ab@web1:~$  sudo /etc/init.d/apache2 reload

Now you can try to open http://www.mysite.com/awstats/awstats.pl but you will get this error:  Error: SiteDomain parameter not defined in your config/domain file. You must edit it for using this version of AWStats.

That means we have to configure Awstats.

3. Configuring Awstats:

By default awstats provides a default configuration file named /etc/awstats/awstats.conf. Copy this file to /etc/awstats/awstats.www.mysite.com.conf:

~$sudo cp /etc/awstats/awstats.conf /etc/awstats/awstats.www.mysite.com.conf

and edit the file:

~$sudo vi /etc/awstats/awstats.www.mysite.com.conf

and check for the following lines and edit those for your needs:

LogFile=”/var/log/apache2/access.log”
SiteDomain=”mysite.com”

This is all setted up, now you need to generate the first stats.

4. Generating the First Stats:

in order to generate the first stats, you need to call the script as root using the following command line:

~:$sudo -u www-data /usr/bin/perl /usr/lib/cgi-bin/awstats.pl -update -config=www.mysite.com

After finishing this you can try to open http://www.mysite.com/awstats/awstats.pl this will show you the stats.

Now for automatic update the stats you need to put the following command in your cron.

0 2 * * * www-data [ -x /usr/lib/cgi-bin/awstats.pl -a -f /etc/awstats/awstats.conf -a -r /var/log/apache/access.log ] && /usr/lib/cgi-bin/awstats.pl -config=mysite.com -update >/dev/null

GeoIP Information for AWStats

Improve country and city location information in your web analytics reports

Awstats showing country info

AWStats offers three different ways to provide Country level information about visitors (“hosts”) connecting to your site. By default, the host domain extension is used if you have performed reverse DNS look-up. While this results in human readable host names as well, reverse DNS lookup is time consuming. Alternatively, GeoIP plugins can be used. They match the host IP with a database of IP allocations which is already installed locally on your computer, significantly reducing the time needed to match a host to a location. There are two country level GeoIP databases available. AGeo::IPFree Perl module is available, but it does not appear that the database is being maintained. The better solution is MaxMind’s Geo::IP GeoLite Country open source version, said to be 97% accurate.

Download the current GeoLite Country, GeoLite City and Organization (AS Numbers)databases
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz

Move data files to directory and unzip.

mv GeoIP.dat.gz /usr/local/share/GeoIP/
gunzip /usr/local/share/GeoIP/GeoIP.dat.gz
mv GeoLiteCity.dat.gz /usr/local/share/GeoIP/
gunzip /usr/local/share/GeoIP/GeoLiteCity.dat.gz
mv GeoIPASNum.dat.gz /usr/local/share/GeoIP/
gunzip /usr/local/share/GeoIP/GeoIPASNum.dat.gz
Install the GeoIP program.

1. wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP-1.4.5.tar.gz
tar -xvzf GeoIP-1.4.5.tar.gz
cd GeoIP-1.4.5
./configure
make
make check
sudo make install

2.wget http://geolite.maxmind.com/download/geoip/api/perl/Geo-IP-1.35.tar.gz
tar -xvzf Geo-IP-1.35.tar.gz
cd Geo-IP-1.35
perl Makefile.PL LIBS=’-L/usr/local/lib’
make
make test
sudo make install

Update your awstats.mysite.conf configuration file

Look for the following geoip LoadPlugin options in your AWStats configuration file. Update them with the full path to each of the two database files.

LoadPlugin=”geoip GEOIP_STANDARD /usr/local/share/GeoIP/GeoIP.dat”
LoadPlugin=”geoip_city_maxmind GEOIP_STANDARD /usr/local/share/GeoIP/GeoLiteCity.dat”
LoadPlugin=”geoip_org_maxmind GEOIP_STANDARD /usr/local/share/GeoIP/GeoIPASNum.dat”

Well, It’s done and now you can check the stats with country info.

Cheers!!

DH的虚拟主机上是有GeoIP.dat的,可以这样找到路径:

$ locate GeoIP.dat
/usr/local/share/GeoIP/GeoIP.dat
/usr/share/GeoIP/GeoIP.dat

安装库模块:

perl -MCPAN -e ‘install “Geo::IP”‘

perl -MCPAN -e ‘install “Geo::IP::PurePerl”‘

我找到两个,比了一下时间,/usr/local那个要更新一点,所以用这个。所以,像下边这样修改common.conf:

找到
# LoadPlugin=”geoip GEOIP_STANDARD /pathto/GeoIP.dat”
取消注释,改为
LoadPlugin=”geoip GEOIP_STANDARD /usr/local/share/GeoIP/GeoIP.dat”

这样做,就可以开启GeoIP功能了,也就是在IP栏的右边,显示出IP所在国家。

如果,你认为DH的GeoIP.dat数据比较老,想使用比较新的,可以直接从MaxMind下载。可以下载GeoIP.dat.gzGeoLiteCity.dat.gz,之后解压,放在某处。假设放在/home/yourname/awstats/目录下。

LoadPlugin=”geoip GEOIP_STANDARD /pathto/GeoIP.dat”
LoadPlugin=”geoip_city_maxmind GEOIP_STANDARD /pathto/GeoIPCity.dat”
把以上两句改为:
LoadPlugin=”geoip GEOIP_STANDARD /home/awstats/awstats/GeoIP.dat”
LoadPlugin=”geoip_city_maxmind GEOIP_STANDARD /home/yourname/awstats/GeoIPCity.dat”

这样,就可以有国家和城市两栏显示了。

但是,这个城市显示比较粗糙一点,还可以利用QQ的纯真库IP信息来显示,有人做了一个这样的插件,qqhostinfo。需要以下步骤:

1. 下载纯真版IP数据库,解压缩后,只使用QQWry.dat
2. 下载qqhostinof.pm
3. 下载分析QQWry.dat的脚本
4. 把以上文件都放在cgi-bin/plugins下
5. 修改qqwry.pl,把./QQWry.dat改为${DIR}/plugins/QQWry.Dat
6. 修改common.conf,加入LoadPlugin=”qqhostinfo”

经过以上设置就可以了,会在GeoIPCity右边出现Location栏,里边有很具体的地址信息。

在使用qqhostinfo的时候,需要安装Net::XWhois模块。发现DH的主机上已经装了这个模块。

如果在没有的虚拟主机上安装,由于没有管理员权限,所以,正常的安装过程在make install的时候会报错的。所以,可以这样:

$ make Makefile.PL PREFIX=/home/yourname/awstats/lib # 这样可以把最后的安装都放在这个目录里
$ make
$ make install

另外,如果对中文搜索引擎统计有更高需求的话,可以使用车东的TOP 8 Chinese local search engines。这东西是将近一年前的,适用于AWStats-6.6,对于6.7来说不太合适。我做了一个6.7的search_engines.pm.patch,可以对search_engines.pm打patch。不管在本地,还是在DH主机的shell里,可以

patch search_engines.pm search_engines.pm.patch

 

1.更新若干有用的模块:      

       ppm install Geo::IP::PurePerl
       ppm install Geography::Countries
       ppm install IP::Country 
       ppm install Geo-IPfree
       ppm install  Net-Xwhois 

2.GeoIP和qqhostinfo需要下载相关文件

GeoIP需要GeoIP.dat;qqhostinfo需要qqhostinfo.pm、qqwry.pl、QQWry.dat3个文件,把他们都放到cgi-bin的插件目录里面.

GeoIP.dat,qqhostinfo.pm、qqwry.pl、QQWry.dat3 打包CSDN下载:
http://download.csdn.net/detail/debugcs/4360307

 

3、插件的开启

        开启 GeoIP 反查模块
       LoadPlugin=”geoip GEOIP_STANDARD C:/Perl/lib/GeoIP.dat”
       开启 IP 反查的外挂
       LoadPlugin=”geoipfree”
  
       # 开启 decodeutfkeys 外挂,解决“用以搜索的关键词”乱码
       LoadPlugin=”decodeutfkeys”    
     
       设定IIS的log时间
       LoadPlugin=”timezone +8″好了,所以的设置都弄好了,awstats已经能够很好的工作了。
       # Plugin: qqhostinfo,显示访问者地区,下面的语句需要手工添加。
       LoadPlugin=”qqhostinfo” 

       # 开启HostInfo,这个是qqhostinfo插件的前提

 

       LoadPlugin=”hostinfo”
*  上面插件加载地址按需修改 

日志统计页面GeoIP显示效果:

It may not be able to give the same level of detail as a commercial package such as Urchin, but it provides more than enough detail for most purposes.
On Ubuntu you can install awstats via apt:
apt-get install awstats
This will install the base package however, if you want to lever its full power you will need to install a couple of extra Perl modules.
apt-get install libnet-ip-perl
If you would like to see which countries your visitors are based in then you should look at one of the IP to Country plugins which will give you a Geo IP lookup.
You can choose between either geoipfree or GeoIp.
Other useful plugins are:

  • Plugin: HostInfo – which gives you a popup whois window
  • Plugin: IPv6 – adds IPv6 support
  • Plugin: Tooltips – confused by all the information? This will take away the mystery :)

On rpm-based system there is a handy little perl script that walks you through the initial configuration. On Ubuntu you have to do it by hand, however most of the configuration is self-explanatory.
Simply copy the provided sample config to a new config file:
cp awstats.conf awstats.yoursite.tld.conf
NB: You will need a separate configuration file for each vhost you wish to examine.
Edit the conf file to match your site’s setup. Important things to pay attention to are any domain aliases, the location of the log files and any IPs you wish to ignore (eg. your own)
You can also decide which optional plugins you want to load. Simply add a line to invoke each one:
LoadPlugin="geoipfree"
LoadPlugin="ipv6"
LoadPlugin="Tooltips"

geoipfree requires an extra perl module. On ubuntu the package is called libgeo-ipfree-perl
You are almost ready!
You now need to configure Apache to allow access to your awstats pages.
Rather than messing about with my main Apache config file I found it neater to place the awstats specific information in an external file called awstats.conf:

Options None
AllowOverride None
Order allow,deny
Allow from all

Alias /awstatsicons/ /usr/share/awstats/icon/
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all


Then use an include directive in your main Apache config (apache2.conf):
Include /etc/apache2/awstats.conf
You then need to add it in to your vhost:
ScriptAlias /whereyouwanttoaccessit/ /usr/lib/cgi-bin/
If you navigate to:

http://www.yourdomain.tld/whereyouwanttoaccessit/awstats.pl?config=yourdomain.tld

You *should* be able to access your stats.
Of course you’ll need to actually generate the stats first:
/usr/lib/cgi-bin/awstats.pl -config=yourdomain.tld -update
I would recommend you run this from the command line once to create the first set of stats and then add a cronjob:
crontab -e
0,10,20,30,40,50 * * * * /usr/lib/cgi-bin/awstats.pl -config=yourdomain.tld -update >/dev/null
wq

This will update your stats every 10 minutes, which means that you’ll only have to update a few lines at a time. If your site is busy this makes sense :)
The last part of the line is important:
>/dev/null
By default cron emails the user each time it runs. You really don’t want 6 emails an hour telling you that Awstats has run :)

How to reset awstats

Just delete the files in /var/lib/awtstats (directory defined by DirData parameter)

sudo su - root
cd /var/lib/awstats
rm *
logout

Notes

  • you have to be root because for some reason, sudo rm -R awstats/* wouldn’t work.
  • if you get the message Never updated (See 'Build/Update' on awstats_setup.html page) whereas the awstats files are there in /var/lib/awtstats, it’s probably a permission problem on this folder.

EXCEL、WORD、POWERPOINT+VBA利用CDO组件发送邮件

前几天学习宏病毒的时候用到了,顺手记录一下~
Sub EMAIL()
Dim cm As Variant
Set cm = CreateObject(“CDO.Message”) ‘创建对象
cm.From = “” ‘设置发信人的邮箱
cm.To = “” ‘设置收信人的邮箱
cm.Subject = “主题:邮件发送试验” ‘设定邮件的主题
‘cm.TextBody = “宝坻一中信息中心/” ‘使用文本格式发送邮件
cm.HtmlBody = “邮件发送试验^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^” ‘使用html格式发送邮件
‘cm.AddAttachment Server.MapPath(“test.zip”)
‘发送附件test.zip。
stUl = “http://schemas.microsoft.com/cdo/configuration/” ‘微软服务器网址
With cm.Configuration.Fields
.Item(stUl & “smtpserver”) = “smtp.bdyz.net” ‘SMTP服务器地址
.Item(stUl & “smtpserverport”) = 25 ‘SMTP服务器端口
.Item(stUl & “sendusing”) = 2 ‘发送端口
.Item(stUl & “smtpauthenticate”) = 1 ‘
.Item(stUl & “sendusername”) = “changxi” ‘发送方邮箱名称
.Item(stUl & “sendpassword”) = “*************” ‘发送方邮箱密码
.Update
End With

cm.Send ‘最后当然是执行发送了
Set cm = Nothing
‘发送成功后即时释放对象
End Sub