❶ 涓轟粈涔堟竻絀哄洖鏀剁珯鏃舵繪彁紺 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