Monday, March 30, 2009

于是今天把Srun第三个版本拿下来了

第三个测试版了吧

线上的那个都快4个月了
最近的两个测试版都拿下了

不算轻松,也不算复杂

只怪代码写得太差,太差

php5.3 rc2-beta居然把_GET扔进argc/argv里...

居然。。。
这个版本的argc/argv包括了 GPC变量。。。。
太诡异了
之前的那个版本的dev版还是没有的,结果刚才把5.3的环境一更新,却发现自己的cli模式判断无效了



访问
http://localhost/test/argc.php?1=2&12=3

php5.2.9下 结果为 0
php5.3.0RC2-dev 结果 为 1

尝试用 POST表单和手工加入的cookies提交,结果数据还是1
只有$_GET 才被算进去了
不懂为啥了


php5.3的这个dev的信息:
Build Date Mar 29 2009 12:47:23
Zend Extension Build API220090115,TS,VC9
PHP Extension Build API20090115,TS,VC9

Sunday, March 29, 2009

【经验】Sogou 浏览器代理相关技巧整理

原创首发于 http://www.bitunion.org/thread-10132052-1-1.html


1 关于代理服务器
曾经尝试过跟sogou浏览器,但是后来放弃了
最开始也云把里边的pac脚本拿出来了(pac: proxy auto config 上网查查吧,用过ipcn.org的那个在线代理的肯定知道)
但是经测试,无效
于是也就没有继续尝试了
PAC脚本内容,来自 sogou浏览器根目录的 sogounet.dll


function FindProxyForURL(url, host){if(isPlainHostName(host)) return "DIRECT";if(!shExpMatch(url, "http*")) return "DIRECT";var ip = dnsResolve(host);// ipv6if(shExpMatch(ip, "*:*")) return "DIRECT"; // localif(isInNet(ip,"192.168.0.0","255.255.0.0")) return "DIRECT";else if(isInNet(ip,"10.0.0.0","255.0.0.0")) return "DIRECT";else if(isInNet(ip,"172.16.0.0","255.255.0.0")) return "DIRECT";else if(isInNet(ip,"169.254.0.0","255.255.0.0")) return "DIRECT";else if(isInNet(ip,"127.0.0.0","255.0.0.0")) return "DIRECT";// cernetelse if(isInNet(ip,"58.154.0.0","255.254.0.0")) return "DIRECT";else if(isInNet(ip,"58.192.0.0","255.240.0.0")) return "DIRECT";else if(isInNet(ip,"59.64.0.0","255.240.0.0")) return "DIRECT";else if(isInNet(ip,"113.54.0.0","255.254.0.0")) return "DIRECT";else if(isInNet(ip,"114.212.0.0","255.254.0.0")) return "DIRECT";else if(isInNet(ip,"114.214.0.0","255.255.0.0")) return "DIRECT";else if(isInNet(ip,"115.24.0.0","255.252.0.0")) return "DIRECT";else if(isInNet(ip,"115.154.0.0","255.254.0.0")) return "DIRECT";else if(isInNet(ip,"115.156.0.0","255.254.0.0")) return "DIRECT";else if(isInNet(ip,"115.158.0.0","255.255.0.0")) return "DIRECT";else if(isInNet(ip,"116.13.0.0","255.255.0.0")) return "DIRECT";else if(isInNet(ip,"116.56.0.0","255.254.0.0")) return "DIRECT";else if(isInNet(ip,"118.202.0.0","255.254.0.0")) return "DIRECT";else if(isInNet(ip,"118.228.0.0","255.254.0.0")) return "DIRECT";else if(isInNet(ip,"118.230.0.0","255.255.0.0")) return "DIRECT";else if(isInNet(ip,"120.94.0.0","255.254.0.0")) return "DIRECT";else if(isInNet(ip,"121.48.0.0","255.254.0.0")) return "DIRECT";else if(isInNet(ip,"121.52.160.0","255.255.224.0")) return "DIRECT";else if(isInNet(ip,"121.192.0.0","255.252.0.0")) return "DIRECT";else if(isInNet(ip,"121.248.0.0","255.252.0.0")) return "DIRECT";else if(isInNet(ip,"122.204.0.0","255.252.0.0")) return "DIRECT";else if(isInNet(ip,"125.216.0.0","255.248.0.0")) return "DIRECT";else if(isInNet(ip,"162.105.0.0","255.255.0.0")) return "DIRECT";else if(isInNet(ip,"166.111.0.0","255.255.0.0")) return "DIRECT";else if(isInNet(ip,"202.4.128.0","255.255.224.0")) return "DIRECT";else if(isInNet(ip,"202.38.64.0","255.255.192.0")) return "DIRECT";else if(isInNet(ip,"202.38.140.0","255.255.254.0")) return "DIRECT";else if(isInNet(ip,"202.38.184.0","255.255.248.0")) return "DIRECT";else if(isInNet(ip,"202.38.192.0","255.255.192.0")) return "DIRECT";else if(isInNet(ip,"202.112.0.0","255.248.0.0")) return "DIRECT";else if(isInNet(ip,"202.120.0.0","255.254.0.0")) return "DIRECT";else if(isInNet(ip,"202.127.216.0","255.255.248.0")) return "DIRECT";else if(isInNet(ip,"202.127.224.0","255.255.224.0")) return "DIRECT";else if(isInNet(ip,"202.179.240.0","255.255.240.0")) return "DIRECT";else if(isInNet(ip,"202.192.0.0","255.240.0.0")) return "DIRECT";else if(isInNet(ip,"203.91.120.0","255.255.248.0")) return "DIRECT";else if(isInNet(ip,"210.25.0.0","255.255.128.0")) return "DIRECT";else if(isInNet(ip,"210.25.128.0","255.255.192.0")) return "DIRECT";else if(isInNet(ip,"210.26.0.0","255.254.0.0")) return "DIRECT";else if(isInNet(ip,"210.28.0.0","255.252.0.0")) return "DIRECT";else if(isInNet(ip,"210.32.0.0","255.240.0.0")) return "DIRECT";else if(isInNet(ip,"211.64.0.0","255.248.0.0")) return "DIRECT";else if(isInNet(ip,"211.80.0.0","255.248.0.0")) return "DIRECT";else if(isInNet(ip,"218.192.0.0","255.248.0.0")) return "DIRECT";else if(isInNet(ip,"219.216.0.0","255.248.0.0")) return "DIRECT";else if(isInNet(ip,"219.224.0.0","255.248.0.0")) return "DIRECT";else if(isInNet(ip,"219.242.0.0","255.254.0.0")) return "DIRECT";else if(isInNet(ip,"219.244.0.0","255.252.0.0")) return "DIRECT";else if(isInNet(ip,"222.16.0.0","255.240.0.0")) return "DIRECT";else if(isInNet(ip,"222.192.0.0","255.240.0.0")) return "DIRECT";else return "PROXY " + host + ".local.acc.sogou.com:80; ";}


2 关于教育网限制

如果安装后的配置过程不选择启用那个代理功能,后来就没法再启用了
但是,注册表里
[code]HKEY_CURRENT_USER\Software\SogouExplorer\Accelerater[/code]
下边有两个值
VideoAccelerater
WebAccelerater
如果你的教育网加速功能不好使,那就把这个都设置成1

但是

sogou的ip检测有问题,尤其是学校这样的多出口的状态下,有时候会把代理加速功能给关掉


不过企鹅告诉了一个代理的使用方法:
命令行下,调用 SogouExplorer.exe -proxy 就会在本地开放一个端口,http代理,直接设置就行了

后来写bat,但是bat必须用 call 来调用,而不能直接开
内容如
reg add HKCU\Software\SogouExplorer\Accelerater /v VideoAccelerater /t REG_DWORD /d 1 /freg add HKCU\Software\SogouExplorer\Accelerater /v WebAccelerater /t REG_DWORD /d 1 /fcall "f:\Program Files\SogouExplorer\SogouExplorer.exe" -proxy

但是这个代理只是监听 127.0.0.1的8081端口,有时候会觉得很不方便

尝试着把监听的ip 127.0.0.1 改成 0.0.0.0,但是一直没有定位成功,于是放弃了


3 关于代理端口转发/共享
这是给*nix说的,或者说是有sshd的机器说的
因为昨天更新freebsd的虚拟机,结果嫌某个代理不好使,于是便想到了sogou的代理
但是这个只监听 127.0.0.1 的端口,怎么办?

SSH TUNNEL!

ssh -R 8080:127.0.0.1:8081 -l sskaje 192.168.181.130
连上去之后,ssh的那台服务器会开一个8080端口,所有发往这个端口的数据都会转发到本地的8081上
这样的话,
export http_proxy=http://localhost:8080cvsup -g -L 2 /etc/ports-supfile
于是就可以更新了


但是这个代理不是特别稳定,那没辙了



================ 更新 ==========================

4 关于sogou 浏览器 -proxy代理的监听IP的修改

之前想错了,居然忘记了代理不是在主程序里
于是刚才跟了下那个sogounet.dll
发现了几个127.0.0.1
都是push的
送进去的是同一个内存地址
hmm
修改
改成了 0.0.0.0

我的sogounet.dll版本是 1.0.1.105
数据的16进制 offset是 0x0007F9A4
注意
修改之后务必把后边的几位置成 0x00


==================================
UPDATE: Apr 15, 2009
临时扔到服务器上了,想测试一下修改后的sogounet.dll能扛多少连接
但是怕有BOF,于是 runas


reg add HKCU\Software\SogouExplorer\Accelerater /v VideoAccelerater /t REG_DWORD /d 1 /f
reg add HKCU\Software\SogouExplorer\Accelerater /v WebAccelerater /t REG_DWORD /d 1 /f
runas /user:services "E:\Progra~1\SogouExplorer\SogouExplorer.exe -proxy"
pause

加用户

但是,会报错
不影响使用

下雪了

下雪了,好冷
中午出门,跟qu吃了饭,赶紧去实验室取了飞盘,去西操玩
两个小时
冷风,吹着小雪
。。。。。

Friday, March 27, 2009

Windows下

重装系统后,得重装MySQL为服务,instant configuration不太好使,于是命令行下
"PATH\TO\MySQL Server *.*\bin\mysqld.exe" --install MySQL "F:\Server\MySQL\MySQL Server 5.1\my.ini"
结果,MySQL Administrator 的本地配置管理功能没法使了

直接修改注册表
HKLM\SYSTEM\CurrentControlSet\Services\MySQL
ImagePath
之前是
"F:\Server\MySQL\MySQL Server 5.1\bin\mysqld" "--defaults-file=F:\Server\MySQL\MySQL Server 5.1\my.ini" MySQL
改为
"F:\Server\MySQL\MySQL Server 5.1\bin\mysqld" --defaults-file="F:\Server\MySQL\MySQL Server 5.1\my.ini" MySQL

Thursday, March 26, 2009

六级居然过了

填表,“懂何种外语,程度如何”
上次在实验室的抽屉里找到了自己的六级准考证,过去查了查
本不抱太大希望
居然
您的成绩总分:462听力:165阅读:174综合:59写作:64

太假了太假了

Wednesday, March 25, 2009

要疯了

做坏事,于是要写检查

然后昨天玩飞盘,新的,却发现很难掌控

一堆事情,堆着,越来越多

Tuesday, March 24, 2009

致所有的WAMP-ers

I apologize, sincerely
所有的WAMP-ers:

1 如果你不确定代码足够安全,千万不要留phpinfo的页面,或者你真的要留,也别用 info.php, phpinfo.php, test.php, 1.php, i.php ...

2 如果你PHP经验不足,那就强制转换所有的变量,或者,在入库前用 mysql/mysqli 等库自带的 real_string_escape 或者类似的函数,转义一下提交数据。

3 如果你的代码没有管理mysql全库的需求,例如管理用户之类的,那就用个单库权限的用户吧,千万不要给FILE权限。

4 如果你的Apache不需要用来管理系统,千万不要让它跑在默认的System权限下,建一个用户、改一改执行权限,没什么难的。

5 不管怎样,phpMyAdmin之类的东西,别放在那种常见的文件夹下

6 不管怎样,列目录的权限都得关掉,除非你确认能列的目录下没有敏感文件;或者你放个默认的空的index页都行

7 线上环境,不要开错误提示,或者至少说,错误提示不要能爆出脚本的物理路径。

8 明确地说,以eval、exec等为关键词查找php shell,是没用的

9 。。。。待续

然后我的开发环境是不安全的,只要你能找到我放的shell

最后
I apologize, sincerely

Friday, March 20, 2009

IE8....

您的IP:10.2.68.128
来自:新1#学生公寓10~13层西南侧
操作系统:Windows XP
浏览器:Internet Explorer 8.0

User agent:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

Thursday, March 19, 2009

十年弹指一挥间

十年弹指一挥间。。。。。锦绣十年。。。

于是我老了

于是我真的很闲

原来mysql可以这样。。。。

SELECT * FROM `tblname` ORDER BY 15;
mysql的字段不允许以数字开头的名字,却可以用这样的查询
而这个order by的数字,正是列数
于是猜字段数可以半折法了。。。

Wednesday, March 18, 2009

I Love M$ Windows

C:\Documents and Settings\Administrator>ipconfig

Windows IP Configuration

An internal error occurred: 文件名太长。

Please contact Microsoft Product Support Services for further help.

Additional information: Unable to query host name.

C:\Documents and Settings\Administrator>ipconfig

Windows IP Configuration

An internal error occurred: 连到系统上的设备没有发挥作用。

Please contact Microsoft Product Support Services for further help.

Additional information: Unknown media status code.

C:\Documents and Settings\Administrator>

Tuesday, March 17, 2009

0和1的差距。。。

看了下google analytics的统计
月增长率 8,416.67%
所谓 0和1的差距。。。。

Monday, March 16, 2009

夏天了。。。

换上了夏装,却在昨晚。。。被蚊子咬了

Thursday, March 12, 2009

郁闷

有吃的,却上火舌头疼...

A PHP Class for Srun3000

本来打算写个完整的客户端的,但是却一直没有想好cli下怎么跟php的进程进行通信

于是写好了一个php的类,简单地封装了 登陆、注销、保持连接、查询信息 的操作

/**
* Srun3000客户端类
*
* @author sskaje sskaje@gmail.com
* @version 1.0.0
* @todo 提供一个通信的机制
*/
class sscSrun3000forBIT
{
private $username;
private $password;
private $mode = 1;
private $client_type = 1;
private $n = 1;

private $url_login = 'http://10.0.0.55/cgi-bin/do_login';
private $url_logout = 'http://10.0.0.55/cgi-bin/do_logout';
private $url_keepalive = 'http://10.0.0.55/cgi-bin/keeplive';

private $modes = array(0=>'国际模式', 1=>'国内模式');
private $client_types = array(1=>'WEB 模式', 2=>'客户端模式');

private $user_agent = '';

private $uid = 0;

public $debug = 0;
/**
* cookie文件存放路径
*
* @var string
*/
private $cookie_file = 'cookie.txt';
/**
* cURL 资源
*
* @var cURL
*/
private $ch;
/**
* 构造函数,默认参数构造
*
* @param string $username 用户名
* @param string $password 密码
* @param int $mode 登陆模式,1->国内,0->国际
* @param int $client_type 客户端模式,1->Web,2->客户端
*/
public function __construct($username, $password, $mode=1, $client_type=1)
{
$this->username = $username;
$this->password = $password;
$this->change_mode($mode);
$this->set_client_type($client_type);
}
/**
* 设置客户端模式
*
* @param int $client_type 客户端模式,1->Web,2->客户端
*/
public function set_client_type($client_type)
{
if ($client_type == 1)
{
$this->client_type = $client_type;
$this->n = 1;
$this->user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GreenBrowser)';
}
else if ($client_type == 2)
{
$this->client_type = $client_type;
$this->n = 3;
$this->user_agent = 'my session';
}
else
{
throw new Exception('Bad client type');
}
}
/**
* 设置登陆模式
*
* @param int $mode 登陆模式,1->国内,0->国际
*/
public function change_mode($mode)
{
if ($mode != 1 && $mode != 0)
{
throw new Exception('Bad login mode');
}
else if ($mode == 0)
{
echo "将以国际模式登陆\n";
}
else
{
echo "将以国内模式登陆\n";
}
$this->mode = $mode;
}
/**
* 设置cookie文件路径
*
* @param string $cookie_file
*/
public function set_cookie_fileloc($cookie_file)
{
$this->cookie_file = $cookie_file;
}
/**
* 初始化资源
*
*/
public function init()
{
$this->ch = curl_init();
curl_setopt($this->ch, CURLOPT_VERBOSE, 0);
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($this->ch, CURLOPT_COOKIEJAR, $this->cookie_file);

if ($this->client_type == 2)
{
curl_setopt($this->ch, CURLOPT_USERAGENT, 'my session');
curl_setopt($this->ch, CURLOPT_PORT, 3333);
}
else
{
curl_setopt($this->ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GreenBrowser) ');
}
}
/**
* 登陆
*
*/
public function login()
{
if ($this->client_type == 2)
{
$password = $this->passencode($this->password);
}
else
{
$password = $this->password;
}

$login_str =
'username=' . urlencode($this->username) .
'&password=' . urlencode($password) .
'&drop=' . $this->mode .
'&type=' . $this->client_type .
'&n=' . $this->n;

$this->debug('Login: ' . $login_str);

curl_setopt($this->ch, CURLOPT_URL, $this->url_login);
curl_setopt($this->ch, CURLOPT_REFERER, $this->url_login);
curl_setopt($this->ch, CURLOPT_POST, 1);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $login_str);
$out = curl_exec($this->ch);

$this->debug('Login response: ' . $out);

curl_setopt($this->ch, CURLOPT_COOKIE, $this->username.'%7C'.$this->password);

if (preg_match('#^\d+$#', $out))
{
$this->uid = $out;
return;
}
$this->login_error($out);
}
/**
* 注销
*
*/
public function logout()
{
curl_setopt($this->ch, CURLOPT_URL, $this->url_logout);
curl_setopt($this->ch, CURLOPT_POST, 1);
$logout_str = 'uid='.$this->uid;

$this->debug('Logout query: '.$logout_str);

curl_setopt($this->ch, CURLOPT_POSTFIELDS, $logout_str);
$out = curl_exec($this->ch);

$this->debug('Logout: ' . $out);

if ($out == 'logout_ok')
{
echo 'Successfully logout.';
}
else
{
echo 'Failed to log u out';
}
}
/**
* 保持连接
*
* @return string
*/
public function keepalive()
{
curl_setopt($this->ch, CURLOPT_URL, $this->url_keepalive);
curl_setopt($this->ch, CURLOPT_POST, 1);
$keepalive_str = 'uid='.$this->uid;

$this->debug('Keepalive query: '.$keepalive_str);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $keepalive_str);
$out = curl_exec($this->ch);

$this->debug('Keepalive: ' . $out);

if (preg_match('#^\d+,\d+,\d+$#', $out))
{
return $out;
}
else
{
die('Disconnected.');
}
}

/**
* 客户端模式密码加密
*
* @param string $pass
* @return string
*/
public function passencode($pass)
{
$atom = 70;
$len = strlen($pass);
for ($i=0; $i<$len; $i++)
{
$pass[$i] = chr(ord($pass[$i]) ^ $atom);
}
return $pass;
}
/**
* 登陆提示
*
* @param string $out
*/
public function login_error($out)
{
switch($out)
{
case "user_tab_error":
die("认证程序未启动");
break;

case "username_error":
die("用户名错误");
break;

case "non_auth_error":
echo "您无须认证,可直接上网";
break;

case "password_error":
die("密码错误");
break;

case "status_error":
die("用户已欠费,请尽快充值。");
break;

case "available_error":
die("用户已禁用");
break;

case "ip_exist_error":
die("用户已存在");
break;

case "usernum_error":
die("用户数已达上限");
break;

case "online_num_error":
die("该帐号的登录人数已超过限额\n如果怀疑帐号被盗用,请联系管理员。");
break;

case "mode_error":
die("系统已禁止WEB方式登录,请使用客户端");
break;

case "time_policy_error":
die("当前时段不允许连接");
break;

case "flux_error":
die("您的流量已超支");
break;

case "minutes_error":
die("您的时长已超支");
break;

case "ip_error":
die("您的IP地址不合法");
break;

case "mac_error":
die("您的MAC地址不合法");
break;

default:
die("找不到认证服务器");
break;
}
}
/**
* debug数据
*
* @param string $message
*/
public function debug($message)
{
if ($this->debug)
echo "\n=====================================\n[DEBUG] ", date('Ymd H:i:s '), $message, "\n=====================================\n";
}
/**
* 查询状态
*
*/
public function query()
{
$msg = $this->keepalive();
$nums = explode(',', $msg);
echo "
Username: {$this->username}
UID : {$this->uid}
Mode : {$this->modes[$this->mode]}
Type : {$this->client_types[$this->client_type]}

Data in : {$nums[1]} bytes
Data out: {$nums[2]} bytes
Connection time: {$nums[0]} seconds
";
}
}



调用方法示例
 require('Srun3000forBIT.class.php'); 
try
{
#$srun = new sscSrun3000forBIT('sskaje', 'pass', 1, 2);
$srun = new sscSrun3000forBIT('sskaje', 'pass', 1, 1);
$srun->debug = 0;
$srun->init();

$srun->login();
$srun->keepalive();
$srun->query();
$srun->logout();
#$srun->keepalive();
}
catch (Exception $e)
{
echo $e->getMessage();
}

Wednesday, March 11, 2009

被Exception Handler虐了。。

调整了一下代码的结构,把几个库扔进了namespace,结果代码就开始跑不通了

但凡有异常被抛出,apache就会挂

apache的错误没有任何帮助,全都是些
[Wed Mar 11 09:54:23 2009] [notice] Parent: child process exited with status 3221225477 -- Restarting.
的东西
没有任何意义的返回码

于是试着把代码回滚,从r104到r100,一点点merge
终于出现了一个有点用的错误提示

PHP Fatal error: Exception thrown without a stack frame in Unknown on line 0

google了下,看到了php文档的comments
http://cn.php.net/manual/en/function.set-exception-handler.php#88082

然后把代码改动了
原始版本:
/**

* Exception handler and some default exception definitions
*
* @file /include/class/kernel/exception.class.php
* @author sskaje (sskaje@gmail.com)
* @lastedit 2009-03-05 12:56
* @version 1.0.0
* @package SS Kernel
* @subpackage exception
*/
declare(encoding='UTF-8');
namespace ssns;

/**
* Exception Handler
*
*/
final class ssExceptionhandler
{
private function __construct()
{
}
/**
* 自定义异常
*
*/
static public function custom_exception_handler()
{
set_exception_handler(array(__CLASS__, 'exception_handler'));
}
/**
* custom exception handler
*
* @param Exception $exception
*/
static public function exception_handler($exception)
{
if (SS_INTERFACE == SS_INTERFACE_CLI)
{
$exception_name = get_class($exception);
sscDebug::stderr('Exception {'.$exception_name.'} : '.$exception, '[Exception]');
exit;
}

debug_print_backtrace();

exit;

if ( $exception instanceof ssExceptionFatal)
{
self::error_exit_page($exception);
}
elseif ( $exception instanceof ssExceptionMsgbox )
{
msgbox($exception);
}
else
{
die( 'Unknown Exception : ' . $exception );
}
}
/**
* error_exit_page
*
* @param string $message
*/
static public function error_exit_page($message)
{
$email = predisp_email(SS_EMAIL);
$version = SS_VERSION;

echo <<<TEXT
...
TEXT; exit;
}
}

改动后
/**

* Exception handler and some default exception definitions
*
* @file /include/class/kernel/exception.class.php
* @author sskaje (sskaje@gmail.com)
* @lastedit 2009-03-05 12:56
* @version 1.0.0
* @package SS Kernel
* @subpackage exception
*/

declare(encoding='UTF-8');
namespace ssns;

/**
* Exception Handler
*
*/
final class ssExceptionhandler extends sscComponent // implements ssifComponent
{
private function __construct()
{
}
/**
* 自定义异常
*
*/
static public function custom_exception_handler()
{
set_exception_handler(array(__CLASS__, 'exception_handler'));
}
/**
* custom exception handler
*
* @param Exception $e
*/
static public function exception_handler($e)
{
try
{
if (SS_INTERFACE == SS_INTERFACE_CLI)
{
$exception_name = get_class($e);
sscDebug::stderr('Exception {'.$exception_name.'} : '.$e);
exit;
}

throw $e;
}
catch (ssExceptionFatal $e)
{
self::error_exit_page($e);
}
catch (ssExceptionMsgbox $e)
{
msgbox($e);
}
catch (Exception $e)
{
die( 'Unknown Exception : ' . $e->getMessage() );
}
}
/**
* error_exit_page
*
* @param string $message
*/
static public function error_exit_page($message)
{
$email = predisp_email(SS_EMAIL);
$version = SS_VERSION;

echo <<<TEXT
...
TEXT;

exit;
}
}

Tuesday, March 10, 2009

诡异的php5.3

现在exception handler彻底地废了
明天又得想方法调了 :s

Sunday, March 8, 2009

于是google 所有服务的A记录全被G F W了?

于是google 所有服务的A记录全被G F W了?

Saturday, March 7, 2009

the 6th Birthday of BiTUNiON

fb
然后两个奖品
上图 :x



Thursday, March 5, 2009

HTS Prog 10 & 12 Done

先做的12
题目很简单,但是很长,长得让人觉得啰嗦
无非就是取出单个的素数合数,然后分别求和再乘积
最后取全串前25个非数字的字符,分别ascii ++
合并

仅此而已
没觉得有多大意义



10
题目也不算复杂,但是很难想到
主要是ie对png支持不好,于是第一次下下来的是一个bmp文件,ie转换后的
winhex打开,跳到最后往前看
结果发现,居然颜色代码都是连续的
于是思路很简单了
下个png版的,然后gd载着,逐行把imagecolorat的结果echo出来,看看结果
很明显的,每行都有个很诡异的数字
取一下这个数字所在的offset
并不是所有行都有这个数字的
所以,取出那么多行的就是了
然后转成ascii的字符
于是,很明显的编码痕迹
decode
一个超长hash
绝对不是md5,反正也是一种通用hash算法
既然它提示了密码的结构

那就for 两个range(a,z)和range(A,Z)
然后排列呗
算法很简单

111000
从左往右扫
第一个 10 的组合 换成 01 -> 110100
同时这个左侧的1全都从最左侧起重排
结果就是
110100
101100
011100
110010
101010
011010
100110
010110
001110
110001
101001
011001
100101
010101
001101
100011
010011
001011
000111

组合呗

算法跟prog5其实类似
不过很不幸的是,prog5的某个字符的个数实在太少了,导致0.1s搞定的可能性太大了

有了结果的组合,有了hash算法
无非就是爆破

跑吧

so easy.

ghs....

我要疯了。。




gfw。。。太和谐了

Sunday, March 1, 2009

so cool @ 360buy.com



钓鱼岛啊。。。。



thx@(qqqqtqqqq@bitunion)