Aug 30, 2008

转帖:黑客眼里的隐私

一个黑客眼里的隐私
本文转贴自opera的一篇blog上(貌似现在很多人搬去哪里),很久没有看这样的类技术性文章了,花半个小时快速浏览了下,长了见识~转贴此文并不代表本blog同意其观点,转贴而已,希望不会因为内容敏感而被禁发(曾经在网易有过这样的经历,可以告诉您,本文网上copy的n多,不过这个是完整的10篇,希望不要因为仅仅出现类似政府,警察的字样就不让发,否则我也要搬家了)
PS:本文貌似是一篇网警写的办案经历,中间插播朽木同学的一篇文章,顺便感叹下,可怜他打电话给腾讯告之被入侵,可惜人还是没放过他,其实我也在想,既然他明白着其中的道理,为什么还会被抓呢?(虽然被保释)讽刺啊!
 
1. 2005年,圈子里一直流传着一句经典玩笑话:小心我DIR溢出你!这句话源自于一个假借红客联盟之名的红客大联盟的老大"虾扑瘟能"先生,接受电视台采访时,对着电脑一个劲的在DOS下执行DIR命令,以达到屏幕一直不停滚动的效果.这段采访的视频传开来后,具说是安焦的朋友最先发明了这句,小心我 DIR溢出你,于是,听着乐,说着乐,这句经典就这样传开来,后来甚至配上了漫画,一直传到圈子里慢慢忘了这件事.(2004年底的最后一天,红客联盟宣布解散,马上就有人继续打着红客联盟的牌子,冒出个红客大联盟来,也不记得是那个电视台还采访了,一不小心就创造出了这个伟大经典的笑话.注:DIR----用来显示文件的DOS命令)
2.  休息了一段时间,每天无聊的看看新闻,听听音乐,日子过的飞快.这天,突然接到个任务,也不能算是任务,算是帮朋友的忙吧.一位做网警的兄弟打来电话,要我过去一下,有个问题要我帮解决,因为算是一个体系,平时我们互相学习,互相帮忙,倒经常配合的很默契.  
兄弟很简单的给我说了一下事情:报案人的电脑里的所有WORD资料全部无法打开了,桌面上留着一个文本文件,里面写着一句话,要想恢复资料,请在三天内转5000元到下面账号内:中国工商银行 胡XX 95588040.....电脑他们几个兄弟查了,没有发现犯罪嫌疑人留下的痕迹.不用说,肯定是报案人访问了挂马的网站,中了木马后,嫌疑人看到电脑里的资料比较重要,所以才留下5000块恢复资料这话.一起典型的利用电脑网络的敲诈,真不明白,现在的计算机高手,都是怎么想的.好好的正路不走,净做些违法的事.  我又让兄弟把电脑开开,我再检查了一遍,一样的结果:三天前的日志全没,后门远程控制的木马也应该被嫌疑人清除了,用恢复软件恢复了所有盘符,只发现一个批处理文件有价值,那家伙定义了一个三天后运行的批处理,自动搜索所有WORD文件,清除WORD里所有文字,然后往里写些乱码. 如果只是删除了文件,还有可能恢复,像这种擦除再往里写乱码的方式,真是让文件无法恢复.看来,想恢复文件,只有找那嫌疑人了.  
"查了银行账号没,"我问兄弟:"这文件是没法恢复还原了,我看那家伙肯定是下载了所有WORD文件后才干了所有文档,不然他也没法恢复,想要文件,还真得找那家伙, 这事也没啥复杂的,查银行帐号,给他转账,等他取的时候直接抓不就得了"兄弟说:"银行那边已经查清楚了,应该是假身份证开的账号,没有详细的线索了,安排好了,无论在哪取钱,都可以马上查出来地址"我说,那不就行了,让他转账就行.说完自己感觉有点不对,能做到敲诈不留痕迹,思维应该是很清晰的,而且这么大胆的直接留下账号(尽管是假身份证,但也得取到钱啊),应该不会属于SB类型的,想到这,却想不出问题的具体不对在哪.  
兄弟给那电脑上装了一个小小的监控软件,然后让那报案人把电脑抱回家,给他说,平时不要访问些乱七八糟的网站,每天把D盘由监控软件生成的一个TXT发过来,让他先转账 (因为资料很重要,又没备份,必须得搞回来),然后等他们抓人.那个监控软件功能很简单,就是记录每个进程连出的IP,生成一个TXT,如果嫌疑人再进来这台电脑,就可以记录下来,原理上这种机率应该不会发生.因为嫌疑人清除了木马,就是不准备再连这台电脑,而且清了所有日志,也就不让有迹可寻,所以,就算真留了更高级的我们查不出的后门,他也不会再访问这台电脑,这也是这家伙心里的常识.但是我兄弟职责所在,不管有用没用,总得有个交待,做做样子,也是要的. 
 
第二天,报案人转账了,给兄弟了电话,这边就密切关注着银行账号了,等着那家伙取款好抓个正着.第三天,报案人邮箱里收到一封邮件,内容写着,要的文件地址:HTTP://www.xxxx.com/admin/test.rar.邮件一看就知道是用群发软件发出的,发件人地址伪造的, DNS是从国外来的,还不知道中转了几次,想查出发信人真实的地址,难.按地址下下来一看,果然是全部的WORD文件,我猜的没错,那家伙果然是下载了所有文件后才下的手. 
 
第四天,账号上的钱依然没动静,又不能冻结账号,只能一直等.......
3.  先贴一篇网友的文章:  (互联网没有天网恢恢疏而不漏-入侵者必读)  
作者:朽木(那个传说中的腾讯入侵者)   
 
这篇文章很早就写了,本来是投到黑防的。编辑说稿子很好,回信给我让我修改稿子把路线偏向“防”,可是思来想去,从纯技术的角度来说。目前国内网络结构是无法“防御”的。所以婉言谢绝了黑防编辑修改文章的事情。发出来大家学习吧。   
 俗语有云:天网恢恢、疏而不漏!这句话是真的么?现实社会中我不知道。但是在互联网上,这句话在Internet上是很软弱的。读完我这篇文,就可以知道。在网络上触犯现行法律,即便于公安部门立案调查,未必就“落入法网” 注:本文仅做技术研讨,并非讨论如何在犯罪后逃脱法律的惩罚。  
  首先来认识一下:“网监”也就是公安部门分管网络的部门。他们负责网络监管,如网站和服务器被黑、游戏帐号装备被盗、网络上的各种纠纷、色情`反现政府的内容。都属于网监处理。    
我们来假设一个案例:163.com主站被入侵,服务器硬盘全部多次格式化,并且重复读写垃圾数据,导致硬盘数据无法进行恢复,损失惨重。于是在召集专家紧急修复服务器数据的同时,163.COM公司迅速向广州网监报案。广州网监介入调查,追踪此次入侵者!    如果你是入侵者,你面对这样的情况。你会怎么办?其实很多同行在侵入别人网站、服务器、内部网络的同时,都不太懂得如何保护自己。如果你们不注意隐藏自己,用不了一天,网监部门就可以锁定你家祖宗十八代-_-!!!,如果隐藏的好,等这个案子过了法律追究期限,也是个无头案。而这,在Internet上来说,是易如反掌!    
首先,我们来了解下`网监部门如何追踪入侵者,锁定他在何处作案。大家一般都知道,当你黑掉一个网站的时候,你在WEB的操作。都会或多或少的被记录在对方WEB服务器日志上。IIS和Apache都是会记录一些IIS日志。如果你入侵一家网站,被记录下IP地址一点也不奇怪。就算一般浏览网站,也会被记录下IP,当你在浏览网站执行一个操作的时候,IIS服务器就会进行一次记录,比如说发生一次连接错误。这就更不谈你侵入他人网站会不会留下IP记录,这是绝对会留下的。    
当你侵入一台服务器呢?在你进入服务器的时候,首先WINDOWS系统就会对你的连接IP进行记录,其次在网关服务器上。也会记录连接进入服务器的IP。所以即便于你能够把服务器上的记录给删除,而网关上的记录,你永远也碰不到。    
公安部门在锁定做案者的时候,首先就是要找到做案者,如何找到?最重要的就是追踪IP了。  
  我们来了解下一些ADSL宽带接入常识。 
  众所周知,现在大家一般都是使用的ADSL电信或者网通的宽带接入网络。绝大部分是使用的动态IP,少部分是使用的固定IP。固定IP是特性一般是带宽在 4M以上。而一般人用不了。当你启动计算机,通过ISP提供给你的宽带ADSL帐号拨进互联网的时候。ISP服务商的系统就会随机分配给你一个动态IP,并且记录如下事件,例如:2008年8月8日8时8分8秒,btm4545455(宽带帐号),拨入IP:58.53.1.5,操作系统: Windowsxp,拨号电话:07284544562。各省的电信记录方式可能不同,但是这些数据绝对会被ISP记录下来,有的人可能不相信ISP会记录这么详细的内容。不过我进入电信网络中查看过这种系统,确实存在!而且更详细,我这里只是简单列举了他记录的一些主要数据!    
另外一点,当你成功拨号进入互联网后,你的IP在访问互联网的时候,会经过不少路由器,几乎每个路由器都会记录下你的IP!    
现在大家知道了ISP服务商通过什么方式记录你的行踪了吧?    
我们再谈谈公安部门如何抓捕做案者。大家都知道,要抓一个人,首先就要知道他是谁、他在那里。如果这都不知道,怎么抓?而要获取到作案者地理位置和真实身份的唯一手段,就是“IP”,IP就是ISP分配给大家用来上网的东东。大家都知道,当你的计算机和一台Internet上的服务器建立连接的时候,双方就会互相传输数据给对方。而这个IP就等于是传输的通道,其实你使用的IP,只能说是互联网的“身份证”,真正访问互联网资源的其实是ISP,你的IP只是负责接受和传输数据到XX服务器。同样,这个IP就是确认某台计算机在某年某月某日某时某分某秒连接进入某个网络的证明。同样只有找到这台作案的计算机,才能继续追查他的使用者。    好的,我们现在回到前面,我们前面说了,假设163.COM公司报案后,公安部门通过分析,在WEB服务器系统上以及网关上面(无法擦去)均找到了连接并入侵系统的IP地址:211.1.1.1,这个时候公安部门调查发现,这个IP是来自日本的。这就是说`入侵者是日本人?这其实只是一个假象。  
  当查找一个入侵者的时候,很重要的一个环节就是查路由日志,大家都知道,当你的IP访问一台服务器的时候,就会经过非常多的路由器,也就是说不只一台路由记录了你曾经到访过的IP,这也是可以追查到的。同样,即使你使用国外肉鸡来连接入侵163.COM,公安叔叔同样会追查到你。那他们是如何做到的? 
  答案很简单,公安部门是有权利要求电信部门配合,提供路由日志,具体提供到有那些IP曾经路由到211.1.1.1这个IP上面,这样。就可以抓住你了。当你被抓的时候,别想`为什么劳资明明用了代理,还是被抓?其实很简单,因为单单是一层,那是很容易被破解的,尤其是代理!代理协议都是很简单的。被破译一点也不难。  
  大家都知道,公安网络监管部门有一个国家防火墙“金盾”,大家知道这个防火墙是做什么的?就是用来屏蔽一些被认为网站内容涉嫌反动、色情活动的站点和网络资源。不信,大家试试随便找个普通的国外有效代理访问类似www.wujie.net,你就会发现你和代理的连接中断,为什么中断?因为金盾检测到你涉嫌访问反动、色情内容`并且已经被屏蔽的站点。然后ISP的系统,就会强行中断你和那个国外代理的连接。这样,在一定的时间里,你就会以为代理死掉了。更简单的测试方法比如:你在google.com里搜索:“邪恶”,你就会发现自己和GOOGLE的连接已经中断,其实这就是ISP强行掐断了你们的访问。你在大概几分钟类就无法访问GOOGLE。因为你的内容没有进行任何加密措施,就类似代理、就很容易被识别出来。  
  所以大家不要随便相信代理这种基本没有任何安全性可言的东西。。而怎么样,才能逃避追踪呢?方法很简单。  
  公安部门追踪入侵者,只能从IP下手,我们逃避掉IP,只要自己拉风。基本就没有危险了。如何逃避?我说下,我一般“检测”站点服务器所用的方法。准备工具`根据威胁性质`我一般对很危险的网络使用“E级防护”直接侵入服务器的是:北京某高速IDC服务器A、它的后面还有:湖南IDC服务器:B、山东 IDC服务器:C、韩国服务器:D、台湾服务器:E、本人电脑:F。    注意,防护程度根据个人能力而定,一般我这种级别的入侵防护要求被控制的服务器质量很高,首要是速度非常快,PING值如果国外的两台高于:150,那就不用考虑了。一般国外的要求PING在120左右。国内的PING在70以内。否则会造成操作速度非常缓慢,因为本身这样做以后,操作速度就会变慢不少,原因是:(这里的各地服务器我用A、B、C、D、E、F代替,刚才已经写清楚了),首先,我们连接的是E,然后在E号服务器里使用3389终端连接韩国D 号,然后D号再3389连接进入山东服务器C号,然后C号3389再连接进入湖南B号。湖南B号继续3389连接进入“A号”。这样,在操作过程中。你的一切操作都会记录在A号上面。被入侵的服务器一切记录都在北京A号上。连A号上的日志都不用擦,就是要留给公安叔叔追踪!  
  我前面已经说过了,公安叔叔的网络抓捕终极武器就是查路由了。而当我连接到台湾E号的时候,就会记录我路由到了E,然后呢?你在3389上的操作,仅仅只会留在对方的服务器上,而你只是看到传输回来的图象。并且是经过高强度加密,我试过根本无法被识别,依照现在的技术,是根本无法还原你到底进行了什么操作。并且这是绝对不可能的事情。因为终端连接的协议是非常严谨的。就现在来说,是无法破解的。看完你就知道为什么了! 
  当我连接到E号台湾的时候,我的一切操作就是E完整的,我仅仅是得到传输回来的图形界面(也就是截图差不多的),所以一切操作就是E完成的。这个时候E路由到了D号韩国,所以E号的路由就不是我们的了,就是由台湾ISP服务商路由了~大家明白原理了吧?公安叔叔只有权利查国内电信部门的路由日志,他们可以查到一个IP路由到了国外,但是绝对不可能查到一个真正的国外计算机傀儡到底他背后是谁`为什么呢?  
   因为当E号台湾操作D号韩国的时候,他的一切操作就是由台湾ISP记录了。这个时候韩国D号连接国内C号的时候,才有可能被查到。为什么呢?因为前面的A、B、C都在国内,只要在国内,都有可能被追踪到!例如:  
  继续回到案例假设中:这个时候公安叔叔查到IP:211.1.1.1`假设他是北京A号,好的,连夜中公安叔叔赶到北京电信`通过电信的配合`查知是某 IDC托管商处的服务器,开启了这台傀儡服务器,通过分析记录日志,得到我们的B号傀儡服务器,好的,连夜赶往湖南电信`在湖南电信的配合下`查到又是一台IDC托管服务器,素闻湖南人热情好客`果然不错。在IDC的盛情款待和大力配合下和公安叔叔们奋勇拼搏、不为个人、大力牺牲的情况下。查到了我们的山东C号服务器。这个时候,劳累的公安叔叔在休息了一晚后,继续赶往山东,在当地电信的配合下。查到这个IP又是属于某IDC机房的。于是在分析完日志后。  
   我们的公安叔叔知道`曾经在吻合的时间和背景下连接到这台C号的IP是:203.1.1.1`而这个IP来自韩国,怎么办?  
  其实公安这样要求国内ISP服务商配合调查,开启路由提供日志的几率是很低的。如果要跨国办案,只有一个可能。就是前往韩国`好的,既然是假设,我们就要假设完。在拿到去韩国的机票后,公安叔叔来到了韩国,在当地警方的大力配合和盛情款待后。通过万分之一的机会查到了这台可能已经被我不负任何责任格式掉的服务器IP地址所在机房。在万分之一的几率下,又通过韩ISP的配合,居然查到还没被删除的路由日志。于是查到路由到这台韩D号的IP来自台湾 22.1.1.1、八耻八荣的号召下,公安叔叔奋力拼搏,拿到了去台湾的机票,终于终于获得了台湾警方的配合。在异国,同胞们还是这么热情,终于在万分之一的几率下查到了这台曾经被不负责的格式掉的服务器。。。 
  终于,在万万分之一的几率下取得源入侵IP23.1.1.1来自中国湖北某地,于是公安叔叔杀红了眼前往湖北,终于在当地ISP的配合下。通过系统记录的拨号记录,终于查找到这位仁兄`可是公安叔叔们发现。已经过了:刑事追究期限。。。。不过这已经是有了中500亿美金的运气了。说实话,比尔大盖子把他 500亿的财产送给你的几率,都比查到源IP的几率高! 
  刚才是我的假设,剧情是顺利的。可是现实中,是绝对不可能的,首先:路由日志,不是谁想查就能查的。查路由会导致ISP整体网络速度下降非常高。而且不一定有几率,最关键的是这种路由日志一般都会定期删除。所以他的保存期很短。并且电信部门对一般的小地市的网监,不强势的部门都不怎么鸟。所以说,就算要找到我们的C号山东服务器都是很困难的。公安叔叔一般情况下,能查到B号的,你就该送人家:优秀人民公安锦旗了。。   
 再说说国外的D号和E号,当查到C的时候,也不知道是什么年代了。去查一台多次格式化,并且读写的服务器的入侵日志,无疑是。。。怎么说都不可能,除非有路由和网关日志,那东西。能在几个月后查到的几率是0,按国内公安办案速度,一般等个一年两年,才有可能去韩国。那个时候,估计人家服务器换没换。我就不知道了,这个时候能幸运的查到台湾E号,几率确实比微软老总送你500亿美刀的几率高。,而在几年后,能在E上找到你的源IP。确实可以当联合国总统了吧?哦对了,好象没这职。   
  按道理说,找到你的时候,你的电脑在长时间的使用中也已经更新换代了~这个年代,两年换代,不希奇吧?劳资2005年1月配的新机花了8200,现在2006年买不到6000配的牛B多鸟!能把你入罪,并且还在法律追究期内的情况,确实能媲美哈雷彗星撞地球了。别的不说,只要把硬盘多读写几次、格几次。这几年后,不格不读写,硬盘也都被重复写过多次了吧?而当年入侵的时候是操作在台湾机器上的,除非有一个可能。 
  ISP在这几年里一直在路由器上拦截你的一切网络访问数据,并且解密开。并且就算解密开,得到的只是你连接对方服务器的数据。这种级别的享受,我想只有特级间谍才享受吧。ISP可花不起这个钱和设备来监视一个普通人几年。并且还保存几年数据,要知道,如果一个省的ISP监视一个省的上网数据,一天的数据就够装几万G了。。。不知道得用什么东西装,这是不可能的事情。更别提解密了。就算找到你,也没证据证明是谁入侵格式了163.COM的硬盘!     归根结底,只要你能够利用国外网络躲避开国内路由,根本没有可能查到你,上面的假设中的A、B、C、D、E我都是自己亲身使用过的。并非胡乱吹嘘。这里我来说下,我一般检测站点服务器的隐藏自己的具体方式`    首先准备肉鸡3-5台`2台国外肉鸡`两台国内,国外肉鸡最低两台。这样才能足够逃避追踪。国内肉鸡可以减少到1台。根据你找到的肉鸡网速决定。要求肉鸡的网络延迟非常高`国外地区的肉鸡`网络延迟要求你本机连接上的PING值不高于130。国内肉鸡不高于70的延迟。这样才能很好的使用肉鸡。方式是使用 WINDOWS自带的3389远程连接,在肉鸡里再连接肉鸡,这样反复套袜子式的连接。  
  我一般是使用5台`3台国内肉鸡,2台国外肉鸡。我采用的连接方式是,完全暴露的国内A号`B号国内,C号国外`D号国内。E号国内,F号本机。我连接E 号,然后连接D、C、B、A。注意`E号建议是采用开代理的方式连接。比如把E号开启SOCKS5代理服务方式,然后你在本机连接IP127.0.1,就可以成功连接E号。这样我在E号留的WINDOWS日志记录IP`全部就变成了127.0.1。这样就无法证明我曾经干了什么。即便于当检查我的计算机的时候,也只能看到我连接了127.0.1。而路由只能证明我访问了、和对方服务器建立了连接。  
   以上隐藏方式,为亲身使用过。并非胡乱猜想。如果你这样都能被逮,只能说你是神人也!天神下凡。。。。  
   注意:这篇文章仅做纯技术研讨学习。请不要尝试越过法律!请各位尝试入侵的网友记住!当你在没有任何防护的情况下进行hacking,你时时刻刻都面临着危险。你是否落入那张“网”,就看别人是否要你进“网”。犹如案板上的→“鱼”)   
 账号上的钱不动,越平静,我心里就越没底,因为目前看来,没有下手的地方:银行那边,因为账号开户是一年前,不可能还有录像;报案人电脑里又没有有用的信息了;收到的邮件查到发信人地址,基本不可能;那家伙放资料下载的网站,我还仔细看了一下,真验证了"疯狂的石头"里的一句话:公共厕所嘛,想来就来, 想走就走!这个站是漏洞一堆,不知道有多少小黑客在里留下痕迹.里面全是网页木马,而且同样,最近的日志都没了.
4.  放假的时候,通常我会去爬山,喜欢在山顶眺望整个城市的感觉;喜欢在山顶,清风拂面,让人的心开阔,让所有的烦恼释怀;更喜欢上山的途中,累了休息,体会那种向上冲刺, 向上攀登的感觉;特别是在爬到一处静处,能感受自己的心跳的加速,感受心脏敲击胸腔的那种刺激,仿佛听到心跳的声音,让自己感觉无以言比的真实.那一刻, 才能真正体会爬山的乐趣所在.
  还没在山顶休息够,兄弟的电话就过来了.一连两天没动静,今天银行那边传来消息,钱动了,但并不是取走了,而是用网银转账了.
  等我赶到,兄弟又给我详细的说了一遍,本来全面监视着账号,没想到账号里的钱通过网上银行,转了4000多到一个在T宝上开店的店主账号,店主账号,身份都是实名,有具体地址,那边已经初步调查了,反馈回来的信息是店主收到一个留言:您好,我看中了贵店的那款ABCD型手机,由于没有支付宝,直接给您转账了,转账金额4600,用户名为胡XX账号95588040......收货地址为:河南省洛阳市涧西区XX花园D-501 颜小玉收.我问兄弟,银行那边查到转账的IP是哪的,兄弟说,韩国的IP,这次还真碰到个老油条了.我说,既然网上查不出问题,也得不到信息了,直接去河南,查那个收货的颜小玉,不就水落石出了,八九不离十就是那家伙了.
  兄弟去河南的第二天,传回来两个更迷茫的消息:账上又多了5000,颜小玉的家里的电脑和工作单位的电脑没有查到任何问题,据她本人交待,自己并没有在网上订手机,也不知道这回事,当然,也不认识那个假身份证上的胡XX.
  原本一起网上敲诈案,搞的人越来越糊涂了,通常网上犯罪,一般由网警处理,但现在是网上信息一堆,却得不到有效的信息,而且账上又多了5000块钱,可能又是另一起敲诈,兄弟这边只能向上级反映具体情况,他留在河南继续调查颜小玉的生活圈子,看是否存在她的朋友或者熟悉的人犯案.然后请刑事那边帮查账上 5000元的来历.
  桌上一个小纸条,上面写着一个IP,就是那个韩国的IP,从兄弟那回来后,我一直在分析这台机子.真正的高手,会不屑于用别人的代理,从来都是自己抓肉鸡,自己再给肉鸡补好漏洞,只留一个供自己用的后门.如果真是这样,说不定这台韩国肉鸡里,能发现一点线索.
  仔仔细细的扫了一遍这个IP,返回的结果是机子只开了1433和1988两个端口,连80都没开,不用说1433肯定是开了SQL服务,80端口都没开,肯定这台肉鸡应该是一台数据库服务器.不知道是不是扫的SA权限弱口令进的系统,就算是,现在扫出来的并不是弱口令,很可能就是那家伙改了密码. 1988端口到不常用,难道?试着用远程桌面连接登陆,果然登陆上去,原来那家伙将3389改到了1988端口.没有密码,也只有干看着,干瞪眼的份.
  没头绪的时候,我喜欢用笔在纸上画,想着那家伙入侵这台数据库服务器的可能的方法.(1)没开80,不可能是通过WEB漏洞;(2)1433溢出?我也试过了,没戏;(3)1433的管理权限(SA权限)弱口令,有可能,但就算当初他是通过弱口令进的,现在也没了,因为扫不出;(4)数据库服务器一般是为WEB服务器服务,邻近IP如果是网站,有可能就是调用的这台数据库,也就有可能突破,就算不是调用的这台服务器,如果在同一网段,也有可能能嗅探到数据库的密码.看来,只有这条路可行了.
5.  喜欢玩黑的都知道,要找好用的肉鸡,最理想的就是韩国鸡,可能是国情的原因还是什么,韩国一直对黑客和网络入侵判的比较严,所以韩国的黑客很少,直接导致的结果是国内的服务器,存在着很多很多幼稚的漏洞,安全意思相对较差,就连初上手的小黑,都可以拿着S扫描器扫一堆SQL空口令的韩国鸡出来.有攻才有防, 我觉得防总是建立在攻的后面,现在全国的小黑特别多,虽然造成网络上的许多的麻烦事,但有一点至少可以肯定,他们间接或直接的增强了国人的网络安全防范意思.  随手打开相邻的IP,果然出来一个商务网站,ASP写的站点,首先让人想到的就是注入,因为韩国网站,ASP+SQL做成的网站,十有八九有注入漏洞,这也成了国内小黑抓肉鸡的一种快速方式,一年前,用GOOGLE随便搜出来的韩国ASP站点,挑一个就有漏洞,当然,现在的安全比以前好多了.
  整个站大致看了一遍,安全比我想像的好,至少注入漏洞补了,后台到是猜到了,但没密码.拿扫描器扫了一下,端口只开了80,得不到啥有用的信息,看来又不好下手.没办法,只能无聊的在网站上慢慢翻,韩文是看不懂的,只能凭感觉跟图片判断页面的意思了.网站的版面并不太多,跟大多的商务站一样,主要是些产品介绍,公司新闻等,再一个留言版,在留言版面折腾了半天,看能不能写SQL代码,结果无功而返,难道就没法下手了吗?
  郁闷的时候,我总是喜欢拿起我的大杯子喝水,以前还学会抽烟,后来写程序的时候,更是每晚恨不得抽掉一包,再后来就是喉咙哑加咳嗽,自己知道不能再这样下去了, 硬是忍了两个月,把烟戒下来了,但留下一个毛病,一思考的时候,就想拿吃的往嘴里送,演变到现在就是一直不停的喝水.    喝着喝着, 想到网站产品图片那么多,应该有个上传图片的地方吧,在网站后台路径随手加了个UPFILES.ASP,竟然真出现了上传页面,而且并不要权限,这下应该有戏了.直接上传个ASP木马上去,结果不成功,弹出的页面应该是不支持ASP文件,可想而知,肯定是做了限制的,于是只能抓包,用UE改后缀加空格, NC提交成功.在IE栏里输入上传木马地址,打开,出现了可爱的登陆窗,真是柳暗花明,感觉自己运气一下好了起来,接连又喝了几大口水.
  现在是有了一个SHELL,但权限不大,只能看看网站的文件,执行简单的DOS命令,输了一个查询端口命令,果然看到这台机子连着SQL服务器的1433端口,看来我的想法没错.心里一动,赶紧去翻网站上的数据库连接文件,呵呵,SQL服务器的连接账号密码全在,而且是管理SA权限,看到下面有一段通用防注入的代码,又看到这个文件的日期,不觉笑了,原来那家伙是通过注入进来的,然后给补了注入漏洞,这台网站服务器估计他没有拿到管理权限,所以连这个文件的日期改动了他都没还原.  赶紧用SQL连接器,输入IP,账号和密码,点连接,等的过程中,又兴奋的喝了两口水,当弹出窗口弹出无法连接时,还有半口水硬是呛了我半天.NND,难道还做了IP限制,只好传了一个带SQL命令的木马到网站服务器,连上去后果然没问题,加了个管理员账号密码,远程登陆上SQL服务器的1988,就这样进了这台SQL服务器.  
6.  打铁要趁热,进了SQL服务器后,先就直奔系统日志,SQL日志,心里还希望那家伙能粗心大意一下,结果还是不能如愿,所有的日志都被清空了.这时的感觉,就像拿着藏宝图,一步一步来到宝洞前,却发现没有门的钥匙,只能在门外徘徊,干瞪眼的份.到这里又没有进展了,只好作罢,在SQL服务器里加了一个登陆监控的小程序,隐藏进程的小东东,如果有人登陆, 自动记下登陆IP,生成一个TXT文件,然后删了增加的账号,清除了所有我留下的日志(俗称擦屁股),走人.
  多半情况,入侵一台电脑,运气占了很大的成份,其次才是技术和经验,如果那个家伙再不用这台肉鸡,那我所做的这些都是白费.一个晚上脑子里都在胡思乱想,睡不塌实,第二天一早,又传来不好的消息.
  跟上次一样,T宝的店主收到同样的留言,同样买了一部手机,又用掉了4000多块,这次的收货人换了:云南省昆明市解放路XX花园1506 张丽,我连忙问转账留下的IP是我多少,得到的就是那个SQL服务器的IP,心一动,赶紧重新加账号登陆上去,查看监控程序生成的TXT,上面记录着一条信息,登陆IP和时间,查了一下,IP来自中国北京的一个机房的IP,扫了一下,但没有任何反映,扫不到任何端口和信息.时间就是凌晨,那家伙就在我们眼皮底下把钱转走了.
  上面对这个案子也越来越重视,同时也是施加了更大的压力.下午,兄弟从河南赶了回来,领导召集所有办案人员,开了一个分析会.
  黑板上写着详细的案件信息:报案人,两个收货人,银行账号,T宝店主,还有嫌疑人,以及相关的日期等.兄弟汇报了在河南调查的结果,那个颜小玉平时挺喜欢上网,长的比较漂亮的女孩子,在网上的网友肯定很多,她始终不知道到底是谁给她寄的手机,而且有网友在网上说过会寄礼物给她,她也不确定是不是那个网友,因为以前聊天只是开玩笑,而且也不记得有没有给过人家自己的地址.兄弟记下了颜小玉的QQ号,网名,以及那个网友的QQ号,就赶回来了,我也汇报了两次都是用的同一韩国肉鸡登陆的网上银行,而且还得到一个来自北京的IP登陆这个肉鸡,但这个IP扫不到任何信息,只能靠IP判断是来自一个电信的机房.其它的的人员也分别汇报了相关的信息.接下来七嘴八舌的讨论,大概有分析:frown:1) 两个收货人都是女孩子,而且相隔这么远,会不会是她们有共同的网友或者熟悉的人做的事;(2)两次转账交易都是在同一店主里买的手机,会不会跟店主有关系而我们只查了表面;(3)嫌疑人为啥买手机送人;最后一个问题就是,那个家伙到底会是谁?讨论最后领导又分配了任务,一组负责查两个收货人和她们的共同熟悉的人员以及网友,一组查T宝店主,我跟兄弟负责查北京的这个IP.为了不打草惊蛇,账号暂时不冻结
.7.  各斯其职,我和兄弟又查了一遍北京的那个IP,仍然是没任何信息,感觉就像是,电脑压根儿没开,或者装了防火墙,屏蔽了所有端口.兄弟只好打电话向那边机房负责人询问, 核对了身份后,对方反馈回来的消息是,这个IP并没有分配给机房的机子,也就是说,机房里没有服务器用这IP.我跟兄弟说,怎么可能,难道有人利用这个 IP没有分配使用,用拨VPN的方法,利用这个IP上网?这样的话,机房里肯定有一台机子开了VPN服务.
  由于到机房查路由分析具体是哪一台机子开VPN,数据是否是通过VPN服务器中转,得一些办案原件,兄弟于是连忙坐飞机赶到北京机房,我则继续利用手上线索,寻找信息.  扫描了一下整个子IP段的所有机子的VPN端口,在子网内发现了两台服务器开着VPN服务器,估计那家伙肯定是拨号到其中一台服务器,然后分配了那个没使用的IP,这样,信息就通过这台服务器中转,并且并不会在服务器上留下信息,只会在VPN服务里有拨号的IP地址.如果服务器里的日志被删除,那就只能查路由里的信息了,好在只是一个子网的路由,影响应该不是很大.
  轮到我没事做了,倒是可以分析子网内的机子,或者拿下其中一台的权限,然后通过嗅探,看能不能得到想要的VPN的账号,密码等,但如果那家伙不登陆,那就啥用也没.而且工程量也太大.所以还不如放松一下,等着兄弟那边的好消息吧.  
  把那两个开VPN的机子IP发信息告诉给兄弟,要他重点查一查.过了一天,各方面都反馈回来了消息:frown:1) 颜小玉和张丽两人都在一个交@友网站里注册过(用GOOGLE搜她两人的网名时发现的);(2)她们有在交%$友网上认识的共同的网友,两人都在交$友网的QQ群里.(群里的人员比较多);(3)交%友网的安全并不理想,办案的同事把交$友网的数据库下下来了,里面有所有会员的全部信息.(包括会员的住址,联系方式,QQ,手机,上传的照片地址等);(4)T宝店主的详细信息,21岁,在读大学生,因有家人做手机生意,所以在T宝上开了个店,挣点学费和生活费.(其它的有用信息无).我们这边就看兄弟查的结果了.
  摊子是越铺越大,看上去线索是越来越多,但或许这些信息又会误导我们.但没有得出结论前,谁也不能肯定,这些信息到底有没有用,而且还必须相信它有用,并继续追查下去.
8.  下午,兄弟那边有了好消息了,正在往回赶的途中.领导又召集起来开了个会,原来账上中午又多了5000块,领导经过考虑,决定先冻结那家伙的账号,不能让损失更一步的扩大,同时,交待各组加快速度,把重点放在交#友网的QQ群里的人,很有可能嫌疑人就在里面,再其次调查一下T宝店主的网友情况,或者在学校的朋友情况.网上追察和网下调查同步进行,两边都不能放松,有最新消息,及时碰头交流.  领导考虑也有他的道理,账上钱是一进一出一进一出的,再不冻结,损失肯定是扩大,但只要一冻结账号,嫌疑人肯定会进行他的下一步动作,至少首先会清除痕迹,就是擦屁股,怕的是,到时就算找到嫌疑人,证据还不一定能取的到.
  兄弟一边给领导汇报,一边把打印出来的部分路由日志给我看,一部分他都在上面划了标记.日志很清晰明了,最近两次,那家伙拨VPN连韩国的SQL服务器,两次IP不同,但是MAC地址(网卡地址,在网上具有唯一性)一样,那个IP的数据都是通过其中一台开VPN服务的机子转发出去,路由里每一个连接都记的清清楚楚,时间上也是吻合.查了一下那两个IP,都是一个大城市的电信ADSL拨号IP,因为MAC地址相同,应该可以断定这台电脑,就是始作俑者的电脑,一般的"小黑",不会用ADSL拨号的机子去做肉鸡的.
  兄弟汇报完,领导马上批示,请求对城市电信相关部门配合,查此MAC地址的 ADSL账号,查清楚拨号号码,确定嫌疑人以及犯案电脑.兄弟回来屁股都没坐热,马上就往那个城市赶去.我心里也是一阵激动,现在虽然没我啥事了,但现在进展顺利,很快就可以查到那家伙的电脑,不觉很是期待.    我的桌子上还有我在纸上乱画的些信息,边喝水,边把那个城市名和两个IP以及MAC地址加上去,又看了几眼先前记的,报案人,两个女孩子,T宝店主,想着嫌疑人跟他们中间,到底谁会有联系,或者就是其中的人.看来看去,还是没啥头绪,干脆去找领导.
  人说:三个臭皮匠,顶上一个诸葛亮,我把那个城市名和两个IP以及MAC地址写到黑板上后,大伙都看出了一个相同的地方,就是这个城市名跟T宝店主上的大学城市相同,难道......原本还有一位同事在那边,刚好兄弟赶了过去,领导给他们分别交待了这边的信息,要他们汇合一起去查.
9.  有电信的配合,查ADSL电话就快了,地址,姓名很详细,兄弟跟同事还有当地的同行马上赶了过去.房东给他们介绍,房子他租给一位在校的大学生,一个小伙子,电话登记的是房东的名字.房子离大学不远,兄弟就跟房东一直在那等着,直到放学,一位小伙子走进那所出租屋.
  当一队人进了屋子,说明来意后,那家伙表现的竟然是非常冷静,兄弟开电脑取证时,那家伙一言不发在边上看着.等电脑开机后,兄弟检查了一下,心里就说糟糕,账号一冻结,果然就打草惊蛇了,那家伙系统肯定是重做了,里面啥也没有,查了一下MAC地址,还好,网卡没有换,MAC地址就是那个.  兄弟马上走出来给领导汇报了现在的情况,说电脑里查不到任何黑客工具,但通过MAC地址可以断定就是这台机子所为.领导指示:frown:1)再仔细查电脑里的痕迹;(2)审查那小伙子,争取从他口中得到信息;(3)小伙子跟T宝店主在同一学校,继续查T宝店主,查他两人的关系.
  于是兄弟分成几组,一组带电脑跟那家伙回当地局里,一组去查T宝店主,一组继续在屋子里查有用信息.到了局里,兄弟给那家伙电脑里装了一个找回格式化和删除文件的工具,慢慢扫所有硬盘,看能不能找到那家伙删除的信息,如果那家伙只是格式化了一遍电脑,应该是可以找回来一部分格式化前的信息,说不定可以找到有黑客工具,入侵记录等.(网上这个工具很早就有,用过的都知道,其实兄弟们平时,也用的就是这个工具而已)
  另一个同事一直在询问那家伙, 得到的回答是,不知道,不清楚,看着他冷静的模样,同事直想上去扁一通,让那家伙开口.兄弟把整个硬盘扫完,看着显示的结果,心又凉了,NND,那家伙不是低级格式化了硬盘,就是把硬盘格了三五次了,啥删除的信息都找不到."小黑"们平时用的工具,一般会放一份在网上存储空间里,或者备份到移动硬盘,另一组查屋子的,把屋子查了个遍,好像也没发现有移动硬盘.查T宝店主的那一组也传回消息,两个认识,那家伙一直在追求T宝店主,但对方一直是若即若离,保持着同学和朋友的关系而已.现在是动机有了,作案条件也有了,但那家伙就是不开口,案情到这一步,又停了下来.
10.  虽然看上去,事实已经很明了了,但没有证据,那家伙不开口,兄弟也没办法.那家伙文文弱弱,肯定是不经打,也不能打的,那都是多少年前的做法了,现在时代也不同了,凡事都要讲证据了.
  一个晚上,那家伙还是同样不开口,到第二天早上,兄弟找到那家伙的辅导员了解情况,最后通过同学了解到,平时见过他有移动硬盘,而且那家伙每天中午都在宿舍休息.终于在宿舍他的抽屉里,找到他的移动硬盘,所有的希望都寄托在这里面了.只要有充分的证据,就不怕他不开口了.果然,当那家伙看到移动硬盘时, 脸色马上就变得苍白,兄弟接上移动硬盘,打开一看,里面黑客工具分的明细清清楚楚,什么远程控制,注入工具,捆绑工具,加壳脱壳,教程等,还有一个专门的文件夹,叫自己写的小工具,里面就有一个用VB写的往WORD里写数据的工具,在另一个专门的文件夹里,许多TXT文档有免费域名密码,许多邮箱密码,被黑网站地址等.接下来就好审多了,兄弟一直看着他,让他把作案的过程讲一下.一个人的自信,在另一个更自信的人面前,被这个人把他伪装的自信击破后,剩下的就只有自卑和恐慌了,沉默过后,那家伙终于开口交待了.
  旁观人可能无法理解当事人的想法,可能是因为站的位置不同吧,他的理由竟然是如此简单:她在T宝上开了个店,由于暂时没有啥信用评价,没啥生意,他就想帮她,于是就有了这件事,为了不让人怀疑,他故意把手机寄给两个不认识的人,两个人的地址,就是从那个交友网站的数据库得来的,那是他以前的战利品而已.
  兄弟只能在心底无奈的叹气,凭这家伙肯钻研的精神,将来说不定会有大好前途.
  那些报案人的资料,全放在一个网上免费硬盘里,打开他的免费域名和远程控制软件,上线的肉鸡竟然还有好几百,如果不是及时破案,还不知道有多少受害人.
  下面是笔录的一部分:
  问:这么多肉鸡,怎么来的?  
答:在一些网站上挂的网页木马,然后上线的  ......
  问:那你是怎么确定人家会付款?
  答:基本上那几台电脑我都盯了几天的,都是公司的高层吧,我看他们的资料都挺重要的,想肯定会付款找回资料吧.  ......
  问:拨号的VPN是怎么来的?
  答:是网上一个兄弟给的,好像是他公司客户的服务器,那个兄弟在一个空间租售代理公司.  问:韩国的服务器是怎么入侵的?
  答:用的SQL注入漏洞进去的.  
问:具体点.
  答:就是用NB扫的注入漏洞,SA权限,直接就加了用户,然后改了远程登陆端口.
  问:那注入漏洞是你补的?
  答:嗯,因为漏洞太简单了,别人也容易进,所以我在WEB服务器上传了个马,把注入漏洞给补上了.  ......
  这个案例,到此算是告一段落了.留给我们的,是心里的无可奈何和伤感.同时,心里也在感慨,如果网卡没了,移动硬盘没了,我们还会不会如此轻松,如果第二次他换一台肉鸡......

Aug 23, 2008

(回味)指针的应用


   和一个大四毕业的师兄和两个研二师兄一起为西南财大中国金融研究重心鼓捣了一个金融交易模拟系统,收获很多,现在我想慢慢的回味一下它。
   由于用的是VC6.0,没有VS中的托管,所以我想有必要把指针这个让人爱恨交错的东西拿出来说一说。

   获得指针:

1) 在View中获得Doc指针
CYouSDIDoc *pDoc=GetDocument();一个视只能有一个文档。
2) 在App中获得MainFrame指针
CWinApp 中的 m_pMainWnd变量就是MainFrame的指针
也可以:
CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();
3) 在View中获得MainFrame指针
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;
4) 获得View(已建立)指针
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd; CyouView *pView=(CyouView *)pMain->GetActiveView();
 5) 获得当前文档指针
CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument();
 6) 获得状态栏与工具栏指针
CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR); CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR); 
7) 如果框架中加入工具栏和状态栏变量还可以这样
(CMainFrame *)GetParent()->m_wndToolBar; (CMainFrame *)GetParent()->m_wndStatusBar; 
 8) 在Mainframe获得菜单指针
CMenu *pMenu=m_pMainWnd->GetMenu();
 9) 在任何类中获得应用程序类
用MFC全局函数AfxGetApp()获得。

Aug 20, 2008

VS IDE

重构菜单:重构是编写代码后在不更改代码的外部行为的前提下,通过更改代码的内部结构来改进代码的过程。这段话的意思是写完代码后还可以修改它以增强代码的可读性和可维护性。重构菜单项在查看代码窗口中的网页,用户控件,语言代码时可用,也可以通过右键单击类视图,对象浏览器和解决方案资源管理器中的标识符,在弹出的上下文菜单中使用重构。

重构菜单包括一下功能:重命名,提取方法,封装字段,提取接口,将局部变量提升为参数,移除参数,重新排列参数。

封装字段:利用现有的公共字段创建属性,并更新代码使之引用新属性来代替引用字段。之前的公共字段转换为私有的,创建get set访问器,一次控制外部对该字段的访问。如果原始字段被声明为read_only则不会创建set服务器

提取接口:如果多个类,结构或者接口使用一组公共成员,则吧这些公共成员提取到一个接口中会更好一些,该接口可以由原始类,结构或接口实现

Aug 16, 2008

动态网站

什么是动态网站呢?所谓“动态”,并不是指网页上简单的GIF动态图片或是Flash动画,动态网站的概念现在还没有统一标准,但都具备以下几个基本特征: 1.交互性:网页会根据用户的要求和选择而动态地改变和响应,浏览器作为客户端,成为一个动态交流的桥梁,动态网页的交互性也是今后Web发展的潮流。 2.自动更新:即无须手动更新HTML文档,便会自动生成新页面,可以大大节省工作量。 3.因时因人而变:即当不同时间、不同用户访问同一网址时会出现不同页面,听起来是不是很酷? 如今,各大论坛、聊天室人满为患,说明网络发展强调更多的交互性。也许你也想拥有一个私人论坛——听听别人对你主页的建议和看法;拥有一个聊天室——志趣相投的朋友在一起自由讨论……其实,只要跟我们一起了解动态主页的制作技巧,在自己的网站中轻松搭建个人社区就再也不是梦想了!那么,从本期开始,别忘了关注我们为你推出的动态网页制作技术教程。 提起动态主页的制作,就不能不说到ASP动态网页技术。细心的读者会发现很多网站的文件是以*.asp结尾,那么这个ASP到底是什么,它与HTML有什么关系,又是如何工作的呢?不妨一起来看一看。 一、细说ASP ASP是Active Server Pages的简称,是微软开发的服务器端脚本环境,它内含于IIS或PWS中(相关内容参看2002年15期中《一步一步教你打造自己的个人服务器》一文),提供一个用于服务器端脚本执行的环境,以此来实现动态交互的目的,这也是许多动态网页技术的共同特征。本章内容均围绕IIS来进行讲解,PWS的内容与此大致相同。 ASP的兴起似乎是“一夜之间”,到底它有什么“魔力“呢? 1.无须编译或链接即可执行,可集成于HTML代码中,有了它,可省去许多繁琐重复的劳动。 2.与浏览器无关:用户端只要使用可执行HTML代码的任何浏览器(例如IE、Netscape等),即可浏览由ASP所设计的主页内容。所有代码都是在服务器端执行,只要写好代码,工作服务器就能搞定一切。 3.可通过ActiveX Server Components(ActiveX服务器组件)来扩充功能,而ActiveX Server Component可使用Visual Basic、Java、Visual C++、COBOL等语言来实现,有了它就可随意扩展功能。更令人兴奋的是,现在网上有很多第三方组件可以随意下载,想要什么尽可去Search、去Download,然后放在你的ASP代码中调用就OK啦。 4.ASP与任何ActiveX Scripting语言兼容。除了可使用VBScript或JavaScript语言来设计之外,还可通过Plug-in的方式,使用由第三方提供的例如REXX、Perl、Tcl等脚本语言,学过动态主页制作的人都知道它们的重要性。 5.ASP源程序代码不会在浏览过程中被下载到用户的浏览器中,也就是说它对你的代码进行了保密。太棒了,花了九牛二虎之力做好的东东可不能让别人轻轻点一下鼠标就拿走了。 ASP作为一种动态网页制作技术易学易用,很是让人心动。接下来我们就来看看ASP是如何工作的,一般来说,ASP文件由3个部分组成: 1.普通的HTML文本(也就是基本网页的内容)。 2.客户端的脚本代码(之间的程序代码)。 3.服务端执行的程序代码(之间的程序代码)。 我们先来看一个简单的例子: hello.asp 结果怎么样呢?如果浏览者是早晨10点打开这个网页,将会看见“早上好!”的问侯语(图1),如果是下午14点进入,页面中则会出现“下午好!”。上面之间的程序由服务器来执行,而我们常用的脚本则是由客户端来执行。这个简单的例子包含了ASP的典型结构,并且强调了ASP的服务端执行,对于我们初学ASP有一定的参考意义。 ASP动态网页与普通的静态网页在显示上有很大不同,它整个的运行过程可分成以下几步: 第1步:用户在浏览器的网址栏中输入.asp文件名称,并回车触发这个ASP的请求。 第2步:浏览器将这个Active Server Pages的请求发送给IIS。 第3步:IIS接收这个请求并根据其.asp的后缀,意识到这是个ASP请求。 第4步:IIS从硬盘或内存中接收正确的ASP文件。 第5步:IIS将这个文件发送到一个叫ASP.dll的特定文件中。 第6步:ASP文件将会从头至尾被执行,并根据命令要求生成相应的静态页面,生成HTML主页。 第7步:HTML主页将被送回浏览器。 第8步:HTML主页将会被用户浏览器解释执行并显示在用户浏览器上。 为了清晰地说明问题,以上步骤已经进行了很大简化。事实上,一个ASP并不一定每次都会重新编译解释,如果第二次接受以前的请求,而该请求没有任何变化,ASP会从数据缓存中提取出以前的结果,而不是再次运行ASP程序,这样可以大大提高运算速度。 对于服务器来说,ASP与HTML有着本质的区别,HTML是不经任何处理就被送回给浏览器,而ASP的每一条命令都首先被用来生成HTML文件,这也正是ASP允许生成动态内容的原因之一,也是动态网页复杂之所在。 另一方面,对于浏览器来说,ASP和HTML几乎没有区别,仅仅是后缀为*.asp和*.htm(或*.html)的不同,当客户端提出ASP请求后,浏览器接受的其实是HTML格式的文件。通过以上一个简单的ASP例子,有两点必须记住:有些代码是在服务器端执行,有些是在客户端浏览器端执行,而在浏览器端看到的是经过服务器解释之后输出的代码。 二、ASP的基本语法 VBScript是ASP的缺省语言,当然也可在ASP网页中使用其它脚本语言,如JavaScript、Perl等。这里所有的ASP都使用VBScript,我们将要介绍的也主要是VBScript的语法知识。相信通过前些期JavaScipt专题的学习,你一定对VBScript驾轻就熟了,其实VBScript跟JavaScript很类似,它是从Visual Basic中简化出来的版本,作为一种解释语言,也非常容易学习和使用。 1.将VBScript的脚本集成到ASP中 方法主要有3种:最简单且最常用的方法是使用两个特殊字符“”,只要在使用的VBScipt脚本语句前后加上它们即可,例如:。 第二种方法是在特定的主页中指定主要的脚本语言,要将这种语言名称直接放在ASP程序的第一行,例如: ... 第三种是方法是利用微软的HTML拓展对象,这样就可以在一个单独的主页中混合使用多种Script脚本。例如下面的例子: <% @language="VBScript" %> ASP Script示例 function sayhello() { response.write(“混合使用多种script脚本”) } 需要注意的是,使用

Aug 14, 2008

【典藏】列函数与散列表(哈希函数、哈希表、Hash函数、Hash表)

散列方法不同于顺序查找、二分查找、二叉排序树及B-树上的查找。它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,无须任何比较就可以找到待查关键字,查找的期望时间为O(1)。

一、散列表的概念 
1、散列表 
  设所有可能出现的关键字集合记为U(简称全集)。实际发生(即实际存储)的关键字集合记为K(|K|比|U|小得多)。
  散列方法是使用函数h将U映射到表T[0..m-1]的下标上(m=O(|U|))。这样以U中关键字为自变量,以h为函数的运算结果就是相应结点的存储地址。从而达到在O(1)时间内就可完成查找。其中:
  ① h:U→{0,1,2,…,m-1} ,通常称h为散列函数(Hash Function)。散列函数h的作用是压缩待处理的下标范围,使待处理的|U|个值减少到m个值,从而降低空间开销。
  ② T为散列表(Hash Table)。
  ③ h(K i )(K i ∈U)是关键字为K i 结点存储地址(亦称散列值或散列地址)。
  ④ 将结点按其关键字的散列地址存储到散列表中的过程称为散列(Hashing)

2、散列表的冲突现象
(1)冲突
 
  两个不同的关键字,由于散列函数值相同,因而被映射到同一表位置上。该现象称为冲突(Collision)或碰撞。发生冲突的两个关键字称为该散列函数的同义词(Synonym)。 
  【例】上图中的k 2 ≠k 5 ,但h(k 2 )=h(k 5 ),故k 2 和K 5 所在的结点的存储地址相同。 
(2)安全避免冲突的条件 
  最理想的解决冲突的方法是安全避免冲突。要做到这一点必须满足两个条件: 
     ①其一是|U|≤m 
     ②其二是选择合适的散列函数。这只适用于|U|较小,且关键字均事先已知的情况,此时经过精心设计散列函数h有可能完全避免冲突。
(3)冲突不可能完全避免 
    通常情况下,h是一个压缩映像。虽然|K|≤m,但|U|>m,故无论怎样设计h,也不可能完全避免冲突。因此,只能在设计h时尽可能使冲突最少。同时还需要确定解决冲突的方法,使发生冲突的同义词能够存储到表中。 
(4)影响冲突的因素 
  冲突的频繁程度除了与h相关外,还与表的填满程度相关。设m和n分别表示表长和表中填人的结点数,则将α=n/m定义为散列表的装填因子(Load Factor)。α越大,表越满,冲突的机会也越大。通常取α≤1。

二、散列函数的构造方法 
1、散列函数的选择有两条标准:简单和均匀。
    简单指散列函数的计算简单快速;均匀指对于关键字集合中的任一关键字,散列函数能以等概率将其映射到表空间的任何一个位置上。也就是说,散列函数能将子集K随机均匀地分布在表的地址集{0,1,…,m-1}上,以使冲突最小化。
2、常用散列函数
为简单起见,假定关键字是定义在自然数集合上。其它关键字可以转换到自然数集合上。 
(1)平方取中法 
  具体方法:先通过求关键字的平方值扩大相近数的差别,然后根据表长度取中间的几位数作为散列函数值。又因为一个乘积的中间几位数和乘数的每一位都相关,所以由此产生的散列地址较为均匀。 
  【例】将一组关键字(0100,0110,1010,1001,0111)平方后得 (0010000,0012100,1020100,1002001,0012321) ,若取表长为1000,则可取中间的三位数作为散列地址集:(100,121,201,020,123)。相应的散列函数用C实现很简单: 
     int Hash(int key){ //假设key是4位整数 
     key*=key; key/=100; //先求平方值,后去掉末尾的两位数
     return key%1000; //取中间三位数作为散列地址返回
    } 
(2)除余法 
  该方法是最为简单常用的一种方法。它是以表长m来除关键字,取其余数作为散列地址,即 h(key)=key%m。该方法的关键是选取m。选取的m应使得散列函数值尽可能与关键字的各位相关。m最好为素数。 
  【例】若选m是关键字的基数的幂次,则就等于是选择关键字的最后若干位数字作为地址,而与高位无关。于是高位不同而低位相同的关键字均互为同义词。 
  【例】若关键字是十进制整数,其基为10,则当m=100时,159,259,359,…,等均互为同义词。 
(3)相乘取整法 
  该方法包括两个步骤:首先用关键字key乘上某个常数A(0





 该函数的C代码为: 

     int Hash(int key){       double d=key *A; //不妨设A和m已有定义       return (int)(m*(d-(int)d));//(int)表示强制转换后面的表达式为整数       }  (4)随机数法   选择一个随机函数,取关键字的随机函数值为它的散列地址,即h(key)=random(key)其中random为伪随机函数,但要保证函数值是在0到m-1之间。 (5)数字分析法  设有 n 个 d 位数,每一位可能有 r 种不同的符号。这 r 种不同的符号在各位上出现的频率不一定相同,可能在某些位上分布均匀些,每种符号出现的几率均等; 在某些位上分布不均匀,只有某几种符号经常出现。可根据散列表的大小,选取其中各种符号分布均匀的若干位作为散列地址。 (6)基数转换法  将关键码值看成另一种进制的数再转换成原来进制的数,然后选其中几位作为散列地址。  (7)折叠法  有时关键码所含的位数很多,采用平方取中法计算太复杂,则可将关键码分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为散列地址,这方法称为折叠法。  (8)ELFhash字符串散列函数  ELFhash函数在UNIX系统V 版本4中的“可执行链接格式”( Executable and Linking Format,即ELF )中会用到,ELF文件格式用于存储可执行文件与目标文件。ELFhash函数是对字符串的散列。它对于长字符串和短字符串都很有效,字符串中每个字符都有同样的作用,它巧妙地对字符的ASCII编码值进行计算,ELFhash函数对于能够比较均匀地把字符串分布在散列表中。

三、处理冲突的方法    通常有两类方法处理冲突:开放定址(Open Addressing)法和拉链(Chaining)法。前者是将所有结点均存放在散列表T[0..m-1]中;后者通常是将互为同义词的结点链成一个单链表,而将此链表的头指针放在散列表T[0..m-1]中。  1、开放定址法  (1)开放地址法解决冲突的方法   用开放定址法解决冲突的做法是:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的地址则表明表中无待查的关键字,即查找失败。注意:  ①用开放定址法建立散列表时,建表前须将表中所有单元(更严格地说,是指单元中存储的关键字)置空。  ②空单元的表示与具体的应用相关。  【例】关键字均为非负数时,可用"-1"来表示空单元,而关键字为字符串时,空单元应是空串。    总之:应该用一个不会出现的关键字来表示空单元。  (2)开放地址法的一般形式    开放定址法的一般形式为: h i =(h(key)+d i )%m 1≤i≤m-1.其中:    ①h(key)为散列函数,d i 为增量序列,m为表长。    ②h(key)是初始的探查位置,后续的探查位置依次是h l ,h 2 ,…,h m-1 ,即h(key),h l ,h 2 ,…,h m-1 形成了一个探查序列。    ③若令开放地址一般形式的i从0开始,并令d 0 =0,则h 0 =h(key),则有: h i =(h(key)+d i )%m 0≤i≤m-1.探查序列可简记为h i (0≤i≤m-1)。  (3)开放地址法堆装填因子的要求    开放定址法要求散列表的装填因子α≤l,实用中取α为0.5到0.9之间的某个值为宜。  (4)形成探测序列的方法    按照形成探查序列的方法不同,可将开放定址法区分为线性探查法、二次探查法、双重散列法等。       ①线性探查法(Linear Probing)  该方法的基本思想是:将散列表T[0..m-1]看成是一个循环向量,若初始探查的地址为d(即h(key)=d),则最长的探查序列为:d,d+l,d+2,…,m-1,0,1,…,d-1 .即:探查时从地址d开始,首先探查T[d],然后依次探查T[d+1],…,直到T[m-1],此后又循环到T[0],T[1],…,直到探查到T[d-1]为止。探查过程终止于三种情况:    (1)若当前探查的单元为空,则表示查找失败(若是插入则将key写入其中);    (2)若当前探查的单元中含有key,则查找成功,但对于插入意味着失败;    (3)若探查到T[d-1]时仍未发现空单元也未找到key,则无论是查找还是插入均意味着失败(此时表满)。  利用开放地址法的一般形式,线性探查法的探查序列为: h i =(h(key)+i)%m 0≤i≤m-1 //即d i =i    【例9.1】已知一组关键字为(26,36,41,38,44,15,68,12,06,51),用除余法构造散列函数,用线性探查法解决冲突构造这组关键字的散列表。 


解答:为了减少冲突,通常令装填因子α   用线性探查法解决冲突时,当表中i,i+1,…,i+k的位置上已有结点时,一个散列地址为i,i+1,…,i+k+1的结点都将插入在位置i+k+1上。把这种散列地址不同的结点争夺同一个后继散列地址的现象称为聚集或堆积(Clustering)。这将造成不是同义词的结点也处在同一个探查序列之中,从而增加了探查序列的长度,即增加了查找时间。若散列函数不好或装填因子过大,都会使堆积现象加剧。    【例】上例中,h(15)=2,h(68)=3,即15和68不是同义词。但由于处理15和同义词41的冲突时,15抢先占用了T[3],这就使得插入68时,这两个本来不应该发生冲突的非同义词之间也会发生冲突。    为了减少堆积的发生,不能像线性探查法那样探查一个顺序的地址序列(相当于顺序查找),而应使探查序列跳跃式地散列在整个散列表中。       ②二次探查法(Quadratic Probing)    二次探查法的探查序列是:h i =(h(key)+i*i)%m 0≤i≤m-1 //即d i =i 2,即探查序列为d=h(key),d+1 2 ,d+2 2 ,…,等。该方法的缺陷是不易探查到整个散列空间。     ③双重散列法(Double Hashing)    该方法是开放定址法中最好的方法之一,它的探查序列是:h i =(h(key)+i*h1(key))%m 0≤i≤m-1 //即d i =i*h1(key),即探查序列为:d=h(key),(d+h1(key))%m,(d+2h1(key))%m,…,等。    该方法使用了两个散列函数h(key)和h1(key),故也称为双散列函数探查法。  注意:定义h1(key)的方法较多,但无论采用什么方法定义,都必须使h1(key)的值和m互素,才能使发生冲突的同义词地址均匀地分布在整个表中,否则可能造成同义词地址的循环计算。    【例】 若m为素数,则h1(key)取1到m-1之间的任何数均与m互素,因此,我们可以简单地将它定义为:h1(key)=key%(m-2)+1    【例】对例9.1,我们可取h(key)=key%13,而h1(key)=key%11+1。    【例】若m是2的方幂,则h1(key)可取1到m-1之间的任何奇数。  2、拉链法  (1)拉链法解决冲突的方法    拉链法解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于1,但一般均取α≤1。  【例9.2】已知一组关键字和选定的散列函数和例9.1相同,用拉链法解决冲突构造这组关键字的散列表。   解答:不妨和例9.1类似,取表长为13,故散列函数为h(key)=key%13,散列表为T[0..12]。 注意:当把h(key)=i的关键字插入第i个单链表时,既可插入在链表的头上,也可以插在链表的尾上。这是因为必须确定key不在第i个链表时,才能将它插入表中,所以也就知道链尾结点的地址。若采用将新关键字插入链尾的方式,依次把给定的这组关键字插入表中,则所得到的散列表如下图所示。 (2)拉链法的优点 

  与开放定址法相比,拉链法有如下几个优点:(1)拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;(2)由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;(3)开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;(4)在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。  (3)拉链法的缺点    拉链法的缺点是:指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度。

四、散列表上的运算  散列表上的运算有查找、插入和删除。其中主要是查找,这是因为散列表的目的主要是用于快速查找,且插入和删除均要用到查找操作。  1、散列表类型说明:       #define NIL -1 //空结点标记依赖于关键字类型,本节假定关键字均为非负整数      #define M 997 //表长度依赖于应用,但一般应根据。确定m为一素数      typedef struct{ //散列表结点类型      KeyType key;      InfoType otherinfo; //此类依赖于应用      }NodeType;      typedef NodeType HashTable[m]; //散列表类型 2、基于开放地址法的查找算法    散列表的查找过程和建表过程相似。假设给定的值为K,根据建表时设定的散列函数h,计算出散列地址h(K),若表中该地址单元为空,则查找失败;否则将该地址中的结点与给定值K比较。若相等则查找成功,否则按建表时设定的处理冲突的方法找下一个地址。如此反复下去,直到某个地址单元为空(查找失败)或者关键字比较相等(查找成功)为止。 (1)开放地址法一般形式的函数表示  int Hash(KeyType k,int i)  { //求在散列表T[0..m-1]中第i次探查的散列地址hi,0≤i≤m-1  //下面的h是散列函数。Increment是求增量序列的函数,它依赖于解决冲突的方法  return(h(K)+Increment(i))%m; //Increment(i)相当于是d i  } 若散列函数用除余法构造,并假设使用线性探查的开放定址法处理冲突,则上述函数中的h(K)和Increment(i)可定义为:  int h(KeyType K){//用除余法求K的散列地址  return K%m;  }  int Increment(int i){ //用线性探查法求第i个增量d i  return i; //若用二次探查法,则返回i*i  }  (2)通用的开放定址法的散列表查找算法: int HashSearch(HashTable T,KeyType K,int *pos)  { //在散列表T[0..m-1]中查找K,成功时返回1。失败有两种情况:找到一个开放地址  //时返回0,表满未找到时返回-1。 *pos记录找到K或找到空结点时表中的位置  int i=0; //记录探查次数  do{  *pos=Hash(K,i); //求探查地址hi  if(T[*pos].key==K) return l; //查找成功返回  if(T[*pos].key==NIL) return 0;//查找到空结点返回  }while(++i return -1; //表满且未找到时,查找失败  } //HashSearch  注意:上述算法适用于任何开放定址法,只要给出函数Hash中的散列函数h(K)和增量函数Increment(i)即可。但要提高查找效率时,可将确定的散列函数和求增量的方法直接写入算法HashSearch中。  3、基于开放地址法的插入及建表    建表时首先要将表中各结点的关键字清空,使其地址为开放的;然后调用插入算法将给定的关键字序列依次插入表中。插入算法首先调用查找算法,若在表中找到待插入的关键字或表已满,则插入失败;若在表中找到一个开放地址,则将待插入的结点插入其中,即插入成功。  void Hashlnsert(HashTable T,NodeTypene w)  { //将新结点new插入散列表T[0..m-1]中  int pos,sign;  sign=HashSearch(T,new.key,&pos); //在表T中查找new的插入位置  if(!sign) //找到一个开放的地址pos  T[pos]=new; //插入新结点new,插入成功  else //插人失败  if(sign>0)  printf("duplicate key!"); //重复的关键字  else //sign<0 >m) //用开放定址法处理冲突时,装填因子α须不大于1  Error("Load factor>1");  for(i=0;i T[i].key=NIL; //将各关键字清空,使地址i为开放地址  for(i=0;i Hashlnsert(T,A[i]);  } //CreateHashTable  4、删除    基于开放定址法的散列表不宜执行散列表的删除操作。若必须在散列表中删除结点,则不能将被删结点的关键字置为NIL,而应该将其置为特定的标记DELETED。因此须对查找操作做相应的修改,使之探查到此标记时继续探查下去。同时也要修改插人操作,使其探查到DELETED标记时,将相应的表单元视为一个空单元,将新结点插入其中。这样做无疑增加了时间开销,并且查找时间不再依赖于装填因子。因此,当必须对散列表做删除结点的操作时,一般是用拉链法来解决冲突。  5、性能分析    插入和删除的时间均取决于查找,故下面只分析查找操作的时间性能。    虽然散列表在关键字和存储位置之间建立了对应关系,理想情况是无须关键字的比较就可找到待查关键字。但是由于冲突的存在,散列表的查找过程仍是一个和关键字比较的过程,不过散列表的平均查找长度比顺序查找、二分查找等完全依赖于关键字比较的查找要小得多。  (1)查找成功的ASL    散列表上的查找优于顺序查找和二分查找。    【例】在例9.1和例9.2的散列表中,在结点的查找概率相等的假设下,线性探查法和拉链法查找成功的平均查找长度分别为:  ASL=(1×6+2×2+3×l+9×1)/10=2.2 //线性探查法  ASL=(1×7+2×2+3×1)/10=1.4 //拉链法    当n=10时,顺序查找和二分查找的平均查找长度(成功时)分别为:  ASL=(10+1)/2=5.5 //顺序查找  ASL=(1×l+2×2+3×4+4×3)/10=2.9 //二分查找,可由判定树求出该值  (2) 查找不成功的ASL    对于不成功的查找,顺序查找和二分查找所需进行的关键字比较次数仅取决于表长,而散列查找所需进行的关键字比较次数和待查结点有关。因此,在等概率情况下,也可将散列表在查找不成功时的平均查找长度,定义为查找不成功时对关键字需要执行的平均比较次数。   【例】例9.1和例9.2的散列表中,在等概率情况下,查找不成功时的线性探查法和拉链法的平均查找长度分别为:  ASL unsucc =(9+8+7+6+5+4+3+2+1+1+2+1+10)/13=59/13≈4.54  ASL unsucc =(1+0+2+1+0+1+1+0+0+0+1+0+3)/13≈10/13≈0.77  注意:    ①由同一个散列函数、不同的解决冲突方法构造的散列表,其平均查找长度是不相同的。    ②散列表的平均查找长度不是结点个数n的函数,而是装填因子α的函数。因此在设计散列表时可选择α以控制散列表的平均查找 长度。    ③ α的取值越小,产生冲突的机会就小,但α过小,空间的浪费就过多。只要α选择合适,散列表上的平均查找长度就是一个常数,即散列表上查找的平均时间为O(1)。    ④ 散列法与其他查找方法的区别  除散列法外,其他查找方法有共同特征为:均是建立在比较关键字的基础上。其中顺序查找是对无序集合的查找,每次关键字的比较结果为"="或"!="两种可能,其平均时间为O(n);其余的查找均是对有序集合的查找,每次关键字的比较有"="、"<"和">"三种可能,且每次比较后均能缩小下次的查找范围,故查找速度更快,其平均时间为O(lgn)。而散列法是根据关键字直接求出地址的查找方法,其查找的期望时间为O(1)。

Aug 13, 2008

Programming ASP.NET笔记:控件

第三章:控件:基本概念

 

控件是构建图形用户界面(GUI)的模块

Web控件包括四种类型:HTML控件;HTML服务器控件;ASP.NET服务器控件;用户控件和自定义控件。

ASP.NET服务器控件包括:文本,标签等;验证控件;数据源控件;数据视图控件;个性化控件;登陆控件和安全控件;母版页;富控件(rich controls

事件:执行程序有两种模式(二者并不是非此即彼的关系)线性模式和事件驱动模式。

线性模式的程序从第一步开始执行,直到所有步骤执行完为止;代码中的流控制结构(循环,IF或者方法调用)或许可以重定位程序的留,然而就本质而言,一旦程序开始执行,在用户或系统的操作下,它将一直运行下去。在有GUI环境之前大多数计算机程序都是线性模式。

时间驱动模式是指发生某些事情时进行响应。多数情况下事件由用户行为生成,但是由系统出发。服务器控件是可以触发事件的对象,用户在浏览器上对服务器控件所执行的任何行为都可能触发事件。

 

事件参数:事件依靠委托实现。委托是一个对象,它封装了对方法的描述,即处理事件所制定的任务

按照管理,所有ASP.NET事件处理程序都有两个参数,并且返回空值。第一个参数表示触发事件的对象,习惯称为sender。尽管这不是必要的;第二个参数称作事件参数,它包括事件信息的细节。如果有的话,对于多数事件,事件参数是EventArgs类型,它没有任何属性。因此,事件的通用原型为private void EventName (object sender , EventArgs e)

对于某些控件,事件参数可以从EventArgs类派生,并显示该事件类型的属性细节。例如,AdRotator控件的AdCreated事件处理程序,接收AdCreatedEventArg类型的参数,它有AdPropertiesAlternateTextImageUrlNavigateUrl属性。

 

应用程序事件和会话事件:当应用程序启动时,将触发Application_Start事件,这时,可以初始化整个应用程序中需要使用的各种资源。当应用程序停止时将触发Application_End事件,此时可以关闭资源,同时执行任何其他必要的日常管理。垃圾回收机制将自动释放内存。然而,如果分配了托管的资源,必须手工清楚

会话事件也是如此,当用户第一次请求应用程序页面时,会话开始。当应用程序关闭会话或会话超市,会话结束。当会话开始时触发Session_Start事件,可以初始化会话生命周期中使用的资源;会话结束时触发Session_End事件

 

页面和控件事件:页面和控件都包含事件,它们继承自control类(Error事件的情况下则继承自TemplateControl类)

部分公共的页面和控件事件:DataBindingDisposed当控件从内存中释放时发生;Error只在页面中(当抛出为处理的异常时发生),Init当控件初始化时产生,Load当控件加载到页面对象时发生;PreRender当控件准备输出时发生;Unload当控件从内存中卸载时发生

 

回传事件vs非回传事件

回传事件促使表单立刻回传到服务器。某些事件(典型的有修改事件如TextBoxTextChanged或者选择事件CheckBoxCheckedChanged)被认为是非回传的,因为事件并不立刻回传到服务器。这些事件由控件捕获知道再次发生回传。设置非回传事件控件的AutoPostBack属性为TRUE可以强制回传。

回传控件:Button,Calendar,DataGrid,DataList,FileUpload,GridView,ImageButton,ImageMap,LinkButton,Menu,Repeater

非回传控件BulletedList,CheckBox,CheckBoxList,DropDownList,ListBox,RadioButtonList,RadioButton,TextBox

 

IsPostBack

Page对象具有IsPostBack属性。这是一个制度的Boolean类型属性。可以指示页面是第一次加载还是为了响应客户端回传而进行的加载。你可以只在页面第一次加载时执行一些耗费资源的操作;如果页面回传到服务器并再次加载,就无需重复这些操作了因为任何输入或构建的数据都议被保留到后续的回传中

 

Visual Studio 2005中的事件

当新建一个Web应用程序时,VS将自动包含下面的代码,以便处理页面加载事件

Protected void Page_Load(object sender,EventArgs e)

{

}

每个页面都包含多个类似Page_Load,可创建处理程序的事件,这些预定义事件处理程序的名称由Page_连接时间名组成,下边的事件处理程序会自动关联到他们相对应的事件

Page_load    Page_AbortTransaction

Page_CommitTransaction     Page_DataBinding

Page_Disposed      Page_Error

Page_Init      Page_InitComplete

Page_Load     Page_LoadComplete

Page_PreInit    Page_PreLoad

Page_PreRender   Page_PreRenderComplete

Page_SaveStateComplete    Page_Unload

 

控件有其默认事件。多个控件可以公用一个时间处理程序。例如,有一个普通的按钮单击时间处理程序它可以处理船体上所有按钮的单击时间,通过测试sender参数值,可以确定触发事件的具体按钮。下列代码,单击按钮的时间处理程序将sender对象转换为Button类型,然后将该按钮ID属性赋值给一个字符串变量

Private void BtnClick(object sender , System.EventArgs e)

{

Button b = sender as Button;

String buttonID= b.ID;

Switch (buttonID)

{

  Case “btnDoThis”:

     //

  Case “btnDoThat”:

    //

}

//所有按钮的通用代码

}


ASP.NET中最为重要的是ASP.NET服务器控件,包含方法以及与之相关的时间处理程序,并且这些代码都在服务器端执行(部分服务器控件也提供客户端脚本,尽管如此这些控件事件仍然会在服务器端处理)

如果控件包括可视化组成部分(按钮,表格等)ASP.NET将在家侧目标浏览器接收能力的情况下为浏览器呈现传统的HTML,如果需要利用客户端脚本,将会生成适应于浏览器类型的脚本并发送给浏览器。

因为发送给客户端的是最普通的HTML代码所以ASP.NET应用程序可以运行在任何浏览器上。所有的处理过程都在服务器段完成。同时ASP.NET服务器控件在浏览器中最终呈现为标准的HTML代码。另外,所发送的脚本并非是必须经过优化的。

Aug 9, 2008

fmod()值,终结

终于要有一个交代了
哎,问题的关键还是处在加法上面
我的失误啊,得补补C语言数据类型了

浮点型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的
有效位以外的数字将被舍去
一个浮点型变量保证的有效数字是7位
后几位是不准确的,对于加法来说就没有意义了

比如以下程序
/*--------------
浮点型数据的舍入误差
----------------*/
#include

void main()
{
float a,b;
a = 123456.789e5;
b = a + 20;
printf("%f\n",b);
}

程序输出a与b相等
因为a的值比20大很多。b理论值为12345678920
而一个浮点型变量只能保证的有效数字是7位,后面的数字无意义,不能准确表示
输出为12345678848.000000
前八位是准确的,后几位不准确,把20加上去是没有意义的
与此类似,用程序计算1.0/3.0*3结果不等于1

其实将float改成double就几乎不存在舍入的问题了。。。

fine。继续奋斗

关于fmod()函数问题的一点想法

吃了个晚饭回来后我重新设定了几个数来测试

这回我令y=0.2,采用第二种表达式来跟
调试的结果是这样的
0.6,1.2,2.4,3.4这几个数ceil后的结果和原数不相等,比原数大1
而在调试窗口看见的结果(比如0.6)是一个是3.0000,一个是4
这还不是最神奇的
2.6,3.2,4.2这几个数算出来更离谱
拿2.6来说吧,一个是13.0000,一个是13,可是这两个数相减居然得到一个很小的数

我想这可能是浮点数的存储中出现的问题
也许是我没有指定精度,导致小数点后出现了一些随机的数
可是这样的话也不对
因为既然存在这问题那对所有的数都是一样的,为什么有些数显示出来减的结果可以是0.00000呢
为什么啊·····

目前程序改成这样了
float f ;
f = m_sellNode/theApp.minArea;
float x = ceil(f);//ceil取不小于f的最小整数
float b = x - f;
if(b == 0 || b == 1 || b<=0.0001)
最后一个条件补上去后情况改善了好多,测试的数都没出错
可是,我想找到一个完全适合这种运算的函数
很奇怪为什么fmod会不行呢
其实原先我想用modf函数先吧整数,小数部分分开然后分别运算
可是这样不妥···
继续想

一个奇怪的问题

  上次做的项目有一个计算公式,是要求在浮点数之间取余数
  我知道有一个fmod函数是用于这样取余数的,于是在程序中我包含了头文件
  
  我写的语句是if(fmod(x,y) == 0)
                              {
                                  //余数为0的相关操作
                               }
                           else{//余数不为0的相关操作}
   然后测试的时候怪事出现了,当我把取成0.5时,算过去是可以的
   但是比如y为0.2,就会出现错误,比如说x=12.2 y=0.2应该是余数为0的吧,可是得数是很奇怪的数,有时会等0.2有时会等0.199999,实在郁闷

   后来我换了个公式,是这样的
    float f ;
f = x/y;
int z = ceil(f);//ceil取不小于f的最小整数
if((z-f) == 0 || (z - f) == 1 )
           {    //余数为0的相关操作
            }
        else{//余数不为0的相关操作}
    这回事情更蹊跷了
    跟进去的结果是大部分数都可以,少部分的不行
    比如6.2,11.4,12.4,22.8,32.6等
    跟出来的结果是当是这些数时,f与z也是或者绝对值相同,或者差1
    但是,即使f=62.0000000,z=62,减出来的结果居然还是不符合if的条件

    郁闷,这是怎么回事啊····总不会是CPU的ALU单元出问题了吧

Aug 7, 2008

编译原理基础

编译原理基础

 

编译程序是现代计算机系统的基本组成部分。从功能上看,一个编译程序就是一个语言翻译程序,把一种语言书写的程序(源程序)翻译成另一种语言(目标程序)的等价的程序

 

软件,计算机系统中的程序及其文档

 

系统软件,居于计算机系统中最靠近硬件的一层,如编译系统和操作系统等

 

语言处理系统,把软件语言书写的各种程序处理成可在计算机上执行的程序。

 

软件语言:用于书写软件的语言,主要包括需求定义语言,功能性语言,设计性语言,程序

设计语言以及文档语言

 

编译逻辑过程:

  词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成

 

编译阶段的组合

  分析,综合:源程序分析(线性分析,层次分析,语义分析),目标程序的综合

  编译的前端(front end

  编译的后端(back end)

  遍历一遍(pass):从头到尾扫描源程序

 

什么是词法分析程序:逐个读入源程序字符并按照构词规则分成一系列单词。单词是语言中具有独立意义的最小单位,包括保留字,标识符,运算符,标点符号和常量

词法分析是编译过程中的一个阶段,在语法分析前进行,页可以和语法分析结合在一起作为一遍。由语法分析程序调用词法分析程序来获得当前单词供语法分析使用

词法分析程序的主要任务:读源程序,产生单词符号

词法分析程序的其他任务:滤掉空格,跳过注释,换行符;追踪换行表示,复制出错源程序;宏展开

 

符号串的运算:

符号串的头,尾,固有头和固有尾:z=xyxz的头,yz的尾。若x非空,那么y是固有尾;同样y非空的话x是固有头  z=abc,那z的头是a,ab,abc,除abc外都是固有透;z的尾是c,bc,abc,除abc外均是固有尾。当对符号串z = xy头感兴趣对其余部分不感兴趣,可以简写z = x…;如果只是强调x在符号串z中某处出现,可以表示为z=…x…;符号t是符号串z的第一个符号,则表示为z=t…

符号串的连接:假设x,y是符号串,他们的连接xy是吧y的符号卸载x的符号后面得到的符号串

符号串的方幂:

符号串集合:集合A中所有元素都是某字母表∑上的符号串,则A为字母表上的符号串集合

两个符号串集合AB的乘积定义为AB={xy|xAyB}

 

正规表达式与正规集

程序设计语言中的单词是基本语法成分,单词符号的语法可以用有效的工具加以描述,并且基于这类描述,实现词法分析程序的自动构造

一些基本术语和概念:

符号:一个抽象实体,字母和数字都是符号

字母表;是元素的非空有穷集合,不同的语言可以有不同的字母表

符号串;由字母表中的符号组成的任何有穷序列陈伟符号串

符号串的长度:符号串中有多少个符号就是多长

空符号串;不包含任何符号的符号串 

正规式:也称正则表达式,是定义正规集的数学工具,我们用以描述单词符号。              

 

状态转换图:是设计词法分析器的一种好途径。转换图是一张有限方向图,结点代表状态,用圆圈表示;状态之间用箭弧连接。箭弧上标记代表在射出结点状态下可能出现的输入字符或者字符类

 

确定的有穷自动机DFA:一个确定的有穷自动机M是一个五元组M=(K,f,S,Z)其中K是一个有穷集,它的每个元素称为一个状态,∑是一个有穷字母表,它的每一个元素称为一个输入符号;f是转换函数,是在k×∑->K的映射,SK是唯一的一个初态;Z包含于K是一个终态集,终态页可称为接受状态或结束状态

一个DFA可以表示成一个状态图(或称状态转换图),整个图有唯一一个初态结点和若干个终态结点。

 

不确定的有穷自动机NFA

例题:写出一定条件的文法和正则表达式

 

文法和语言概述:当我们表述一种语言时,无非是说明这种语言的句子,如果语言只含有有穷多个句子,则只需列出句子的有穷集就行了;但对于含有无穷句子的语言来讲,存在着如何给出它的有穷表示的问题。但是人们可以给出一些规则用来说明(或者定义)句子的组成结构

 

如果语言是无穷的,找出语言的有穷表示,语言的有穷表示有两个途径

生成方法(文法):语言中的每个句子可以用严格定义的规则来构造

识别方式(自动机):用一个过程,当输入的一任意串属于语言时,该过程经有限次计算后就会停止并回答“是“,若不属于,要么能停止并回答”不是“,要么永远继续下去

Aug 6, 2008

UML基础

Uml的基本概念unified modeling language

  通用可视化建模语言,能与所有的开发方法一起使用,可用于软件开发的整个生命周期

  能表达系统的静态结构和动态信息,能管理复杂的系统模型

  Uml不是编程语言:支持uml语言的工具可以提供从UML到各种编程语言的代码生成,提供从现有程序你想构建UML模型

  Uml是一种离散的建模语言。

  Uml的另一个目标是:能尽量简介的表达系统的模型

  UML的概念范围:系统需求,静态结构,动态行为,交互行为,物理实现,各种图之间的关系,模型组织,扩展机制。

  系统需求:用例视图:从外部用户的角度来秒素系统的行为,它将系统划分为对用于有意义的事务。

  静态结构:静态视图,一个模型必须先定义各种事务的内部特征和相互之间的关系。

  动态行为:状态机视图:对每个类的对象的生命周期进行建模,秒素对象时间上的动态行为。活动视图:利用状态机对运算和工作流进行建模的特殊形式

  交互行为:交互视图:对象通过交互来实现行为,通过协作来进行建模。协作有结构和行为两方面

  物理实现:物理视图。

  各种图间的关系:静态视图(类图,对象图)物理视图(实现视图,部署视图)是描述系统的静态结构

   用例图是描述系统的外部结构;活动图是描述系统的内、外部视图

   交互视图(顺序图,协作图)描述系统的内部视图

   状态图:描述单个类的动态行为

   扩展机制:包括约束,标签值和原型。这些扩展机制可以用来为特定领域剪裁UML的配置。根据自身需要来使用建模语言。

 

静态建模:一个模型必须先定义各种事务的内部特征和相互间的联系。基本的模型元素:

   分类:类,接口,子系统(Sub System),执行者,用例(Use cases),组件(Component)结点,注释(Comment)

   关系:关联(Association),泛化(Generalization,依赖(dependecy),实现,约束(constraint

   静态视图:类图,对象图

  

   类:具有相同属性,操作和关系的对象集合的总称。通常在UML中画成矩形,包括三个部分:名称:每个类必须有一个名字,属性:类可以有任意多个属性,也可以没有属性,操作:操作是类的任意一个实例对象都可以调用的,并可能影响对象行为的实现

   接口:为给出实现对象行为的描述。接口包含操作,但没有属性。一个或多个类可以实现接口的操作

   子系统:任何大的系统都必须划分为较小的单元。包可以包含各种模型元素和其他的包,包之间还可能存在一定的依赖。子系统是具有独立的说明和实现部分的包:代表了与系统其他部分具有清晰接口的清晰单元。通常代表了系统在功能或实现范围上的划分

   执行者是与系统,子系统或类交互的外部人员,进程或事务。

   用例是系统提供的外部可感知的功能单元。

   组件:可重用的系统片段,具有良好定义接口的物理实现单元,每个组件包含系统设计中某些类的实现

组件设计的原则:良好的组件不直接依赖与其他组件而是依赖于其他组件所支持的接口,好处是系统中的组件可以被支持相同接口的组件所取代

一个组件可能是源代码,动态链接库或可执行程序

结点代表系统运行时的物理对象,通常拥有运算能力,它可以容纳对象和组件实例

注释用于解释设计的思路,便于理解

关联:描述了系统中对象和其他实例之间的离散的连接

聚集:用来表达整体-部分关系的关联

组合:是一种聚集,是关联更强的形式

泛化是一般化和具体化之间的关系

多重继承:可能存在冲突。最好显示解决冲突问题

依赖:指明两个或两个以上模型元素之间的关系

实现:是依赖的一种,但有特殊的意义。实现是连接说明和实体间的关系

约束:用来表述各种限制

静态视图表现为类图,主要描述类和类之间的关系,是UML的基础

对象图是系统在某一时刻的快照

动态建模:状态机图:对单个类的对象的生命周期进行建模。

    用例图:描述各个执行者在各个用例中的参与情况,描述系统为用户所感知的外部视图。

用例图的功能:捕获系统用户需求,描述系统边界,指明系统外部行为,指导系统开发者的功能开发,系统建模的起点指导所有的类图和交互图的设计;产生测试用例,用户文档;估计项目大小和进度。

活动图:用状态机对工作流进行建模的特殊形式,支持并发控制

交互视图:对象行为是通过交互来实现的,交互是对象间为完成某一目的而进行的一系列消息交换

协作图:包含分类角色和关联角色。

物理架构:实现视图:描述可重用的系统组件及组件之间的依赖

部署视图:描述系统资源在运行时的物理分布,系统资源成为结点

 

UML是一种建模语言而不是方法,这是因为UML中没有过程的概念,而过程正是方法的一个重要组成部分。UML本身独立于过程,这一味这用户在使用UML进行建模时可以选用任何适合的过程

 

建模步骤:一般的建模过程有:瀑布式开发模型,迭代递增开发模型

基于UML的系统开发采取增量迭代开发的模型:

    1 需求:最初需求规格说明应当由代表系统最终用户的人员提供,内容包括系统基本功能需求和对计算机系统的需求

    2分析:分析的任务是找出系统的所有需求并加以描述,同时建立模型以定义系统中的关键领域类。应由系统用户和开发人员合作完成。 

    3设计:设计阶段任务是通过综合考虑所有的技术限制,以扩展和细化分析阶段的模型,分为结构设计和详细设计

    结构设计:一个设计良好的系统结构是系统可扩充和可变更的基础。

详细设计:目的是通过创建新的类图,状态图和动态图,描述新的技术类,并扩展和细化分析阶段的对象类、 

4实现:构造或实现阶段是对类进行编程的过程。

5测试和配置:完成系统编码后,需要对系统进行测试,包括单元测试,集成测试,系统测试和验收测试

 

    RoseRational公司的产品,有一系列。可能你指的是Rose建模工具,它支持UML用来画用例图,序列图,状态图,类图等。可根据设计的类生成代码(包括多种语言)。还可以从代码反向生成类。如果你会UMLRose则使你如虎添翼。Rose建模的图形可以帖到文档里,另外有一点,它比VISIO简单易学,显然功能不如VISIO强大。所以结论是:它是系统分析和设计的工具,也支持一点编码,用好ROSE的关键还是在于其它方面的功力。

   

 

Powered By Blogger