改用了163的域名邮箱

原来是用ixwebhosting提供的邮局,突然有一天163宣布提供免费企业邮,当时忙没顾得去细看,还以为要复杂的审核,今天弄好了blog和bbs两大域名,就去申请玩玩,于是造就了下面的成果~~

Webmail: http://mail.gmsj.org
POP3: pop3.gmsj.org:110
SMTP: smtp.gmsj.org:25

IMAP看样子163还没在这种邮箱开通

以后gmsj0001[at]gmsj.org和gmsj0001[at]163.com还有gmsj0001[at]126.com之间转东西就方便咯

IXWebhosting上设置.htaccess实现discuz、wordpress二级域名映射子目录

昨天又一次去搞这棘手的.htaccess,郁闷的是Win7的ftp貌似不显示隐藏的.htaccess文件,基本上是用ftp命令行和boom管理系统操作的。众所周知ixwebhosting很贱,一个独立ip只能绑定一个域名,又做了全局的rewrite设置,导致通常的.htaccess都不好实现。半夜捣鼓半天,找到一个基本还行的写法

RewriteEngine   On
RewriteBase /

RewriteCond %{HTTP_HOST} ^bbs.gmsj.org$
RewriteCond %{REQUEST_URI} !^/bbs/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /bbs/$1
RewriteCond %{HTTP_HOST} ^bbs.gmsj.org$
RewriteRule ^(/)?$ /bbs/index.php [L]

RewriteCond %{HTTP_HOST} ^blog.gmsj.org$
RewriteCond %{REQUEST_URI} !^/blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /blog/$1
RewriteCond %{HTTP_HOST} ^blog.gmsj.org$
RewriteRule ^(/)?$ /blog/index.php [L]

RewriteCond %{HTTP_HOST} ^chd.gmsj.org$
RewriteCond %{REQUEST_URI} !^/chd/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /chd/$1 [L]
RewriteCond %{HTTP_HOST} ^chd.gmsj.org$
RewriteRule ^(/)?$ /chd/index.php [L]

这样写目前基本能满足要求了,bbs.gmsj.org可以访问gmsj.org/bbs,blog.gmsj.org可以访问gmsj.org/blog,只剩下一个bug,就是bbs.gmsj.org/index.php访问的是/index.php而bbs.gmsj.org/能正常访问gmsj.org/bbs/index.php,还有待继续探讨。正则表达式貌似在这个rewrite语法中不是完全一致。。

另外还有个问题就是wordpress,wordpress本身有rewrite设置,经测试,如果让wp自己设置.htaccess并不能很好满足我们的要求,需手动按下面操作进行。

在wp后台设置wordpress address和site addresss均为http://lxf.me,但/blog目录中的.htaccess不按默认生成的,而是稍作修改改为以下内容

# BEGIN WordPress

RewriteEngine On
RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]

# END WordPress

这样既可即使http://lxf.me/XXX能正确访问,又能使wp上出现的链接是blog.gmsj.org而不是gmsj.org/blog

以上内容仅供大家参考,我个人觉得设置这伪静态实在是个让人抓狂的事情。。

以后多用SAFE_DELETE

前些天羽毛汇报说那天杀的彩虹岛插件服务端又崩了。研究加壳过的程序崩掉后的dmp文件确实是个体力活。从eip来看程序是跑飞了,看了下esp处是个在dll领空内的地址,说明是call飞的,用这个地址减去dll的起始地址,然后用od加载错的dll,把刚才减出的偏移加到这个hmodule上,算是找到了出错的指令了,谢天谢地这段指令没有混淆过。这还没完,要根据这里的汇编码找出对应的源代码位置。。还算比较幸运,这个函数下面一个函数就有了字符串的引用,于是找到代码是OnDisconnect中delete m_session一句出错,从dump来看内存里已经不是SocketSession的内容了,应该是call析构函数call飞的,那么推断下来只可能是两种情况,要不就是哪里缓冲区溢出了,要不就是二次delete。我自己自然能保证我的代码中不会出现重复delete逻辑,但是OnDisconnect这个socket类库却不是我写的,天知道这个庞大的socket框架哪里又出了啥毛病,本来我已经为它改了N多bug了。。

然而如果是delete的问题,这个却不能说不能从我这里防止。因为多年来从vb混到.net,也就是代码一直是被托管着的,永远不会缓冲区溢出永远不会随便一个小问题就退出了函数调用都是微软的不用担心失败等等等等,使得我的程序一直在出错预防和处理上很糟糕,在正式做C++的project后,天啊。。

弄C++的应该都知道一个好习惯,就是free或者delete后立即赋值null,我写程序也不是不常用,只是有的时候记不住而已。

昨天弄D3D,在DXUT framework的dxstdafx.h中看到几个很有趣的宏

#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }

在《DirectX 9.0游戏开发编程基础》中框架设计也有类似功能的代码,因为是D3D,似乎用的更多是com中的release。

如果说delete *p; p = NULL;这样写有点不好看的话用上面这个宏写出来貌似还是蛮帅的,嘻嘻。以后就用它了~~

DXUT里还有几个好玩的排错宏,比如V_RETURN等,我猜那个V应该是verify的意思。有机会写套自己的代码异常机制。这些日子真的是被那个dll各种稀奇古怪的bug给整疯了

终于查清GoogleMaps严重偏移的事实

E72和GPS166也买了一段时间了,买来就看到GoogleMaps定位向西北偏移500米左右,当时以为GPS山寨了,随后用其它导航软件测量是正常的,同时网上查到GoogleMaps确实可能在地图衔接上有偏移的,故以松江为农村为由也不以为意。

结果到9月18号去上海音乐厅,回来时发现还是偏移500米,我就郁闷了,难不成上海都是偏移的,于是很郁闷,不过也就认了。

再到10月3号,去同济聚会,烧烤回来公交车上无聊,拿森的手机开GoogleMaps,我靠,居然没有500米偏移,于是我惊了,然后一晚上没安顿,一直拿两个手机比划比划啊,我想总不至于真的是我GPS山寨吧,或者说她S60不山寨我WM山寨。。同时关掉GPS,发现两个手机基站定位居然也是相差500米,这下稍微松口气,但是当直接把GPS报的经纬度输到搜索里,以为也会差500米,结果偏偏又给我两个一致的结果,再次晕倒!!

然后呢,就怀疑是WM系统中国家号没得到?这两天在忙着研究蓝牙PAN,也没研究出啥结果,刚刚准备睡觉,突然想起这个问题,于是上网搜googlemaps smartphone 定位不准,结果在UC论坛上冒个帖子《GoogleMaps新版不如旧版?》,遂想起我的是今年9月份刚出的3.2版,森那个是放假时给她下的2.4版(下载是用我的V700下的,1M流量是我出的 – -)点开看说是新版定位有偏差,赶紧登录论坛看到图片,图是洞庭湖那里的,新版比旧版往西北跑了500米。

于是再搜googlemaps 新版定位偏差,得到官方的一些信息

http://www.google.com/support/forum/p/mobile/thread?tid=07efa2c9e1adac1d&hl=zh-CN

http://www.google.com/support/forum/p/mobile/thread?tid=3c7cdb58ae93faea&hl=zh-CN

 

于是卸了3.2版,网上淘2.4版给手机装上,开GPS,从此不再郁闷。

原因据说是中国版和国际版的偏差,还在研究中。。

 

10月7号

你还敢用VC6吗??

中二时期文章,仅用于存档,不要当真。

来个黑底白字时代C语言差不多应用最多的小段代码吧

#include <stdio.h>

void main()
{
char str[16];
printf(“Input your name”);
gets(str);
puts(str);
}

很平常吧,没有问题吧?

很好,现在你去输入个大于24字节的字符串,按回车~

BiaJi,程序跑飞了,VC6的调试器直接切换到反汇编栏然后飞到了无人区,你是不是还一头雾水不知道哪里出问题了??

 

现在换用VC9测试。首先,上面的代码编译时会出现一个警告:

warning C4996: ‘gets’: This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

明明白白的告诉你,gets是不安全的,可能会出现问题,叫你换用gets_s。。。

信微软,得永生,我们换上gets_s运行测试,输入大于16字节的串,回车后立即触发了Assert:

提示信息:Buffer is too small。

就算是release模式同样被调试器拦下:

Microsoft Visual Studio C 运行时库在 test.exe 中检测到一个错误。

在debug模式下,Assert中断附加信息向你清楚地说明了问题之所在。你就直接去改吧,release下没出信息,但也通知调试器中断在gets_s函数里,不至于你满大街去找bug

 

现在我们不信微软,改回原来的gets,运行。

在main函数结束后调试器中断了,报告:Run-Time Check Failure #2 – Stack around the variable ‘str’ was corrupted.,这个中断是@_RTC_CheckStackVars@8函数产生的;

如果继续运行,则会连续两次报告:在已损坏了程序内部状态的 test.exe 中发生了缓冲区溢出,这两个报告是另外一个@__security_check_cookie@4函数产生的。随后这个安全检查函数调用TerminateProcess结束了进程。

 

而在VC6中,你就继续面对满屏无人区的???符号发呆吧,并且,在你努力给用户们做升级补丁的时候,黑客们已经开始利用你程序的这个漏洞侵入了你用户们的电脑,甚至可能取得了操作系统ring0权限,什么概念,人品坏一点的估计可以弄个新版CIH把你客户的主板烧了。

 

而无论是你自己调试找不到北,还是你的客户被当了肉鸡,这一切都是因为你选择了1998年的VC6!

赶紧更新换代吧,跟不上时代步伐也就罢了,当了用户的罪人就不好了~~

 

其实呢,大家也别太紧张了,这bug本来就不是你的错,当年猥琐软件公司貌似也写了像你这样的程序,后果也没啥太严重的,也就是诞生了一个叫冲击波的小程序。。

 

09年8月24日某小鬼研究QQ2009SP1及SP2 Unicode溢出漏洞有感而发