Mar 14, 2009

终于搭建起TA系统了!!

真的是呕心沥血啊,哎


客户端程序是写好的,一堆DDL加个EXE文件

服务器端,数据库是ORC 10g

由于TA系统采用的是三层架构,中间层用的是Tuxedo8.1


首先是今天我把系统重装了

因为昨天装VC6编译器时系统卡住了,我很郁闷

别人装的系统已经让我郁闷很久了,从系统到硬盘到域都让我纠结

花了3个小时重装了系统和软件(很高效吧,嘿嘿,不是GHOST哦,装的是原版的)

然后接下来的四个小时就在搭建TA系统

——摸着石头过河啊


新装了ORC数据库,果然用起来很顺手,10g的你想装多少次它只会在

*:\oracle\product\10.2.0下多建几个db_*路径而已,这点比9i要好很多

顺利的导入了数据库,然后,艰辛的过程就开始了流泪


首先建了个TA文件夹,里边有常用的一些目录

如src,temp,log,bin,etc等等

然后把服务器的一堆.pc和.c文件拷到src文件夹下,再加上用于配置VC编译器的makefile文件,接着启动cmd切换到src目录执行>make

热,报错。。。

找到问题所在——makefile配置文件里没有修改好

而且有两处错误,一点一点改,一点一点调

编译成功了!!然后再将ubb文件(tux配置)和编译好的可执行文件(自动放在bin目录)一起放到bin目录里,执行

tmloadcf -y ubb

what??tmloadcf can not run on a non-master mode

晕~~~是不是刚装系统时用的没有加入公司域的管理员账号装的TUX

加入域后我用域内用户名登陆,虽然我已经给它赋了管理员权限让它可以安装文件

但是在TUX这还是卡住了

没办法,重装TUX,重装的时候安装目录和先前不同(埋下了悲剧的伏笔流泪


重装TUX后再起,这回得退到make这一步了

>make

晕,buildserver不是一个内部或外部命令,也不是一个可执行的文件&*(&*

怎么回事,buildserver是tux\bin目录下的一个exe文件,建立服务器的

怎么会找不到?

看makefile和ubb文件,没有错啊。。。

困扰了很久,猛然想起:两次安装目录不同,环境变量!!!!

我只改了TUXDIR,而真正指向bin目录的是系统path变量下的tuxedo8.1\bin路径

改之再

>make

晕,CMDTUX_CAT you do not have a valid SDK license

靠,我装的时候明明把lic.txt文件导入了啊,它提示成功了

怎么可以。。。怎么可以酱紫。。。

再困扰了很久,又猛然想起,我瓜皮了,TUX识别lic的时候时去翻找TUXDIR变量

问题在这里!!改之,再

>make 哇卡卡卡卡,好顺利啊,酣畅淋漓


接下来又到了tmloadcf -y ubb这条命令

这回执行时候不会不承认我是它的master了

可是,又跳出来说TUXCONFIG未配置??

咦。ubb文件里明明配了的嘛,怎么回事?

随便set TUXCONFIG=$APPDIR\bin

再敲入命令,不对,说TUXCONFIG应该要和ubb中的匹配

明白了,set回来,再敲入命令

哇卡卡卡卡,酣畅淋漓啊


接着tmboot,很听话的启动了

再启动客户端,跳出数据库配置窗口

由于前边抓狂了很久,已经不记得要怎么填WSNADDR了,本机似乎不用填

可是服务器名忘记了

OK,够了,今天已经被摧残够了


想对兄弟们说,我们这群小年轻

面对生活

一定要学习小强的精神

那就是

“你TM的就是踩不死我!!”


收工,刷卡下班

Mar 9, 2009

【转】09年3月编程语言排行榜:VB江河日下,JavaScript稳步上升

2009年3月Tiobe编程语言排行榜出炉,前十位的排名基本没有变化,JavaScript前进2名,同比增长1.27%,(Visual) Basic下降1位,同比减少3.32%。

2009年3月榜单



前十名长期趋势



以下是排名21到50的语言

【CSDN新闻】专家称微软网络品牌混乱陷入web 2.0困局

导读:业界分析人士伊安·加里森(Ian Garrison)今天载文称,微软正在公司内部测试Kumo搜索引擎,但仅靠杰出的技术,微软无法挑战谷歌。微软还需要整合旗下不同的服务品牌,让普通用户理解其服务产品。以下为其全文:

微软新的“谷歌杀手”——Kumo搜索引擎似乎非常棒,但仅靠杰出的技术,微软无法成为互联网搜索市场上的领头羊。

消息称,微软正在公司内部对Kumo进行测试。Kumo不仅能够理解搜索关键词,还能够理解复杂的句子,返回的搜索结果的相关度也高得多。

如果其表现能够与微软的宣传相符,Kumo将标志着搜索技术的一大进步。因为当前的搜索技术还很“基本”, 尽管能够在不足1秒钟的时间内返回数以千计的搜索结果,但有多少搜索结果是用户真正感兴趣的?如果能够提供相关度更高的搜索结果,微软就可能成为搜索市场 上的赢家,但这还取决于另外一个因素——有效整合其品牌。

目前,微软的“Live”服务可谓是一团乱麻。谷歌提供了简洁的服务,而微软则陷入了web 2.0困局。没有多少人真正理解Windows Live、Office Online、Office Live是什么。尽管每种服务可能都很棒,但普通用户却很难搞清楚它们各自的用途。

部分业界观察人士认为,微软在计划将各种服务整合到Kumo品牌下。考虑到微软目前服务产品的混乱局面,这可谓是一项英明的决策。如果微软希望挑战谷歌,就需要重新考虑其销售互联网服务的方式。(志翔)

【转】Oracle重新配置EM简化版教程

Oracle 10G重建EM DB Control.
  1.drop configuration files and repository run :
  emca -deconfig dbcontrol db -repos drop
  2. Logon SQLPLUS as user SYS or SYSTEM, and drop the sysman account and mangement objects:
  a. drop user sysman cascade;
  b. drop role MGMT_USER;
  c. drop user MGMT_VIEW cascade;
  d. drop public synonym MGMT_TARGET_BLACKOUTS;
  e. drop public synonym SETEMVIEWUSERCONTEXT;
  3.Create configuration files and repository run
  emca -config dbcontrol db -repos create
  创建EM时,提示的端口号,应为实例的断口号,比如1521,不是EM的端口号(比如1158)
  EM的端口号在这个文件中可以查到10.2.0\db_1\sysman\config\emca.properties
  然后,进行em后,界面出来了,但报了一个错:
  Java.lang.Exception: Exception in sending Request :: null
  很多功能不能用,提示重新登录.
  在Oracle论坛上查到了解决办法:
  http://forums.oracle.com/forums/thread.jspa?threadID=320574&tstart=0&messageID=1374397
  找到下面的文件
  10.2.0\db_1\ZYKNET_ORC2\sysman\config\emd.properties
  其中的agentTZRegion缺省是GMT,改为你所在的时区即可,例如:
  agentTZRegion=Asia/Chungking
  关于时区的列表参考:10.2.0\db_1\sysman\admin\supportedtzs.lst
  然后,重启OracleDBConsole

【转】你的系统有多脆弱

软件安全性依然是热点话题。每个人,从老祖母到全球 500 强公司都听说过由互联网上的病毒和攻击者所引起的盗窃身份、丢失数据,及一般性的伤害的事。在 2008 年第一季度,所有报告的 1,474 个不同的软件脆弱点只有 64 个被解决。 1 分辨率大约为 4%。伴随所有关于软件和系统安全的议论,计算机世界似乎处于一片混乱中,这会让许多人不禁问道:“我有多脆弱?”

在本文中,我将介绍一些伍斯特工业学院(Worcester Polytechnic Institute,WPI)近期的安全项目的成果,以及额外的研究。我的目的是通过阐明公共术语并且提供一些典型的安全性使用的现实实例来说明什么是软件安全性。

本文不打算提供全面的计算机安全教育,而是介绍一些辽阔且扩展的信息安全领域中的关键主题。如果您想要进一步讨论,那么请通过 rbreznak@wpi.edu 联系我。

背景

我 早期对计算机安全的兴趣实际上激发了我对计算机科学的最初兴趣,并且从那时起就一直是我关注的焦点。所以不用说,我有一点失望的是 WPI 没有提供大学软件或系统安全课程。在没有任何正式的安全课程的情况下,我和其他两个计算机科学的学生决定进行独立研究,了解更多关于软件安全的知识。今年 的早些日子,我们和 WPI 计算机科学的教授 Kathryn Fisler 谈论关于开始一个涉及软件安全的独立研究项目的事。我们计划开设一门首先在 08-09 学年度进行的安全软件工程的课程。众所周知,CS4400x 将成为 WPI 提供的第一门大学计算机科学安全课程。

在开设该课程的过程中,我们发现许多关于没有在标准课 程中提到的软件脆弱性和预防的事实。我们发现大部分脆弱点通常由小的逻辑错误或软件开发人员没发现或解决的情况所引起。一些脆弱点不太复杂,因而很容易被 黑客利用。可以通过一些简单的资源就能找到它们,像 Web 浏览器和文本编辑器。在软件开发团队出错的其他情况下,安全性的破坏可能由最终用户不恰当地配置或使用软件所致。

我们的结论是,最大的安全缺陷源于开发人员错误地假设安全问题将在系统的其他地方处理 —— 举例来说,他们假设可以相信输入的数据。经验教训:我们不得不认识到安全是每个人的职责,不是其他人的。


脆弱性 101

脆 弱性是什么?“利用”、“攻击”、“脆弱点”,和其它术语一般用于描述什么适当的软件安全目的在于纠正:系统中允许黑客特权访问信息或破坏系统的缺陷。 Mitre Corporation 将脆弱性定义为“系统或网络中允许黑客以另一个用户的身份执行命令,访问他们不应该访问的数据,冒充某人,及/或执行拒绝服务的状态”。 2 根据此定义,脆弱就意味着处于一种状态,在这种状态下,黑客(人或恶意程序,像病毒或间谍软件)可以访问到比他们应该可以访问的要多的系统的部分。

脆弱点出现的范围很广,从明显的 —— 像使用不健壮的密码或存储无保护的私有数据 —— 到更有细微差异的 —— 像未检查的输入。

溢出攻击

最 早遭受破坏的,且仍旧普遍的攻击来源于开发人员对最终用户输入的数据可以信任的假设。大部分程序设计人员未预料在用户名框中得到 40,000 行文本,或者从密码框中获得甚至非键盘输入的模糊字符,因此,所输入的数据从不会被验证无误。这种假设增加了溢出攻击。举例来说,使用本文编辑器并了解一 些 Microsoft PowerPoint 文件格式的知识, 3 人们就可以手工编写 PowerPoint 文件。编辑 PowerPoint 文件 4 , 让内部字段中拥有比格式允许的更多的数据会导致 Microsoft PowerPoint XP 崩溃,然后执行任何黑客想要执行的程序。在一个这种脆弱性的熟悉的实例中,内嵌的 Windows 计算器程序被执行,然而,被执行的程序很容易是更恶意的。这只是无数的这类利用中的一个实例。

实质上,溢 出类攻击是由于将太多的数据放入原始程序设计人员认为足够的空间中导致的。额外的数据溢出到预期存储区附近的内存中,并且覆盖与该区域的原始用途无关的数 据。当执行余下的程序时,它使用新被覆盖的数据。如果黑客能够用伪数据(也就是,NOP)填充足够的空间,然后添加一点恶意代码或值,那么程序将执行恶意 代码或使用新值。这可能导致许多不同的后果。黑客可能能够越过登录 5 ,获得程序的管理员特权。如果受攻击的程序是由系统管理员启动的,那么恶意代码将作为原始程序的一部分进行执行,给黑客系统中的管理员特权。溢出脆弱点,尽管不总是出现,但在一些情况下,可能很容易被补救,当开发应用程序时利用“安全”库 6 ,使用堆栈保护 7 (也就是,StackGuard 8 )或对输入数据进行检查,从而确保其是适当的大小或类型。这一类的利用总是以类似的方式进行,但会根据受影响的内存类型和预期效果而不同。

缓冲区溢出攻击

在缓冲区溢出攻击的实例中,程序的内部值溢出,从而改变程序的运行方式。 9 在 程序的正常操作过程中,当调用一个函数时,被调用函数的所有参数以及返回位置的指针都放在栈中。当完成该函数之后,使用返回指针回到原来的位置并继续程 序。利用缓冲区溢出进行攻击可以改变这个过程,并且允许黑客执行任何他们期望的函数。 这是通过输入足够的数据来用伪数据覆盖参数,及输入到不同函数的新返回指针来实现的,现在就执行新的函数了。 10

SQL 注入

除 了溢出的利用以外,SQL 注入是另一类依赖于开发人员没测试输入数据的疏漏的攻击。大多数人拥有字母数字式密码,或者有安全意识的人,拥有附带其他键盘符号的字母数字式密码。由于 这种想法,开发人员可能允许输入任何字符作为密码。这通常是没问题的,除非他们忘记清洁或检查输入数据。这种情况比应该的要发生的频繁得多。使用 SQL 数据库的密码系统(在许多网站上非常普遍的场景)可能运行这样的查询:

SELECT * FROM users WHERE 'username' = '$USER' AND 'password'='$PASS';

$USER 和 $PASS 会用用户提供的用户名和密码来代替。那么如果用户输入‘bob’和‘1234’,那么结果的查询是:

SELECT * FROM users WHERE 'username' = 'bob' AND 'password' = '1234';

,而来自数据库的返回值会是所有用 bob 作为用户名且用 1234 作为密码的数据元组。如果黑客输入 admin 和 <<'hi' 或 1=1>>--,那么查询是:

SELECT * FROM users WHERE 'username' = 'admin' and `password` = 'hi' OR 1=1--'

注 意用户输入的引号如何与原始查询中的第三个引号匹配。数据库现在会返回用户名为 admin 的所有元组,并且会取消对密码的检查,因为 'password' = 'hi' OR 1=1 命令数据库寻找密码是 hi 的元组或 1=1 的元组,而由于 1 总是 1,所以每行都是候选。-- 是 SQL 注释标志,取消查询中原始的其他引号,并且还将取消任何额外的检查,因此如果有额外的凭证(也就是,keyfob 11 或 captcha 12 )也会被忽略。现在黑客可以以管理员的身份进入系统并且不用不得不给出合法的密码。通过利用越来越复杂的查询,黑客可以变更、添加,或查询数据。 13 对于数据库,这令黑客具有同应用程序相同的特权。

这 种类型的脆弱点被证实是对 Web 应用程序最有效的攻击类型之一,并且随着对 Web 应用程序的信任的增加,这种利用的力量甚至将更令人畏缩。幸运的消息是,像溢出类型的攻击一样,可以通过清洁输入数据,并且从不立即相信用户输入(至少对 于输入的数据)来防止大部分这种脆弱点。


散列攻击

任何处理在数据库中存储用户凭证的人都会告诉您,首要的规则之一是从不直接存储没有首先加密的密码或其它私有数据。如果数据库暴露了,那么使用加密方案将防止暴露用户的密码。为了更多的利益,利用单向加密算法或散列,像 MD5 14 或 Blowfish, 15 将使密码的解密成为不可能。这是因为散列可以将输入值转化为新的值,而这些新值不能从数学上逆向生成原始值。传统上,攻击以这种方式存储的密码的方式涉及 用尽可能多的不同的密码进行尝试直到最终有效,这被称之为“蛮干”技术。虽然这种类型的攻击十分简单,但通常是无效的,因为需要绝对的时间来尝试足够的组 合,有时候要上千年,统计上是成功的,一般是理论的。

每天您可能都在使用散列攻击工具,而甚至不知道它。Google 真的非常擅长它所做的:在信息之间找到链接。举例来说,Googling “Bob Breznak”将取出所有关于我的信息:我为 The Rational Edge 写的最近的书评,我的个人站点(及废弃的)等等。现在,如果您从这里借鉴一下,那么您将得到快速返回结果的许多想法。应用该想法来寻找散列。举例来说,利 用“foobar”的 MD5 散列:3858f62230ac3c915f300c664312c63f。现在将其输入 Google,瞧!0.21 秒内,第一个结果是“Google Hash: md5(foobar) = 3858f62230ac3c915f300c664312c63f”。您将找到的大部分结果都是哈希索引站点 —— 有意地连接散列值和其相应关键字的站点。尝试更复杂的字符串(举例来说,“bobby”、“crayon”、“rational”)将生成混合的结果。如 果您尝试复杂的密码(或者最好是传递阶段),您可能没有收获。

这可能不是您需要担心的最大安全漏洞,但令其危险的是,这种利用不太知名,并且没有简单的补救办法。随着越来越复杂的关键字被匹配到散列上,匹配到已知密码上的可能性增加了。变更为更复杂的算法,比方说从 MD5 变更为 SHA-2, 16 对恢复秘密的完整性没什么作用。这是因为尽管从不同的散列中获得同一个字符串的返回值,但是将关键字链接到散列上也只是时间的问题。虽然加密法总是将利用时间来蛮干作为安全网,搜索减少所需的时间,从而成功地从几千年到几年,甚至几个月。

现 在,存在着两种主要的争论,它们将散列查找从年度最大的安全缺陷的竞争列表中去掉了。这种类型的攻击只可能在数据库或密码存储已经暴露的情况下进行。需要 读取数据库、影子文件(UNIX 或 LINUX 系统保存用户密码的地方),或 I/O 流。在某些情况下,这可能和达到正确的 URL 或执行 SQL 注入一样简单,而在其他情况下,它可能需要比黑客多得多的工作。减小这种攻击的潜在严重性的另一个争论实际上源于散列的使用。由于许多字符串可以生成相同 的散列,所以不能必然地确定原始的字符串(用户的真实密码)。然而,找到任何散列到相同值得字符串能够再次生成相同的散列值。这意味着尽管黑客可能没有获 得实际的密码,但是由于系统使用存储的散列,而黑客拥有能生成同等散列的字符串,所以系统会像黑客拥有原始密码那样响应。


最终用户问题

即使有了最彻底地测试过的且安全的软件,一旦打包并交给最终用户,全部的赌都输了。软件如何配置和实现,像其他步骤那样扮演者关键的安全性角色。

默认值的谬论

用 户犯的最大错误之一是当所使用的软件没有默认值时。许多软件为各种选项定义默认值,以便用户可以尽可能快地运行。虽然有时候这可能非常有益,像 Web 服务器默认为标准的 Web 服务器通信端口,这也会导致许多安全问题。举例来说,许多路由器和其它网络设备都有默认的登录用户名和密码。当用户不将这些默认值改为独特的值时就会出现 问题。搜索“默认的路由器密码”将得到许多列出市场上大部分路由器的默认用户名和密码的站点。如果黑客打算进入网络,那么还未接触的用户名、密码、IP 地址,和其它默认值都是现成的钥匙。

不可靠的系统

当 最终用户不确定他们添加的软件如何符合系统的其他部分,并且需要采取什么额外的安全量度时,会产生另一个问题。再次拿 Web 搜索举例。搜索“view/index.shtml axis”将返回未保护的网络摄像机的列表。在一些情况下,最终用户成功地设置了他们想让全世界都可见的网络摄像机。在其他情况下,网络摄像机被添加到某 个网络,并且没有配置为不公开。这种未保护的摄像机可以被互联网上的每个人见到,并且可能快速地成为侵犯隐私罪。一些书籍和网站致力于提供返回所有者没犹 豫过安全性并且现在公开了的数据搜索查询。 17

我 们从这些新的搜索中得到一些经验。第一,默认值到处都是,因此当不修改默认值时,考虑如果黑客知道此信息会有多有害。第二,您应该了解如何访问系统的各个 部分并且考虑这种访问级别是否合适。第三,记住通过模糊的安全没有用。不论多么不重要或未公开的信息公开了,如果有人感兴趣,不管通过自动的搜索或一些人 力,都可以找到该数据。 18


结束语

随 着越来越多的脆弱点日益被发现,这些威胁只是沧海一粟 。如同这些实例一样,大部分脆弱点源于疏忽:忽略了实现安全实践的开发人员,或者忽略改变配置的最 终用户。即使我提供的实例可能肤浅,并且似乎十分容易避免,但随着项目的增长,对于简单的未检查的情况就有机会了。黑客可能只需要小小的机会就对系统进行 攻击并且引起永久性的损害。开发人员应该充分了解他们假设的影响,并且越过正常使用之外进行测试。通过充分地了解系统的工作方式,并且假定为对于产品的黑 客角色,开发人员应该定期审查他们的工作,并且在必要时发布补丁。

个人可能说不出软件有多大缺陷,并且虽然没 有那么完全的安全系统,但是人们可以通过利用多层次的安全性将脆弱性最小化。健壮的密码,让软件保持更新及适当地修补,并且当添加了每个软件困扰时了解它 的影响,是最终用户添加保护层的小方法。最后,与软件相关的每个人都有责任关注安全性,并试图减少脆弱点。


注释

  1. http://www.cert.org/stats/vulnerability_remediation.html
  2. http://cve.mitre.org/about/terminology.html#vulnerability
  3. http://poi.apache.org/hslf/ppt-file-format.html
  4. http://www.astalavista.com/index.php?section=exploits&cmd=details&id=4818
  5. http://nsfsecurity.pr.erau.edu/bom/Spock.html
  6. http://www.openbsd.org/cgi-bin/man.cgi?query=strlcpy&sektion=3
  7. http://nsfsecurity.pr.erau.edu/bom/StackGuard.html
  8. http://www.usenix.org/publications/library/proceedings/sec98/full_papers/cowan/cowan_html/cowan.html
  9. http://nsfsecurity.pr.erau.edu/bom/Smasher.html
  10. http://insecure.org/stf/smashstack.html
  11. http://en.wikipedia.org/wiki/SecurID
  12. http://captcha.net/
  13. http://www.youtube.com/watch?v=MJNJjh4jORY
  14. http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html
  15. http://en.wikipedia.org/wiki/Blowfish_(cipher)
  16. http://en.wikipedia.org/wiki/SHA-1
  17. http://www.oreilly.com/catalog/googlehks
  18. http://www.linux.com/articles/23313
关于作者

author photo

Bob Breznak 在马萨诸塞州,伍斯特的伍斯特工业学院研究计算机科学,专攻软件工程和机器人技术。目前,他作为高级助理,受雇于计算机科学系,并且受雇于 Sun Microsystems。在学校里,他频繁参与 Association for Computer Machinery(ACM)、IEEE、和最近刚把他选为主席的计算机科学的荣誉团体(Upsilon Pi Epsilon,或 UPE)。他通常在计算机科学楼的下层地下室中进行从系统安全到机器人技术的项目。

【转】EM 无法启动&&重新完全配置EM

公司的电脑改了IP ,于是EM无法启动了

环境:ORACLE 10G

OS:WINXP SP2


D:\Documents and Settings\guanhao>emctl start dbconsole
OC4J Configuration issue. E:\oracle\product\10.2.0\db_1/oc4j/j2ee/OC4J_DBConsole
_server_tuosi not found.


EMCA的一些命令参数

D:\Documents and Settings\guanhao>emca
E:\oracle\product\10.2.0\db_1\bin\emca.bat [操作] [模式] [数据库类型] [标记] [参数]-h | --h | -help | --help: 打印此帮助消息-version: 打印版本-config dbcontrol db [-repos (create | recreate)] [-cluster] [-silent] [-backup]

[参数]: 配置数据库的 Database Control
-config centralAgent (db | asm) [-cluster] [-silent] [参数]: 配置中心代理管理
-config all db [-repos (create | recreate)] [-cluster] [-silent] [-backup] [参数]: 配置 Database Control 和中心代理管理

-deconfig dbcontrol db [-repos drop] [-cluster] [-silent] [参数]: 取消配置 Database Control
-deconfig centralAgent (db | asm) [-cluster] [ -silent] [参数]: 取消配置中心代理管理
-deconfig all db [-repos drop] [-cluster] [-silent] [参数]: 取消配置 Database Control 和中心代理管理

-addInst (db | asm) [-silent] [参数]: 为新的 RAC 实例配置 EM
-deleteInst (db | asm) [-silent] [参数]: 取消为指定的 RAC 实例配置 EM

-reconfig ports [-cluster] [参数]: 重新明确分配 Database Control 端口
-reconfig dbcontrol -cluster [-silent] [参数]: 重新配置 RAC Database Control 部署

-displayConfig dbcontrol -cluster [-silent] [参数]: 显示有关 RAC Database Control 配置的信息

-upgrade (db | asm | db_asm) [-cluster] [-silent] [参数]: 将较低版本的 EM 配置升级到当前版本

-restore (db | asm | db_asm) [-cluster] [-silent] [参数]: 将当前版本的 EM 配置复原到较低版本

参数和选项:
[参数]: [ -respFile 文件名 ] [ -paramName paramValue ]*
db: 对数据库 (包括使用 ASM 的数据库) 执行配置操作
asm: 仅对 ASM 实例执行配置操作
db_asm: 对数据库和 ASM 实例执行升级/复原操作
-repos create: 创建新的 Database Control 资料档案库
-repos drop: 删除当前的 Database Control 资料档案库
-repos recreate: 删除当前的 Database Control 资料档案库并重新创建一个
-cluster: 对 RAC 数据库执行配置操作
-silent: 在不提示参数的情况下执行配置操作
-backup: 配置数据库的自动备份

单实例数据库的参数
HOST: 数据库主机名
SID: 数据库 SID
PORT: 监听程序端口号
ORACLE_HOME: 数据库 ORACLE_HOME
HOST_USER: 自动备份的主机用户名
HOST_USER_PWD: 自动备份的主机用户口令
BACKUP_SCHEDULE: 自动备份调度 (HH:MM)
EMAIL_ADDRESS: 通知的电子邮件地址
MAIL_SERVER_NAME: 通知的发件 (SMTP) 服务器
ASM_OH: ASM ORACLE_HOME
ASM_SID: ASM SID
ASM_PORT: ASM 端口
ASM_USER_ROLE: ASM 用户角色
ASM_USER_NAME: ASM 用户名
ASM_USER_PWD: ASM 用户口令
SRC_OH: 要升级的数据库的 ORACLE_HOME
DBSNMP_PWD: DBSNMP 用户的口令
SYSMAN_PWD: SYSMAN 用户的口令
SYS_PWD: SYS 用户的口令
DBCONTROL_HTTP_PORT: Database Control HTTP 端口
AGENT_PORT: EM 代理端口
RMI_PORT: Database Control 的 RMI 端口
JMS_PORT: Database Control 的 JMS 端口

集群数据库的其它参数
CLUSTER_NAME: 集群名
DB_UNIQUE_NAME: 数据库的唯一名称
SERVICE_NAME: 服务名
EM_NODE: Database Control 节点名
EM_SID_LIST: 代理 SID 列表 [以逗号分隔]


于是先删除原来的配置:
D:\Documents and Settings\guanhao>emca -repos drop

EMCA 开始于 2007-11-19 14:45:06
EM Configuration Assistant 10.2.0.1.0 正式版
版权所有 (c) 2003, 2005, Oracle。保留所有权利。

输入以下信息:
数据库 SID: tuosi
监听程序端口号: 1521
SYS 用户的口令:
SYSMAN 用户的口令:
SYSMAN 用户的口令:
是否继续? [yes(Y)/no(N)]: y
2007-11-19 14:45:20 oracle.sysman.emcp.EMConfig perform
信息: 正在将此操作记录到 E:\oracle\product\10.2.0\db_1\cfgtoollogs\emca\tuosi\em
ca_2007-11-19_02-45-06-下午.log。
2007-11-19 14:45:21 oracle.sysman.emcp.EMReposConfig dropRepository
信息: 正在删除 EM 资料档案库 (此操作可能需要一段时间)...
2007-11-19 14:48:13 oracle.sysman.emcp.EMReposConfig invoke
信息: 已成功删除资料档案库
已成功完成 Enterprise Manager 的配置
EMCA 结束于 2007-11-19 14:48:13


创建新的配置:
D:\Documents and Settings\guanhao>emca -repos create

EMCA 开始于 2007-11-19 14:53:35
EM Configuration Assistant 10.2.0.1.0 正式版
版权所有 (c) 2003, 2005, Oracle。保留所有权利。

输入以下信息:
数据库 SID: tuosi
监听程序端口号: 1521
SYS 用户的口令:
SYSMAN 用户的口令:

是否继续? [yes(Y)/no(N)]: y
2007-11-19 14:53:50 oracle.sysman.emcp.EMConfig perform
信息: 正在将此操作记录到 E:\oracle\product\10.2.0\db_1\cfgtoollogs\emca\tuosi\em
ca_2007-11-19_02-53-35-下午.log。
2007-11-19 14:53:50 oracle.sysman.emcp.EMReposConfig createRepository
信息: 正在创建 EM 资料档案库 (此操作可能需要一段时间)...
2007-11-19 14:57:40 oracle.sysman.emcp.EMReposConfig invoke
信息: 已成功创建资料档案库
已成功完成 Enterprise Manager 的配置
EMCA 结束于 2007-11-19 14:57:40


D:\Documents and Settings\guanhao>emca -config dbcontrol db

EMCA 开始于 2007-11-19 15:02:45
EM Configuration Assistant 10.2.0.1.0 正式版
版权所有 (c) 2003, 2005, Oracle。保留所有权利。

输入以下信息:
数据库 SID: tuosi
已为数据库 tuosi 配置了 Database Control
您已选择配置 Database Control, 以便管理数据库 tuosi
此操作将移去现有配置和默认设置, 并重新执行配置
是否继续? [yes(Y)/no(N)]: y
监听程序端口号: 1521
SYS 用户的口令:
DBSNMP 用户的口令:
用户名/口令无效。
DBSNMP 用户的口令:
SYSMAN 用户的口令:
通知的电子邮件地址 (可选):
通知的发件 (SMTP) 服务器 (可选):
-----------------------------------------------------------------

已指定以下设置

数据库 ORACLE_HOME ................ E:\oracle\product\10.2.0\db_1

数据库主机名 ................ server
监听程序端口号 ................ 1521
数据库 SID ................ tuosi
通知的电子邮件地址 ...............
通知的发件 (SMTP) 服务器 ...............

-----------------------------------------------------------------
是否继续? [yes(Y)/no(N)]: y
2007-11-19 15:03:25 oracle.sysman.emcp.EMConfig perform
信息: 正在将此操作记录到 E:\oracle\product\10.2.0\db_1\cfgtoollogs\emca\tuosi\em
ca_2007-11-19_03-02-45-下午.log。
2007-11-19 15:03:27 oracle.sysman.emcp.util.DBControlUtil stopOMS
信息: 正在停止 Database Control (此操作可能需要一段时间)...
2007-11-19 15:03:39 oracle.sysman.emcp.util.DBControlUtil startOMS
信息: 正在启动 Database Control (此操作可能需要一段时间)...
2007-11-19 15:04:29 oracle.sysman.emcp.EMDBPostConfig performConfiguration
信息: 已成功启动 Database Control
2007-11-19 15:04:29 oracle.sysman.emcp.EMDBPostConfig performConfiguration
警告: 无法创建 Database Control 快捷方式
2007-11-19 15:04:29 oracle.sysman.emcp.EMDBPostConfig performConfiguration
信息: >>>>>>>>>>> Database Control URL 为 http://server:5500/em <<<<<<<<<<<
已成功完成 Enterprise Manager 的配置
EMCA 结束于 2007-11-19 15:04:29


原来的还没停止,于是

D:\Documents and Settings\guanhao>emctl start dbconsole
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0
Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.
http://server:5500/em/console/aboutApplication
Agent Version : 10.1.0.4.1
OMS Version : 10.1.0.4.0
Protocol Version : 10.1.0.2.0
Agent Home : E:\oracle\product\10.2.0\db_1\server_tuosi
Agent binaries : E:\oracle\product\10.2.0\db_1
Agent Process ID : 1160
Agent Process ID : 1160
Agent is already started. Will restart the agent
This will stop the Oracle Enterprise Manager 10g Database Control process. Conti
nue [y/n] :y
OracleDBConsoletuosi 服务正在停止................
OracleDBConsoletuosi 服务已成功停止。
D:\Documents and Settings\guanhao>emctl start dbconsole
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0
Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.
http://server:5500/em/console/aboutApplication
Starting Oracle Enterprise Manager 10g Database Control ...OracleDBConsoletuosi
服务正在启动 ................
OracleDBConsoletuosi 服务已经启动成功。


这样就重新配置了EM,当然可以从第3部直接来配置,但如果你考虑重新配置的话,就进行3步吧!

^(Oo)^

Mar 8, 2009

【《程序员》2008年4月刊】做人、做事,做架构师——架构师能力模型解析

文 / 周爱民
引子

究竟是什么让你在同一个位置上——例如程序员或技术负责人——工作了三年、五年或者更久,而仍然得不到任何的发展空间?你觉得自己已成为技术圈中 的大牛,并信心满满地去拿明天就要颁发的某某大奖,然而却仍然停留在同样的技术职位上,去年到今年涨的薪水甚至填不平物价升幅?于是,你开始对老板不满, 对员工不满,对昨天升职的那个同事不满……你开始计划明天就要跑单,或者准备考虑提出加薪却又心怀忐忑。

如果技术人员有发展的轨迹,那么他要么“看透工具的本质,把关注点转移到‘团队’的圈子里去”,要么“顺着代码铺就的道路,亦步亦趋地成为良匠大 师”。仅以技术方向而言,你大概可以做到架构师、总架构师甚至首席架构师;但问题是:你现在还只是一个程序员。那要如何才能踏上通往架构师之路呢?本文为 你解析一个架构师的能力模型。

你能不能做一个好的架构师?

架构师不是界定一个技术高下的职位名称,而是一个职务。所谓职务,包括职——职位,务——工作。前者决定了你具备哪些资源,可以影响到怎样的范围,以及面向的机构,后者则简单地是你需要完成的工作列表。

所以我说“架构师”不是指“一个能做架构的人”。前者是把架构师当职能,后者是当工人。能做一份工作列表中的事,并不等于就成为相应职位上的人。 在管理体系里面,你的个人特性决定了你在哪个位置,而技术技能只是做事实施的必需。架构师这个职务,同时要求较高的个人素质和技术能力,因此它的进取之路 总结起来就是:做人、做事,做架构师。

因此“模型”由“个人特性”和“技术技能”两个方面构成,在第一张图中,我特别说明“个人特性”既包括人际关系的能力,也包括(具体)业务能力;“技术技能”也是如此。所以个人特性主要与“做人”有关,部分地也包含“做事”的要素。



图1 架构师能力模型

“有效沟通”以及“学会谈判”与做具体的事无关,是个人能力特性的公共方面。前者是过程,后者是知道如何定目标与求结果。而“风险与防备”是做事 过程控制的关键,与前面两项正好构成了一个做事基本能力的完整体系。基本上,这三项个人特性都是一个“普通程序员”所不具备的,甚至在大多数情况下,普通 程序员并不愿意去具备这样的个人特性,因为在许多陷于技术泥淖的开发人员看来:沟通总是会使事情变得更加麻烦,谈判则徒耗时间而无济于事。然而事实上,在 整个的架构决策过程中,架构师需要不停地沟通与谈判。将“架构”变成“决策”的过程,其实就是对各个技术角色(及其思想)兼容并包的过程,你需要不断地协 调需求、实现之间的各种问题,也需要面对各种投资者(时间、资金、人才等方面的决策者)进行谈判,以确定项目的规模——没有规模也就没有范围,没有范围如 何展开设计呢?

一部分开发人员会认为上述过程是“项目经理”的事情,但真的如此吗?当你作为一个更高级别的架构师,以至于要影响到多个项目的决策时,你就全然不会有这种感受了。因为这种情况下,你的决策将先于项目的启动,或者说你已经不单单是一个技术角色了。

设计是架构能力的一部分,但架构师不是设计师——看清楚二者之间的不同,你才真正迈出了架构师职业生涯的第一步。

抽象是思维能力、模型化是表达能力

个人特性中另一个非常重要的方面是“抽象思维”,而这是与架构师角色直接相关的一种能力。这种能力既有职业技能特征,又是普遍性的能力。

所谓普遍性的能力,是指“抽象”在我们——作为人这种个体的——生活中无处不在。例如我们说花、草,说桌、椅……我们用语言去指称任何一个既已存 在的(可以脱离我们的语言而自然存在的)事物时,就用到了抽象。说“桌子”的时候,既没有描述桌子的具体形式,也没有说明它的规格,但我们用这个名词时, 所有人都知道“桌子是什么”。所以,名词概念是整个抽象逻辑系统中的主体。如果失去了这些名词定义,我们基本上不能说话,也不能描述任何东西——那便到了 “只可意会不可言传”的境地。

用现有的成熟语汇去描述你的系统时,大多数人会理解你所表达的含义,例如我们说“这个系统设计为一个三层结构”。然而架构师面临的系统在许多细节 上并不见得能够用成熟的语汇去描述,因此必须自已构建一个抽象系统,这就需要概念抽象能力、概念表达能力和基于概念的逻辑表达能力。

概念抽象能力是一种思维能力。简单地说,就是“把目标分解或概括清楚”:你要么概而言之“它是什么”,要么详细地说明“它包括什么”。必须使用大 量的语汇来陈述这个“什么”,这不单单是表达为文字,也表达为你在思想过程中的一个完整系统。通常用的方法是“映射系统”。例如你可以用数学中的“数轴” 来映射“实数域”。将目标系统形式化为一个概念化的、可讨论的结构系统后,你的抽象过程就基本结束了。



图2 能力模型中的个人特性

然而这个“抽象系统”可能只构建在你的思维意识里,还必须把它描绘出来。因为不能只是你自己思考清楚,系统就能设计完成。这个“描绘”就依赖于后面两种表达能力,一种是描绘概念实体,一种是描绘实体上的逻辑——有趣的是,这似乎又回到了“程序=结构+算法”。

现在大家回过头来看看UML,或者更多种类的ML(建模语言),他们就用于表达这两个方面的东西:要么是概念实体(例如用一个框表明系统边界),要么是实体上的逻辑(例如用箭头表明逻辑时序)。

所以大家应该清楚,我们再如何称赞UML,它也只是一种对模型化系统的“表达能力”,你只能把它当一种辅助表达的工具去使用,它本身既不能帮助思考,也不见得能作为抽象过程中的或抽象思维环境中的参考。

任何一个优秀的架构师都有自己独特的思考方式,这决定了他如何抽象系统,以及如何“创造性地”设计与构画这个系统。这种“独特的思考方式”贯彻他 从孩童开始的整个成长过程,直至他形成独立的社会观、人生观与世界观。他认识世界的方式和接受世界的能力决定于他如何思考,也反映了他这种思考方式的“独 特性”。但这并不表明他有特立独行的行为特性(我们这里只说他的思考方式),我们不应介意他是否用某种语言(例如UML或者形式化编程语言)来表达他的思 考结果。

推动:设计做大,实施做小

架构师首先是把问题的真正目标确定下来,然后变成系统设计、平台设计或架构设计。而在此之后设计输出将会有两个方向的发展,一是被忠实地贯彻下 来,二是被变形地发展下去。两个方向都存在致命的危险:架构最终能否被完整实现。对前者来说,可能是架构设计过度,或设计本身出现了错误;后者则是对架构 直接的伤害。

所以架构师必须参与实施的全程——尤其是在架构被映射为目标系统的前期。在这个阶段中,架构师的任务就是推动架构实施,以保证在项目全程的设计/ 架构/体系的一致性。除了直接跟设计师或设计团队沟通,以保证他们的设计在你可以控制的范围之内以外,架构师还必须有阶段化设计的能力。这种能力用于将一 个原本规模宏大的架构设计,变成较小的、易于实施的、对开发团队来说可控的关键点。例如在体系层次的规划上,设计可能是独立、异质的、可迁移的存储框架来 实现数据层,但在(前期的)实施上,这里可能被表达为本地数据库,并要求前端开发人员必须通过一个清晰的数据交互层来访问——例如一组数据存取接口,或一 个独立数据服务组件。开发人员可能在这里遇到障碍:因为要通过这些中间层来访问本地数据库,纯粹是多余的。然而,正是这“多余的工作”提供了系统弹性,为 并行团队开发公共存储服务争取了周期,也为将来的灵活部署与数据迁移提供了可能。

这里的关键就在于,无论原始系统设定有多大,实施时总是在“做小”。每一个局部的实施块都是可控的,并为它在整个体系空间中留下了位置和接口,这 样才可能由“小的部分”做大。一个大系统的架构师可能同时在考虑许多个项目中的、不同位置的架构,并且清楚这些项目最终的总体规模。而这,就是平台架构师 和体系架构师所涉的领域。



图3 架构师模型图中的“实现能力”

架构真的是“好不好”的问题吗?如同我对工程的理解一样,架构问题的根本,也并不在于它是否完美或漂亮,而是在于是否合用。因此架构师必须对实施 架构的团队以及实施过程有充分了解,知道他们的能力缺陷,知道实现过程要消耗的资源,清楚每个环节可能的故障以及先兆。只有这样,架构师才能设计一个让这 个团队能实现,而且在实现过程中能受控的架构。

要知道,你作为架构师被请来,不是画几张图纸交给项目经理,说:你们去做吧,做不出来是你们不会做。即使你可以身体力行,在这个团队中教大家、培 养大家,那么公司的开销呢?风险呢?这些东西难道就不考虑了?项目的周期因为实现的复杂程度而无法控制时,项目就死掉了。那么,追根究底来说,是不是架构 师的问题?是啊,你为什么会做了一份“不合用”的架构呢?——你都不知道项目如何开发、由谁实施、如何管理等等,又如何能面对这些实际环境去设计架构呢?

所以这一部分能力,是要在你的开发经验、团队经验以及用人识人的经验中去找的。参考模型图的“实现能力”下的“设计能力→了解你的主要沟通对象”和“架构推行”等分支,对你或有一些可用的提示。

局部与全局

架构是一个从全局到局部的过程,而实施正好反过来,是从局部到全局。这也正是“设计做大,实施做小”的另一个层面的含义。设计大才可以见到全局,才知道此全局对彼全局的影响;实施小才可能关注细节,才谈得上品质与控制。

事实上,大多数情况下架构是在为“当前项目之外”去考虑,这可以看成全局关注的一个组成部分。因此我们需要界定所谓“全局”的范围:超出公司或整个产品系列、产品线或规划的范围才是多余的。

所以当架构决策谈及“全局”时,其目标并不见得是“保障当前项目”,而又必须由当前项目去完成。

一个经常被用到的例子是:如果仅为当前项目考虑,那么只需要做成DLL模块;如果为产品线考虑,可能会是“管道+插件”的结构形式。而“管道+插件”的形式显然比做成DLL模块更费时,这个时间成本(以及其它成本)就变成了当前项目的无谓开销。

这种全局策略对局部计划的影响是大多数公司不能忍受的,也被很多团队所垢病。然而这却是架构师角色对体系的“近乎必然”的影响——如果你试图在体 系中引用架构师这个角色的话。一些情况下,体系能够容纳这种影响,例如“技术架构师”试图推动某种插件框架,而正好开发人员对这项技术感兴趣,那就顺其自 然地花点工夫去实现了。但如果不是这样,实施者或实施团队看不到“多余的部分”对他们的价值时,来自局部的抵触就产生了。

这种情况下,平衡这些抵触就成了架构推行的实务之一。在我看来,“平衡”是全局的艺术和局部的技术。也就是说,一方面架构师要学会游说,另一方面 也要寻求更为简洁的、成本更小的实现技术。只有当整个体系都意识到(你所推行的)架构的重要性,而且实施成本在他们可以接受的范围之内时,他们才会积极行 动起来。

所以所谓平衡,其实也是折衷的过程。构架师只有眼中见大,才知道哪些折衷可以做,而哪些不能。所谓设计评估(模型图中的实现能力->设计能 力->设计评估分支)并不是去分析一个设计结果好或不好,而是从中看到原始的需求,看到体系全局的意图,然后知道在将设计变得更为“适当”时可以做 哪些折衷。同样的原因,架构师也必须知道自己的决策会产生的影响,才能控制它们,以防它们变成团队的灾难。有些时候,架构师甚至需要抛弃一些特性,以使得 项目能够持续下去。因为产品的阶段性产出只是整个战略中的一个环节,而不是全部。

其它

“怎么做一个架构师”这个问题得分成两个部分来看,一个是“做到”,一个是“做好”。由于架构师本身不过是一个技术职位,所以时机成熟了自然会做得到。但问题是,真有一天你被放在这个位置上了,你能做得好吗?

我浏览过几套所谓培训机构的有关架构师的教程,也翻阅过一些讲架构的书。我发现他们普遍地是将架构作为一种“职业技术”来讲,就像培养程序员或者 缝纫工一样来教育。但就我的经验来说,架构并不是一件纯粹表现技术能力的工作,所以并不是翻几本书学几种方法就可以投入“实战”的。更深层的问题是,架构 师其实不是“战”出来的。昨天跟同事讨论这个话题,他把我们这几年来的一些思考用了三句话来概括,非常精彩:从无到有的,是架构;从表到里的,是抽象;从 粗到细的,是设计。

那么到底什么是架构呢?从上面的概括中你是看不到答案的。到底如何做架构呢?从本文中你也是看不到答案的。然而我说,“你看不到答案”的根源其实 是在于你的眼光与心性——后面这个词换成现代白话,就是“思想”。真正阻碍了你成为优秀架构师的,也许正是你既有的知识与思想方法,扔掉它们,接受一些全 然有别的信息,也许正是良好的开端。

或许你现在正愤愤然:这篇文章怎么空洞无物?——我甚至能想象到一些读者的表情。然而请在问题面前停下来,不要急于给出答案。正如你将“?”稍微变下形,它就成为了“!”一样,问题的本身,就是答案。

作者简介

周爱民(aimingoo),具有十余年的软件开发、项目管理和团队建设的经验,现担任盛大网络的平台架构师,著有《大道至简》、《Delphi源代码分析》等。

Mar 7, 2009

【转】Delphi中常用VCL函数说明

BCB/Delphi中常用的VCL函数说明
说明,BCB,Delphi,C++Builder,内存分配,文件操作,磁盘目录管理,字符串操作,时间日期管理,类型转换

--------------------
内存分配
--------------------
函数名称:AllocMem
函数说明:在队中分配指定字节的内存块,并将分配的每一个字节初始化为 0.函数原型如下:
void * __fastcall AllocMem(Cardinal Size);

函数名称:SysFreeMem
函数说明:释放所指定的内存块.函数原型如下:
int __fastcall SysFreeMem(void * P);

函数名称:SysReallocMem
函数说明:要求重新分配参数Size所指定的内存.函数原型如下:
void * __fastcall SysReallocMem(void * P , int Size);

--------------------
文件操作
--------------------
函数名称:ChangeFileExt
函数说明:更改指定文件的扩展名,函数原型如下:
AnsiString __fastcall ChangeFileExt(const AnsiString FileName,const AnsiString Extension);

函数名称:DeleteFile
函数说明:在计算机磁盘中删除指定的文件,如果操作成功,则函数返回真,函数原型如下:
bool __fastcall DeleteFile(const AnsiString FileName);

函数名称:ExtractFileDir
函数说明:返回指定文件的工作目录,函数原型如下:
AnsiString __fastcall ExtractFileDir(const AnsiString FileName);

函数名称:ExtractFileDrive
函数说明:返回指定文件的驱动器,函数原型如下:
AnsiString __fastcall ExtractFileDrive(const AnsiString FileName);

函数名称:ExtractFileExt
函数说明:返回指定文件的扩展名,函数原型如下:
AnsiString __fastcall ExtractFileExt(const AnsiString FileName);

函数名称:ExtractFileName
函数说明:返回指定文件的文件名及扩展名,函数原型如下:
AnsiString __fastcall ExtractFileName(const AnsiString FileName);

函数名称:ExtractFilePath
函数说明:返回指定文件的工作路径,函数原型如下:
AnsiString __fastcall ExtractFilePath(const AnsiString FileName);

函数名称:FileAge
函数说明:返回指定文件的时间标签,如果操作失败,则返回-1,函数原型如下:
int __fastcall FileAge(const System::AnsiString FileName);

函数名称:FileClose
函数说明:关闭指定的文件,函数原型如下:
void __fastcall FileClose(int Handle);

函数名称:FileCreate
函数说明:以指定的文件名称创建一个新的文件,如果返回为正数,表示操作成功,返回值为文件句柄,如果返回值为-1,表示操作失败.函数原型如下:
int __fastcall FileCreate(const System ::AnsiString FileName);

函数名称:FileExists
函数说明:用于测试指定的文件是否存在,如果存在返回真,否则返回假,函数原型如下:
bool __fastcall FileExists(const System::AnsiString FileName);

函数名称:FileGetAttr
函数说明:返回指定文件的属性,如果操作失败,则函数返回-1,函数原型如下;
int __fastcall FileGetAttr(const System::AnsiString FileName);

函数名称:FileGetDate
函数说明:返回指定文件的DOS时间标签,如果操作失败,则近回-1,函数原型如下:
int __fastcall FileGetDate(int Handle);

函数名称:FileOpen
函数说明:打开指定的文件,如果返回为正数,表示操作成功,返回值为文件句柄:如果返回值为-1,表示操作失败,函数原型如下:
int __fastcall FileOpen(const System::AnsiString FileName,int Mode);

函数名称:FileRead
函数说明:从文件中读取指定字节的数据到缓冲区中,函数返回实际读取的字节数,函数原型如下;
int __fastcall FileRead(int Handle,void *Buffer,int Count);

函数名称:FileSeek
函数说明:调整文件指针到新的位置,如果操作成功,则返回新的文件位置,如果操作失败,则函数返回-1,函数原型如下:
int __fastcall FileSeek(int Handle,int Offset,int Origin);

函数名称:FileSetAttr
函数说明:更改指定文件的属性参数,如果操作成功,则返回0,函数原型如下;
int __fastcall FileSetAttr(const System::AnsiString FileName,int Attr);

函数名称:FileSetDate
函数说明:更改指定文件的DOS时间标签,如果操作成功,返回0,否则返回错误代码,函数原型如下:
int __fastcall FileSetDate(int Handle,int Age);

函数名称:FileWrite
函数说明:将缓冲区的数据写入到指定的文件的当前位置中去如果操作成功,函数返回实际写入的字节数,如果返回为-1,则表示操作产生错误,函数原型如下:
int __fastcall FileWrite(int Handle,const void *Buffer,int Count);

函数名称:FindClose
函数说明:释放FindFirst操作所申请的内存资源,函数原型如下:
void __fastcall FindClose(TSearchRec &F);

函数名称:FindFirst
函数说明:在指定的文件目录内,搜寻符合特定属性参数的文件,如果成功地查找到符合条件的文件,则函数返回0,否则函数返回一个错误代码,函数原型如下:
int __fastcall FindFirst(const System::AnsiString Path,int Attr,TSearchRec &F);

函数名称:FindNext
函数说明:继续搜寻FindFirst所指定属性参数的文件,如果成功地查找到符合条件的文件,则函数返回0,否则函数返回一个错误代码,函数原型如下:
int __fastcall FindNext(TSearchRec &F);
// 本文转自 C++Builder 研究 - http://www.ccrun.com/article.asp?i=983&d=22l01d

函数名称:RenameFile
函数说明:更改指定文件的名称,如果操作成功,则函数返回真,函数原型如下:
bool __fastcall RenameFile(const AnsiString OldName, const AnsiString NewName);

--------------------
磁盘目录管理
--------------------
函数名称:CreateDir
函数说明:创建新的目录,如果操作成功,返回真,否则返回假,函数原型如下:
bool __fastcall CreateDir(const AnsiString Dir);

函数名称:DiskFree
函数说明:返回指定磁盘的剩余空间,如果操作成功,返回剩余磁盘空间,如果操作失败,则返回-1,函数原型如下:
int __fastcall DiskFree(Byte Drive);

函数名称:DiskSize
函数说明:返回指定磁盘的空间,如果操作成功,返回磁盘空间,如果操作失败,则返回-1,函数原型如下:
int __fastcall DiskSize(Byte Drive);

函数名称:GetCurrentDir
函数说明:返回当前工作目录,函数原型如下:
AnsiString __fastcall GetCurrentDir();

函数名称:RemoveDir
函数说明:删除指定的目录,如果操作成功,返回真,否则返回假,函数原型如下:
bool __fastcall RemoveDir(const AnsiString Dir);

函数名称:SetCurrentDir
函数说明:设置当前工作目录,如果操作成功,则返回真,函数原型如下:
bool __fastcall SetCurrentDir(const AnsiString Dir);

--------------------
字符串操作
--------------------
函数名称:CompareStr
函数说明:比较两个AnsiString字符串,函数原型如下:
int __fastcall CompareStr(const AnsiString S1, const AnsiString S2);

函数名称:CompareText
函数说明:比较两个AnsiString字符串,函数原型如下:
int __fastcall CompareText(const AnsiString S1, const AnsiString S2);

函数名称:LowerCase
函数说明:将指定的AnsiString字符串转换为小写形式,函数原型如下:
AnsiString __fastcall LowerCase(const AnsiString S);

函数名称:StrAlloc
函数说明:为字符串分配指定字节的内存,并返回内存指针,函数原型如下:
char * __fastcall StrAlloc(Cardinal Size);

函数名称:StrBufSize
函数说明:返回*Str所指向内存的大小,函数原型如下:
Cardinal __fastcall StrBufSize(const char * Str);

函数名称:StrCat
函数说明:连接两个字符串,并返回目的字符串指针,函数原型如下:
char * __fastcall StrCat(char * Dest, const char * Source);

函数名称:StrComp
函数说明:两个字符串相到比较,返回比较的结果,函数原型如下:
int __fastcall StrComp(const char * Str1, const char * Str2);

函数名称:StrCopy
函数说明:将源字符串拷贝到目的字符串中,函数原型如下:
char * __fastcall StrCopy(char * Dest, const char * Source);

函数名称:StrECopy
函数说明:将源字符串拷贝到目的字符串中,并返回目的字符串结尾指针,函数原型如下:

char * __fastcall StrECopy(char * Dest, const char * Source);

函数名称:StrEnd
函数说明:返回字符串结尾指针,函数原型如下:
char * __fastcall StrEnd(const char * Str);

函数名称:StrIComp
函数说明:两个字符串相互比较(不论大小写),返回比较的结果,函数原型如下:
int __fastcall StrIComp(const char * Str1, const char * Str2);

函数名称:StrLCat
函数说明:将指定数目的源字符串连接到目的字符串,并返回目的字符串指针,函数原型如下:
char * __fastcall StrLCat(char * Dest, const char * Source, Cardinal MaxLen);

函数名称:StrLComp
函数说明:对两个字符串指定数目的字符进行比较操作,函数原型如下:
int __fastcall StrLComp(const char * Str1, const char * Str2, Cardinal MaxLen);

函数名称:StrLCopy
函数说明:将源字符串指定数目的字符拷贝到目的字符串中,并返回目的字符串指针,函数原型如下:
char * __fastcall StrLCopy(char * Dest, const char * Source, Cardinal MaxLen);

函数名称:StrLen
函数说明:返回字符串的长度,函数原型如下:
Cardinal __fastcall StrLen(const char * Str);

函数名称:StrLower
函数说明:将字符串转换为小写形式,函数原型如下:
char * __fastcall StrLower(char * Str);

函数名称:StrMove
函数说明:从源字符串向目的字符串拷贝指定数目的字符,函数原型如下:
char * __fastcall StrMove(char * Dest, const char * Source, Cardinal Count);

函数名称:StrNew
函数说明:在堆中为指定字符串分配空间,并将字符串拷贝到此空间中,函数原型如下:
char * __fastcall StrNew(const char * Str);

函数名称:StrPas
函数说明:将指定的字符串转换为AnsiString类型字符串对象,函数原型如下:
AnsiString __fastcall StrPas(const char * Str);

函数名称:StrPCopy
函数说明:将AnsiString类型的源字符串拷贝到目的字符串中,并返回目的字符串指针,函数原型如下:
char * __fastcall StrPCopy(char * Dest, const AnsiString Source);

函数名称:StrPLCopy
函数说明:将源字符串(AnsiString类型)指定数目的字符拷贝到目的字符串中,并返回目的字符串指针,函数原型如下:
char * __fastcall StrPLCopy(char * Dest, const AnsiString Source, Cardinal MaxLen);

函数名称:StrPos
函数说明:在Strl所指定的字符串中寻找Str2所指定的子字符串,并返回Str2在Str2中第一个子字符的指针,函数原型如下:
char * __fastcall StrPos(const char * Str1, const char * Str2);

函数名称:StrRScan
函数说明:在指定的字符串中寻找特定的字符,并返回字符串中最后一个特定字符的指针,函数原型如下:
char * __fastcall StrRScan(const char * Str, char Chr);

函数名称:StrScan
函数说明:在指定的字符串中寻找特定的字符,并返回字符串中第一个特定字符的指针,函数原型如下:
char * __fastcall StrScan(const char * Str, char Chr);

函数名称:StrUpper
函数说明:将字符串转换为大写形式,函数原型如下:
char * __fastcall StrUpper(char * Str);

函数名称:UpperCase
函数说明:将指定的AnsiString字符串转换为大写形式,函数原型如下:
AnsiString __fastcall UpperCase(const AnsiString S);

--------------------
类型转换
--------------------
函数名称:FloatToStr
函数说明:将浮点数转换为AnsiString字符串,函数原型如下:
AnsiString __fastcall FloatToStr(Extended Value);

函数名称:FloatToStrF
函数说明:将浮点数转换为指定格式的AnsiString字符串,函数原型如下:
AnsiString __fastcall FloatToStrF(Extended Value, TFloatFormat Format,int Precision, int Digits);

函数名称:IntToHex
函数说明:将整数转换为十六进制字符串,函数原型如下:
AnsiString __fastcall IntToHex(int Value, int Digits);

函数名称:IntToStr
函数说明:将整数转换为AnsiString字符串,函数原型如下:
AnsiString __fastcall IntToStr(int Value);

函数名称:StrToFloat
函数说明:将AnsiString字符串转换为一个浮点数值,函数原型如下:
Extended __fastcall StrToFloat(const AnsiString S);

函数名称:StrToInt
函数说明:将AnsiString字符串转换为整数值,如果不能进行转换,则产生EConvertError异常,函数原型如下:
int __fastcall StrToInt(const AnsiString S);

函数名称:StrToIntDef
函数说明:将AnsiString字符串转换为一个数值,函数原型如下:
int __fastcall StrToIntDef(const System::AnsiString S,int Default);

--------------------
时间日期管理
--------------------
函数名称:Date
函数说明:返回TDateTime对象,包含当前的年月日信息,函数原型如下:
System::TDateTime __fastcall Date(void);

函数名称:DateTimetoStr
函数说明:将TDateTime对象转换为字符串对象,函数原型如下:
AnsiString __fastcall DateTimeToStr(System::TDateTime DateTime);

函数名称:DatetimeToString
函数说明:将TDateTime对象转换为指定格式的字符串对象,函数原型如下:
void __fastcall DateTimeToString(AnsiString &Result, const AnsiString Format,System::TDateTime DateTime);

函数名称:DateTimeToSystemTime
函数说明:将TDateTime对象转换为操作系统时间,函数原型如下:
void __fastcall DateTimeToSystemTime( System::TDateTime DateTime, _SYSTEMTIME &SystemTime);

函数名称:DateToStr
函数说明:将TDateTime对象(包含当前年月日信息)转换为字符串对象,函数原型如下:
AnsiString __fastcall DateToStr(System::TDateTime Date);

函数名称:Now
函数说明:返回TDateTime对象,获取当前的日期和时间信息,函数原型如下:
System::TDateTime __fastcall Now(void);

函数名称:StrToDate
函数说明:将字符串对象转换为年月日对象,函数原型如下:
System::TDateTime __fastcall StrToDate(const AnsiString S);

函数名称:StrToDateTime
函数说明:将字符串对象转换为年月日时间对象,函数原型如下:
System::TDateTime __fastcall StrToDateTime(const AnsiString S);

函数名称:StrToTime
函数说明:将字符串对象转换时间对象,函数原型如下:
System::TDateTime __fastcall StrToTime(const AnsiString S);

函数名称:SystemTimeToDateTime
函数说明:将操作系统时间转换为TDateTime对象,函数原型如下:
System::TDateTime __fastcall SystemTimeToDateTime(const _SYSTEMTIME &SystemTime);

函数名称:Time
函数说明:返回TDateTime对象,包含当前的时间信息,函数原型如下:
System::TDateTime __fastcall Time(void);

函数名称:TimeToStr
函数说明:将当前日期转换为字符串对象,函数原型如下:
AnsiString __fastcall TimeToStr(System::TDateTime Time);


本文档是ccrun(老妖)根据网上资料整理而成。

Delphi中属性的使用(unit2)

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes;

type
// 基类employee
employee=class
protected
name:string; // 姓名
empno:string; // 雇员号
accumpay:real;// 月薪
public
constructor create();// 构造函数
Procedure pay(); Virtual; // 计算月薪函数(虚拟方法)
Procedure displaystatus(); Virtual;// 显示信息函数(虚拟方法)
end;

//技术员类technician
technician=class(employee)
private
hrRate:string;//每小时酬金
hr:string; //当月工作时数
function GetHourlyRate():string;
procedure SetHourlyRate(Value: string);
function GetWorkHours():string;
procedure SetWorkHours(Value: string);

public
property MyHourlyRate: string read GetHourlyRate write SetHourlyRate;
property MyWorkHours: string read GetWorkHours write SetWorkHours;
Procedure pay(); override; //计算月薪函数(覆盖基类中同名方法)
Procedure displaystatus();override; //显示信息函数(覆盖基类中同名方法)
end;

//销售员类(派生于employee)
salesman=class(employee)
private
comm:string;//提取销售额的百分比
sale:string;//销售额
function GetCommrateRate():string;
procedure SetCommrateRate(Value: string);
function GetSales():string;
procedure SetSales(Value: string);
public
property MyCommRate: string read GetCommrateRate write SetCommrateRate;
property MySales: string read GetSales write SetSales;
Procedure pay(); override; //计算月薪函数(覆盖基类中同名方法)
Procedure displaystatus(); override; //显示信息函数(覆盖基类中同名方法)
end;

var
tech: technician;
sales: salesman;
name1,number,result1: string;

implementation
//employee类的函数实现
constructor employee.create();
begin
name:=name1; // name1为存放雇员姓名的全局变量
empno:=number; // number为存放雇员号的全局变量
accumpay:=0.0;
end;

Procedure employee.pay();
begin
end;

Procedure employee.displaystatus();
begin
end;

//技术员类的函数实现
Procedure technician.pay();
begin
accumpay:=strtofloat(GetHourlyRate)*strtofloat(GetWorkHours);
end;

Procedure technician.displaystatus();
begin
result1:=empno+'号技术员'+name+'的本月工资为 '+floattostr(accumpay);
end;
//技术员工资结算
function technician.GetHourlyRate(): string;
begin
GetHourlyRate:=hrRate;
end;
procedure technician.SetHourlyRate(Value: string);
begin
hrRate:=Value;
end;
function technician.GetWorkHours(): string;
begin
GetWorkHours:=hr;
end;
procedure technician.SetWorkHours(Value: string);
begin
hr:=value;
end;

//销售员类的函数实现
Procedure salesman.pay();
begin
accumpay:=strtofloat(GetCommrateRate)*strtofloat(GetSales);
end;

Procedure salesman.displaystatus();
begin
result1:=empno+'号销售员'+name+'的本月工资为 '+floattostr(accumpay);
end;
//销售人员工资结算
function salesman.GetCommrateRate(): string;
begin
GetCommrateRate:=comm;
end;
procedure salesman.SetCommrateRate(Value: string);
begin
comm:=value;
end;
function salesman.GetSales(): string;
begin
GetSales:=sale;
end;
procedure salesman.SetSales(Value: string);
begin
sale:=value;
end;

end.

Delphi中属性的使用(unit1)

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;

type
TForm1 = class(TForm)
Label1: TLabel;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
tch: TGroupBox;
sls: TGroupBox;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
jsyno: TEdit;
jsyxm: TEdit;
hours: TEdit;
Label5: TLabel;
xsyno: TEdit;
Label6: TLabel;
xsyxm: TEdit;
xsl: TEdit;
Label7: TLabel;
Label8: TLabel;
result: TEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
lblHrRate: TLabel;
edtHrRate: TEdit;
lblComm: TLabel;
edtComm: TEdit;
GroupBox3: TGroupBox;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ResetTech(flag: boolean); //设置只读属性
procedure ResetSale(flag: boolean);
procedure RadioButton1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject); //flag标志着只读属性,true则只读,false则可修改
procedure SetEmptyTech();
procedure SetEmptySale();
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;
{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
var
t1: technician;
s1: salesman;
begin
if RadioButton1.Checked =true then
begin
// 计算技术员的月薪
number:=jsyno.Text ;
name1:= jsyxm.Text ;
t1:=technician.create ();
t1.MyHourlyRate := edtHrRate.Text;
t1.MyWorkHours := hours.Text;
t1.pay ();
t1.displaystatus ();
end
else begin
// 计算销售员的月薪
number:= xsyno.Text ;
name1:= xsyxm.Text ;
s1:=salesman.create ();
s1.MySales := xsl.Text;
s1.MyCommRate := edtComm.Text;
s1.pay ();
s1.displaystatus ();
end;
// 将信息显示在result文本框中
SetEmptyTech();
SetEmptySale();
result.Text :=result1;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
form1.Close;
end;

procedure TForm1.ResetTech(flag: boolean); //根据radio button选择情况设置各输入组的只读情况
begin
if flag = true then
begin
jsyno.ReadOnly := true;
jsyxm.ReadOnly := true;
hours.ReadOnly := true;
edtHrRate.ReadOnly := true;
jsyno.Enabled := false;
jsyxm.Enabled := false;
hours.Enabled := false;
edtHrRate.Enabled := false;
end
else begin
jsyno.ReadOnly := false;
jsyxm.ReadOnly := false;
hours.ReadOnly := false;
edtHrRate.ReadOnly := false;
jsyno.Enabled := true;
jsyxm.Enabled := true;
hours.Enabled := true;
edtHrRate.Enabled := true;
end;
end;

procedure TForm1.ResetSale(flag: boolean);
begin
if flag = true then
begin
xsyno.ReadOnly := true;
xsyxm.ReadOnly := true;
xsl.ReadOnly := true;
edtComm.ReadOnly := true;
xsyno.Enabled := false;
xsyxm.Enabled := false;
xsl.Enabled := false;
edtComm.Enabled := false;
end
else begin
xsyno.ReadOnly := false;
xsyxm.ReadOnly := false;
xsl.ReadOnly := false;
edtComm.ReadOnly := false;
xsyno.Enabled := true;
xsyxm.Enabled := true;
xsl.Enabled := true;
edtComm.Enabled := true;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if RadioButton1.Checked =true then//选中了技术员
begin
ResetTech(false); //将技术员的只读属性设置为false
ResetSale(true);//将销售员的只读属性设置为true
end
else begin
ResetTech(true); //将技术员的只读属性设置为true
ResetSale(false);//将销售员的只读属性设置为false
end;
end;

procedure TForm1.RadioButton1Click(Sender: TObject);
begin
ResetTech(false); //将技术员的只读属性设置为false
ResetSale(true);//将销售员的只读属性设置为true
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
begin
ResetTech(true); //将技术员的只读属性设置为true
ResetSale(false);//将销售员的只读属性设置为false
end;

procedure TForm1.SetEmptySale;
begin
xsyno.Text := '';
xsyxm.Text := '';
xsl.Text := '';
edtComm.Text := '';
end;

procedure TForm1.SetEmptyTech;
begin
jsyno.Text := '';
jsyxm.Text := '';
hours.Text := '';
edtHrRate.Text := '';
end;

end.

僵尸网络


僵尸网络指采用一种或多种传播手段,将大量主机感染bot程序(僵尸程序),从而在控制者和被感染主机之间所形成的一个可一对多控制的网络。
  攻击者通过各种途径传播僵尸程序感染互联网上的大量主机,而被感染的主机将通过一个控制信道接 收攻击者的指令,组成一个僵尸网络。之所以用僵尸网络这个名字,是为了更形象的让人们认识到这类危害的特点:众多的计算机在不知不觉中如同中国古老传说中 的僵尸群一样被人驱赶和指挥着,成为被人利用的一种工具。
  在Botnet的概念中有这样几个关键词。“bot程序”是robot的缩写,是指实现恶意控 制功能的程序代码;“僵尸计算机”就是被植入bot的计算机;“控制服务器(Control Server)”是指控制和通信的中心服务器,在基于IRC(因特网中继聊天)协议进行控制的Botnet中,就是指提供IRC聊天服务的网络
  Botnet
  首先是一个可控制的网络,这个网络并不是指物理意义上具有拓扑结构的网络,它具有一定的分布性,随着bot程序的不断传播而不断有新位置的僵尸计算机添加到这个网络中来。
  其次,这个网络是采用了一定的恶意传播手段形成的,例如主动漏洞攻击,邮件病毒等各种病毒与蠕虫的传播手段,都可以用来进行Botnet的传播,从这个意义上讲,恶意程序bot也是一种病毒或蠕虫。
  最后一点,也是Botnet的最主要的特点,就是可以一对多地执行相同的恶意行为,比如可以同 时对某目标网站进行分布式拒绝服务(DDos)攻击,同时发送大量的垃圾邮件等,而正是这种一对多的控制关系,使得攻击者能够以极低的代价高效地控制大量 的资源为其服务,这也是Botnet攻击模式近年来受到黑客青睐的根本原因。在执行恶意行为的时候,Botnet充当了一个攻击平台的角色,这也就使得 Botnet不同于简单的病毒和蠕虫,也与通常意义的木马有所不同。
  僵尸网络是互联网上受到黑客集中控制的一群计算机,往往被黑客用来发起大规模的网络攻击,如分 布式拒绝服务攻击(DDoS)、海量垃圾邮件等,同时黑客控制的这些计算机所保存的信息,譬如银行帐户的密码与社会安全号码等也都可被黑客随意“取用”。 因此,不论是对网络安全运行还是用户数据安全的保护来说,僵尸网络都是极具威胁的隐患。僵尸网络的威胁也因此成为目前一个国际上十分关注的问题。然而,发 现一个僵尸网络是非常困难的,因为黑客通常远程、隐蔽地控制分散在网络上的“僵尸主机”,这些主机的用户往往并不知情。因此,僵尸网络是目前互联网上黑客 最青睐的作案工具。
  对网友而言,感染上“僵尸病毒”却十分容易。网络上搔首弄姿的美女、各种各样有趣的小游戏,都 在吸引着网友轻轻一点鼠标。但事实上,点击之后毫无动静,原来一切只是骗局,意在诱惑网友下载有问题的软件。一旦这种有毒的软件进入到网友电脑,远端主机 就可以发号施令,对电脑进行操控。
  专家表示,每周平均新增数十万台任人遥控的僵尸电脑,任凭远端主机指挥,进行各种不法活动。多数时候,僵尸电脑的根本不晓得自己已被选中,任人摆布。
  僵尸网络之所以出现,在家高速上网越来越普遍也是原因。高速上网可以处理(或制造)更多的流量,但高速上网家庭习惯将电脑长时间开机,唯有电脑开机,远端主机才可以对僵尸电脑发号施令。
  网络专家称:“重要的硬件设施虽然非常重视杀毒、防黑客,但网络真正的安全漏洞来自于住家用户,这些个体户欠缺自我保护的知识,让网络充满地雷,进而对其他用户构成威胁。”
  Botnet的发展过程
  Botnet是随着自动智能程序的应用而逐渐发展起来的。在早期的IRC聊天网络中,有一些服 务是重复出现的,如防止频道被滥用、管理权限、记录频道事件等一系列功能都可以由管理者编写的智能程序所完成。于是在1993 年,在IRC 聊天网络中出现了Bot 工具——Eggdrop,这是第一个bot程序,能够帮助用户方便地使用IRC 聊天网络。这种bot的功能是良性的,是出于服务的目的,然而这个设计思路却为黑客所利用,他们编写出了带有恶意的Bot 工具,开始对大量的受害主机进行控制,利用他们的资源以达到恶意目标。
  20世纪90年代末,随着分布式拒绝服务攻击概念的成熟,出现了大量分布式拒绝服务攻击工具如TFN、TFN2K和Trinoo,攻击者利用这些工具控制大量的被感染主机,发动分布式拒绝服务攻击。而这些被控主机从一定意义上来说已经具有了Botnet的雏形。
  1999 年,在第八届DEFCON 年会上发布的SubSeven 2.1 版开始使用IRC 协议构建攻击者对僵尸主机的控制信道,也成为第一个真正意义上的bot程序。随后基于IRC协议的bot程序的大量出现,如GTBot、Sdbot 等,使得基于IRC协议的Botnet成为主流。
  2003 年之后,随着蠕虫技术的不断成熟,bot的传播开始使用蠕虫的主动传播技术,从而能够快速构建大规模的Botnet。著名的有2004年爆发的 Agobot/Gaobot 和rBot/Spybot。同年出现的Phatbot 则在Agobot 的基础上,开始独立使用P2P 结构构建控制信道。
  从良性bot的出现到恶意bot的实现,从被动传播到利用蠕虫技术主动传播,从使用简单的IRC协议构成控制信道到构建复杂多变P2P结构的控制模式,Botnet逐渐发展成规模庞大、功能多样、不易检测的恶意网络,给当前的网络安全带来了不容忽视的威胁。
  Botnet的工作过程
  Botnet的工作过程包括传播、加入和控制三个阶段。
  一个Botnet首先需要的是具有一定规模的被控计算机,而这个规模是逐渐地随着采用某种或某几种传播手段的bot程序的扩散而形成的,在这个传播过程中有如下几种手段:
  (1)主动攻击漏洞。其原理是通过攻击系统所存在的漏洞获得访问权,并在Shellcode 执行bot程序注入代码,将被攻击系统感染成为僵尸主机。属于此类的最基本的感染途径是攻击者手动地利用一系列黑客工具和脚本进行攻击,获得权限后下载 bot程序执行。攻击者还会将僵尸程序和蠕虫技术进行结合,从而使bot程序能够进行自动传播,著名的bot样本AgoBot,就是实现了将bot程序的 自动传播。
  (2)邮件病毒。bot程序还会通过发送大量的邮件病毒传播自身,通常表现为在邮件附件中携带 僵尸程序以及在邮件内容中包含下载执行bot程序的链接,并通过一系列社会工程学的技巧诱使接收者执行附件或点击链接,或是通过利用邮件客户端的漏洞自动 执行,从而使得接收者主机被感染成为僵尸主机。
  (3)即时通信软件。利用即时通信软件向好友列表发送执行僵尸程序的链接,并通过社会工程学技巧诱骗其点击,从而进行感染,如2005年年初爆发的MSN性感鸡(Worm.MSNLoveme)采用的就是这种方式。
  (4)恶意网站脚本。攻击者在提供Web服务的网站中在HTML页面上绑定恶意的脚本,当访问者访问这些网站时就会执行恶意脚本,使得bot程序下载到主机上,并被自动执行。
  (5)特洛伊木马。伪装成有用的软件,在网站、FTP 服务器、P2P 网络中提供,诱骗用户下载并执行。
  通过以上几种传播手段可以看出,在Botnet的形成中传播方式与蠕虫和病毒以及功能复杂的间谍软件很相近。
  在加入阶段,每一个被感染主机都会随着隐藏在自身上的bot程序的发作而加入到Botnet中 去,加入的方式根据控制方式和通信协议的不同而有所不同。在基于IRC协议的Botnet中,感染bot程序的主机会登录到指定的服务器和频道中去,在登 录成功后,在频道中等待控制者发来的恶意指令。图2为在实际的Botnet中看到的不断有新的bot加入到Botnet中的行为。
  在控制阶段,攻击者通过中心服务器发送预先定义好的控制指令,让被感染主机执行恶意行为,如发起DDos攻击、窃取主机敏感信息、更新升级恶意程序等。图3为观测到的在控制阶段向内网传播恶意程序的Botnet行为。
  Botnet的分类
  Botnet根据分类标准的不同,可以有许多种分类。
  按bot程序的种类分类
  (1)Agobot/Phatbot/Forbot/XtremBot。这可能是最出名的僵尸 工具。防病毒厂商Spphos 列出了超过500种已知的不同版本的Agobot(Sophos 病毒分析),这个数目也在稳步增长。僵尸工具本身使用跨平台的C++写成。Agobot 最新可获得的版本代码清晰并且有很好的抽象设计,以模块化的方式组合,添加命令或者其他漏洞的扫描器及攻击功能非常简单,并提供像文件和进程隐藏的 Rootkit 能力在攻陷主机中隐藏自己。在获取该样本后对它进行逆向工程是比较困难的,因为它包含了监测调试器(Softice 和O11Dbg)和虚拟机(VMware 和Virtual PC)的功能。
  (2)SDBot/RBot/UrBot/SpyBot/。这个家族的恶意软件目前是最活跃的bot程序软件,SDBot 由C语言写成。它提供了和Agobot 一样的功能特征,但是命令集没那么大,实现也没那么复杂。它是基于IRC协议的一类bot程序。
  (3)GT-Bots。GT-Bots是基于当前比较流行的IRC客户端程序mIRC编写 的,GT是(Global Threat)的缩写。这类僵尸工具用脚本和其他二进制文件开启一个mIRC聊天客户端, 但会隐藏原mIRC窗口。通过执行mIRC 脚本连接到指定的服务器频道上,等待恶意命令。这类bot程序由于捆绑了mIRC程序,所以体积会比较大,往往会大于1MB。
  按Botnet的控制方式分类
  (1)IRC Botnet。是指控制和通信方式为利用IRC协议的Botnet,形成这类Botnet的主要bot程序有spybot、GTbot和SDbot,目前绝大多数Botnet属于这一类别。
  (2)AOL Botnet。与IRC Bot类似,AOL为美国在线提供的一种即时通信服务,这类Botnet是依托这种即时通信服务形成的网络而建立的,被感染主机登录到固定的服务器上接收 控制命令。AIM-Canbot和Fizzer就采用了AOL Instant Messager实现对Bot的控制。
  (3)P2P Botnet。这类Botnet中使用的bot程序本身包含了P2P的客户端,可以连入采用了Gnutella技术(一种开放源码的文件共享技术)的服务 器,利用WASTE文件共享协议进行相互通信。由于这种协议分布式地进行连接,就使得每一个僵尸主机可以很方便地找到其他的僵尸主机并进行通信,而当有一 些bot被查杀时,并不会影响到Botnet的生存,所以这类的Botnet具有不存在单点失效但实现相对复杂的特点。Agobot和Phatbot采用 了P2P的方式。
  Botnet的危害
  Botnet构成了一个攻击平台,利用这个平台可以有效地发起各种各样的攻击行为,可以导致整 个基础信息网络或者重要应用系统瘫痪,也可以导致大量机密或个人隐私泄漏,还可以用来从事网络欺诈等其他违法犯罪活动。下面是已经发现的利用Botnet 发动的攻击行为。随着将来出现各种新的攻击类型,Botnet还可能被用来发起新的未知攻击。
  (1)拒绝服务攻击。使用Botnet发动DDos攻击是当前最主要的威胁之一,攻击者可以向 自己控制的所有bots发送指令,让它们在特定的时间同时开始连续访问特定的网络目标,从而达到DDos的目的。由于Botnet可以形成庞大规模,而且 利用其进行DDos攻击可以做到更好地同步,所以在发布控制指令时,能够使得DDos的危害更大,防范更难。
  (2)发送垃圾邮件。一些bots会设立sockv4、v5 代理,这样就可以利用Botnet发送大量的垃圾邮件,而且发送者可以很好地隐藏自身的IP信息。
  (3)窃取秘密。Botnet的控制者可以从僵尸主机中窃取用户的各种敏感信息和其他秘密,例如个人帐号、机密数据等。同时bot程序能够使用sniffer观测感兴趣的网络数据,从而获得网络流量中的秘密。
  (4)滥用资源。攻击者利用Botnet从事各种需要耗费网络资源的活动,从而使用户的网络性能受到影响,甚至带来经济损失。例如:种植广告软件,点击指定的网站;利用僵尸主机的资源存储大型数据和违法数据等,利用僵尸主机搭建假冒的银行网站从事网络钓鱼的非法活动。
  可以看出,Botnet无论是对整个网络还是对用户自身,都造成了比较严重的危害,我们要采取有效的方法减少Botnet的危害。
  

【CSDN新闻】Websense 2009六大安全预测 黑客也玩“云安全”

近日,Websense 发布2009年6大安全预测。其中“云安全”技术的被滥用、Web应用和Web2.0应用等被恶意利用的几率将大幅增加。

“云安全”被恶意利用的频率将越来越高

以云计算技术为基础的服务如亚马逊的Web服务(AWS)、微软的Azure 以及GoGrid等为企业和用户提供了简单易用的基础运算、可按需租用的存储空间和大幅度的成本节省。但这些服务也引起了网络犯罪者和黑客们的高度关注, 他们将利用这些技术和服务来达成其恶意目的。Websense预测:2009年,云计算技术被滥用的现象将会越来越多。该技术既可被用于简单的垃圾邮件发 送,也可用来发起针对下载、数据上传统计、恶意代码监测更为高级的恶意程序攻击。

富互联网应用系统(RIAs)如Flash、Google Gears等被恶意利用的几率增大

利用基于浏览器的Web应用如基于Web的CRM系统、Google文档和其他基于Web的办公工具等越来 越多的取代了传统的桌面应用程序。运用基于浏览器的Web应用来丰富互联网使用体验的程序是富互联网应用系统(RIAs)。伴随这些应用需求的爆炸式增 长,使用RIA技术的Google Gears、Air、Flash和Silverlight构建了一个大型的Web2.0网络应用体系,而安全问题却是最后被考虑的,这就如同敞开大门让网 络犯罪分子肆意攻击。由于RIA的迅速流行,我们可以预见在2009年将会有大规模的利用RIA核心组件和用户创建的服务来发起的攻击,这些攻击将使黑客 们能够远程操控用户的电脑。

黑客们将充分利用可编写Web发动攻击

Web2.0应用是一个开放了网络应用程序接口、mashups、小工具的开放世界,允许共享、使用来自其 他网站的功能。搜索引擎Web API服务的发行以破纪录的速度发布而几乎没有什么时间来进行测试,而这种应用需要用户间达到一定的信赖水平方可。因此Websense认为在2009 年,利用Web API服务来获得信任、窃取用户的资格证书或机密信息的恶意攻击将会增加。

Web垃圾和向blog、论坛和社交性网站发送的恶意内容将会大幅度增加

那些允许用户进行内容编辑的网站越来越流行,数量也将出现飞跃增长,而这些网站很有可能导致Web垃圾和和 向blog、论坛和社交性网站发送的恶意内容的大幅度增加,这些内容包括搜索引擎麻痹、恶意引诱传播和网络欺诈等。此外,这些威胁和攻击将被数种新的 Web攻击工具所整合,使黑客们可以发现那些存在漏洞或者允许发布恶意代码的网站。越来越多的基础设施特许承包商会在其提供的功能中增加HTTP发布功 能。

黑客们将转向分布式僵尸网络控制和恶意代码托管模式

2008年Websense发现两家总部位于加利福尼亚州的托管公司McCololo和Intercage/Atrivo就由于发布僵尸网络和恶意代码被上游供应商关闭。Mcolor倒闭的当天垃圾邮件减少了50%,而Intercage/Atrivo倒闭的当天大大减轻了“风暴”僵尸网络的蔓延。Websense预测:由于这些僵尸集团仅拥有少数几家供应商来托管其C&C服务,他们会将其服务器分布到各处,同时转移至国外服务器供应商,使其更难被上游供应商、网络监管部门和执法部门所发现和关闭。

对于具有“良好声誉”网站的攻击将会持续

2009年,我们将看到有80%以上的恶意内容会以那些拥有“良好声誉”的网站为载体。会有更多的著名网站 和Alexa排名前10万的网站遭受恶意攻击。这些攻击既包括对于当地著名网站某些特定频道的攻击,也包括对流行的体育网站、新闻网的攻击以及向这些网站 中持续植入IFRAME、恶意重定向代码。

Mar 5, 2009

大唐软件技术经理陈建慧《如何做好开发团队负责人---管别人先管好自已,请从做一名合格程序员开始》

        开发经理(开发组长)开发经理是团队中的大师那就该是整个团队工作中的榜样,无论是工作效率、态度、分析设计水平、业务知识、技术能力各方面都要努力让自己成为团队成员榜样。 

        开发经理除了安排好目前工作之外还需要主动学习,不断提高自己的业务和技术水平。很多人会说很忙没有时间,那就要求开发经理要比别人付出更多的努力,因为开发经理拿的工资比别人高,就应该付出更多,为公司创造更高的价值。如果我是老板的话,我给你涨了工资,不仅仅是对你以前工作的肯定,但更重要的是期待你以后能有更高的产出,所以从开发人员变为开发经理之后就得更加努力有更高产出。 
        关键问题和核心代码一定要尽可能亲自动手。通过解决关键问题,可以在团队成员心中树立自已的形象和权威,减少经后工作量估算的误差,同时也减少团队成员变动引起的风险,开发经理要能够随时胜任为团队中任何人的替补。具统计优秀的开源软件代码的开发人员70%以上是30多岁的人,我们的开发经理大多数都比这个年纪要小,一个优秀的程序员至少需要十年以上才可能练成。如果现在就不动手,就只会管几个人,我觉得对公司来说都是一种资源的浪费,对个人来说是失去成长的机会。现在整行业的人都很浮躁的重要原因是大多数程序员都高估了自已的能力水平,降低了对自已的要求标准,很多人工作多年,连一个合格的程序员都算不上,更不要说优秀程序员。千万不能认为编码是一种低级劳动,一定要纠正这种错误思想,很多大师级的人物都在写代码,更何况自已只是一个不合格的程序员。 
         安排工作方面,先紧后松原则,做事情一定要先紧,安排工作也要先紧,要给自已和团队成员犯错误和解决风险的时间,留充分的余量。安排任务要给团队成员压力,要以自已完成任务的标准去要求下属。 
        总结自已和优秀成员的胜任特征,并复制给其它团队成员。复制的是胜任工作所需要的能力,做事情和思考问题的方法,不是只告诉他如何做某件具体事情。 
及时检查团队成员的输出成果,通过对成员输出的检查及时了解成员的特点和能力水平,及时指出不足。以便经后能够按人员能力特点给其安排工作任务。指出成员的不足,是对他个人负责。 

        积极思想往下传,消极思想往上传,消极的思想和问题只能向上级领导反映,不要在下级面前表露出来,带给下级的永远是正面积极的思想。 给团队成员灌输正面思想多抓住平常的机会,不能只等到面对面谈话时再来谈大道理,这个时侯讲的大道理大多数人都很难接受。多站在为对方着想的角度去灌输正面思想,不要总像个领导在下达命令。

         swetter点评:不少经典部分。我相信所有优秀的人才都是以自己的努力钻研为背景的,而不是靠着某些别人称之为天赋的东西。

【转】如何修炼成技术专家

1、选择适合自己的发展通道,走对路(附图) 
-技术专家 
-架构师 
-技术经理 

2、勤用外功,成长更快、更高(附图) 
-再往前走走:更多一点点、更好一点点 
-来倒立想想:换角度思考 
-常回头看看:总结、对比 

3、修炼内功,保持向上发展的内在动力(附图) 
-初级阶段:Stay Hungry 

-高级阶段:Stay Foolish


算法

对非计算机专业的程序员来说

算法是一道硬伤

还有某些细节问题。。

Mar 4, 2009

【转自CSDN】软件开发10大经典致命错误

【CSDN 3月2日编译】在Steve McConnell(McConnell是Construx软件公司的CEO和首席软件工程师。)的新书《快速开发:驯服疯狂的软件进度》中,作者将很多人经常会犯的错误命名为“经典错误”,这些错误本可以避免并提早预见由这些错误所产生的后果。

为了确定常见的软件开发错误出现的频率和严重程度,Construx软件开发白皮书的作者调查了500个软件从业人员。认定了42个经典的软件开发错误,下面的10个被认为是最有破坏性、最致命的:

1. 不切实际的期望;
2. 过于乐观的进度表;
3. 违背质量保证;
4. 一厢情愿;
5. 目标不清;
6. 过多的并发任务;
7. 特征发生变化;
8. 吵闹纷杂的办公室;
9. 在压力下放弃计划;
10. 风险管理不足

 其它32个经典错误涉及:在项目进行中转换开发工具,开发人员外出镀金,开发人员和客户之间有摩擦等。

原文:

                          10 most damaging classic software development mistakes  

In Steve McConnell’s book Rapid Development: Taming Wild Software Schedules, he defines “classic mistakes” as mistakes that have been made so often, by so many people, that the consequences of making these mistakes should be predictable and the mistakes should be avoidable. McConnell is CEO and Chief Software Engineer at Construx Software.

To determine the frequency and severity of common software development mistakes, the authors of this Construx Software Builders white paper surveyed 500 software practitioners. Of the 42 classic software development mistakes identified, these 10 mistakes are reported to be the most damaging:
Unrealistic expectations
Overly optimistic schedules
Shortchanged quality assurance
Wishful thinking
Confusing estimates with targets
Excessive multi-tasking
Feature creep
Noisy, crowded offices
Abandoning planning under pressure
Insufficient risk management

Several of the other 32 classic mistakes identified are: switching development tools in the middle of a project, developer gold plating, and friction between developers and customers.

Powered By Blogger