2011年8月

windows平台cl.exe编译pcre 8.33

最近在windows平台开发的一个project需要使用正则表达式,当然自己实现一个regexp也是可以的,只是太蛋疼且技术不到家。所以我优先考虑了open source的library,pcre是比较有名的库,在linux编译都是普通的套路,不过在win下面就稍微麻烦一点了。

编译的方法主要参考源代码zip包里面的NON-AUTOTOOLS-BUILD文件。

  1. 下载最新的pcre:ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.33.zip (zip/tar.gz/tar.bz2三种格式任选一种,windows的一般用zip),并解压。
  2. 重命名config.h.generic为config.h,这是generic配置文件,需要根据具体的环境对预编译做相应修改。
    HAVE_BCOPY 1改为0,HAVE_INTTYPES_H 1改为0,HAVE_STDINT_H 1改为0。
    如果不修改,在下面编译dftables的步骤中会报错:  



    pcre_internal.h(198) : fatal error C1083: Cannot open include file: 'inttypes.h': No such file or directory

  3. 重命名pcre.h.generic为pcre.h,重命名pcre_chartables.c.dist为pcre_chartables.c

  4. cl -MD -DHAVE_CONFIG_H dftables.c生成dftables.exe

  5. dftables.exe pcre_chartables.c (修改了一些注释,不知道目的何在)

  6. cl -O1 -MD -DHAVE_CONFIG_H -c pcre_chartables.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_compile.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_config.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_dfa_exec.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_exec.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_fullinfo.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_get.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_globals.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_info.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_maketables.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_newline.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_ord2utf8.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_refcount.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_study.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_tables.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_try_flipped.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_ucd.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_valid_utf8.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_version.c

cl -O1 -MD -DHAVE_CONFIG_H -c pcre_xclass.c

lib -out:pcre.lib pcre_chartables.obj pcre_compile.obj pcre_config.obj pcre_dfa_exec.obj pcre_exec.obj pcre_fullinfo.obj pcre_get.obj pcre_globals.obj pcre_info.obj pcre_maketables.obj pcre_newline.obj pcre_ord2utf8.obj pcre_refcount.obj pcre_study.obj pcre_tables.obj pcre_try_flipped.obj pcre_ucd.obj pcre_valid_utf8.obj pcre_version.obj pcre_xclass.obj

最后生成的pcre.lib就是我们所需要的pcre库文件。

【注意】,如果要编译debug版本的pcre.lib,请用-MDd替代-MD,否则项目会出现“MSVCRTD.lib(cinitexe.obj) : warning LNK4098: 默认库“msvcrt.lib”的问题。

拷贝pcre.h和pcre.lib到我们自己项目的目录,然后在源代码顶部加入以下代码:

#include "pcre.h" 
#pragma comment(lib,"pcre.lib")

用以下代码测试:

version= pcre_version(); 

wchar_t *shit = (wchar_t *)malloc(strlen(version));

MultiByteToWideChar(CP_ACP,0,version,-1,shit,wcslen(shit));

MessageBox(hWnd,shit,shit,MB_OK);

Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration

"Invalid command ‘Header’, perhaps misspelled or defined by a module not included in the server configuration".

Invalid command 'Header'" appeared because the Apache module mod_headers was not enabled. To enable mod_headers, I had to recompile Apache with the configuration parameter --enable-headers".

If you installed Apache from a build, then you will have to add the line

LoadModule headers_module modules/mod_headers.so

in httpd.conf.

博客被入侵

由于缺乏安全考虑,我将很多自己写的php代码文件都上传到网站的/lab目录,并且/lab目录下的所有php文件均可被解析,所以造成了这次事故。

网站上传了很多php木马,用cpanel自带的扫描器扫了很多出来。

PHP.Mailer是php发欺诈邮件用的,内容是美国银行之类的东东:

/lab/php目录出现了大量的链接目录,无法删除,不知是用来作什么坏事的,懂的朋友还望不吝相告。

wp后台密码和admin的邮箱都被修改,网页的favicon也成了一个骷髅头。

先收到了那个test mail,然后发现cnzz的统计访问量为0,再发现wp后台无法登录,最后才在前台看到骷髅头。8月19就被黑了,23日才发现,汗~

庆幸的是/lab目录在8月18的时候做了一次备份。准备进cpanel查raw access log,结果发现只有当天的,就没有发现他入侵的入口,我估计不是wp插件,就是我的/lab里面的php文件造成的。

黑别人是high的,被黑是悲剧的。已经将/lab目录的php后缀文件映射为text/plain。