2010年4月19日星期一

搬家

由于blogspot.com在国内长期无法防问. 我也不是专业翻墙者,所以在国内卖个了空间架了个简简单单的博客, 一些技术爱好包括koobi的研究,就搬到新家去了. 这里就不再更新了. 没办法, 大国顺民, 不折腾. 并,本职工作繁忙, 恕我不能对我所释出的一些程序作服务或答疑解惑.
祝阅读者愉快!

博客新地址: http://www.babalele.com/typecho

2009年3月28日星期六

Koobi Pro v7 build 1.05

koobi 7.1.05的前台翻译全部完成. 并已国际化. 尚末发现重大错误. 欢迎反馈.(对这个程序精确的过程执行越来越爱不释手)
后台还没有译.

[2008.12.28更新]

前后台都已翻译完成.

词条翻译中遵循这样几个原则: 一, 表意清楚, 与程序功能匹配(因此所有词条出现的页面都测试运行过); 二, 符合中文表达习惯. 比如德国的FSK-18, 是一种内容分级制度, 中国没有对应制度, 译为"不向未满18岁青少年开放内容"我想是准确和便于理解的. 三, 页面呈现优美. 比如菜单词条尽量整齐, 单行表格中的词条尽量不换行, 不把表格撑大等等.

前台词条也有再作一些调整,一是为表意更清晰明确,更符合汉语环境的理解习惯,二是为了与后台词条最大程度的统一。

在翻译的过程中,有几个地方真让我犯难。
一是cheats这个模块应该如何理解。它有文章介绍,有文件下载,有文件适用平台。原德语和英文文档中将这一模块名称定义为“Tip&Trick”, 直译为中文“小贴士&窍门”(我曾经在filefox的英文官方网站有这样一个栏目,中文官方网站对应栏目就是译为贴士与技巧,但实际呈现内容与koobi此处的设计有较大差别)或更IT一点的“攻略”,都跟实际内容好像不太搭。实际内容怎么看都就是一个软件下载功能模块!最后该模块中文名称我定为“软件”。是否恰当,仁者见仁了。
另外一个地方就是article。字面很好理解。但此模块功能与字面并不太一致。实际中,article这个模块呈现的内容也是有简介,有版本之分,有适用平台,有系统需求等等,但是没有文件下载,代之以购买链接。总而言之与cheats模块很接近--在后台也是列在同一个管理区块中,词条变量名前缀也是同样的(game_)。直译为“文章”肯定不贴切。我想来想去,觉得作者写此模块的本意是放置软件测评文章的。有兴趣的朋友可以去体验一下。因此最后(此次更新后台语言时同时更新了前台语言)把这个模块中文名称定为了“测试文章”。

另外,在语言包中自己陆陆续续发现有一些错别字(有时打得太快了),现在释出的文件中也必定还有我没发现的错别字,或是较为晦涩的地方,或是表意有误差的地方,总之,就是我们常在书籍前言中看到的一句话:“由于时间仓促,加之水平有限,错漏之处在所难免,恳请同好和读者批评指正.”

[2009.03.28更新]

修正: 后台"商店信息"无法写入(原程序bug: koobi7_shop_einstellungen表中缺失Fsk18字段). --感谢网友Sophina

Koobi Pro v7 build 1.05 下载[skydrive] [2009.03.28更新]

玩得开心! 欢迎交流反馈.

2009年1月12日星期一

为Koobi论坛增加附件图片显示功能

从Koobi声名雀起的4.2版开始,一直到现在的7.1.20版,它的论坛一直不显示图片附件,任何附件只显示一个下载链接,不知用意何在。技术上不存在难度。这里写出来,供有兴趣的朋友参考。并提供了修改好的补丁文件,为懒人直接下载使用。

补丁功能:
1. 原论坛附件仅显示下载链接, 本补丁增加图片(JPG,GIF,PNG)显示
2. 控制图片显示尺寸, 宽度大于800px的图片自动调整为800px宽度显示(高度自动按比例调整)

手动修改指南(手动修改前建议备份您的原始文件)

1. 打开/system/showtopic.php, 在第380行(while ( $file = $r_file->fetchrow()) { )之后插入:

if(eregi("jpg|gif|png$",$file->orig_name)){
    $file->img = $file->filename;
    $size = GetImageSize("uploads/attachment/$file->filename");
    $file->imgWidth = $size[1]; //Get image width
    if($size[1] >800){$file->imgWidth = 800;} //you can define as other value
} else {
    $file->img = "";
}

保存关闭.

2. 打开/theme/standard/forums/showtopic.tpl,(请将standard替换为您使用的模板文件夹名称), 在第97行( {foreach from=$post->files item=file name="post"} )之后插入:

{if $file->img}
<tr>
<td colspan="2"><img src="uploads/attachment/{$file->img}" width="{$file->imgWidth}px" alt="" /></td>
</tr>
{/if}

保存关闭.

补丁下载:Koobi_Patch_7105_01.rar

祝玩得开心!

2008年10月29日星期三

对koobi中字符过滤暨正则表达式的思考

Koobi中大量使用了正则表达式来验证用户输入的合作法性和对字符进行过滤. 然而我在学习的过程中有两点感到似乎可以再提高:

一是对邮件地址的合法性验证. 请看这一行:
if(@!preg_match("/^[ -._A-Za-zÀ-ÖØ-öø-ÿ0-9-]+(\.[_A-Za-zÀ-ÖØ-öø-ÿ0-9-]+)*@([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,4})$/", $_POST['reg_email'])) $error[] = $GLOBALS['config_vars']['RegE_wrongmail'];
这是class/class.login.php第453行, 对注册email进行验证. 注意*@前面的两节, 我不明白@前面为何允许À-ÖØ-öø-ÿ区间字符开头并在其中可包含这些字符(邮件允许包含德文字符吗). 我认为所有邮件验证应该去掉À-ÖØ-öø-ÿ区间. 也是最经典的正则表达式验证email地址的写法:
preg_match("/^[ -._A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,4})$/", $_POST['reg_email'])

二是对用户输入的安全字符过滤. 我们还是来看他是怎么写的:
if(!empty($_POST['reg_username']) && @preg_match("/[^ ._A-Za-zÀ-ÖØ-öø-ÿ0-9-]/", $_POST['reg_username'])) $error[] = $GLOBALS['config_vars']['RegE_wrongUsername'];
这行的意思是如果reg_username非空并且包含 ._A-Za-zÀ-ÖØ-öø-ÿ0-9-区间以外的字符, 就报错终止. 如果光是德国人用, 没问题, 因为德国人能够输入的也就是这几个区间的字符. 可我们是光荣的中国人. 问题来了: 中文字符不在此区间内. 而且整个软件充斥着A-Za-zÀ-ÖØ-öø-ÿ0-9这个字符串作为允许输入的字符范围.
我的建议暨我的修改作业做法是: 在全局配置文件中定义一个代表中文区间的字符串, 再在所有涉及字符过虑或验证的正则表达式中代入这个字符串.
如:
在db.config.php中增加[build 05版中将会在安装过程中自动完成]: define("CPATTERN", "À-ÖØ-öø-ÿ".chr(0xa1)."-".chr(0xff)); //为何用常量? 它更方便穿透类和函数. chr(0xa1)-chr(0xff)涵盖中文区间. 之前曾尝试\xa1-\xff, 总有些测试无法通过. 后来选用chr(0xa1)-chr(0xff)才没出现问题. chr(0xa1)-chr(0xff)涵盖中文字符区间是在php手册中出现的, 所以, 应可放心, 我的大量测试也还没有捕捉到例外. 这里我将德文字符也作为允许范围--毕竟是它的祖国嘛. [11.04 编辑]
在应用语句中改为(以上面引用的语句为例):
if(!empty($_POST['reg_username']) && @preg_match("/[^ ._A-Za-z".CPATTERN."0-9-]/", $_POST['reg_username'])) $error[] = $GLOBALS['config_vars']['RegE_wrongUsername'];

对于正则表达式的理解, 网上的教程多如牛毛, 不赘述. 贴一张完整参考列表, 来自于wikipedia. 并推荐两个学习网址: wikipedia, 正则表达工作室.
在PCRE中元字符及其在正则表达式上下文中的行为的完整列表:

字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。
^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
* 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。
{n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
{n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
{n,m} mn均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。
. 匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“[.\n]”的模式。
(pattern) 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(”或“\)”。
(?:pattern) 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用“或”字符(|)来组合一个模式的各个部分是很有用。例如,“industr(?:y|ies)就是一个比”industry|industries'更简略的表达式。
(?=pattern) 正向预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例 如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配 “Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从 包含预查的字符之后开始。
(?!pattern) 负向预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如 “Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中 的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。
[xyz] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“p”。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B 匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。
\d 匹配一个数字字符。等价于[0-9]。
\D 匹配一个非数字字符。等价于[^0-9]。
\f 匹配一个换页符。等价于\x0c和\cL。
\n 匹配一个换行符。等价于\x0a和\cJ。
\r 匹配一个回车符。等价于\x0d和\cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]。
\S 匹配任何非空白字符。等价于[^\f\n\r\t\v]。
\t 匹配一个制表符。等价于\x09和\cI。
\v 匹配一个垂直制表符。等价于\x0b和\cK。
\w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。
\W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
\xn 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04”&“1”。正则表达式中可以使用ASCII编码。.
\num 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若nm均为八进制数字(0-7),则\nm将匹配八进制转义值nm
\nml 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
\un 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。

2008年10月27日星期一

skype官方版使用tom-skype国内卡方法

想用skype打电话, 在tom.com上买了一张"国内卡"试试. 不能打. 问tom的客服, 说是因为我用的skype版本不对. 要下载tom-skype版本的才能用. 又有广告又加了好多非官方的东西, 简直像个流氓软件, 真是不想用它. google一下, 发现一个方法可以让skype官方版本使用tom的国内卡, 一试还真有用.

引用:
非TOM-Skype版本的国内卡长话通拨号方法:
拨打手机号码:0099008668033+0+手机号码
拨打座机号码:0099008668033+区号(不要去0)+电话号码
如示例:
拨打手机方式: 0099008668033013917497583
拨打座机方式: 009900866803302161021281

2008年10月14日星期二

koobi发布新的免费模板

十天前, koobi官方网站陆续发布出了三款模板, 适用于koobi 7 pro版和standard版, 提供免费下载.



Koobi 7 Theme - Butterfly


Koobi 7 Theme - Classic Car


Koobi 7 Theme - Flowers

个人认为butterfly比较打眼. 字体'Georgia'我很也喜欢. 就是本博客使用的字体, 这种字体最明显是数字显示很漂亮. 另外, 从koobi7的标准模板到这几个模板, 默认字体都是12pt, 显示中文再也不会像6系列那样需要难看,需要到css去一个一个改了.
适用版本
Koobi7 Pro, Koobi7 Standard

安装指导
#文件解压缩后复制到 koobi安装目录的"/ theme /" 文件夹中.
# 登录到后台, 进入"设置"->"分区"
# 点击目标分区的"编辑"图标, 在弹出窗口的模板(theme)下拉选框中你会看到刚复制进去的模板, 选择你喜欢的, 其它都不需要更改, 保存
# 刷新相应分区, 查看效果.

另外, 顺便讲讲我对koobi运行速度的了解. koobi使用页面缓存技术, 如果页面是第一次被访问, 它需要生成一个缓存页面文件, 比较慢, 以后再打开这个页面(不管是你还是其它人在其它地方访问), 速度就很快了. (这种样子对边修改边测试的人是很普通痛苦的, 改动了它就要重新生成一次). 我在我的机器上测试(赛扬2.1的老机器了), 首页第一次打开要5.032秒, 之后第次不超过1.5秒, 应该还是可以接受的.

2008年9月17日星期三

koobi Pro 7.1.04 和 7.1.05 的升级

最近koobi升级很频繁. 两个月中发布了两次修正性升级. 我试着将这两次升级的说明译成中文以通告爱好者们.(没有得到升级程序).

koobi 7.1.04 (pro & standard)更新(基于7.1.03):
修正:

  • 在非分区1(section 1)中创建制造厂商(Manufacturer), 却只能显示在分区1中.
  • 在非分区1中创建投票调查(Poll)出错, 投票无法处理.
  • 在分区1中指定投票"不发布"出错.
  • 所有文章(除文档)都会在分区1显示, 即使文章是创建在其它分区.
  • 如果在分区中选择某一类新闻,将得不到正确的"该分区该分类"的新闻
  • 论坛贴子的meta描述丢失现象.

总的看来, 7.1.04主要是修正7.1.03中分区管理的错误.

[10.04 更新]: 国庆假期花了一点时间对照1.04对于1.03的源代码改动, 发现其实改动的远不止官方所描述的(上面的引用), 还有好多安全漏洞的小修改. 在此共享. 同样, 我的改动仅限于安装过程的多语言化和整个网站的UTF-8, 跟之前的改动范围完全一样. 中文语言文件我有一搭没一搭的译出了一些, 主要还有论坛和商店两个大头没有译. 因为我译语言是要逐一运行引用每条语言条目的网页, 以求译文准确, 同时也能测试一下每个角落的运行情况, 所以翻译比较慢...反正是玩嘛. 这次还收到了koobi 7 用户手册.

下载 koobi Pro v7 Build 1.04(10.12更新)

下载 koobi 7 用户手册(德文附图)

mafiascripts和iAG这两个大名鼎鼎的破解组织也释出了他们的koobi7.104, 我逐个文件详细对比, mafiascripts的版本把所有版权标志和检查copyright.php等都去掉了, 没有修改其它一些小错误; iAG同样去掉版权标志(这是不是就叫做nulled), 没有修改错误, 还在两个地方加了iAG的标志. 都加入了nfo文件.


koobi 7.1.05 (pro & standard)更新(基于7.1.04):
本次升级修正了一些次要错误, 以及以下主要改动:

  • 商店(Shop): 当顾客使用了优惠券时最终价格计算不正确.
  • 文章: 相关购买链接可能出错.

新功能:

  • Banners管理(新功能): 不同的分区显示不同的Banner, 指定Banner显示权重(显示频率), 最多显示次数等.
  • 可以指定首页显示文章,链接,下载等项目的条数.
  • "最新注册用户"的显示用户名称及头像.
  • 论坛显示"当前在线"用户包含当前不在论坛但在站内的用户.
  • 日历中显示最新事件
  • 论坛贴子meta关键词和描述可用
  • 优化显示notfound.php(网页没找到的错误页)的速度.
  • 联络表单: 通过网站发送邮件的同时可以抄送一份给发送者本人.

2008年8月18日星期一

koobi pro 7.1.03

对于前文提到过的四个加密文件:
/setup.php
/index.php
/lib/copyright.php
/admin/index.php
都反编成了明码. 没作功能性的改动. 改动仅限于:
1. 在没有中国选项的地方加上中国.
2. 安装过程中有一处原码是会把安装情况包括主机名/系列号/个人信息等情况邮件发送到官方, 我把它注释掉了.
其它......基本没有改动了. 哦对, 安装过程原来是不可选的语种的, 就德语. 我把它改成了可选语种. 前后台语言加上了中文包--但我没有翻译语言条目, 没兴趣. 有需要用的不防自行译. 如果你译好了愿意反馈给我, 当然欢迎!
至于官方的反D版措施, 我看是非常松的. 一是在安装过程中有个邮件收集, 上面我提到了, 我把它注释掉了. 二是对于copyright.php这个文件的检查, 原码是如果去掉了这个版权标识就无法运行. 不过即已经将它编为明码了, 你如果要改......何必呢, 我们只是看到好代码玩玩而已. 商业应用还是悠着点.

下载 Koobi Pro 7.1.03 [08.08.29日更新]
玩得开心.

08.08.29:
1. 强制指定数据库,数据读写均遵循UTF8字符集
2. 修正程序在对中文进行字符安全处理后显示乱码的问题(都是htmlentities, htmlspecialchars, stripslashes这三个函数作崇, 涉及到三个文件,五个自定义函数, 分别对模板文件中的字符处理和程序文件中的字符处理起作用)

2008年8月16日星期六

koobi pro 7 解密 -- byterun的反编码过程

koobi 7 发布之后, 我在第一时间得到了源码, 安装表现自不待说, 精彩非常, 是一个不可多得的CMS/onlineshop. 有兴趣可以看官网:dream4.de
细看源码, 发现商业保护采用的是内部编码加密的方式, 有这么几个文件加密:
/setup.php
/index.php
/lib/copyright.php
/admin/index.php
以copyright.php为例讲述我的反编码过程. 其中让我对原作者的奇思妙想大为佩服.
copyright.php加密后的编码如下:
$_F=__FILE__;$_X='PzNhP21abWJ5eWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYnl5ND5ZWVdyNAoyNC00Lzc2NC00dFkKW1JxNll3W2xSCkIoSCk0VgpCUjdkKG4pNGJ5eTRQW1t0Onl5bGxsWFYKQlI3ZFhWQmJ5eWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYnl5NFIvUFtHRjkhYnl5NFZyQjZCCjR0Clk5ClI3Ny9ZVkI0cjZbNEcKUEIKCkIvUFtxci9QNDlCNi9QR0JbVVtieXk0VnJCNEcKUEJXQgoKQi9QW0I0cXJCOUJGNFdCcjRWQkY0fUJsQnJxcjlCRjRSR1tZCkJGWGJ5eTRSQkZWQgpHRjlCRjRyRjRWckI2Qgo0VlJbQnI0Qgp3WXE5QkY0Ukd3NEJyOUJGQjQ5QndSUAohYnl5NEI2NHI2WzRGci9QWzQ5QjZbUltbQlssNFZCRjQvWXRoCnI5UFtQckZsQnI2NFVHNFJCRlZCCkY0WVZCCjRVR2J5eTRCRlt3QgpGQkZYNEZHCjRsQkZGNDZyQjRCckZCNC9ZdGgKcjlQW1ByRmxCcjYtQkZbd0IKRkdGOTRXQjZbQnFxW2J5eTRQUldCRiw0VkdCCndCRjQ2ckI0VnJCNkJGNEJGW3dCCkZCRlhieXlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYnl5NFdCcjR3ClI5QkY0bEJGVkJGNDZyQjQ2ci9QNFdyW1tCNFJGOjQ+WUZbUj5bQFYKQlI3ZFhWQmJ5eWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYkVNdU9ETTQoJ3JfVnIKJyw0TG9uX25NbS4wSE0oIlxcIiwieSIsY01vSF1FKCkpKTtiQE9ESC5KRU0ocl9Wcgo0WDQneS5PQXlwTW5MT1NEWE9ET1htWm0nKTtiRU11T0RNKCcvWXRoRllbci9CJyw0J1ZPTUxNNDZNT29NNF1KbkVNNCBPbzQ+U1NBTzQnWGlCCjZyWUZYJzQnWD5ZWVdyX2lCCjZyWUZYJzRNbkxvTS4ubzQmSFNtNTs0czg4ei0nNFg0RTBvTSgnaCcpNFg0JzRhMDRvMG5jTW9mIl9BLjBEUSI0Wm5NdWYiWm9vbTp5eV1dXVhFbk0wIGRYRU15SCBMeSIzRW5NMCBkJm5NYztheTAzJyk7YkVNdU9ETSgnL1l0aEZZW3IvQl9SVjdyRicsNCc+U1NBTzQnNFg0NGlCCjZyWUY0WDQnNCc0WDQ+WVlXcl9pQgo2cllGNFg0J2FBbjR5MyZIU201OzRzODh6LSc0WDRFMG9NKCdoJyk0WDQnNGEwNG8wbmNNb2YiX0EuMERRIjRabk11ZiJab29tOnl5XV1dWEVuTTAgZFhFTXlIIEx5IjNFbk0wIGQmbk1jO2F5MDMnKTtiYnVKREhvT1NENGVqTHdWY091SnVPSkV1Sk9VVUdrMklqMklqMmoySU1FKCRTSm8pYktiCSR1T0RFX0g0ZjRMb25tU0woJFNKbyw0L1l0aEZZW3IvQik7YgliCU91KCR1T0RFX0g0ZmZmNHUwLkxNNCYmNEAkXwpCPEdCNltnJ20nTjQhZjQnIE9MSCc0JiY0IUVNdU9ETUUoJ0ZZWUdbJykpYglLYgkJTW5uU24oJz5TU0FPNEgwRERTbzRBTTRuSkQ0QU1IMEpMTTRTdTQgU0VPdTVPRGM0b1pNNHVPLk00YU0gMy5PQXlIU201bk9jWm9YbVptYXlNIDNYYUFuNHkzdC5NMExNNEpMTTRvWk00WW5PY09EMC4td08uTTQwREU0bS4wSE00b1pNNFswYzRhTSAzS0hTbTVuT2Nab1RheU0gMzQwbzRvWk00QkRFNFN1NDVTSm40UFs3cS1bTSBtLjBvTVgnKTtiCVQ0TS5MTTRLYgkJTUhaUzQkU0pvO2IJVGJUYmJ1SkRIb09TRDRtbk9Eb19IU201bk9jWm8oKWJLYgluTW9KbkQ0L1l0aEZZW3IvQjtiVGI/Mw==';$_D=strrev('edoced_46esab');eval($_D('JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCdPL2JwdXcza002QjJ0eEQxLlJvWF1sVlkgPkpBRUdUZno3SwpRSD1qc31acVVjZTh2NW5tPFs5YTRpMENyV3tOZ2hkSUxQeVNGJywnaUMKdmZGPnplU0U3UDVucWxBdC53V0RPbUt1YmRVfT0zTXtSa2N4OTJKaExaZ1gwNnlycFFURzwgVmFqSUIxXVtZNDhzSC9vTicpOyRfUj1lcmVnX3JlcGxhY2UoJ19fRklMRV9fJywiJyIuJF9GLiInIiwkX1gpO2V2YWwoJF9SKTskX1I9MDskX1g9MDs='));

有一定编程经验的人一定都能解出eval函数的编码为:
$_X=base64_decode($_X);$_X=strtr($_X,'O/bpuw3kM6B2txD1.RoX]lVY >JAEGTfz7K
QH=js}ZqUce8v5nm <[9a4i0CrW{NghdILPySF','iC
vfF>zeSE7P5nqlAt.wWDOmKubdU}=3M{Rkcx92JhLZgX06yrpQTG < VajIB1][Y48sH/oN');$_R=ereg_replace('__FILE__',"'".$_F."'",$_X);eval($_R);$_R=0;$_X=0;

按 一般的加密编码思维, 只要按上面代码的意思, 将$_X base64反编码, 再把strtr函数的过程中的字串复制下来代回到$_X中即可. 然而在复制过程中就犯了一个原作者设下的误区. 在JAEGTfz7K和iC后面的换行符\n在windows下复制将产生错误, 最后导致对应替换出来的代码失真.

我的思路是, 既然反编码的关键在"复制"替换字串时出错, 那我何不避免"复制"?
一, 分析得到上述编码后, 不echo出来, 直接通过文件操作写入一个文件(暂叫他temp.php).
二, 将copyright.php中的$_F $_X变量复制到temp.php中, 删除eval($_R);$_R=0;$_X=0; .
三, 最后通过文件操作把$_R写入一个新文件crack_copyright.php, 即得到完全正确的源码.

//=================================================================
// KOOBI R7 - CMS - PORTALSOFTWARE(c) DREAM4(r)
// HTTP://WWW.DREAM4.DE
//=================================================================
// ACHTUNG!
// DIESER PROGRAMMCODE IST URHERRECHTLICH GESCHUETZT
// DIE URHEBERRECHTE LIEGEN BEI DEN JEWEILIGEN AUTOREN.
// AENDERUNGEN IN DIESER DATEI ERFOLGEN AUF EIGENE GEFAHR!
// ES IST NICHT GESTATTET, DEN COPYRIGHTHINWEIS ZU AENDERN ODER ZU
// ENTFERNEN. NUR WENN SIE EINE COPYRIGHTHINWEIS-ENTFERNUNG BESTELLT
// HABEN, DUERFEN SIE DIESEN ENTFERNEN.
//================================================================
// BEI FRAGEN WENDEN SIE SICH BITTE AN: KONTAKT@DREAM4.DE
//=================================================================
define ('I_DIR', str_replace("\\","/",getcwd()));
@include(I_DIR . '/lib/version.ini.php');
define('COPYNOTICE', 'Diese Seite wurde mit Koobi '.VERSION.' '.KOOBI_VERSION.' erstellt © 2003-' . date('Y') . ' dream4® ');
define('COPYNOTICE_ADMIN', 'Koobi ' . VERSION . ' ' . KOOBI_VERSION . '
© 2003-' . date('Y') . ' dream4® ');

function X9sFDgifufiudfuiZZUz7897897978ed($out)
{
$find_c = strpos($out, COPYNOTICE);

if($find_c === false && @$_REQUEST['p'] != 'misc' && !defined('NOOUT'))
{
error('Koobi cannot be run because of modifying the file lib/copyright.php .
Please use the Original-File and place the Tag {copyright} at the End of your HTML-Template.');
} else {
echo $out;
}
}

function print_copyright()
{
return COPYNOTICE;
}

我看到网上有兄弟在一个07年贴子里解密这种代码动用十六进制编辑器. 我不懂这个,运作太大了, 亦不是一般程序员都懂编辑十六进制.
顺便说, 这种加密码是用一个叫byterun protector的软件产生的.
koobi 7的完整程序我想稍后放上来。koobi 7虽然开始了多语种支持的尝试,但还是比较死板,安装过程是无法选择的。同样,像对V6.25版做的那样, 我在把安装过程改成多语种可选安装。

2008年8月15日星期五

Simple Customer

Simple Customer 是为那些需要简易追踪客户的人设计的. 打单的客户经理,渠道拓展经理, OEM客户开发人员, 等等大部分的Sales, 都会发现它是多么有用. 它能帮你记录客户信息, 跟踪信息, 以及简单的提醒标记. 使用PHP/mysql, Simple Customer 是一个轻量级的, 小巧而实用,专业的程序工具. 你完全可以当他是一个CRM(customer relationship management).

这个程序是由http://www.simplecustomer.com/发布的, 我将它作了一些修改, 使之更适合一般的业务行事. 这些修改包括:
1. 姓名字段的调整. 将firstname+lastname改为一个字段, 适合中国人的习惯.
2. 客户信息表单的小调整
3. 客户列表同时显示最后一条跟踪信息, 并可设置客户状态提醒(pendding/hang up)

你可以从simplecustomer.com下载到末经修改之前的版本, 他的站上还有一个DEMO. 或者从这里下载我修改过后的版本--我正在用它帮助我工作.