❶ 涓轰粈涔堟竻绌哄洖鏀剁珯鏃舵绘彁绀 df66鏂囦欢澶逛笉鑳戒负绌猴紝鍥炴敹绔欎腑宸茬粡绌轰簡锛屼絾浠嶆樉绀烘湁鏂囦欢娌℃竻绌虹殑鐘舵併
鐒跺悗鍐嶈瘯鐫鍒犻櫎銆
2锛庤繘鍏モ滃畨鍏ㄦā寮忓垹闄も濄
3锛庡湪绾疍OS鍛戒护琛屼笅浣跨敤DEL锛孌ELTREE鍜孯D鍛戒护灏嗗叾鍒犻櫎銆
4锛庡傛灉鏄鏂囦欢澶逛腑鏈夋瘮杈冨氱殑瀛愮洰褰曟垨鏂囦欢鑰屽艰嚧鏃犳硶鍒犻櫎锛屽彲鍏堝垹闄よユ枃浠跺す涓鐨勫瓙鐩褰曞拰鏂囦欢锛屽啀鍒犻櫎鏂囦欢澶广
5锛庡湪浠诲姟绠$悊鍣ㄤ腑缁撴潫Explorer.exe杩涚▼锛岀劧鍚庡湪鍛戒护鎻愮ず绗︾獥鍙e垹闄ゆ枃浠躲
6锛庡傛灉浣犳湁瀹夎匒CDSee锛孎lashFXP锛孨ero锛孴otal杩欏嚑涓杞浠讹紝鍙浠ュ皾璇曞湪杩欏嚑涓杞浠朵腑鍒犻櫎鏂囦欢澶广
浜屻侀珮绾цВ鍐虫柟妗堬細
1锛庣佺洏閿欒
杩愯岀佺洏鎵鎻忥紝骞舵壂鎻忔枃浠舵墍鍦ㄥ垎鍖猴紝鎵鎻忓墠纭瀹氬凡閫変笂淇澶嶆枃浠跺拰鍧忔墖鍖猴紝鍏ㄩ潰鎵鎻忔墍鏈夐夐」锛屾壂鎻忓悗鍐嶅垹闄ゆ枃浠躲
2锛庨勮绘満鍒讹細
鏌愪簺濯掍綋鎾鏀句腑鏂鎴栨e湪棰勮堟椂浼氶犳垚鏃犳硶鍒犻櫎銆傚湪鈥滆繍琛屸濇嗕腑杈撳叆锛歊EGSVR32 /U SHMEDIA.DLL锛屾敞閿鎺夐勮诲姛鑳姐傛垨鍒犻櫎娉ㄥ唽琛ㄤ腑涓嬮潰杩欎釜閿鍊硷細[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\\InProcServer32]銆
3锛庨槻鐏澧欙細
鐢变簬鍙嶇梾姣掕蒋浠跺湪鏌ユ瘨鏃朵細鍗犵敤姝e湪妫鏌ョ殑鏂囦欢锛屼粠鑰屽艰嚧鎵ц屽垹闄ゆ椂鎻愮ず鏂囦欢姝e湪浣跨敤锛岃繖鏃跺彲璇曠潃鏆傛椂鍏抽棴瀹冪殑鍗虫椂鐩戞帶绋嬪簭锛屾垨璁稿彲浠ヨВ鍐炽
4锛嶰FFice銆乄PS绯诲垪杞浠讹細
OFFice鐨勯潪娉曞叧闂涔熶細閫犳垚鏂囦欢鏃犳硶鍒犻櫎鎴栨敼鍚嶃傞噸鏂拌繍琛岃ョ▼搴忥紝鐒跺悗姝e父鍏抽棴锛屽啀鍒犻櫎鏂囦欢銆
5锛庡熷姪WinRAR锛
鍙冲嚮瑕佸垹闄ょ殑鏂囦欢澶癸紝閫夋嫨鈥滄坊鍔犲埌鍘嬬缉鏂囦欢鈥濄傚湪寮瑰嚭鐨勫硅瘽妗嗕腑閫変腑鈥滃帇缂╁悗鍒犻櫎婧愭枃浠讹紝鈥濋殢渚垮啓涓鍘嬬缉鍖呭悕锛岀偣纭瀹氥
6锛庢潈闄愰棶棰橈細
濡傛灉鏄2000鍜寈p绯荤粺锛岃峰厛纭瀹氭槸鍚︽湁鏉冮檺鍒犻櫎杩欎釜鏂囦欢鎴栨枃浠跺す銆
7锛庡彲鎵ц屾枃浠剁殑鍒犻櫎锛
濡傛灉鍙鎵ц屾枃浠剁殑鏄犲儚鎴栫▼搴忔墍璋冪敤鐨凞LL鍔ㄦ侀摼鎺ュ簱鏂囦欢杩樺湪鍐呭瓨涓鏈閲婃斁锛屽垹闄ゆ椂灏变細鎻愮ず鏂囦欢姝e湪浣跨敤锛岃В鍐虫柟娉曟槸鍒犻櫎绯荤粺鐨勯〉闈㈡枃浠讹紝Win98涓鏄疻in386.SWP锛學in2000/XP鏄痯agefile.sys銆傛敞鎰忚佸湪DOS涓嬪垹闄ゃ
8锛庢枃浠剁矇纰庢硶锛
浣跨敤鏂囦欢绮夌庢満锛屽侳ile Pulverizer锛屽彲浠ュ交搴曞垹闄や竴浜涢〗鍥烘枃浠躲
涓夈佸埗浣滀竴涓鏃犳硶鍒犻櫎鐨勨滄枃浠朵繚闄╃扁
鏂囦欢澶规棤娉曞垹闄わ紝鏈蹇呭氨鏄涓嶅ソ鐨勪簨鎯咃紝濡傛灉鎶婁竴浜涢噸瑕佺殑鏂囦欢鏀惧湪杩欎釜鐩褰曚腑锛屼笉灏卞彲浠ラ伩鍏嶈鍒犱簡鍚楋紵涓涓鏂囦欢鍚嶅彧鍖呭惈绌烘牸鐨勬枃浠跺す鍦╓indows涓鏄涓嶅厑璁稿垱寤哄拰鍒犻櫎鐨勶紝浣嗗湪DOS涓嬪嵈鍙浠ュ垱寤烘枃浠跺悕鍖呭惈\鐨勬枃浠跺す銆
鍦ㄦ垜浠浣跨敤Windows鐨勮繃绋嬩腑锛屼細閬囧埌鍚勭嶅悇鏍风殑闂棰樸傚嵆浣挎槸鏈绠鍗曠殑鍒犻櫎鏂囦欢涔熷彲鑳介亣鍒伴夯鐑︼紝瑕佷箞绯荤粺鎻愮ず鈥滄枃浠舵e湪琚鍙︿竴涓浜烘垨绋嬪簭浣跨敤鈥濓紝瑕佷箞灏辨槸鎶ュ憡鈥滆块棶琚鎷掔粷鈥濃︹﹀傛灉浣犱篃閬囧埌杩囪繖绉嶆儏鍐碉紝涓嶅Θ鐪嬬湅鏈鏂囥
鍘熷洜涓锛氭枃浠舵e湪浣跨敤涓
鍦ㄥ垹闄ゆ枃浠舵椂锛岀粡甯镐細閬囧埌鐨勪竴涓闂棰樻槸锛屾枃浠舵e湪浣跨敤锛屾棤娉曞垹闄ゃ傚傛灉璇曞浘鍒犻櫎浠ョ嫭鍗犺块棶鑰屼笉鏄浠ュ叡浜璁块棶鏂瑰紡鎵撳紑锛屽苟涓旀e湪浣跨敤涓鐨勬枃浠舵椂锛岀郴缁熷氨浼氬嚭鐜伴敊璇鎻愮ず锛氣滄棤娉曞垹闄xxx锛氭枃浠舵e湪琚鍙︿竴涓浜烘垨绋嬪簭浣跨敤鈥濄傝屽彟涓绉嶆儏鍐靛垯鏄锛岃兘澶熶娇鐢ㄥ垹闄ゅ懡浠ゅ垹闄ゆ枃浠讹紝浣嗗湪鎵撳紑鏂囦欢鐨勮繘绋嬮噴鏀捐ユ枃浠朵箣鍓嶏紝鏂囦欢瀹為檯涓婂苟鏈鍒犻櫎銆
瑕佽В鍐充笂杩伴棶棰橈紝闇瑕佺‘瀹氭嫢鏈夋枃浠舵墦寮鍙ユ焺鐨勮繘绋嬶紝鐒跺悗鍏抽棴姝よ繘绋嬨傚湪浠ュ墠鐨刉indows涓锛屾垜浠鍙浠ヤ娇鐢ㄨ祫婧愬伐鍏峰寘鐨凮h.exe銆備絾鍦╔P涓锛屽畨瑁呭ソ鐨凷upport
Tools鍗翠笉甯Oh.exe銆備笉杩囷紝XP鎻愪緵浜嗕竴涓鏂扮殑Openfiles.exe鍛戒护琛屽伐鍏凤紝瀹冭兘澶熸姤鍛婅繘绋嬫墦寮鐨勫悇涓鏂囦欢銆備笌Oh.exe鐩镐技锛孫penfiles.exe涔熻佹眰鎵撳紑绯荤粺鍐呮牳鐩戣嗭紝杩欎細娑堣椾竴浜涘唴瀛橈紝骞堕檷浣庣郴缁熸搷浣滅殑鎬ц兘銆傛墦寮绯荤粺鐩戣嗙殑鍛戒护鏄鈥淥penfiles
/local
on鈥濓紝瀹冧細鍚鐢ㄧ郴缁熷叏灞鏍囧織鈥滅淮鎶ゅ硅薄鍒楄〃鈥濓紝闇閲嶆柊鍚鍔ㄧ郴缁熸墠鑳界敓鏁堛傞噸鏂板惎鍔ㄧ郴缁熷悗锛屽湪鍛戒护鎻愮ず绗︿笅鎵ц屼笉甯﹀弬鏁扮殑鈥淥penfiles鈥濓紝鍗冲彲鐪嬪埌鍚勪釜杩涚▼鎵撳紑鏂囦欢鐨勬竻鍗曘
鍘熷洜浜岋細鏂囦欢绯荤粺鎹熷潖
纾佺洏涓婄殑鍧忓尯銆佸叾浠栫‖浠舵晠闅滄垨鑰呰蒋浠堕敊璇閮藉彲鑳戒細鎹熷潖鏂囦欢绯荤粺锛屼娇鏂囦欢鍑虹幇闂棰樿屾棤娉曞垹闄ゃ傚吀鍨嬫搷浣滃け璐ョ殑鏂瑰紡鍙鑳藉悇涓嶇浉鍚岋紝褰撴娴嬪埌鏂囦欢绯荤粺鎹熷潖鏃讹紝閫氬父浼氭敹鍒颁竴鏉℃彁绀鸿繍琛孋hkdsk鐨勪俊鎭銆
濡傛灉閬囧埌杩欑嶆儏鍐碉紝鍙浠ュ湪纾佺洏鍗蜂笂杩愯孋hkdsk瀹炵敤宸ュ叿浠ョ籂姝d换浣曞瓨鍦ㄧ殑閿欒銆傛牴鎹鎹熷潖鐨勬ц川锛孋hkdsk涔熻歌兘澶熸仮澶嶆枃浠舵暟鎹锛屼篃璁告棤娉曟仮澶嶏紝浣咰hkdsk鍙浠ヤ娇鏂囦欢绯荤粺杩斿洖鍒颁竴绉嶅湪鍐呴儴涓鑷寸殑鐘舵併傛湁鍏矯hkdsk瀹炵敤宸ュ叿鐨勫懡浠ゅ強鍙傛暟锛屽彲浠ュ湪鍛戒护鎻愮ず绗︿笅鎵ц屸淐hkdsk
/锛熲濇煡闃呫
鍘熷洜涓夛細鏂囦欢浣跨敤浜嗗瓨鍙栨帶鍒跺垪琛
濡傛灉鏌愪釜鏂囦欢浣跨敤浜嗗瓨鍙栨帶鍒跺垪琛锛圓ccess Control
List锛岀畝绉癆CL锛夛紝鑰屾搷浣滆呭張娌℃湁鐩稿簲鐨勬潈闄愶紝閭d箞鍒犻櫎鏂囦欢鏃跺氨鍙鑳藉嚭鐜扳滆块棶琚鎷掔粷鈥濈殑鎻愮ず銆
閫氬父鎯呭喌涓嬶紝绠$悊鍛樺叿鏈夊彇寰椾换浣曟枃浠舵墍鏈夋潈鐨勯殣鍚鑳藉姏锛屾枃浠舵墍鏈夎呬篃鍏锋湁淇鏀规枃浠舵潈闄愮殑闅愬惈鑳藉姏銆備笉杩囷紝杩欎簺榛樿ょ殑鏉冮檺鏄鍙浠ヨ淇鏀圭殑銆
瑕佽В鍐冲洜ACL瀵艰嚧鏂囦欢鏃犳硶鍒犻櫎鐨勯棶棰橈紝灏卞繀椤讳互鍏锋湁鐩稿簲鏉冮檺鐨勭敤鎴疯韩浠界櫥褰曪紝鎴栬呮槸璧嬩簣鑷宸卞垹闄ゆ枃浠剁殑鏉冮檺锛岀劧鍚庢墠鑳藉垹闄ゆ枃浠躲傝佹敞鎰忕殑鏄锛屾搷浣滆呭繀椤绘嫢鏈夎繖浜涙枃浠剁殑鎵鏈夋潈鎵嶈兘鏇存敼鏉冮檺銆傚傛灉鏄鍥犱负鏂囦欢浣跨敤浜嗕笉瑙勮寖鐨凙CL鑰屼笉鑳戒娇鐢ㄦ煇浜涘畨鍏ㄥ伐鍏锋樉绀烘垨淇鏀瑰叾鏉冮檺鏃讹紝鍙浠ュ皾璇曚娇鐢ㄥ懡浠よ屽伐鍏稢acls.exe杩涜屼慨鏀广
鍘熷洜鍥涳細鏂囦欢鍚嶄娇鐢ㄤ簡涓涓淇濈暀鍚嶇О
浼楁墍鍛ㄧ煡锛屽儚AUX銆丩PT1杩欐牱鐨勫悕绉版槸涓烘棫寮廌OS璁惧囦繚鐣欑殑銆備负浜嗗悜鍚庡吋瀹癸紝鍦╓indows涓涓嶅厑璁镐娇鐢ㄨ繖浜涙枃浠跺悕锛屼篃涓嶈兘浣跨敤鍏稿瀷鐨刉in32鏂囦欢璋冪敤鏉ュ垱寤哄畠浠銆傚弽涔嬶紝濡傛灉鏂囦欢鍚嶆槸Win32鍛藉悕绌洪棿涓鐨勪竴涓淇濈暀鍚嶇О锛屽垯鍚屾牱鍙鑳芥棤娉曞垹闄ゆゆ枃浠躲
瑕佽В鍐虫ょ被闂棰橈紝鍙浠ュ湪linux鎴栧叾浠栭潪Windows鐨勬搷浣滅郴缁熶笅閲嶅懡鍚嶆垨鍒犻櫎璇ユ枃浠躲傚彟澶栵紝濡傛灉鑳藉熶娇鐢ㄧ壒瀹氱殑璇娉曟寚瀹氬埌璇ユ枃浠剁殑璺寰勶紝涔熷彲浠ヤ娇鐢ㄤ竴浜涘唴缃鐨勫懡浠ょ粫杩囧吀鍨嬬殑Win32淇濈暀鍚嶇О妫鏌ャ備緥濡傦紝鍦╓indows
XP涓浣跨敤浠ヤ笅鍛戒护锛屽彲浠ュ垹闄ゅ悕涓衡渓pt1鈥濈殑鏂囦欢锛圖el鍛戒护鍚庨潰鍔犱笂鈥滐紵鈥濇潵閬垮厤Windows妫鏌ユ枃浠跺悕鐨勫悎娉曟э級锛
Del [URL=]?c:[/URL]鏂囦欢璺寰刲pt1
鍘熷洜浜旓細鏃犳晥鐨勬枃浠跺悕绉
濡傛灉鏂囦欢鍚嶄腑鍖呮嫭涓涓鏃犳晥鍚嶇О锛屼緥濡傛枃浠跺悕鏈変竴涓灏鹃殢绌烘牸锛屾垨涓涓灏鹃殢鍙ョ偣锛屾垨鑰呮枃浠跺悕浠呯敱涓涓绌烘牸缁勬垚锛屽悓鏍峰彲鑳芥棤娉曞垹闄よユ枃浠躲傚煎緱涓鎻愮殑鏄锛屽傛灉浣跨敤鍏稿瀷鐨刉in32璇娉曟墦寮鍚嶇О涓鏈夊熬闅忕┖鏍兼垨灏鹃殢鍙ョ偣鐨勬枃浠讹紝鍒欏熬闅忕┖鏍兼垨鍙ョ偣鍦ㄦ墦寮瀹為檯鏂囦欢涔嬪墠浼氳鍘绘帀銆傚洜姝わ紝濡傛灉鍦ㄥ悓涓涓鏂囦欢澶逛腑鏈変袱涓鍒嗗埆鍚嶄负鈥淔ile.txt鈥濆拰鈥淔ile.txt
鈥濈殑鏂囦欢锛堟敞鎰忕浜屼釜鏂囦欢鍚嶅悗闈㈢殑绌烘牸锛夛紝褰撲娇鐢ㄦ爣鍑哤in32璋冪敤鎵撳紑绗浜屼釜鏂囦欢鏃讹紝瀹為檯涓婁細鎵撳紑绗涓涓鏂囦欢銆傚悓鏍凤紝濡傛灉鏂囦欢鐨勫悕绉颁粎鏄鈥
鈥濓紙涓涓绌烘牸瀛楃︼級锛屽綋灏濊瘯浣跨敤鏍囧噯Win32璋冪敤鎵撳紑瀹冩椂锛屽疄闄呬笂浼氭墦寮璇ユ枃浠剁殑鐖舵枃浠跺す銆傚湪姝ゆ儏鍐典笅锛屽傛灉灏濊瘯鏇存敼杩欎簺鏂囦欢涓婄殑瀹夊叏璁剧疆锛屽氨鏈夊彲鑳戒細鎰忓栨洿鏀瑰叾浠栨枃浠朵笂鐨勮剧疆銆
涓庤В鍐虫枃浠跺悕浣跨敤淇濈暀鍚嶇О鐨勬柟娉曠被浼硷紝鍙浠ヤ娇鐢ㄤ竴绉嶉傚綋鐨勫唴閮ㄨ娉曞垹闄ゆゆ枃浠躲備緥濡傝佸垹闄ゅ寘鍚灏鹃殢绌烘牸鐨勬枃浠讹紝鍙浠ヤ娇鐢ㄥ備笅鍛戒护锛
Del [URL=]?[/URL] c:鏂囦欢璺寰(灏鹃殢绌烘牸鐨勬枃浠跺悕)
鍘熷洜鍏锛氭枃浠惰矾寰勫お娣辨棤娉曡块棶
鏂囦欢浣嶄簬姣旀渶澶ц矾寰勫瓧绗︽暟锛圡AX_PATH锛夋洿娣辩殑璺寰勪腑锛屽彲鑳藉艰嚧鏂囦欢鏃犳硶璁块棶锛屽綋鐒讹紝杩欑嶆儏鍐佃緝涓哄皯瑙併傚傛灉璺寰勬繁鐨勫師鍥犳槸鏂囦欢澶瑰悕绉板お闀匡紝鏈绠渚跨殑瑙e喅鏂规堟槸浣跨敤鑷鍔ㄧ敓鎴愮殑8.3鍚嶇О璁块棶璇ユ枃浠躲傚傛灉8.3璺寰勪篃澶闀匡紝鍙浠ヤ粠鏍规枃浠跺す寮濮嬮噸鍛藉悕鏂囦欢澶癸紝缂╃煭瀹冧滑鐨勫悕绉帮紝浠ヤ娇鐩鏍囨枃浠剁殑璺寰勬繁搴︿笉瓒呰繃MAX_PATH銆傝嫢鏄鏂囦欢鐨勬繁搴﹁秴杩128涓鏂囦欢澶癸紝鍙浠ラ氳繃鍒涘缓涓涓缃戠粶鍏变韩锛屼娇鍏朵綅浜庢枃浠跺す鏍戜腑灏藉彲鑳芥繁鐨勪綅缃锛岀劧鍚庨氳繃璁块棶姝ゅ叡浜鏉ヨ块棶鏂囦欢銆
涓鑸鎯呭喌涓嬶紝濡傛灉閬囧埌鍥犳枃浠惰矾寰勫お娣辨棤娉曡块棶鐨勬儏鍐碉紝鍙浠ラ氳繃浣跨敤鍒涘缓鏂囦欢鐨勮蒋浠舵潵绠$悊杩欎簺鏂囦欢銆備篃灏辨槸璇达紝濡傛灉鏈変竴涓绋嬪簭锛屽畠鍙浠ュ垱寤鸿秴杩嘙AX_PATH鐨勬枃浠讹紝鍒欐垜浠涔熷彲浠ヤ娇鐢ㄨョ▼搴忔潵绠$悊杩欎簺鏂囦欢銆傛ゅ栵紝瀵逛簬閫氳繃缃戠粶鍏变韩鍒涘缓鐨勬繁灞傛$粨鏋勭殑鏂囦欢涔熷彲浠ラ氳繃浣跨敤鍚屼竴鍏变韩鏉ヨ繘琛屽垹闄ゃ
鍓嶉潰浠嬬粛浜哤indows绯荤粺涓鏂囦欢鎴栨枃浠跺す鏃犳硶鍒犻櫎鐨勫嚑绉嶅師鍥犱互鍙婅В鍐崇殑鏂规硶銆傚湪鏌愪簺鎯呭喌涓嬶紝鍙鑳借繕浼氶亣鍒颁笂杩板悇绉嶅師鍥犵殑涓嶅悓缁勫悎锛屼娇寰楀垹闄ゆ枃浠剁殑杩囩▼鏇村姞澶嶆潅銆傝繖灏遍渶瑕佽昏呰兘澶熶妇涓鍙嶄笁锛岀伒娲诲簲鐢ㄥ井杞鎻愪緵鐨勫悇绉嶅疄鐢ㄥ伐鍏疯繘琛岃В鍐充簡銆
Windows XP涓鍒犻櫎AVI鏂囦欢鐨勯棶棰
寰堝氭湅鍙嬪彲鑳戒細閬囧埌Windows XP涓鏃犳硶鍒犻櫎AVI鏂囦欢鐨勯棶棰橈紝杩欎富瑕佹槸鐢变簬Windows
XP瑙嗛戦勮堝姛鑳界殑Bug鎵瀵艰嚧鐨勩備綘鍙浠ュ皾璇曠敤浠ヤ笅鏂规硶杩涜屽垹闄ゃ
鏂规硶涓 鍦ㄨ繍琛屽懡浠ゆ嗕腑杈撳叆鈥淩egs-vr32/u
Shmedia.dll鈥濆苟鍥炶溅锛屽嵏鍘籛indows
XP鐨勮嗛戞枃浠堕勮堝姛鑳姐傚綋浠ュ悗鎯宠佹仮澶嶈嗛戦勮堝姛鑳芥椂锛屽啀浣跨敤鈥淩egsvr32Shmedia.dll鈥濆懡浠ら噸鏂版敞鍐屽嵆鍙銆
鏂规硶浜
鍏堟墦寮鍛戒护鎻愮ず绗︾獥鍙o紝鐒跺悗鍦ㄤ换鍔$$悊鍣ㄤ腑缁撴潫Explorer杩涚▼锛屽啀浠庡懡浠ゆ彁绀虹︾獥鍙d腑鍒囨崲鍒颁繚瀛樿嗛戞枃浠剁殑鏂囦欢澶逛笅锛岀敤Del鍛戒护鍒犻櫎鏂囦欢銆
鏂规硶涓
濡傛灉瀹夎呬簡鍙岀郴缁燂紝鍙浠ヤ粠鍙︿竴涓绯荤粺锛屽俉in98涓嬭繘琛屽垹闄ゃ
❷ linux哪个编译选项对程序的启动速度影响较大
一、选择题((1)—(40)每题1分,(41)—(50)每题2分,共60分)
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。
??
(1) 在32位计算机中,一个字长所占的字节数为( )。
A) 1
B) 2
C) 4
D) 8
??
(2) 与十进制数511等值的十六进制数为( )。
A) 1FF
B) 2FF
C) 1FE
D) 2FE
??
(3) 能将高级语言编写的源程序转换成目标程序的是( )。
A) 编程程序
B) 编译程序
C) 解释程序
D) 链接程序
??
(4) 在计算机系统中,存储一个汉字的国标码所需要的字节数为( )。
A) 1
B) 2
C) 3
D) 4
??
(5) 下列带有通配符的文件名中,能表示文件ABC.TXT的是( )。
A) *BC.?
B) A?.*
C) ?BC.*
D) ?.?
??
(6) 在多媒体计算机系统中,不能用以存储多媒体信息的是( )。
A) 光缆
B) 软盘
C) 硬盘
D) 光盘
??
(7) DOS命令逗COPY/看地的功能是( )。
A) 将当前盘当前目录中的所有文件复制到当前盘的根目录下
B) 将当前盘当前目录中所有以单个字符命名的文件复制到当前盘的根目录下
C) 以提示方式复制文件
D) 显示COPY命令的帮助信息
??
(8) 在Windows环境下,若要将当前活动窗口存入剪贴板,则可以按( )。
A) Ctrl+PrintScreen键
B) Ctrl+PrintScreen键
C) Shift+PrintScreen键
D) PrintScreen键
??
(9) 在Windows环境下,单击当前应用程序窗口中的逗关闭地按钮,其功能是( )。
A) 将当前应用程序转为后台运行
B) 退出Windows后再关机
C) 退出Windows后重新启动计算机
D) 终止当前应用程序的运行
??
(10) 在Windows环境中,粘贴按钮是( )。
A) ctrl+A
B) ctrl+C
C) ctrl+X
D) ctrl+V
??
(11) 以下叙述中正确的是( )。
A) 构成C程序的基本单位是函数
B) 可以在一个函数中定义另一个函数
C) main()函数必须放在其它函数之前
D) 所有被调用的函数一定要在调用之前进行定义
??
(12) 以下选项中合法的实型常数是( )。
A) 5E2.0
B) E-3
C) .2E0
D) 1.3E
??
(13) 以下选项中合法的用户标识符是( )。
A) long
B) _2Test
C) 3Dmax
D) A.dat
??
(14) 已知大写字母A的ASCII码值是65,小写字母a的ASCII码是97,则用八进制表示的字符常量‘\101’是( )。
A) 字符A
B)字符a
C)字符e
D)非法的常量
??
(15) 以下非法的赋值语句是( )。
A) n=(i=2,++i);
B)j++;
C) ++(i+1);
D)x=j>0;
??
(16) 设a和b均为double型变量,且a=5.5、b=2.5,则表达式(int)a+b/b的值是( )。
A)6.500000
B)6
C) 5.500000
D) 6.000000
??
(17) 已知i、j、k为int型变量,若从键盘输入:1,2,3,使i的值为1、j的值为2、k的值为3,以下选项中正确的输入语句是( )。
A) scanf(逗%2d%2d%2d地,&i,&j,&k);
B) scanf(逗%d %d %d地,&i,&j,&k);
C) scanf(逗%d,%d,%d地,&i,&j,&k);
D) scanf(逗i=%d,j=%d,k=%d地,&i,&j,&k);
??
(18) 与数学式子 对应的C语言表达式是( )。
A) 3*x^n(2*x-1)
B) 3*x**n(2*x-1)
C) 3*pow(x,n)*(1/(2*x-1))
D) 3*pow(n,x)/(2*x-1)
??
(19) 设有定义:long x=-123456L;,则以下能够正确输出变量x值的语句是( )。
A)printf(逗x=%d\n地,x);
B) printf(逗x=%1d\n地,x);
C)printf(逗x=%8dL\n地,x);
D)printf(逗x=%LD\n地,x);
??
(20) 若有以下程序:
??main()
??{ int k=2,i=2,m;
??m=(k+=i*=k);printf(逗%d,%d\n地,m,i);
??}
??执行后的输出结果是( )。
A) 8,6
B) 8,3
C) 6,4
D) 7,4
??
(21) 已有定义:int x=3,y=4,z=5;,则表达式!(x+y)+z-1 && y+z/2的值是( )。
A) 6
B) 0
C) 2
D) 1
??
(22) 有一函数, ,以下程序段中不能根据x值正确计算出y值的是( )。
A) if(x>0) y=1; B) y=0;
?? else if(x==0) y=0; if(x>0) y=1;
?? else y=-1; else if(x<0) y=-1;
C)y=0; D)if(x>=0)
?? if(x>=0); if(x>0) y=1;
?? if(x>0) y=1 ; else y=0;
?? else y=-1; else y=-1;
??
(23) 以下选项中,与k=n++完全等价的表达式是( )。
A) k=n,n=n+1
B) n=n+1,k=n
C) k=++n
D) k+=n+1
??
(24) 以下程序的功能是:按顺序读入10名学生4门课程的成绩,计算出每位学生的平均分并输出,程序如下:
??main()
??{ int n,k;
??float score ,sum,ave;
??sum=0.0;
??for(n=1;n<=10;n++)
??{ for(k=1;k<=4;k++)
??{ scanf(逗%f地,&score); sum+=score;}
??ave=sum/4.0;
??printf(逗NO%d:%f\n地,n,ave);
?? }
??}
??上述程序运行后结果不正确,调试中发现有一条语句出现在程序中的位置不正确。这条语句是( )。
A) sum=0.0;
B) sum+=score;
C) ave=sun/4.0;
D) printf(逗NO%d:%f\n地,n,ave);
??
(25) 有以下程序段
??int n=0,p;
??do{scanf(逗%d地,&p);n++;}while(p!=12345 &&n<3);
??此处do—while循环的结束条件是( )。
A) P的值不等于12345并且n的值小于3
B) P的值等于12345并且n的值大于等于3
C) P的值不等于12345或者n的值小于3
D) P的值等于12345或者n的值大于等于3
??
(26) 有以下程序
??main()
??{ int a=15,b=21,m=0;
??switch(a%3)
??{ case 0:m++;break;
??case 1:m++;
?? switch(b%2)
??{ default:m++;
??case 0:m++;break;
??}
??}
??printf(逗%d\n地,m);
??}
?? 程序运行后的输出结果是( )。
A) 1
B) 2
C) 3
D) 4
??
(27) C语言中,函数值类型的定义可以缺省,此时函数值的隐含类型是( )。
A) void
B) int
C) float
D) double
??
(28) 若有说明:int n=2,*p=&n,*q=p;,则以下非法的赋值语句是( )。
A) p=q;
B) *p=*q;
C) n=*q;
D) p=n;
??
(29) 有以下程序
??float fun(int x,int y)
??{ return(x+y); }
??main()
??{ int a=2,b=5,c=8;
??printf(逗%3.0f\n地,fun(int)fun(a+c,b),a-c));
??}
??程序运行后的输出结果是( )。
A) 编译出错
B) 9
C) 21
D) 9.0
??
(30) 有以下程序
??void fun(char *c,int d)
??{ *c=*c+1;d=d+1;
??printf(逗%c,%c,地,*c,d);
??}
??main()
??{ char a=’A’,b=’a’;
??fun(&b,a); printf(逗%c,%c\n地,a,b);
??}
??程序运行后的输出结果是( )。
A)B,a,B,a
B) a,B,a,B
C) A,b,A,b
D) b,B,A,b
??
(31) 以下程序中函数sort的功能是对a所指数组中的数据进行由大到小的排序
??void sort(int a[],int n)
{ int i,j,t;
for(i=0;i
for(j=i+1,j
if(a[i]
}
main()
{ int aa[10]={1,2,3,4,5,6,7,8,9,10},i;
sort(&aa[3],5);
for(i=o;i<10;i++) print(逗%d,地,aa[i]);
printf(‘\n地);
}
??程序运行后的输出结果是( )。
A)1,2,3,4,5,6,7,8,9,10
B) 10,9,8,7,6,5,4,3,2,1,
C) 1,2,3,8,7.6.5.4.9,10
D) 1,2,10,9,8,7,6,5,4,3
??
(32) 有以下程序
??int f(int n)
??{ if (n==1) return 1;
??else return f(n-1)+1;
??}
??main()
??{ int i,j=0;
??for(i=i;i<3;i++) j+=f(i);
??printf(逗%d\n地,j);
??}
??程序运行后的输出结果是( )。
A) 4
B) 3
C) 2
D) 1
??
(33) 有以下程序
??main()
??{ char a[ ]={‘a’,‘b’,‘c’,‘d’, ‘e’, ‘f’, ‘g’,‘h’,‘\0’}; int i,j;
??i=sizeof(a); j=strlen(a);
??printf(逗%d,%d\b地i,j);
??}
??程序运行后的输出结果是( )。
A)9,9
B)8,9
C)1,8
D)9,8
??
(34) 以下程序中函数reverse的功能是将a所指数组中的内容进行逆置。
??void reverse(int a[ ],int n)
??{ int i,t;
??for(i=0;i??{ t=a[i]; a[i]=a[n-1-i];a[n-1-i]=t;}
??}
??main()
??{ int b[10]={1,2,3,4,5,6,7,8,9,10}; int i,s=0;
?? reverse(b,8);
?? for(i=6;i<10;i++) s+=b[i];
?? printf(逗%d\n地,s);
??}
??程序运行后的输出结果是( )。
A) 22
B) 10
C) 34
D) 30
??
(35) 有以下程序
??main()
??{ int aa[4][4]={{1,2,3,4},{5,6,7,8},{3,9,10,2},{4,2,9,6}};
??int i,s=0
??for(i=0;i<4;i++) s+=aa[i][1];
??printf(逗%d\n地,s);
??}
??程序运行后的输出结果是( )。
A) 11
B) 19
C) 13
D) 20
??
(36) 有以下程序
??#include
??main()
??{ char *p=逗abcde\Ofghjik\0地;
??printf(逗%d\n地,strlen(p));
??}
??程序运行后的输出结果是( )。
A) 12
B) 15
C) 6
D) 5
??
(37) 程序中头文件typel.h 的内容是:
??#define N 5
??#define M1 N*3
??程序如下:
??#define 逗type1.h地
??#define M2 N*2
??main()
??{ int i;
??i=M1+M2; printf(逗%d\n地,i);
??}
??程序编译后运行的输出结果是:( )。
A) 10
B) 20
C) 25
D) 30
??
(38) 有以下程序
??#include
??main()
??{ FILE *fp; int i=20,j=30,k,n;
??fp=fopen(逗d1.dat地逗w地);
??fprintf(fp,逗%d\n地,i);fprintf(fp,逗%d\n地j);
??fclose(fp);
??fp=fopen(逗d1.dat地, 逗r地);
??fp=fscanf(fp,逗%d%d地,&k,&n); printf(逗%d%d\n地,k,n);
??fclose(fp);
??}
??程序运行后的输出结果是( )。
A) 20 30
B) 20 50
C) 30 50
D) 30 20
??
(39) 以下叙述中错误的是( )。
A) 二进制文件打开后可以先读文件的末尾,而顺序文件不可以
B) 在程序结束时,应当用fclose函数关闭已打开的文件
C) 在利用fread函数从二进制文件中读数据时,可以用数组名给数组中所有元素读入数据
D) 不可以用FILE定义指向二进制文件的文件指针
(40) 有以下程序
??#include
??main(int argc,char *argv[])
??{ int i,len=0;
??for(i=1;i??printf(逗%d\n地,len);
??}
??程序编译连接后生成的可执行文件是ex1.exe,若运行时输入带参数的命令行是:
??ex1 abcd efg 10
??则运行的结果是:( )。
A) 22
B) 17
C) 12
D) 9
??
(41) 有以下程序
??int fa(int x)
??{ return x*x; }
??int fb(int x)
??{ return x*x*x; }
??int f(int (*f1)(),int (*f2)(),int x)
??{ return f2(x)-f1(x); }
??main()
??{ int i;
??i=f(fa,fb,2); printf(逗%d\n地,i);
??}
??程序运行后的输出结果是( )。
A) -4
B) 1
C) 4
D) 8
??
(42) 有以下程序
??int a=3;
??main()
??{ int s=0;
??{ int a=5; s+=a++; }
??s+=a++;printf(逗%d\n地,s);
??}
??程序运行后的输出结果是( )。
A) 8
B) 10
C) 7
D) 11
??
(43) 有以下程序
??void ss(char *s,char t)
??{ while(*s)
??{ if(*s==t) *s=t-‘a’+’A’;
?? s++;
??}
??}
??main()
??{ char str1[100]=逗abcddfefdbd地,c=’d’;
??ss(str1,c); printf(逗%s\n地,str1);
??}
??程序运行后的输出结果是( )。
A) ABCDDEFEDBD
B) abcDDfefDbD
C) abcAAfefAbA
D) Abcddfefdbd
??
(44) 有以下程序
??struct STU
??{ char num[10]; float score[3]; };
??main()
??{ struct stu s[3]={{逗20021地,90,95,85},
??{逗20022地,95,80,75},
??{逗20023地,100,95,90}},*p=s;
??int i; float sum=0;
??for(i=0;i<3,i++)
??sum=sum+p->score[i];
??printf(逗%6.2f\n地,sum);
??}
??程序运行后的输出结果是( )。
A) 260.00
B) 270.00
C) 280.00
D) 285.00
??
(45) 设有如下定义:
??struck sk
??{ int a;
??float b;
??}data;
??int *p;
??若要使P指向data中的a域,正确的赋值语句是( )。
A) p=&a;
B) p=data.a;
C) p=&data.a;
D) *p=data.a;
??
(46) 有以下程序
??#include
??struct NODE
??{ int num; struct NODE *next; };
??main()
??{ struct NODE *p,*Q,*R;
??p=(struct NODE*)malloc(sizeof(struct NODE));
??q=(struct NODE*)malloc(sizeof(struct NODE));
??r=(struct NODE*)malloc(sizeof(struct NODE));
??p->num=10; q->num=20; r->num=30;
??p->next=q;q->next=r;
??printf(逗%d\n地,p->num+q->next->num);
??}
??程序运行后的输出结果是( )。
A) 10
B) 20
C) 30
D) 40
??
(47) 若有以下说明和定义
??typedef int *INTEGER;
??INTEGER p,*q;
??以下叙述正确的是( )。
A) P是int型变量
B) p是基类型为int的指针变量
C) q是基类型为int的指针变量
D) 程序中可用INTEGER代替int类型名
??
(48) 有以下程序
??main()
??{ unsigned char a,b,c;
??a=0x3; b=a|0x8; c=b<<1;
??printf(逗%d%d\n地,b,c);
??}
??程序运行后的输出结果是( )。
A) –11 12
B) –6 –13
C) 12 24
D) 11 22
??
(49) 有以下程序
??#include
??main()
??{ char *p,*q;
??p=(char*)malloc(sizeof(char)*20); q=p;
??scanf(逗%s%s地,p,q); printf(逗%s%s\n地,p,q);
??}
??若从键盘输入:abc def,则输出结果是:( )。
A) def def
B) abc def
C) abc d
D) d d
??
(50) 以下程序中函数f的功能是将n个字符串按由大到小的顺序进行排序。
??#include
??void f(char p[][10],int n)
??{ char t[20]; int i,j;
??for(i=0;i??for(j=i+1;j??if(strcmp(p[i],p[j])<0)
?? { strcpy(t,p[i]);strcpy(p[i],p[j]);strcpy(p[j],t);}
??}
??main()
??{ char p[][10]={逗abc地,逗aabdfg地,逗abbd地,逗dcdbe地,逗cd地};int i;
??f(p,5); printf(逗%d\n地,strlen(p[0]));
??}
??程序运行后的输出结果是( )。
A) 6
B) 4
C) 5
D) 3
??
二、填空题(每空2分,共40分)
请将答案分别写在答题卡中序号为【1】至【20】的横线上,答在试卷上不得分。
??
1、计算机软件分为系统软件和应用软件,操作系统属于 [1] 。
??
2、在DOS环境下,代表键盘和显示器的设备文件名为 [2] 。
??
3、支持Internet基本服务的协议是 [3] 。
??
4、从Windows环境进入MS-DOS方式后,返回Windows环境的DOS命令为 [4] 。
??
5、某微型机的运算速度为2MIPS,则该微型机每秒执行 [5] 条指令。
??
6、设有定义:int n,*k=&n;以下语句将利用指针变量k读写变量n中的内容,请将语句补充完整。
??scanf(逗%d, 地 [6] );
??printf(逗%d\n地, [7] 。);
??
7、以下程序运行后的输出结果是 [8] 。
?? main()
??{ int x=10,y=20,t=0;
??if(x==y)t=x;x=y;y=t;
??printf(逗%d,%d \n地,x,y);
??}
??
8、以下程序运行后的输出结果是 [9] 。
??main()
??{ int x=15;
??while(x>10 && x<50)
??{ x++;
??if(x/3){x++;break;}
??else continue;
??}
??printf(逗%d\n地,x);
??}
??
9、有以下程序:
??#include
??main()
??{ char c;
??while((c=getchar( ))!=’?’) putchar(--c);
??}
??程序运行时,如果从键盘输入:Y看N看,则输出结果为 [10] 。
??
10、以下程序运行后的输出结果是 [11] 。
??void fun(int x,int y)
??{ x=x+y;y=x-y;x=x-y;
??printf(逗%d,%d,地,x,y); }
??main()
??{ int x=2,y=3;
??fun(x,y);
??printf(逗%d,%d\n地,x,y);
??}
??
11、以下函数的功能是计算s=1+ + +……+ ,请填空。
??double fun(int n)
??{ double s=0.0,fac=1.0; int i;
??for(i=1,i<=n;i++)
??{ fac=fac [12] ;
??s=s+fac;
??}
??return s;
??}
??
12 fun函数的功能是:首先对a所指的N行N列的矩阵,找出各行中的最大的数,再求这N个最大值中的最小的那个数作为函数值返回。请填空。
??#include
??#define N 100
??int fun(int(*a)[N])
??{ int row,col,max,min;
??for(row=0;row??{ for(max=a[row][0],col=1;col??if( [13] )max=a[row][col];
?? if( row==0)min=max;
?? else if( [14] )min=max;
?? }
??return min;
??}
??
13、函数sstrcmp()的功能是对两个字符串进行比较。当s所指字符串和t所指字符串相等时,返回值为0;当s所指字符串大于t所指字符串时,返回值大于0;当s所指字符串小于t所指字符串时,返回值小于0(功能等同于库函数strcmp())。请填空。
??#include
??int sstrcmp(char *s,char *t)
??{ while(*s&&*t&& *s== [15] )
??{ s++;t++;}
??return [16] ;
??}
??
14、下面程序的运行结果是 [17] 。
??#define N 10
??#define s(x) x*x
??#define f(x) (x*x)
??main()
??{ int i1,i2;
??i1=1000/s(N); i2=1000/f(N);
??printf(逗%d %d\n地,i1,i2);
??}
??
15、下面程序的运行结果是: [18] 。
??void swap(int *a,int *b)
??{ int *t;
??t=a; a=b; b=t;
??}
??main()
??{ int x=3,y=5,*p=&x,*q=&y;
??swap(p,q);
??printf(逗%d%d\n地,*p,*q);
??}
??
16、下面程序的运行结果是: [19] 。
??typedef union student
??{ char name[10];
??long sno;
??char sex;
??float score[4];
??}STU;
??main()
??{ STU a[5];
??printf(逗%d\n地,sizeof(a));
??}
??
(17) 函数sstrcmp()的功能是对两个字符串进行比较。当s 所指字符串和t所指字符相等时,返回值为0;当s所指字符串大于t所指字符串时,返回值大于0;当s所指字符串小于t所指字符串时,返回值小于0(功能等同于库函数strcmp())。请填空。
#include
int sstrcmp(char *s,char *t)
{while(*s&&*t&&*s==【19】)
{s++;t++; }
return 【20】;
}
❸ 为什么DEBUG版本正确,Release版本错误
一、Debug 和 Release 编译方式的本质区别
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起 Release 版错误,在此不讨论)
Debug 版本:
/MDd /MLd 或 /MTd 使用 Debug runtime library(调试版本的运行时刻函数库)
/Od 关闭优化开关
/D "_DEBUG" 相当于 #define _DEBUG,打开编译调试代码开关(主要针对
assert函数)
/ZI 创建 Edit and continue(编辑继续)数据库,这样在调试过
程中如果修改了源代码不需重新编译
/GZ 可以帮助捕获内存错误
/Gm 打开最小化重链接开关,减少链接时间
Release 版本:
/MD /ML 或 /MT 使用发布版本的运行时刻函数库
/O1 或 /O2 优化开关,使程序最小或最快
/D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数)
/GF 合并重复的字符串,并将字符串常量放到只读内存,防止
被修改
实际上,Debug 和 Release 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。
二、哪些情况下 Release 版会出错
有了上面的介绍,我们再来逐个对照这些选项看看 Release 版错误是怎样产生的
1. Runtime Library:链接哪种运行时刻函数库通常只对程序的性能产生影响。调试版本的 Runtime Library 包含了调试信息,并采用了一些保护机制以帮助发现错误,因此性能不如发布版本。编译器提供的 Runtime Library 通常很稳定,不会造成 Release 版错误;倒是由于 Debug 的 Runtime Library 加强了对错误的检测,如堆内存分配,有时会出现 Debug 有错但 Release 正常的现象。应当指出的是,如果 Debug 有错,即使 Release 正常,程序肯定是有 Bug 的,只不过可能是 Release 版的某次运行没有表现出来而已。
2. 优化:这是造成错误的主要原因,因为关闭优化时源程序基本上是直接翻译的,而打开优化后编译器会作出一系列假设。这类错误主要有以下几种:
(1) 帧指针(Frame Pointer)省略(简称 FPO ):在函数调用过程中,所有调用信息(返回地址、参数)以及自动变量都是放在栈中的。若函数的声明与实现不同(参数、返回值、调用方式),就会产生错误————但 Debug 方式下,栈的访问通过 EBP 寄存器保存的地址实现,如果没有发生数组越界之类的错误(或是越界“不多”),函数通常能正常执行;Release 方式下,优化会省略 EBP 栈基址指针,这样通过一个全局指针访问栈就会造成返回地址错误是程序崩溃。C++ 的强类型特性能检查出大多数这样的错误,但如果用了强制类型转换,就不行了。你可以在 Release 版本中强制加入 /Oy- 编译选项来关掉帧指针省略,以确定是否此类错误。此类错误通常有:
● MFC 消息响应函数书写错误。正确的应为
afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam);
ON_MESSAGE 宏包含强制类型转换。防止这种错误的方法之一是重定义 ON_MESSAGE 宏,把下列代码加到 stdafx.h 中(在#include "afxwin.h"之后),函数原形错误时编译会报错
#undef ON_MESSAGE
#define ON_MESSAGE(message, memberFxn) { message, 0, 0, 0, AfxSig_lwl, (AFX_PMSG)(AFX_PMSGW)(static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > (&memberFxn) },
(2) volatile 型变量:volatile 告诉编译器该变量可能被程序之外的未知方式修改(如系统、其他进程和线程)。优化程序为了使程序性能提高,常把一些变量放在寄存器中(类似于 register 关键字),而其他进程只能对该变量所在的内存进行修改,而寄存器中的值没变。如果你的程序是多线程的,或者你发现某个变量的值与预期的不符而你确信已正确的设置了,则很可能遇到这样的问题。这种错误有时会表现为程序在最快优化出错而最小优化正常。把你认为可疑的变量加上 volatile 试试。
(3) 变量优化:优化程序会根据变量的使用情况优化变量。例如,函数中有一个未被使用的变量,在 Debug 版中它有可能掩盖一个数组越界,而在 Release 版中,这个变量很可能被优化调,此时数组越界会破坏栈中有用的数据。当然,实际的情况会比这复杂得多。与此有关的错误有:
● 非法访问,包括数组越界、指针错误等。例如
void fn(void)
{
int i;
i = 1;
int a[4];
{
int j;
j = 1;
}
a[-1] = 1;//当然错误不会这么明显,例如下标是变量
a[4] = 1;
}
j 虽然在数组越界时已出了作用域,但其空间并未收回,因而 i 和 j 就会掩盖越界。而 Release 版由于 i、j 并未其很大作用可能会被优化掉,从而使栈被破坏。
3. _DEBUG 与 NDEBUG :当定义了 _DEBUG 时,assert() 函数会被编译,而 NDEBUG 时不被编译。除此之外,VC++中还有一系列断言宏。这包括:
ANSI C 断言 void assert(int expression );
C Runtime Lib 断言 _ASSERT( booleanExpression );
_ASSERTE( booleanExpression );
MFC 断言 ASSERT( booleanExpression );
VERIFY( booleanExpression );
ASSERT_VALID( pObject );
ASSERT_KINDOF( classname, pobject );
ATL 断言 ATLASSERT( booleanExpression );
此外,TRACE() 宏的编译也受 _DEBUG 控制。
所有这些断言都只在 Debug版中才被编译,而在 Release 版中被忽略。唯一的例外是 VERIFY() 。事实上,这些宏都是调用了 assert() 函数,只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了任何程序代码,而不只是布尔表达式(例如赋值、能改变变量值的函数调用 等),那么 Release 版都不会执行这些操作,从而造成错误。初学者很容易犯这类错误,查找的方法也很简单,因为这些宏都已在上面列出,只要利用 VC++ 的 Find in Files 功能在工程所有文件中找到用这些宏的地方再一一检查即可。另外,有些高手可能还会加入 #ifdef _DEBUG 之类的条件编译,也要注意一下。
顺便值得一提的是 VERIFY() 宏,这个宏允许你将程序代码放在布尔表达式里。这个宏通常用来检查 Windows API 的返回值。有些人可能为这个原因而滥用 VERIFY() ,事实上这是危险的,因为 VERIFY() 违反了断言的思想,不能使程序代码和调试代码完全分离,最终可能会带来很多麻烦。因此,专家们建议尽量少用这个宏。
4. /GZ 选项:这个选项会做以下这些事
(1) 初始化内存和变量。包括用 0xCC 初始化所有自动变量,0xCD ( Cleared Data ) 初始化堆中分配的内存(即动态分配的内存,例如 new ),0xDD ( Dead Data ) 填充已被释放的堆内存(例如 delete ),0xFD( deFencde Data ) 初始化受保护的内存(debug 版在动态分配内存的前后加入保护内存以防止越界访问),其中括号中的词是微软建议的助记词。这样做的好处是这些值都很大,作为指针是不可能的(而且 32 位系统中指针很少是奇数值,在有些系统中奇数的指针会产生运行时错误),作为数值也很少遇到,而且这些值也很容易辨认,因此这很有利于在 Debug 版中发现 Release 版才会遇到的错误。要特别注意的是,很多人认为编译器会用 0 来初始化变量,这是错误的(而且这样很不利于查找错误)。
(2) 通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性。(防止原形不匹配)
(3) 函数返回前检查栈指针,确认未被修改。(防止越界访问和原形不匹配,与第二项合在一起可大致模拟帧指针省略 FPO )
通常 /GZ 选项会造成 Debug 版出错而 Release 版正常的现象,因为 Release 版中未初始化的变量是随机的,这有可能使指针指向一个有效地址而掩盖了非法访问。
除此之外,/Gm /GF 等选项造成错误的情况比较少,而且他们的效果显而易见,比较容易发现。
三、怎样“调试” Release 版的程序
遇到 Debug 成功但 Release 失败,显然是一件很沮丧的事,而且往往无从下手。如果你看了以上的分析,结合错误的具体表现,很快找出了错误,固然很好。但如果一时找不出,以下给出了一些在这种情况下的策略。
1. 前面已经提过,Debug 和 Release 只是一组编译选项的差别,实际上并没有什么定义能区分二者。我们可以修改 Release 版的编译选项来缩小错误范围。如上所述,可以把 Release 的选项逐个改为与之相对的 Debug 选项,如 /MD 改为 /MDd、/O1 改为 /Od,或运行时间优化改为程序大小优化。注意,一次只改一个选项,看改哪个选项时错误消失,再对应该选项相关的错误,针对性地查找。这些选项在 Project\Settings... 中都可以直接通过列表选取,通常不要手动修改。由于以上的分析已相当全面,这个方法是最有效的。
2. 在编程过程中就要时常注意测试 Release 版本,以免最后代码太多,时间又很紧。
3. 在 Debug 版中使用 /W4 警告级别,这样可以从编译器获得最大限度的错误信息,比如 if( i =0 )就会引起 /W4 警告。不要忽略这些警告,通常这是你程序中的 Bug 引起的。但有时 /W4 会带来很多冗余信息,如 未使用的函数参数 警告,而很多消息处理函数都会忽略某些参数。我们可以用
#progma warning(disable: 4702) //禁止
//...
#progma warning(default: 4702) //重新允许
来暂时禁止某个警告,或使用
#progma warning(push, 3) //设置警告级别为 /W3
//...
#progma warning(pop) //重设为 /W4
来暂时改变警告级别,有时你可以只在认为可疑的那一部分代码使用 /W4。
4.你也可以像 Debug 一样调试你的 Release 版,只要加入调试符号。在 Project/Settings... 中,选中 Settings for "Win32 Release",选中 C/C++ 标签,Category 选 General,Debug Info 选 Program Database。再在 Link 标签 Project options 最后加上 "/OPT:REF" (引号不要输)。这样调试器就能使用 pdb 文件中的调试符号。但调试时你会发现断点很难设置,变量也很难找到——这些都被优化过了。不过令人庆幸的是,Call Stack 窗口仍然工作正常,即使帧指针被优化,栈信息(特别是返回地址)仍然能找到。这对定位错误很有帮助。
❹ IDS的主要功能有哪些
几乎所有当前市场上的网络入侵检测系统都是基于一种被动数据收集方式的协议分析
,我们可以预见,这种方式在本质上是有缺陷的。
毫无疑问,这样的入侵检测系统会监视整个网络环境中的数据流量,并且总是与一种
预定义的可疑行为模式来进行对照,甚至所谓的入侵行为分析技术也只是简单地从单位时
间状态事件技术上做了些组合工作,事实上离真正实用的复杂黑客入侵行为的剖析和理解
还有很远的距离。
对于这种检测技术的可靠性,我们可以通过自定义的三种可行性很强的攻击方式来验
证――插入攻击、逃避攻击和拒绝服务攻击。我们可以看到,当一个入侵者实施了这样的
入侵策略以后,所谓的入侵检测系统便妥协了。我们的结论是这种入侵检测系统不是放之
四海而皆准的,除非它们从根本上被重新设计过。
入侵检测系统的作用及其功能
真正实用的入侵检测系统的存在价值就是能够察觉黑客的入侵行为并且进行记录和处
理,当然,人们也会根据自己的需求提出需要强大的日志记录策略、黑客入侵诱导等等。
不同的入侵检测系统存在不同的入侵分析特征。一个企图检测Web入侵的系统可能只会
考虑那些常见的恶意HTTP协议请求;同样道理,一个监视动态路由协议的系统可能只会考
虑网络是否存在RIP欺骗攻击等等。目前国内市场上的大部分入侵检测系统使用同一个入侵
行为定义库,如著名的SNORT特征库,这说明我们在技术挖掘方面的投入还不够,事实上我
国在基础研究设施的投入上也存在严重不足。
入侵检测系统现在已经成为重要的安全组件,它有效地补充和完善了其他安全技术和
手段,如近乎快过时的基于协议和端口的防火墙。入侵检测系统为管理人员提供相应的警
告信息、报告可能发生的潜在攻击,从而抵挡了大部分“只是对系统设计好奇”的普通入
侵者。
世界上已经开发出了很多种入侵检测系统,我们可以用通用的入侵检测体系结构(CI
DF:Common Intrusion Detection Framework)来定义常见的入侵检测系统的功能组件。这
些功能组件通常包括事件产生器、分析引擎、存储机制、攻击事件对策。
许多入侵检测系统在设计之时就仅仅被考虑作为警报器。好在多数商业化的入侵检测
系统配置了可用的防御性反攻击模块,起码可以切断TCP连接或动态地更改互动防火墙过滤
规则。这样就可以阻止黑客沿着同一路径继续他的攻击行为。一些入侵检测系统还配置了
很好的攻击诱骗模块,可以为系统提供进一步的防护,也为进一步深入研究黑客行为提供
了依据。
IDS到底有那些不足
IDS的基本原理
对于比较普遍的两种入侵检测模式--基于网络的入侵检测和基于主机的入侵检测,我
们可以这样考虑:基于主机的入侵检测系统对于特定主机给予了定制性的保护,对于发生
在本地的、用户级的、特征性比较明显的入侵行为有防范作用。但是,这种模式对于发生
在网络传输层的入侵通常是无可奈何的,想让应用级特征比较强的系统同时把系统级和网
络底层技术实现得比较完善是不太现实的。虽然我们可以看到在伟大的Linux系统上实现了
Lids,毕竟象Solaris,NT这样的系统,我们能够了解的只是皮毛。
基于网络的入侵检测系统需要监视整个网络的流量,匹配可疑行为特征。它的技术实
现通常必须从网络和系统的底层入手,而且它同时保护的是网络上的一批主机,无论它们
使用的什么系统。基于网络的入侵检测系统显然不会关心某一台主机之上正在进行着什么
操作,只要这些操作数据不会扩散到网络上来。因为网络入侵检测系统是以行为模式匹配
为基础的,我们可以断定它有匹配失误的可能,有因为不能确定某种行为是入侵而将其放
行的可能。那么当一个“聪明”的入侵者骗过了这种系统,顺利地进入一台主机,该系统
的厄运开始了。
被动的网络监视器通常利用网络的混杂模式工作,它们直接从网络媒介获得网络中数
据包的拷贝,而不考虑这些包本来是不应该被它们接收的。当然,这种被动的网络底层协
议分析总是“安静地”存在于网络的某个地方,它只是根据网络媒介提供的这种特征,在
其他主机不知不觉的时候将网络数据拷贝一份。同时,需要考虑到,根据引擎端实现平台
的不同,各平台实现的网络数据包捕获机制的不同,在混杂模式下丢包的程度是不同的。
事实上,对于大多数还需要从内核读取数据的应用级包过滤系统,只能考虑以更快的方式
把数据读取到用户空间,进而发送给其它进程。 这样处理的化,要求从技术上增加用户空
间的缓冲区尺寸,如在BSD(BPF)的系统上,能够利用BIOCSBLEN ioctl调用来增加缓冲区尺
寸。
攻击IDS的原理
入侵检测系统地最重要的特征莫过于其检测的“精确性”。因此IDS要对捕获到的数据
包进行详细的分析,所以对IDS的攻击就是针对IDS在分析数据时的弱点和漏洞。
网络IDS捕获到网络上传输的数据包并进行分析,以便知道一个对象对另一个对象做了
什么。IDS总是通过网络上交换的数据包来对终端系统上发生的信息行为进行判断。假设一
个带有错误UDP校验和的IP数据包,大多数操作系统会丢弃这样的数据。某些比较陈旧的系
统也可能会接受。IDS需要了解每一个终端系统的具体情况,否则IDS按照自己的方式构造
出来的逻辑在终端系统上的应用会有不同。某些操作系统有可能会接受一个明显存在问题
的数据包,如允许一个有错误的校验和的IP包。当然,IDS如果不进行分辨,必然会丢掉这
些本来终端系统会接受的数据。
就算IDS系统知道网络都有些什么操作系统,它也没有办法通过查看一个包而知道是否
一个终端系统会接受这个包。原因很简单,CPU耗尽、内存不足都可能导致系统发生丢包现
象。
IDS全部的信息来源就是它捕获到的数据包。但是,IDS应该多了解一些关于终端系统
的网络行为,应该了解终端系统如何处理各种网络数据。但是,实际上,这是不可能的。
在处理所谓的拒绝服务攻击时,存在两种常见的情况:某些IDS系统在自己处于停机状
态时,可以保持网络正常的信息流通,这种属于“fail-open”型;另一种则是“fail-cl
osed”型,即当IDS系统出现问题时,整个网络也随之瘫痪了。
网络检测系统是被动的。它们不控制网络本身,也不会以任何方式维护网络的连接。
如果一个IDS系统是fail-open的,入侵者通过各种手段使IDS资源不可用了,那时IDS就没
有任何防范入侵的作用了。正是因为这样,IDS系统加强自身抗拒绝服务攻击的能力显得极
为重要。
当然,许多攻击方式讨论的都是针对基于嗅探模式的IDS系统。这些类型的攻击都企图
阻止协议分析,阻止特征模式匹配,阻止IDS获得足够信息以得出结论。
针对入侵检测系统弱点的攻击探讨
有时IDS系统会接受终端系统丢弃了的数据包。因为IDS认为终端系统接受并且处理了
这些数据,而事实上终端系统由于种种原因丢弃了这些数据包。一个入侵者就可以利用这
一点,制造那种他所想要入侵的主机会丢弃而IDS系统将接受并作出判断的数据包,以使I
DS与终端系统得到不同的结论。
我们可以把这种攻击称为“插入式”攻击。道理很简单,假设一个入侵者发往终端系
统的数据是attack,但是,他通过精心构造在数据流中加入了一个多余的t。对于终端系统
而言,这个t是被丢掉不被处理的;而对于IDS系统而言,它得到的最终上下文关系是attt
ack,这个结论使IDS认为这次行为并没有对终端系统形成攻击而不作处理,事实上,终端
系统已经接受了attack数据。
现在让我们来分析一下这种方式的攻击如何阻止特征分析。特征分析通常的方式是根
据固定模式判断某个特定的字串是否被存在于一个数据流中,例如,对待一个phf的HTTP攻
击,IDS通常检查这个字串的存在与否,“GET /cgi-bin/phf?”, IDS系统判断这种情况很
容易,只需要简单的子串搜索功能便可以做到,然而,但是,如果一个入侵者通过插入式
攻击的思想在这次HTTP请求中增加了这样的内容,GET /cgi-bin/pleasedontdetectthisf
orme?,里面同样包含了phf,但是在IDS看来,味道已经不一样了。
插入式攻击的的结果就是IDS系统与终端系统重组得到了不一样的内容。通常,插入式
攻击在IDS没有终端系统处理数据那么严格的时候都存在。可能好的解决方法就是让IDS系
统在处理网络中需要重组的数据的时候,作出严格的判断和处理,尽可能地与终端系统处
理地效果一个样。可是,引来了另外一个问题,这便是另一种攻击方式,相对地叫做“逃
避式“攻击模式。
相对的,有些数据包是IDS不会接受的,而终端系统却会对这些数据作出处理。当然,
IDS由于不接受某些包,而会导致与这些数据相关的上下文关系无法了解。
问题的现象是因为IDS在对数据包进行审核处理的时候过于严格,使得往往某些数据在
终端系统而言,是要进行接受重组处理的,而在IDS本身,仅仅是不作处理,导致许多攻击
在这种严格的分析引擎的鼻子地下躲过。
逃避式攻击和插入式攻击都有效地愚弄了模式匹配引擎系统。结果都是入侵者使得ID
S与终端系统接受处理了不同的数据流,在逃避式攻击中,终端系统比IDS接受了更多的内
容而遭受攻击。
还是上面的phf的例子,入侵者发送了一个HTTP请求,使得原本的GET /cgi-bin/phf?
在IDS处理的结论中变成了GET /gin/f,当然,这个结论对于大多数IDS系统来说,几乎没
有任何意义。
从技术上来看, 插入式和逃避式这两种对付检测系统的方式也不是这容易就被入侵者
所利用,因为实现这种攻击要求入侵具备相当的知识面和实践能力。
现在的许多网络协议是简单的并且容易分析的。比如一个普通的网络分析器就能够容易的
判断一个UDP DNS请求的目的。
其它的一些协议则复杂的多,在得出实际传输的内容之前,需要对许多单个的数据包
进行考虑。这样的话,网络监视器必须总是监视内容的数据流,跟踪包含在数据流中的信
息。例如,为了解析出一个TCP连接中发生了什么,必须重组这次连接中的整个数据流。
象TCP这样的协议,允许在IP最大包尺寸范围内的任意大小的数据被包含于每一个分散
的数据包中,数据可以无序地到达目的地,每个数据包都具有一个序列号来表明自己在数
据流中的位置。TCP数据流的接受者有责任重新按照序列号进行数据包的重新排序和组合,
并解析出数据发送者的意思。这有一套TCP的数据重组机制来完成。在IP层,IP也定义了一
种自己的机制,叫做“碎片“,这种机制允许主机把一个数据包切分为更小的数据分片。
每一个片都有一个标记,标记自己原来属于原始数据包的什么相对位置,叫做”偏移值“
。IP实现允许接受这样的IP碎片包,并且根据偏移值来重组原始数据包。插入式攻击通过
增加一些数据包到数据流中导致终端系统重组很困难。被插入的数据包能够改变数据流的
先后顺序,进而阻止IDS正确地处理紧跟着的正确的数据包。包的插入重叠了老的数据,在
IDS系统上重写了数据流。某些情况下,插入数据包,改变了数据流原来的意思。
逃避式攻击则是导致IDS系统在进行流重组的时候错过了其中的部分关键内容,被IDS忽略
的数据包可能对于数据流的顺序来说是至关重要的;IDS系统可能在逃避式攻击之后不知道
该如何对这些数据下结论了。许多情况下,入侵者产生整个躲避IDS系统检测的数据流是相
对简单的。
“插入式”和“逃避式”IDS攻击都不是很容易防范的,除非IDS通过了第二信息源的配合
,能够对当前监视的网络拓扑结构以及对作为被监视对象的终端系统所能够接收什么样的
数据包进行跟踪分析,否则问题依然存在,这是目前必须要提出来的对被检测网络的诠释
技术,尽可能通过配合第二信息源的方式,让IDS对它所检测的网络中的终端系统以及网络
实际环境有一个成熟的了解。如果一个攻击能够造成实现插入任意的IP数据包,那么,插
入一个UDP或者ICMP也是没有问题的。所以可以看出IDS系统在IP层实现对这两种入侵手段
的免疫将是很重要的。一个最容易的让终端系统丢弃IP数据包的方式是让数据包具有不正
确的IP头部信息。如RFC731定义。入侵者所使用的这些头部信息有问题的数据包在现实中
可能会遇到问题,除非攻击对象IDS系统处在同一个局域网之内,例如如果version域不是
4,而是其他的值,这种数据包实际上是不会被路由的。当然,对于其他的一些域值,比如
IP包长度或者IP头长度,一个不规范的长度将阻止IDS系统正确定位IP中的传输层的位置等
。
在IP头域信息中,最容易被忽略的是校验值。似乎对于一个IDS系统去校验每一个捕获的I
P数据包的校验是没有必要的。然而,一个带有病态的校验值的数据报对于大多数IP实现来
说都是不会被处理的。一个IDS系统在设计的时候考虑到有问题的校验了么?如果没有考虑
到校验的必要性,那么很难避免“插入式“攻击。TTL域表示了一个数据包在到达目的系统
的过程中需要经过多少路由器。每一次,一个路由器转发一个数据包,数据包所带的TTL信
息将会被消耗。TTL消耗尽时,包也被丢弃了。所以,入侵者可以构建一个TTL的值,使得
发送的数据包刚好可以到达IDS系统,但是TTL刚好耗尽了,数据本来应该到达的目标却没
有到。相类似的另一个问题与IP头部的DF标志有关。DF标志置位使得转发设备即便是在包
超出标准大小尺寸的时候也不要对数据进行IP分片,紧紧通知简单的丢弃掉这些包。
这两个不明确的问题的解决要求IDS系统能够了解它所监视的网络拓扑结构。
IP校验和问题很好解决;一个IDS系统可以假设如果校验和是错误的,那么数据包将会被目
标系统所不接受。而IP的选项域的存在又导致一些不同的可能性。许多操作系统可以配置
为自动拒绝源路由数据包。除非IDS了解是否一个源路由数据包的目标主机拒绝这样的数据
包,否则不可能正确处理这样情况。
对IP数据包中的源路由项进行检查或许是一个明显的必要。然而,其他的一些选项也是必
须应该考虑的。例如,“timestamp“选项要求特定的数据包的接受者在数据包里放置一个
时间戳标记。如果这个选项出现问题,处理事件戳选项的代码将强迫丢弃这个包。如果ID
S没有如同终端系统那样核实时间戳选项的话,便存在问题。
同一个LAN上的入侵者能够指引链路层的数据帧到IDS系统,不必允许作为IP目标的主机看
到这个包。如果一个入侵者知道了IDS的MAC地址,他便能将他的欺骗包发往IDS系统,LAN
上的其他系统不会处理这个数据包,但是,如果IDS不检查接受到的数据包的MAC地址,它
是不会知道发生了什么情况的。
逃避式攻击则是导致IDS系统在进行流重组的时候错过了其中的部分关键内容,被IDS忽略
的数据包可能对于数据流的顺序来说是至关重要的;IDS系统可能在逃避式攻击之后不知道
该如何对这些数据下结论了。许多情况下,入侵者产生整个躲避IDS系统检测的数据流是相
对简单的。
因为终端系统将重组IP碎片,所以IDS系统能够进行IP碎片重组也是重要的。一个不能正确
的重组碎片的IDS系统将是容易受到攻击的,入侵者仅仅通过人工生产碎片便可以愚弄IDS
。IP碎片的数据流通常有序到达。但是,协议允许碎片以任何次序到达。一个终端系统必
须能够重组无序到达的数据包分片。 IDS系统如果不能处理IP碎片无序到达这种情况的话
,也是存在问题的;一个入侵者能够故意捣乱他的碎片来逃避IDS检测。而且IDS必须在全
部的碎片都被接收到以后才进行碎片重组。当然了,接收到的分片必须被存储下来,直到
分片流可以被重组为一个完整的IP数据包。一个入侵者如果利用分片的形式来对网络进行
flooding攻击,那么IDS系统通常会资源耗尽。
每个终端系统也必须处理这个问题。许多系统根据TTL来丢弃分片,而避免这种由于大量碎
片请求造成的内存不足。许多入侵者能够刻意地通过构造病态的IP分片躲避传统的包过滤
器,他们使用的是尽可能小的分片包,因为单个的分片所包含的数据不足以达到过滤规则
的长度。另外,出现的问题是重叠的分片处理问题,可能性是这样的,具有不同尺寸和分
片先后到达系统,并且分片的数据位置处于重叠状态,既是说,如果一个分片迟于另外一
个分片达到系统,两个分片对于重组参数来说是同一个,这时新到的数据可能会覆盖掉已
经先到达的老的一些数据。这便又提出了一个问题,如果一个IDS系统没有能够以它所监视
和保护的终端系统处理分片的方式处理分片包的话,可能面对同一个数据分片流,IDS系统
将重组出于终端系统得到的安全不同的数据包。一个了解这种IDS与终端系统之间矛盾的入
侵者可能会采用这种入侵方式。对于重叠分片的取舍是更加复杂的,对于这些又冲突的分
片数据是否被采纳往往取决于他们所在的位置,而根据不同的操作系统的对IP碎片重叠情
况的不同处理也不一样。有些情况,新的数据被承认而有的时候是旧的被承认,而新的被
丢弃。当然,IDS不能正确分析这种情况,将面临“逃脱”式攻击。
IDS系统并不是处理这种重叠分片出现问题的唯一IP实现,终端系统的IP驱动程序同样会有
问题。或许正是因为IP碎片重组的困难和复杂才使得出现了那么多不正确的处理。所以,
除非一个IDS系统准确的知道它所监视的系统都是什么不同的IP驱动,否则精确地重组每一
个系统接受地数据是不可能的。
例如:Windows NT在处理重叠分片时,总是保留已有的数据。这与BSD4.4刚好相反。
IP包的选项域是应该考虑到的。当一个IP包被分片时,来自于原始数据包的选项是否应该
被携带到全部的分片中去。RFC791声明某些IP选项如(security)将出现在每一个分片里
,而其它的一些必须只出现在第一个分片中。对于严格的IP实现将丢弃那些具有不正确选
项的分片。但是IDS许多系统不是这样的。如果IDS没能象终端系统那样精确的处理这种情
况的话,将面临前面提到的两类攻击。
对于IP第四代协议,现实是任何人都可以进行IP地址伪造。使IDS系统判断出来好像是来自
多处的攻击。对于无连接的协议来说,更为严重。
在面向连接的协议中,关于一次连接回话的起源问题基于是否一个可用的连接被产生了;
象TCP这样的连接协议使用了序列号机制,这种机制提供了一种确认方法, 可是,对于无
连接协议,这种相对严格的确认机制却是没有的;可以看到,一个入侵DNS的破坏者其实可
以是来自任何地方。看来,IDS系统的管理者对于IDS系统给出的网络地址的准确性是应该
仔细考虑的。事实上,被IDS检测到的大部分攻击是通过TCP连接的。所以,IDS对TCP会话
数据流的重组能力成为关键。而假如IDS没有能够使用与它所检测的网络中的终端系统同样
的重组规则的话,将是脆弱的。对于正常的TCP连接,就像一次由远程登录发起的连接,这
很容易做到的。也存在许多实现TCP连接监视的方法。对于IDS而言,没有一个对捕获到的
TCP数据流如何进行处理的标准规范成了最主要的问题。
IDS系统为了能够重建TCP连接的信息,TCP片段使用的序列号信息是必须知道的。我们可以
把这种IDS去判断当前连接的可用序列号的过程叫“同步”。当然,在判断序列号时出现问
题,可以叫“失去同步”。当IDS系统在一次TCP连接中失去序列号同步了,就不能够对这
次连接的信息数据进行有效的重组了。在许多情况下,IDS系统由此变得不再处理这一次连
接中的任何数据信息。所以,入侵者通常把让IDS系统失去同步作为一个主要目标。
TCP标准定义了一个流控制机制,用来阻止建立连接的一方发送过多的数据到连接的另外一
方;IDS追踪TCP连接的每一方的window域的值。TCP也允许数据流中发送所谓的OOB数据(
带外数据),它利用了定义的紧急指针。
对于网络中的终端系统,与之相关的每次连接的状态信息的收集处理是没有问题的,每种
TCP实现必须管理自己的TCB――TCP控制块,以便理解那一次建立的连接情况。一个网络I
DS系统也必须能够维护它所监视的每一次连接对应的TCB。
任何网络IDS系统都定义了针对所探测到的新的TCP连接而产生TCB的机制,同时也对那些不
再有关的连接进行释放和消除工作。在讨论IDS的TCP问题中,我们独立地分析三个方面,
可以看到,在IDS处理这三种情况时可能出现问题。首先是TCP creation,通过它IDS决定对
一个新探测到地TCP连接产生TCB;其次是数据流重组,IDS根据它所维护地TCB信息对数据
流进行重组,当然这一步受到上一步地关联;再者是TCB拆卸,IDS通过它撤销一个TCB。通
过分析可以看到,“插入式”攻击的实现将影响到以上提到的几个方面,插入式攻击使得
IDS系统分不清到底什么数据事实上到达了终端系统。比如在数据流重组上下文关系中,数
据插入式攻击使得一次可靠的TCP会话监视几乎成为不可能的事;所以说IDS能够针对插入
式攻击做处理是非常重要的也是很难实现的。
对于IP协议,可以有几种不同的方法可以实现往IDS系统中插入数据包,而对于TCP,问题
会复杂一些,但是同样有一些手段能够导致IDS去主动丢弃某些特定的数据包,以达到入侵
者的目的,无论如何,如果一个IDS系统不能够以它所监视的终端相同的方式来处理TCP包
的话,对待”插入式“将受到威胁。
在一次TCP交互中,如果接收方对应回应了一个信息,那么一个TCP片段就是被认可的,我
们进一步可能分析回应的是RST信息还是ACK信息。IDS能够通过对这些认可信息的辨识判断
一个片段是否是存在问题的。包含在TCP包里面的数据能够被提取出来进行重组,而不去考
虑TCP的头域的某些部分。这种不严格的处理情况使得容易做出对于“插入式“攻击手段显
得脆弱的TCP会话监视器,所以,在处理TCP数据的时候,先严格考虑TCP头域的信息可用性
显得很重要了。一个极易被忽略的头域是“CODE“,这个头域决定了TCP片段中发送的信息
的类型。这个域是一系列二进制标志位。可以看到,某些标志位的组合是不正常的,通常
在网络中导致包被丢弃掉。另外,许多TCP实现就不去接收没有ACK位被设置的TCP片段中的
数据信息。
根据TCP的标准定义,TCP实现应该接受包含在SYN类型片段中的数据信息。而对这种定义的
理解却变成了多种味道,导致一些TCP实现没有正确地处理这类信息。如果一个IDS系统没
能考虑SYN数据,那么一个随便的“逃避式”攻击就可以对它进行威胁;反之,如果这个I
DS系统能够很好地考虑SYN数据了,在针对某些没有正确实现这种定义的终端系统的时候,
它显得当不住入侵者刻画的“插入式”攻击。
另外的经常被忽略的TCP输入处理问题是校验和,全部的TCP实现被强制性地要求验证网络
校验,许多IDS系统不能做这种检查;所以通过构建有错误校验值的TCP片段就可以简单地
插入数据包到IDS系统。
就像处理IP的选项域一样,IDS能够正确的处理TCP的选项域也是十分重要的。可是不幸的
是,由于TCP的选项域某些内容被产生和利用的时间还比较短,如timestamp、windows sc
ale这些选项;另外对于何时TCP的选项能够出现在连接的上下文中,TCP有专门的规定。某
些选项在某些连接状态或许就是不可用或者是非法的。RFC1323[13]中介绍了两个TCP的选
项,这两个选项被设计来增加TCP在高速环境下的可靠性和性能。但是规定这些选项仅仅可
以出现在非SYN的分段之中。
因为某些TCP实现会拒绝包含了这些没有见过的选项的非SYN片段,所以IDS也不可盲目的都
接受这些有选项的数据包。另外,也有一些终端系统通过忽略这些选项,继续处理这些数
据包;所以,可见IDS必须清楚地知道终端系统是如何处理各种数据包的,才能以相对于特
定的终端系统正确的处理方式来进行处理而避免如插入和逃避式攻击。
RFC1323 定义了的另外一个叫做PAWS的概念,全称是“protection against wrapped seq
uence numbers”。使用PAWS的系统将会跟踪分段中的timestamps选项;根据分段中的tim
estamps响应值判断数据包是否被丢弃,一个入侵者可以很简单的产生一个人工的timesta
mp值,目的是使得支持PAWS的TCP堆栈不用作出进一步的处理就丢弃这个数据包。IDS不仅
仅需要知道是否终端系统支持PAWS,而且还需要知道终端系统对于timestamps的threshol
d的值是什么。如果没有这些信息,IDS将会错误地处理不正确地TCP片段,或者对一个片段
的合法性作出错误的猜测。如前面提到的三点,其中TCB creation(可以叫作TCB创造)是
第一点。一个IDS系统TCB创造策略决定了IDS如何开始记录一次给定的TCP连接的数据信息
,比如象序列号等。这使得IDS可以同步一次需要监视的TCP会话。然而TCB创造是个麻烦的
问题。可以用多种方法可以被利用来判断何时打开一个TCB,但是,这些方法中的每一个似
乎证明都是有问题的。TCB创造建立一次连接的初始化状态,包括了连接序列号等信息;通
过对IDS的TCB的欺骗行为,入侵者能够破坏那些与这一次被利用的连
❺ Linux常见的命令都有哪些linux系统里有哪些目录
关于您所询问的系统里面的目录,如果能够找寻相关的Linux的命令,应该可以通过系统帮助选项找到相关的提示符
❻ 请问电脑处于sniffer状态是什么意识啊
sniffer是窃听的意思,sniffer状态应该就是窃听状态了
要更详细的看下面,保证看到你头大~哈哈
sniffers(嗅探器)几乎和internet有一样久的历史了.Sniffer是一种常用的收集有用数据方法,这些数据可以是用户的帐号和密码,可以是一些商用机密数据等等。随着Internet及电子商务的日益普及,Internet的安全也越来越受到重视。在Internet安全隐患中扮演重要角色之一的Sniffer以受到越来越大的关注,所以今天我要向大家介绍一下介绍Sniffer以及如何阻止sniffer。
大多数的黑客仅仅为了探测内部网上的主机并取得控制权,只有那些"雄心勃勃"的黑客,为了控制整个网络才会安装特洛伊木马和后门程序,并清除记录。他们经常使用的手法是安装sniffer。
在内部网上,黑客要想迅速获得大量的账号(包括用户名和密码),最为有效的手段是使用 "sniffer" 程序。这种方法要求运行Sniffer 程序的主机和被监听的主机必须在同一个以太网段上,故而在外部主机上运行sniffer是没有效果的。再者,必须以root的身份使用sniffer 程序,才能够监听到以太网段上的数据流。谈到以太网sniffer,就必须谈到以太网sniffing。
那么什么是以太网sniffer呢?
以太网sniffing是指对以太网设备上传送的数据包进行侦听,发现感兴趣的包。如果发现符合条件的包,就把它存到一个log文件中
去。通常设置的这些条件是包含字"username"或"password"的包。它的目的是将网络层放到promiscuous模式,从而能干些事情。
Promiscuous模式是指网络上的所有设备都对总线上传送的数据进行侦听,并不仅仅是它们自己的数据。根据第二章中有关对以太网的工作原理的基本介绍,可以知道:一个设备要向某一目标发送数据时,它是对以太网进行广播的。一个连到以太网总线上的设备在任何时间里都在接受数据。不过只是将属于自己的数据传给该计算机上的应用程序。
利用这一点,可以将一台计算机的网络连接设置为接受所有以太
网总线上的数据,从而实现sniffer。
sniffer通常运行在路由器,或有路由器功能的主机上。这样就能对大量的数据进行监控。sniffer属第二层次的攻击。通常是攻击者已经进入了目标系统,然后使用sniffer这种攻击手段,以便得到更多的信息。
sniffer除了能得到口令或用户名外,还能得到更多的其他信息,比如一个其他重要的信息,在网上传送的金融信息等等。sniffer几乎能得到任何以太网上的传送的数据包。黑客会使用各种方法,获得系统的控制权并留下再次侵入的后门,以保证sniffer能够执行。在Solaris 2.x平台上,sniffer 程序通常被安装在/usr/bin 或/dev目录下。黑客还会巧妙的修改时间,使得sniffer程序看上去是和其它系统程序同时安装的。
大多数以太网sniffer程序在后台运行,将结果输出到某个记录文件中。黑客常常会修改ps程序,使得系统管理员很难发现运行的sniffer程序。
以太网sniffer程序将系统的网络接口设定为混合模式。这样,它就可以监听到所有流经同一以太网网段的数据包,不管它的接受者或发送者是不是运行sniffer的主机。 程序将用户名、密码和其它黑客感兴趣的数据存入log文件。黑客会等待一段时间 ----- 比如一周后,再回到这里下载记录文件。
讲了这么多,那么到底我们可以用什么通俗的话来介绍sniffer呢?
计算机网络与电话电路不同,计算机网络是共享通讯通道的。共享意味着计算机能够接收到发送给其它计算机的信息。捕获在网络中传输的数据信息就称为sniffing(窃听)。
以太网是现在应用最广泛的计算机连网方式。以太网协议是在同一回路向所有主机发送数据包信息。数据包头包含有目标主机的正确地址。一般情况下只有具有该地址的主机会接受这个数据包。如果一台主机能够接收所有数据包,而不理会数据包头内容,这种方式通常称为"混杂" 模式。
由于在一个普通的网络环境中,帐号和口令信息以明文方式在以太网中传输, 一旦入侵者获得其中一台主机的root权限,并将其置于混杂模式以窃听网络数据,从而有可能入侵网络中的所有计算机。
一句话,sniffer就是一个用来窃听的黑客手段和工具。
二、sniffer的工作原理
通常在同一个网段的所有网络接口都有访问在物理媒体上传输的所有数据的能力,而每个网络接口都还应该有一个硬件地址,该硬件地址不同于网络中存在的其他网络接口的硬件地址,同时,每个网络至少还要一个广播地址。(代表所有的接口地址),在正常情况下,一个合法的网络接口应该只响应这样的两种数据帧:
1、帧的目标区域具有和本地网络接口相匹配的硬件地址。
2、帧的目标区域具有"广播地址"。
在接受到上面两种情况的数据包时,nc通过cpu产生一个硬件中断,该中断能引起操作系统注意,然后将帧中所包含的数据传送给系统进一步处理。
而sniffer就是一种能将本地nc状态设成(promiscuous)状态的软件,当nc处于这种"混杂"方式时,该nc具备"广播地址",它对所有遭遇到的每一个帧都产生一个硬件中断以便提醒操作系统处理流经该物理媒体上的每一个报文包。(绝大多数的nc具备置成 promiscuous方式的能力)
可见,sniffer工作在网络环境中的底层,它会拦截所有的正在网络上传送的数据,并且通过相应的软件处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体布局。值得注意的是:sniffer是极其安静的,它是一种消极的安全攻击。
通常sniffer所要关心的内容可以分成这样几类:
1、口令
我想这是绝大多数非法使用sniffer的理由,sniffer可以记录到明文传送的userid和passwd.就算你在网络传送过程中使用了加密的数据,sniffer记录的数据一样有可能使入侵者在家里边吃肉串边想办法算出你的算法。
2、金融帐号
许多用户很放心在网上使用自己的信用卡或现金帐号,然而sniffer可以很轻松截获在网上传送的用户姓名、口令、信用卡号码、截止日期、帐号和pin.
3、偷窥机密或敏感的信息数据
通过拦截数据包,入侵者可以很方便记录别人之间敏感的信息传送,或者干脆拦截整个的email会话过程。
4、窥探低级的协议信息。
这是很可怕的事,我认为,通过对底层的信息协议记录,比如记录两台主机之间的网络接口地址、远程网络接口ip地址、ip路由信息和tcp连接的字节顺序号码等。这些信息由非法入侵的人掌握后将对网络安全构成极大的危害,通常有人用sniffer收集这些信息只有一个原因:他正在进行一次欺诈,(通常的ip地址欺诈就要求你准确插入tcp连接的字节顺序号,这将在以后整理的文章中指出)如果某人很关心这个问题,那么sniffer对他来说只是前奏,今后的问题要大得多。(对于高级的hacker而言,我想这是使用sniffer的唯一理由吧)
二.sniffer的工作环境
snifffer就是能够捕获网络报文的设备。嗅探器的正当用处在于分析网络的流量,以便找出所关心的网络中潜在的问题。例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器来作出精确的问题判断。
嗅探器在功能和设计方面有很多不同。有些只能分析一种协议,而另一些可能能够分析几百种协议。一般情况下,大多数的嗅探器至少能够分析下面的协议:
1.标准以太网
2.TCP/IP
3.IPX
4.DECNet
嗅探器通常是软硬件的结合。专用的嗅探器价格非常昂贵。另一方面,免费的嗅探器虽然不需要花什么钱,但得不到什么支持。
嗅探器与一般的键盘捕获程序不同。键盘捕获程序捕获在终端上输入的键值,而嗅探器则捕获真实的网络报文。嗅探器通过将其置身于网络接口来达到这个目的——例如将以太网卡设置成杂收模式。(为了理解杂收模式是怎么回事,先解释局域网是怎么工作的)。
数据在网络上是以很小的称为帧(Ftame)的单位传输的帧由好几部分组成,不同的部分执行不同的功能。(例如,以太网的前12个字节存放的是源和目的的地址,这些位告诉网络:数据的来源和去处。以太网帧的其他部分存放实际的用户数据、TCP/IP的报文头或IPX报文头等等)。
帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上。通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧的到达,然后对其进行存储。就是在这个传输和接收的过程中,嗅探器会造成安全方面的问题。
每一个在LAN上的工作站都有其硬件地址。这些地址唯一地表示着网络上的机器(这一点于Internet地址系统比较相似)。当用户发送一个报文时,这些报文就会发送到LAN上所有可用的机器。
在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的报文则不予响应(换句话说,工作站A不会捕获属于工作站B的数据,而是简单的忽略这些数据)。
如果某在工作站的网络接口处于杂收模式,那么它就可以捕获网络上所有的报文和帧,如果一个工作站被配置成这样的方式,它(包括其软件)就是一个嗅探器。
嗅探器可能造成的危害:
1.嗅探器能够捕获口令
2.能够捕获专用的或者机密的信息
3.可以用来危害网络邻居的安全,或者用来获取更高级别的访问权限
事实上,如果你在网络上存在非授权的嗅探器就以为着你的系统已经暴露在别人面前了。(大家可以试试天行2的嗅探功能)
一般我们只嗅探每个报文的前200到300个字节。用户名和口令都包含在这一部分中,这是我们关心的真正部分。工人,也可以嗅探给定接口上的所有报文,如果有足够的空间进行存储,有足够的那里进行处理的话,将会发现另一些非常有趣的东西……
简单的放置一个嗅探器宾将其放到随便什么地方将不会起到什么作用。将嗅探器放置于被攻击机器或网络附近,这样将捕获到很多口令,还有一个比较好的方法就是放在网关上。如果这样的话就能捕获网络和其他网络进行身份鉴别的过程。这样的方式将成倍地增加我们能够攻击的范围。
三.谁会使用sniffers
可能谁都回知道谁会使用sniffer,但是并不是每个使用它的人都是网络高手,因为现在有很多的sniffer都成了傻瓜似的了,前段时间用的最多的不外乎oicq sniffer。我想那些喜欢查好友ip的朋友都应该记得它吧。呵呵,我都使用过它,现在当然不用了啊!
当然系统管理员使用sniffer来分析网络信息交通并且找出网络上何处发生问题。一个安全管理员可以同时用多种sniffer, 将它们放置在网络的各处,形成一个入侵警报系统。对于系统管理员来说sniffer是一个非常好的工具,但是它同样是一个经常被黑客使用的工具.骇客安装sniffer以获得用户名和账号,信用卡号码,个人信息,和其他的信息可以导致对你或是你的公司的极大危害如果向坏的方面发展。当它们得到这些信息后,骇客将使用密码来进攻其他的internet 站点甚至倒卖信用卡号码。
三.sniffer是如何在网络上实施的
谈这个问题之前还应该先说一下Ethernet的通讯。通常在同一个网段的所有网络接口都有访问在媒体上传输的所有数据的能力,而每个网络接口都还应该有一个硬件地址,该硬件地址不同于网络中存在的其它网络接口的硬件地址,同时,每个网络至少还要一个广播地址。在正常情况下,一个合法的网络接口应该只响应这样的两种数据帧:
1