2006年12月6日星期三

防止文章被复制的网络分析软件

  很多Blogger都遇到过自己文章被其他人非法复制的情况,为了让大家能快速将恶意转载者找出来,我根据搜索引擎的一些原理,利用百度搜索引擎的数据,开发了一个可以自动分析查找那些对自己有“实质伤害”的复制人的地址。

防止文章被抄袭的网络分析软件

  这是一个独立的可执行的程序,完全免费,基于ACCESS数据库,目前支持Z-Blog系统,其实支持其他ASP的Blog修改也很简单,有需要的可以联系一下我。(注:其他Blog程序的使用方法:先建立一个Access文件,然后建立一个表,表名为blog_Article,表中增加字段log_ID和log_Title,log_ID为自动编号,log_Title为文章标题,然后将你Blog上的文章标题都复制过来,一篇文章对应一条记录,只复制标题即可,然后在本程序中选择这个数据库)

  数据挖掘我是直接通过调用搜索引擎来实现的。原先打算使用Java下调用Google SOAP API来实现,不过不知什么原因,Google SOAP API搜索英文没有任何问题,一搜索中文就报数组超界,不知道什么原因。只好去调用百度的搜索引擎。

  百度的搜索引擎没有API,不过我还是有办法间接调用的。调用的时候发现中文的确没有什么问题,也没有错误,很顺利就调通了程序。

  我目前搜索的时候,采用了“实质伤害”这个概念,因为目前文章转载的情况会非常多,每一个都去处理会很麻烦。因此我们只去寻找情况恶劣的即可。这个可以通过搜索引擎排名来实现。只寻找那些转载地址对于原文影响最坏的。

  这个程序使用起来很简单,先选择数据库文件,再选择Z-Blog系统,然后填写你自己的域名,点搜索即可开始执行。搜索完成后会自动生成一个名为list.txt的文件,就是搜索结果。此程序对于部分标题的文章会有误判,最好文章标题个性化浓一些。软件的界面看起来不是很好,因为我没有美工嘛。

  点击下载软件:转载文章搜索器

2006年12月5日星期二

申请Google AdSense for Feeds

  今天从困兽那里听到一个消息,说“Google已经开始接受AdSense for Feeds申请,只要你的网站 feed 订阅数在100以上,并且拥有 AdSense 帐户,就可以参加 AdSense for feeds (BETA)。申请地址:https://services.google.com/ads_inquiry/aff 。”

  我对此很感兴趣,于是也点击上面的链接申请,显示的页面是英文的,我选择填写自己的信息后提交,大概几分钟后,收到Google发来的一封邮件,内容如下:

  Thank you for your interest in AdSense for feeds.

  Unfortunately, we're unable to accept your application for the program at this time. Because AdSense for feeds is currently in beta, we're unable to accept all applicants into the program. If we're able to extend our service to you in the future, we'll be sure to let you know.

  自动被拒了。看来,中文Blog申请Google AdSense for Feeds还是有困难的,估计这个服务还是只对英文用户开放的。至少等英文用户使用稳定后,才可能考虑中文用户。

  大家有兴趣也可以去申请试试,看看能否申请成功。

2006年12月3日星期日

通过Web Service调用Google SOAP Search API

  我曾经介绍过“使用Axis开发Web Service程序”的一些步骤,做为一个更有特色的应用范例,本次我将介绍使用Axis通过Web Service调用Google SOAP Search API,实现Google搜索、Google快照、Google拼写这三项功能,包括示例源代码。

  一、环境配置

  首先,没有Java开发环境的,需要安装一下环境,点这里查看《Java开发环境的详细配置方法》,其实,本示例安装JDK 1.42以及Eclipse 3.2就可以了。

  二、将Apache Axis相关包文件放在WEB-INFlib目录下

  从Apache的主页上下载Axis包文件,复制到lib目录下。

  三、申请Google SOAP Search API license key

  要使用Google的服务,必须要有“license key”,如果你有Gmail帐号,点这里就可以申请license key,这个license key是一段很长的字符串,每个key可以支持每天1000次的Google搜索。

  四、下载WSDL文件,生成客户端Java代码

  WSDL文件的下载地址参见:http://api.google.com/GoogleSearch.wsdl

  生成客户端代码的批处理文件如下:

set Axis_Lib=D:workspace estWEB-INFlib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Output_Path=D:workspace estsrc
set Package=com.google.api
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% GoogleSearch.wsdl

  最后会生成下列代码文件:

DirectoryCategory.java
GoogleSearchBindingStub.java
GoogleSearchPort_PortType.java
GoogleSearchResult.java
GoogleSearchService.java
GoogleSearchServiceLocator.java
ResultElement.java

  五、编写程序,调用Google SOAP Search API

  在上面那个包下,编写你自己的Java程序,就可以调用Google SOAP Search API.目前可以使用的Google服务有:网页搜索,网页快照,拼写检查这三个。

  Java示例代码如下,请使用前将clientKey替换为你自己的。替换后直接运行即可得出结果。

package com.google.api;

import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;

public class ClientGoogle {

  public static void main(String[] args) throws ServiceException,
    RemoteException {
    String clientKey = "kkkkkkkkkkkkkkkkkkkkkkkkkkey";
    GoogleSearchServiceLocator service = new GoogleSearchServiceLocator();
    GoogleSearchPort_PortType gsp = service.getGoogleSearchPort();

    //Google Search API
    GoogleSearchResult searchResult = gsp.doGoogleSearch(clientKey,
        "www.williamlong.info", 0, 10, false, "", false, "", "latin1",
        "latin1");
    System.out.println("Google Search Results:");
    System.out.println("======================");
    ResultElement results[] = searchResult.getResultElements();
    for (int counter = 0; counter < results.length; ++counter) {
      ResultElement result = results[counter];
      String returnResult = "('" + result.getTitle() + "','"
          + result.getURL() + "','" + result.getSnippet() + "')";
      System.out.println("Return Result");
      System.out.println(returnResult);
    }

    //Google CachedPage
    byte[] cachedBytes = gsp.doGetCachedPage(clientKey,
        "http://www.williamlong.info/");
    System.out.println("Cached page:");
    System.out.println("============");
    String cachedString = new String(cachedBytes);
    System.out.println(cachedString);

    //Google SpellingSuggestion
    String suggestion = (String) gsp.doSpellingSuggestion(clientKey,
        "williamlong");
    System.out.println(suggestion);

  }

}

  当然,你也可以不使用Apache Axis,Google自己也提供了一个API包可以做为客户端调用,下载地址参见这里

  最后声明一下,Google SOAP Search API是属于实验产品,每个license每天最多只允许搜索一千次,其许可协议注明不能使用于商业模式的网站,而对于个人研究来说,每天一千次的搜索也就足够了。

  相关专业名词解释:

  Web Service:是一种革命性的分布是计算技术。它使用基于XML的消息处理作为基本的数据通讯方式,消除使用不同组件模型、操作系统和编程语言的系统之间存在的差异,使异类系统能够作为计算网络的一部分协同运行。开发人员可以使用像过去创建分布式应用程序时使用组件的方式,创建由各种来源的Web服务组合在一起的应用程序。由于Web服务是建立在一些通用协议的基础上,如HTTP(Hypertext Transfer Protocol, WWW服务程序所用的协议),SOAP(Simple Object Access Protocol,简单对象访问协议),XML,WSDL(Web Services Description Language,Web服务描述语言),UDDI(Universal Description,Discovery,and Integration,通用描述发现和集成协议)等,这些协议在涉及到操作系统、对象模型和编程语言的选择时,没有任何倾向,因此Web服务将会有很强的生命力。

  SOAP:是“Simple Object Access Protocol”的缩写,SOAP是消息传递的协议,它规定了Web Services之间是怎样传递信息的。简单的说,SOAP规定了:

  1. 传递信息的格式为XML.这就使Web Services能够在任何平台上,用任何语言进行实现。

  2. 远程对象方法调用的格式。规定了怎样表示被调用对象以及调用的方法名称和参数类型等。

  3. 参数类型和XML格式之间的映射。这是因为,被调用的方法有时候需要传递一个复杂的参数,例如,一个Person对象。怎样用XML来表示一个对象参数,也是SOAP所定义的范围。

  WSDL:是“Web Services Description Language”的缩写。WSDL是Web Services的定义语言。当实现了某种服务的时候(如:股票查询服务),为了让别的程序调用,必须告诉大家服务接口。例如:服务名称,服务所在的机器名称,监听端口号,传递参数的类型,个数和顺序,返回结果的类型等等。这样别的应用程序才能调用该服务。WSDL协议就是规定了有关Web Services描述的标准。

  UDDI:是“Universal Description, Discovery,and Integration”的缩写。简单说,UDDI用于集中存放和查找WSDL描述文件,起着目录服务器的作用。

  XML:(eXtensible Markup Language,可扩展标记语言)是Internet上数据表示和数据交换的新标准。它是ISO(International Organization for Standardization,国际标准化组织)的SGML(Standard for General Markup Language,通用标记语言标准)的一个简化子集。XML关注信息本身,是Web上表示结构化信息的一种标准文本格式。与传统的注重页面信息显示的HTML(Hypertext Markup Language, 超文本链接标示语言)相比,关注于内容的XML具有以下诸多优点:良好的可扩展性,语言简单有效,可自行定义标记;内容与形式的分离,主要刻画数据内容,不考虑显示效果;有严格的语法要求,便于分析统一和与数据库信息转换;便于传输,为纯文本形式,可通过Http协议直接传输,可跨越防火墙;等等。XML的出现和发展对于Internet和Intranet产生了巨大的影响。

2006年12月2日星期六

Google Blogger Beta中文界面启用

  昨天,ReallyFindIt留言给我一个消息,说Google Blogger Beta的后台管理的中文界面已经全面启用了。由于我以前一直用Email发帖子,登录后台较少,所以我立刻登录了一下Blogger Beta,发现界面的确已经全部是中文了。

  Blogger今年来在国内的服务断断续续,被折腾的也够呛,不过我依旧认为Blogger是最好的博客服务之一,速度快,功能多,Blogger Beta的一个最大的优势就是发表文章后不用重建了。这样发文章的速度就快多了。Blogger还有一个优势是操作简单,不用编辑HTML代码,只需要在设置界面上点几下鼠标,就可以完成界面部件的新增和修改,对于普通用户来说十分方便。另外Blogger还有很多实用的小技巧,所以,现在中文用户已经到了将Blogger升级到Blogger Beta的时机了。

  不过,如果你是通过FTP来发布Blogger的,那么还是不要升级好一些,反正FTP发布是肯定需要重建的。

PayPal支持电汇提现

  今天,收到一封邮件提示我的PayPal帐户收到了Review Me的50美元,于是登录了一下PayPal的英文网站,果然发现收到了50美元,同时我还发现另外一个有趣的东西,PayPal的英文网站居然用中文写了一个很大的广告,上书“最快3天,美元到您手-PayPal电汇提现”。这说明PayPal开通了对中国地区的电汇提现功能,中国人收美元又有了一个新方法。

  首先先向大家解释一个问题,就是PayPal和“PayPal贝宝”有什么区别?

  PayPal国际网站(www.paypal.com)是允许用户向世界各国用户发送和接收付款。 可以使用包括美元、加元、欧元、英镑、澳元和日元等币种。不过用户需要在账户添加国际信用卡(比如招行的信用卡)。

  PayPal贝宝(www.paypal.com.cn)只能向中国用户发送和接收付款,只能用人民币交易。用户可以添加一个中国的银行账户,在贝宝账户和银行账户之间进行资金转账。

  因此接收美元必须使用英文的PayPal才可以,中文的贝宝是收不到美元的。

  PayPal的网站上介绍新的电汇提现的一些优点:

  更快:只需3到7个工作日,美金就能到达用户的国内银行双币账号。

  更容易:只需几步便能在PayPal账户内添加用户的银行双币账号,立刻开始提现。

  更直接:无需海外银行账号,更不用申请支票,提现美金直接到达用户的国内银行双币账号。

  不过,我再给其补充上一条:

  更贵:每笔电汇提现需要支付20美元手续费(而且只有打折期间才是20美元) :(

  PayPal还在自己的网站上做了一张提现方案对比的图表:

  电汇

香港银行账户

美国银行账户 美国出具的支票
时间 3-7个工作日 5-7个工作日 3-4个工作日 6星期左右
費用 促销价20美元*
低于5折
提现免费
(可能会有兑换费用)
免费 5美元
收取币种 美元 港币 美元 美元
银行所在地 中国 香港 美国 存入中国银行账户

  注:一般国外银行电汇提现手续费在25至45美元之间。

  图表中可以看出,通过香港的招行一卡通提现是免费的,但是有汇率损失。美元全部转换为港币,用美国银行的帐户则完全免费,使用支票需要5美元费用,国内银行还会再收20元人民币左右的托收费用。

  总的来说,使用支票的方式还是更为实惠一些。当然,如果PayPal帐户资金较多的话,电汇也是不错的选择。

2006年12月1日星期五

百度搜藏的功能缺陷

  百度的网络收藏夹服务“百度搜藏”已经发布了,我也第一时间试用了一下,感觉百度搜藏有不少功能上的缺陷令人感到很遗憾,社会化功能很弱,速度也不是很快,不过搜索功能的确是做的不错。下面我就说一下我个人发现的一些百度搜藏的功能缺陷。

  一、分享地址在哪里?

  使用国外的del.icio.us美味书签的时候,可以很明确的知道任何一个人的书签地址,比如我的地址就是 http://del.icio.us/williamlong ,甚至分类(tags)地址也知道,比如这里是我baidu书签的地址。然而,使用百度搜藏的时候,我却找不到我的地址,或者是百度根本就没有这个功能,只有自己才能看到自己的书签。

分享地址在哪里

  更新:百度已经解决了这个缺陷,我们可以使用类似 http://cang.baidu.com/williamlong  的地址访问自己的搜藏地址。

  二、我的tags能分类吗?

  百度搜藏把tags翻译为“分类”,不过当我们的分类很多的时候,我们就需要一个bundle tags(分类包),我可以将我含义接近的分类再进行一次分类,这样我们的分类就看起来非常清晰了。

我的tags能分类吗

  三、只能进,不能出?

  百度搜藏的导入功能我用了一下,做的的确很不错,我的del.icio.us里的书签,可以连摘要和分类一起全部导入,一个都没有导错,看得出百度在导入这个功能上下了不少功夫,然而可惜的是,我在百度搜藏里面却找不到导出的功能,为什么其他的网络书签系统都提供导出功能,而偏偏百度搜藏却不提供呢?

只能进,不能出

  四、输出在哪里?

  百度搜藏里没有找到RSS输出,这也可以理解,用RSS的人也不多,JavaScript输出也没有找到,写Blog的人难道也不多,HTML输出呢?API呢?全都没有,不知道是因为这些功能没用?还是因为百度认为大家都不会用?

输出在哪里

  总之,用了一遍百度搜藏后,我觉得我还是继续使用我的del.icio.us吧,百度有不错的构思,可惜做的东西缺陷实在太多。

2006年11月30日星期四

软件加密锁编程技巧

  本文将介绍软件加密锁的一些编程技巧,以及软件开发者将如何编写安全可靠的代码,如何对付各种各样的加密狗破解,编写加密程序时应该尽量避免的一些问题等等。以下是全文。

  一、加密狗加密的基本原理

  开发商程序通过调用硬件加密狗的接口模块对硬件加密狗操作,硬件加密狗响应该操作并通过接口模块将相应数据返回给开发商的应用程序。开发商的应用程序可以对返回值进行判定并采取相应的动作。如果返回无效的响应,表明没有正确的狗,开发商可以将应用程序终止运行,或者让应用程序以错误的方式执行。简要示意如下:

软件加密锁编程

  二、常用的解密方法

  1、反汇编后静态分析: W32Dasm、IDA Pro

  2、用调试工具跟踪动态分析:SoftICE、TRW2000

  3、针对各种语言的反汇编工具:VB、Delphi、Java等

  4、其他监视工具:FileMon、RegMon 等

  三、如何提高加密强度

  下面,我们以Sentinel SuperPro加密锁为例,详细介绍一下使用如何在编程的过程中提高加密强度的方法。

  1、反DEBUG解密的编程方法和技巧

  访问狗之后不要立即做判断,判断狗不正确后,不要立即提示,或者不提示。开发商在程序各个部分插入校验算法的代码,用以增加程序代码的复杂性,防止解密者轻易跟踪发现全部的校验代码。校验代码插入程序的频率越高,破解难度越大,软件就越安全。

  重要的字符串不要在程序中以明文出现,应该使用算法动态生成。

  在不影响程序效率的情况下,尽量多写一些查狗的函数,彼此要有区别,使用不同的算法,多一些查狗出错的标志,让这些标志参与运算,在不同的模块中,使用不同的查狗函数。

  针对某一具体查询校验,都有三步骤组成:查询得到响应串;比较响应串和查询串是否匹配;根据校验结果执行相应的步骤。建议三个步骤要延时执行。最好将三步骤相互远离些,甚至放到不同的子程序或函数中。例如:执行“查询得到响应串”后,相隔50行执行“比较响应串和查询串是否匹配”,假如程序需要调用一个函数。那么就在这个函数里执行“执行相应的步骤”。解密者在跟踪过程中,即使发现了其中一部分程序代码,但很难发现另外两部分代码和全部三部分之间的关联。程序难于被破解。

  将加密锁返回的“响应串”作为程序中的参数使用。例如:算法单元返回“响应串”是“87611123”,而程序中需要使用“123”这个参数。程序中得到“响应串”后,将“响应串”减去“87611000”得到参数。如果解密者修改代码跳过查询校验加密锁部分,参数将是错误值,从而会使程序运行紊乱。

  程序在验证加密算法过程中,一般情况下验证数据不正确程序就会选择退出。这样一来很容易被解密者发现代码特征,跳过查询校验部分。开发商设计查询校验部分时,如果程序校验数据不正确,程序也不退出可以继续执行一些无用的操作使程序紊乱,用以隐蔽代码迷惑解密者。

  开发商的软件可能有多个模块,查狗的模块或接口不要用显而易见的名字来命名,这样会令解密者更容易找到加密点,当然也可以利用一些名字来迷惑解密者,尤其是dll,引出函数时甚至可以不用函数名。

  给查狗函数加入一定的随机性,例如,随机地执行某一API函数,或者在狗的存储区中划定一小块区域作随机读写,读写地址、读写内容、读写长度都是随机取的,这样可以很好地防止那些模拟工具。

  试用版与正式版要分开,试用版不提供的功能,代码已经删掉,使得不可能利用试用版破解得到正式版。

  在大多数情况下,破解是通过更改exe 或 dll 文件实现的,要在程序中检查exe或dll文件的完整性,即利用某种算法计算出整个文件的校验和,在程序中比较,如果文件被更改,校验和就会变化,这类算法网上有很多,可以查得到。另外,exe和dll之间要相互认证,一方面防止dll被替换,另一方面防止非法exe访问dll。

  小结:应该尽量避免的问题

  1)访问狗、做判断、提示用户写在一起

  2)重要的字符串在程序中以明文出现

  3)在狗中存放字符串,程序中读出比较

  4)调用同一函数或判断同一个全局标志查狗

  5)试用版软件同正式版软件是同一份

  6)查狗的模块或接口名字太明显

  7)程序无随机性,每次运行执行路径都一样

  8)没有检查exe 或 dll 文件的完整性,exe 和 dll 之间也没有相互认证

  2、反“监听仿真”软件保护锁的编程方法

  1)随机查询法:开发商使用SuperPro开发工具生成大量查询、响应对,如:1000 对,并在程序中使用这些校验数据。在程序运行过程中,从1000 对查询、响应对之中,随机的抽出其中一对验证SuperPro加密算法。因为,校验数据很多,每次验证加密算法使用的“查询响应对”可能不同,“监听仿真”软件即使纪录了一部分“查询响应对”,但无法纪录全部“查询响应对”。软件每次运行时,都可能使用新的查询响应校验数据,“监听仿真”软件无法响应这些新的查询。因此,“监听仿真”也就失去了模拟、仿真SuperPro软件保护锁的作用。

  2)延时法:开发商可以事先使用开发工具生成大量的校验数据,即:“查询、响应”对,比如:200000 组“查询、响应”对,开发程序过程中,开发商设计定时查询、校验加密锁的机制。在程序运行过程中,每10分钟查询并校验加密锁一次,使用过的校验数据,4年内不再重复使用。即使监听软件24小时记录数据,也需要4年才能纪录完毕。4年后,软件早已过了“热卖期”了,使用监听软件的解密者也就失去了行动意义。

  3)分组、分时法:开发商可以在程序中把查询响应对分组,比如:1200 对校验数据可分为12组,每100对一组。程序在一年中的第一月使用第一组校验数据,第二月使用第二组校验数据,以此类推。监听软件就算记录了第一月的校验数据,第二个三个月以后校验数据没有纪录,在以后的时间段软件仍然无法正常使用,从而“监听仿真”失去意义。

  4)随机噪声数据法:开发商可以在程序中随机产生查询数据,随机数据和真实数据混合在一起,监听软件即使记录了查询数据,也会被其随机性所迷惑,同时也无法仿真另一个次软件运行产生的随机数,加密软件也就无法破解。

  注:本文部分内容来源于彩虹加密锁Sentinel SuperPro的使用说明文档以及相关技术文档整理而成。