锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
蹇樹簡鎿嶄綔緋葷粺浼氭牴鎹鐞嗗櫒鍨嬪彿鍔犺澆涓嶅悓鐗堟湰鍐呮牳浜?...
姝eソ鐪嬪埌楂樼璋冭瘯涓婃湁鍏充簬榪欎釜鐨勮璁? http://advdbg.org/forums/2142/ShowPost.aspx
浣嗘槸鎴戠殑鍒嗘瀽鏄熀浜巒toskrnl鐨勶紝娌″姙娉曪紝鍙ソ寮哄埗鎸囧畾緋葷粺鍔犺澆ntosknrl浜?寰楀仛浠ヤ笅鍑犱釜宸ヤ綔
1 鎶妚m鐨刾rocessor璋冩垚鍗曟牳鍗曞鐞嗗櫒
2 寮windows铏氭嫙鏈? 涓轟簡鍛婅瘔緋葷粺鐜板湪鏄崟鏍稿崟澶勭悊鍣ㄦā寮?寰楄窇涓涓嬭繖涓懡浠?nbsp;rundll32.exe setupapi,InstallHinfSection ACPIAPIC_UP_HAL 131 %windir%\inf\hal.inf
鍙傝? 濡備綍淇敼Windows XP緋葷粺鐨勫唴鏍哥被鍨?nbsp; http://blog.sina.com.cn/s/blog_5918846401000bik.html
3 褰撶劧,榪欓噷榪樻病緇撴潫,濡傛灉澶勭悊鍣ㄦ敮鎸丳AE 閭d箞緋葷粺浼氬姞杞絥toskrnla 鎵浠ヨ繕寰楃鐢≒AE. 鍒?span style="font-family: arial, 瀹嬩綋, sans-serif; font-size: 14px; line-height: 24px; text-indent: 30px; background-color: #ffffff;">BOOT.INI閲岄潰, 鍚姩璁劇疆涓鏋滄湁/noexecute=optin灝辨浛鎹㈡敼鎴?execute,娌℃湁鐨勮瘽灝卞姞涓?/span>/execute
瀹屼簡鍚庡氨浼氬姞杞絥toskrnl浜?鏁堟灉鍥?
鎸囧畾鍏跺畠緋葷粺鏂規硶綾諱技,鍦ㄦ浠呮姏鐮栧紩鐜?nbsp;
]]>
聽
C++鏍囧噯瑙勫畾:
緙栬瘧鍣ㄧ殑綾葷殑綾誨瀷杞崲瀵圭┖鎸囬拡(NULL)鐗規畩澶勭悊,鍗充綘NULL榪涜寮哄埗綾誨瀷杞寲鐨勭粨鏋滆繕鏄疦ULL,鎵浠モ?
static_cast綾誨瀷杞寲鐨勬椂鍊?_ATL_PACKING鐨勫煎緱鏄潪闆跺氨濂?/code>
聽
C++ Standard 4.10/3 Pointer conversions [conv.ptr]:
An rvalue of type 鈥減ointer to cv D,鈥?where D is a class type, can be converted to an rvalue of type 鈥減ointer to cv B,鈥?where B is a base class (clause 10) of D. If B is an inaccessible (clause 11) or ambiguous (10.2) base class of D, a program that necessitates this conversion is ill-formed. The result of the conversion is a pointer to the base class sub-object of the derived class object. The null pointer value is converted to the null pointer value of the destination type.
姝ゆ枃浼氭秹鍙婂埌涓浜涙櫘閫氬爢鐨勭煡璇嗭紝榪欎簺鍐呭鍙互鍙傝鎴戜箣鍓嶇殑鏂囩珷 WINDBG鐨勫爢璋冭瘯--浜嗚ВHEAP緇勭粐
鎵璋撶殑鍫嗙牬鍧忥紝鏄娌℃帶鍒跺ソ鑷繁鐨勬寚閽堬紝鎶婁笉灞炰簬浣犲垎閰嶇殑閭e潡鍐呭瓨緇欏啓瑕嗙洊浜嗐傝繖鍧楀唴瀛樺彲鑳芥槸浣犵▼搴忕殑鏁版嵁錛屼篃鍙兘鏄爢鐨勭鐞嗙粨鏋勩傞偅涔堣繖涓細瀵艱嚧鎬庢牱鐨勫悗鏋滃憿錛熷彲鑳界殑鎯呭喌鎴戜滑鏉y涓?/font>
鍫嗙牬鍧忚緝涓虹悊鎯崇殑鎯呭喌鏄淇敼鐨勬暟鎹細椹笂瀵艱嚧紼嬪簭crash錛屾渶宸殑鎯呭喌鏄綘鐨勫爢鏁版嵁鑾悕鍏跺鍦ㄤ粖澶╄鏀逛簡錛屼絾鏄庡ぉ鎵峜rash銆傝繖涓椂鍊欏湪鍘誨垎鏋恈rash錛屽氨濡傛垜浠殑璀﹀療鍙斿彅鐜板湪鎺ユ墜涓妗?0騫村墠鐨勬瀛愪竴鑸?---鏃犱粠涓嬫墜銆傝佸縐頒箣涓篽eap corruption鏄緢璐村垏鐨勶紝鏈夋椂鍊欏挶鍫嗘暟鎹鎰忓綃℃敼鏄棤澹版棤鎭殑錛屼綘涔熻娌℃硶浠庣晫闈㈢敋鑷蟲棩蹇楁枃浠朵腑鐪嬪埌瀹冭綃℃敼鐨勪竴鐐硅抗璞★紝褰撳埌鏌愪竴涓椂鍒伙紝榪欑閿欒浼氭毚闇插嚭鏉ワ紝鐒惰岃繖涓椂鍊欐煡鐪嬪爢淇℃伅涔熻浼氭槸姣棤澶寸華銆傛墍浠ュ浜庡爢鐮村潖錛屽挶鐨勭瓥鐣ユ槸灝芥棭鍙戠幇鎴戜滑鐨勫爢琚鏀逛簡錛屾渶濂借兘澶熷湪鍫嗘暟鎹鎰忓綃℃敼鐨勯偅涓鏃跺埢璇卞彂涓涓紓甯告潵鎻愰啋鎴戜滑----鍏勫紵錛屼綘鐨勫爢琚厫铓浜嗐?/font>
寰蔣鎻愪緵浜嗕竴浜涙柟妗堬紝鏉ュ府鍔╂垜浠瘖鏂爢鐮村潖銆備竴鑸潵璇達紝鍫嗙牬鍧忓線寰閮芥槸鍐欐暟鎹秺鐣岄犳垚鐨勶紙yy鐨勭浜岀鎯呭喌錛屽鏋滄槸絎竴縐嶆儏鍐靛叾瀹炶繕綆鍗曪紝涓嬩釜鍐呭瓨鏂偣灝卞ソ錛夛紝鎵浠ュ井杞湪鍫嗗垎閰嶄笂錛岀粰紼嬪簭鍛橀棬棰濆鎻愪緵浜?縐嶅爢鍒嗛厤妯″紡--瀹屽叏欏靛爢錛坒ull page heap錛夛紝鍑嗛〉鍫?normal page heap)錛岀敤鏉ユ嫻嬪爢琚啓瓚婄晫鐨勬儏鍐點?/font>
瀹屽叏欏靛爢鐨勬嫻嬪熀鏈濊礬鏄氳繃鍒嗛厤鐩擱偦鐨勪竴涓〉錛屽茍灝嗗叾璁句負涓嶅彲璁塊棶灞炴э紝鐒跺悗鐢ㄦ埛鏁版嵁鍧椾細琚垎閰嶅埌鍐呭瓨欏電殑鏈鏈錛屼粠鑰屽疄鐜拌秺鐣岃闂殑媯嫻嬨傚綋鎴戜滑瀵瑰爢涓垎閰嶇殑鍐呭瓨璇誨啓瓚婄晫鍚庝究浼氳闂埌閭d釜涓嶅彲璇葷殑欏碉紝緋葷粺鎹曡幏鍒版敼嬈″紓甯稿悗浼氳瘯鍥句腑鏂墽琛屽茍灝嗚寮傚父涓婃姤緇檇ebugger錛屾垨鑰呭穿婧冦傚叿浣撶殑鍐呭瓨緇勭粐緇撴瀯濡備笅鍥?/font>
鎽樿嚜銆婅蔣浠惰皟璇曘?/font>
涓庢櫘閫氬爢涓嶅悓鐨勬槸錛屽唴瀛樺潡鍓嶉潰鐨凥EAP_ENTRY緇撴瀯琚獶PH_BLOCK_INFORMATION緇撴瀯鍙栦唬錛岃繖涓粨鏋勫唴閮ㄨ褰曚簡欏靛爢妯″紡涓嬭繖涓唴瀛樺潡鐨勪竴浜涘熀鏈俊鎭傚鏋滅敤鎴鋒暟鎹尯鍓嶉潰鐨勬暟鎹紝涔熷氨鏄疍PH_BLOCK_INFORMATION緇撴瀯琚牬鍧忎簡錛岄偅涔堝湪閲婃斁鍐呭瓨鍧楃殑鏃跺欑郴緇熶細鎶ラ敊錛屽鏋滅紪紼嬭呭榪欏潡鍐呭瓨鍧楄鍐欒秺鐣屼簡錛屽綋鐒訛紝榪欓噷瓚婄晫鏈夊嚑縐嶆儏鍐碉細
榪欓噷闇瑕佹敞鎰忕殑榪樻槸鍧楀熬濉厖涓嶄竴瀹氬瓨鍦?/font>錛屽潡灝懼~鍏呮槸鍥犱負瑕佹弧瓚沖爢鍐呭瓨鐨勬渶灝忓垎閰嶇矑搴︼紝濡傛灉鏈韓鍐呭瓨鍧楃殑鍒嗛厤綺掑害灝卞凡緇忔槸鏈灝忓垎閰嶇矑搴︾殑鍊嶆暟浜嗭紝閭d箞鍧楀熬濉厖灝變笉瀛樺湪浜嗭紝姣斿鍫嗗唴瀛樺垎閰嶇矑搴︽槸鏄? bytes錛岄偅涔堝鏋滅敵璇蜂簡14 bytes鐨勮瘽浼氭湁2 bytes鐨勫ぇ寰愬皬鐨勫潡灝懼~鍏呭潡錛屽鏋滅敵璇蜂簡24bytes錛岄偅涔堝氨娌℃湁鍧楀熬濉厖浜嗭紝鍥犱負24姝eソ鏄?鐨勫嶆暟銆?/font>
寮鍚叏欏靛爢錛堢敤windbg鐩綍涓嬬殑gflags鎴栬呰涓涓猘ppverifier閮藉彲浠ュ紑鍚級錛岄氳繃鑷繁鍐欑殑涓涓猦eap.exe鏉ョ湅涓涓嬪浣曚嬌鐢ㄥ叏欏靛爢媯嫻嬪爢鐮村潖鎯呭喌heap.exe浠g爜濡備笅錛?/font>
#include "windows.h"
int main()
{
HANDLE heap_handle = HeapCreate( NULL , 1024 , 0 ) ;
char *temp = NULL ;
char *buffer = (char*)HeapAlloc(heap_handle , NULL , 128) ;
char *buffer1 = (char*)HeapAlloc(heap_handle , NULL , 121) ;
temp = buffer ;
for( int i = 0 ; i < 138 ; ++i )
{
*(temp++) = 'a' ;
}
HeapFree(heap_handle, 0 , buffer ) ;
HeapFree(heap_handle, 0 , buffer1 ) ;
HeapDestroy( heap_handle) ;
return 0 ;
}鍦ㄧ14琛屽悜buffer鍐欏叆138瀛楄妭錛岃繖鏄劇劧瓚婄晫浜嗭紝鐒跺悗鍦ㄧ敤windbg鍚姩heap.exe錛岀洿鎺ヨ繍琛岋紝浼氬彂鐜版姤閿欏涓?/font>
0:000> g
(1f50.1f54): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00000080 ebx=00000000 ecx=02596000 edx=02596000 esi=00000001 edi=00193374
eip=00191068 esp=0016fdc8 ebp=0016fddc iopl=0 nv up ei ng nz ac pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010297
heap!main+0x68:
00191068 c60161 mov byte ptr [ecx],61h ds:0023:02596000=??
鎶ヤ簡涓涓唴瀛樿闂敊璇紝鐒跺悗鐪嬩竴涓嬭皟鐢ㄥ爢鏍?/font>
0:000> kb
ChildEBP RetAddr Args to Child
0016fddc 0019120f 00000001 023fbfd0 0239df48 heap!main+0x68 [d:\projects\heap\main.cpp @ 14]
0016fe20 765b1114 7ffd3000 0016fe6c 778eb429 heap!__tmainCRTStartup+0x10f [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 582]
0016fe2c 778eb429 7ffd3000 757369d8 00000000 kernel32!BaseThreadInitThunk+0xe
0016fe6c 778eb3fc 00191357 7ffd3000 00000000 ntdll!__RtlUserThreadStart+0x70
0016fe84 00000000 00191357 7ffd3000 00000000 ntdll!_RtlUserThreadStart+0x1b
鍙互鐪嬪埌鏄14琛屾姤鐨勯敊錛屼絾鏄?4琛岀殑浠g爜榪愯浜嗛偅涔堝嬈★紝鎴戜滑鍐嶇湅涓涓嬭繖涓椂鍊欏彉閲廼鐨勫兼槸澶氬皯
0:000> dv i
i = 0n128
鏄劇劧錛屽湪濉厖絎?28瀛楄妭鐨勬椂鍊欙紝鎴戜滑鐨則emp鎸囬拡璁塊棶鍒頒簡鏍呮爮欏碉紝浠庤屾姤鍑轟簡涓涓唴瀛樿繚瑙勭殑寮傚父銆?/font>
榪欓噷欏哄甫鐪嬩竴涓嬪鏋滄垜浠垎閰嶇殑鍐呭瓨涓嶆槸8 bytes鐨勬儏鍐碉紙涓鑸爢鍐呭瓨鍒嗛厤綺掑害鏄? bytes錛屾墍浠ョ敵璇?28 bytes鐨勫唴瀛樻椂鏄笉浼氭湁鍧楀熬濉厖閮ㄥ垎鐨勶級
閭f垜浠帴涓嬫潵鐪嬪彟澶栦竴孌典唬鐮?/font>
鎴戜滑鎶婄10琛岀殑temp = buffer鏀規垚temp = buffer1
鍥犱負buffer1鐢寵浜?21 bytes錛屼篃灝辨槸璇村畠鏈? bytes鐨勫~鍏呭瓧鑺?/font>
0:000> g
(1ba0.1ba4): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00000080 ebx=00000000 ecx=024c8000 edx=024c8000 esi=00000001 edi=00033374
eip=00031068 esp=002cfb80 ebp=002cfb94 iopl=0 nv up ei ng nz ac pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010297
heap!main+0x68:
00031068 c60161 mov byte ptr [ecx],61h ds:0023:024c8000=??
0:000> dv i
i = 0n128
鍙互鐪嬪埌鍙橀噺i榪樻槸128錛屼篃灝辨槸璇存垜浠繕鏄湪璁塊棶鍒扮128瀛楄妭鍚庢墠寮曞彂璁塊棶寮傚父錛岃屼笉鏄垜浠湡鏈涚殑121瀛楄妭鍚庡氨寮曞彂寮傚父銆?/font>
榪欓噷涔熷氨鏄濡傛灉鎴戜滑鐨勪唬鐮佷腑瀵圭敵璇風殑鍫嗗唴瀛樺啓瓚婄晫浜嗭紝鍐欐暟鎹鐩栧潡灝懼~鍏呴儴鍒嗙殑鏃跺欏茍涓嶄細寮曞彂寮傚父錛?/font>
浣嗘槸錛岃繖騫朵笉浠h〃鎴戜滑鐨勫啓瓚婄晫闂涓嶄細琚彂鐜般傚潡灝懼~鍏呴儴鍒嗘槸浼氳濉厖涓婂浐瀹氭暟鎹殑錛岀郴緇熷湪閫傚悎鐨勬椂鏈猴紙姣斿閿姣佸爢鐨勬椂鍊欙級浼氭牎楠屽潡灝懼~鍏呭潡錛屽鏋滃彂鐜板潡灝懼~鍏呭潡鏁版嵁鏈夊彉錛岄偅涔堜究浼氭姤涓涓獀erifier寮傚父錛屾瘮濡傛垜浠妸浠g爜涓殑for寰幆嬈℃暟鏀逛負124
for( int i = 0 ; i < 124 ; ++i )
閭d箞windbg浼氫腑鏂湪絎?9琛?/font>
HeapDestroy( heap_handle) ;
鎻愮ず鍐呭濡備笅
=======================================
VERIFIER STOP 0000000F: pid 0x1E3C: Corrupted suffix pattern for heap block.
025A1000 : Heap handle used in the call.
025A7F80 : Heap block involved in the operation.
00000079 : Size of the heap block.
025A7FF9 : Corruption address.
=======================================
This verifier stop is not continuable. Process will be terminated
when you use the `go' debugger command.
=======================================
(1e3c.143c): Break instruction exception - code 80000003 (first chance)
eax=6c75e994 ebx=6c75cf58 ecx=00000002 edx=002bf461 esi=00000000 edi=000001ff
eip=6c753c38 esp=002bf6b4 ebp=002bf8b8 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
vrfcore!VerifierStopMessageEx+0x543:
6c753c38 cc int 3
鎻愮ず璇寸殑寰堟竻妤氫簡錛宎ppverifier鎸囧嚭浜嗗爢鍜屽叿浣撶殑鍐呭瓨鍧楋紝鎴戜滑榪欎釜鏃跺欐煡鐪媌uffer1鐨勫兼槸0x025a7f80 錛屾濂藉氨鏄嚭闂鐨勫爢鍧楋紝鍑洪棶棰樼殑鍦板潃鏄?x025a7ff79錛屾濂藉氨鏄痓uffer1鍐呭瓨鍧楃殑杈圭晫錛岄敊璇師鍥犳槸Corrupted suffix pattern for heap block錛屼篃灝辨槸璇村挶鍧楀熬濉厖閮ㄥ垎錛坰uffix pattern for heap block錛夎鐮村潖錛坈orrupted錛変簡
緇撹錛氬彧瑕佸啓瓚婄晫錛岀郴緇熼兘鑳藉媯嫻嬪嚭鏉ワ紝鍙笉榪囧鏋滃啓瓚婄晫鍐欏埌浜嗘爡鏍忛〉浼氱悊瑙hЕ鍙戝紓甯鎬腑鏂紝鑰屽啓瓚婄晫鍙啓浜嗗潡灝懼~鍏呴儴鍒嗭紝閭d箞緋葷粺鍦ㄩ傚綋鏃舵満錛堟瘮濡傚爢琚攢姣侊紝鎴栬呰繖鍧楀唴瀛樿閲嶆柊鍒嗛厤絳夋椂鏈猴級浼氬鍧楀熬濉厖閮ㄥ垎鍋氬畬鏁存ф嫻嬶紝濡傛灉鍙戠幇琚牬鍧忎簡錛屽氨浼氭姤閿欍傚綋鐒訛紝浣犲彲浠ユ牴鎹敊璇彿錛?font color="#0000ff">钃濊壊瀛椾綋閮ㄥ垎錛変俊鎭幓appverifier鐨勫府鍔╂枃妗d腑鏌ユ壘鏇磋緇嗙殑閿欒璇存槑銆?/font>
榪欐鍜辨潵鍊掑彊錛屽厛浠庢渶鍩烘湰鐨勫唴瀛樺爢鍧楃粨鏋凞PH_BLOCK_INFORMATION寮濮嬩粙緇嶏紝DPH_BLOCK_INFORMATION緇撴瀯寰蔣涔熸湁瀵瑰簲鏂囨。浠嬬粛

鍏朵腑prefix start magic鍜宲refix end magic鏄牎楠屽潡錛岀敤鏉ユ嫻婦PH_BLOCK_INFORMATION鏄惁琚牬鍧忥紝榪欎簺媯嫻嬮儴鍒嗗睘浜嶥PH_BLOCK_INFORMATION緇撴瀯銆傛垜浠厛鏉ョ敤windbg鎺㈢┒涓婦PH_BLOCK_INFORMATION榪欎釜鏈鍩烘湰鐨勭粨鏋?鍐嶄竴嬈?鎴戜滑鎵撳紑windbg璋冭瘯heap.exe.榪愯鍒扮10琛?榪欎釜鏃跺欏彉閲忕殑鍊兼槸
0:000> dv heap_handle
heap_handle = 0x024a0000
0:000> dv buffer
buffer = 0x024a5f80 "???"
0:000> dv buffer1
buffer1 = 0x024a7f80 "???"
榪欓噷鍙互鐪嬪埌涓涓緢鏈夎叮鐨勭幇璞?buffer1鍜宐uffer鐨勫湴鍧姝eソ鐩稿樊8K,涔熷氨鏄袱涓〉鐨勫ぇ灝?榪欏綋鐒舵槸鍥犱負欏靛爢鐨勫師鍥犲暒,鍏跺疄榪欎袱鍧楀唴瀛樺垎閰嶆槸鐩擱偦鐫鐨?铏氭嫙鍐呭瓨緇撴瀯濡備笅鍥炬墍紺?/font>
| buffer鍐呭瓨鍧楋紙4K錛?/font> | 鏍呮爮欏碉紙4K錛?/font> | buffer1鍐呭瓨鍧?4K) | 鏍呮爮欏?4K) |
鐢變簬buffer鍜宐uffer1鍒嗛厤鐨勫ぇ灝忔槸涓鏍風殑錛坆uffer1鍔犱笂灝鵑儴濉厖鍧楀拰buffer鐨勫ぇ灝忕浉鍚岋級錛屾墍浠ヨ繖涓ゅ潡鍐呭瓨姝eソ鐩稿樊8K
鑰孌PH_BLOCK_INFORMATION灝卞湪鎴戜滑鐢寵鐨勫唴瀛樺潡鎸囬拡鐨勫墠0x20瀛楄妭澶勶紝鐢╠t鍛戒護鐪嬬殑緇撴灉濡備笅:
0:000> dt _DPH_BLOCK_INFORMATION 0x024a5f80-0x20
verifier!_DPH_BLOCK_INFORMATION
+0x000 StartStamp : 0xabcdbbbb
+0x004 Heap : 0x024a1000 Void
+0x008 RequestedSize : 0x80
+0x00c ActualSize : 0x1000
+0x010 Internal : _DPH_BLOCK_INTERNAL_INFORMATION
+0x018 StackTrace : 0x003d9854 Void
+0x01c EndStamp : 0xdcbabbbb
0x024a5f80-0x20灝辨槸DPH_BLOCK_INFORMATION緇撴瀯鐨勫湴鍧銆侱PH_BLOCK_INFORMATION緇撴瀯鍦ㄥ凡鍒嗛厤鍜屽凡閲婃斁鐨勭姸鎬佷笅錛孲tartStamp鍜孍ndStamp錛堜篃灝辨槸MSDN鍥句腑鐨刾refix start magic鍜宲refix end magic錛夋槸涓嶅悓鐨勶紝鏄劇劧dt杈撳嚭鐨勭粨鏋滅湅鏉ワ紝榪欎釜鍐呭瓨鍧楁槸宸插垎閰嶇姸鎬併係tackTrace璁板綍浜嗗垎閰嶈繖涓唴瀛樺潡鏃剁殑璋冪敤鏍堬紝鍙互鐢╠ds鏉ョ湅涓涓嬭繖涓唴瀛樺潡琚垎閰嶆椂鍊欑殑璋冪敤鏍?/font>
0:000> dds 0x003d9854
003d9854 00000000
003d9858 00004001
003d985c 00090000
003d9860 5b3b8e89 verifier!AVrfDebugPageHeapAllocate+0x229
003d9864 776d5c4e ntdll!RtlDebugAllocateHeap+0x30
003d9868 77697e5e ntdll!RtlpAllocateHeap+0xc4
003d986c 776634df ntdll!RtlAllocateHeap+0x23a
003d9870 003b1030 heap!main+0x30 [d:\projects\heap\main.cpp @ 8]
003d9874 003b120c heap!__tmainCRTStartup+0x10f [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 582]
003d9878 76451114 kernel32!BaseThreadInitThunk+0xe
003d987c 7766b429 ntdll!__RtlUserThreadStart+0x70
003d9880 7766b3fc ntdll!_RtlUserThreadStart+0x1b
杈撳嚭緇撴灉鎴戜滑鍙互鐪嬪埌榪欎釜鍐呭瓨鍧楁槸鍦╩ain.cpp,涔熷氨鏄垜浠殑紺轟緥浠g爜鐨勭8琛屽垎閰嶇殑錛岀8琛屾槸char *buffer = (char*)HeapAlloc(heap_handle , NULL , 128) 姝eソ灝辨槸鍒嗛厤buffer鍐呭瓨鐨勯偅鏉¤鍙ャ傝繖涓粨鏋勭殑鍏跺畠瀛楁錛岄【鍚嶆濅箟錛孉ctualSize鎸囨槑浜嗗疄闄呭垎閰嶅瓧鑺傛暟錛?x1000 bytes涔熷氨鏄?K澶у皬錛孖nternal榪欎釜瀛楁淇濆瓨浜嗕釜鍐呴儴緇撴瀯錛岀敤windbg涔熺湅涓嶅嚭榪欎釜緇撴瀯淇℃伅銆?/font>
褰撶劧涓轟簡闃叉鍐呭瓨鍧楀墠闈㈢殑鏁版嵁琚啿鍒鋒帀錛岄櫎浜咲PH_BLOCK_INFORMATION澶栵紝緋葷粺榪橀氳繃DPH_HEAP_BLOCK淇濆瓨浜嗘墍鍒嗛厤鍐呭瓨鍧楃殑淇℃伅錛?/font>
閫氳繃!heap 鈥損 鈥揾 [address] 鍙互鏌ョ湅鍒伴〉鍫嗙殑淇℃伅
0:000> !heap -p -h 0x024a0000 //heap_handle鐨勫?/font>
_DPH_HEAP_ROOT @ 24a1000
Freed and decommitted blocks
DPH_HEAP_BLOCK : VirtAddr VirtSize
Busy allocations
DPH_HEAP_BLOCK : UserAddr UserSize - VirtAddr VirtSize
024a1f6c : 024a5f80 00000080 - 024a5000 00002000
024a1f38 : 024a7f80 00000079 - 024a7000 00002000
鍙互鐪嬪埌錛宐uffer鍐呭瓨鍧楀搴旂殑DPH_HEAP_BLOCK緇撴瀯鍦板潃鏄?font color="#0000ff">024a1f6c
0:000> dt _DPH_HEAP_BLOCK 024a1f6c
verifier!_DPH_HEAP_BLOCK
+0x000 NextFullPageHeapDelayedNode : 0x024a1020 _DPH_HEAP_BLOCK
+0x004 DelayQueueEntry : _DPH_DELAY_FREE_QUEUE_ENTRY
+0x000 LookasideEntry : _LIST_ENTRY [ 0x24a1020 - 0x0 ]
+0x000 UnusedListEntry : _LIST_ENTRY [ 0x24a1020 - 0x0 ]
+0x000 VirtualListEntry : _LIST_ENTRY [ 0x24a1020 - 0x0 ]
+0x000 FreeListEntry : _LIST_ENTRY [ 0x24a1020 - 0x0 ]
+0x000 TableLinks : _RTL_BALANCED_LINKS
+0x010 pUserAllocation : 0x024a5f80 "???"
+0x014 pVirtualBlock : 0x024a5000 "???"
+0x018 nVirtualBlockSize : 0x2000
+0x01c Flags : _DPH_HEAP_BLOCK_FLAGS
+0x020 nUserRequestedSize : 0x80
+0x024 AdjacencyEntry : _LIST_ENTRY [ 0x24a1f5c - 0x24a1fc4 ]
+0x02c ThreadId : 0x3f4
+0x030 StackTrace : 0x003d9854 Void
浠巇t鐨勬暟鎹湅鏉ワ紝榪欎釜緇撴瀯澶у皬涓?x34錛宐uffer鍜宐uffer1鐨凞PH_HEAP_BLOCK緇撴瀯棣栧湴鍧姝eソ涔熸槸鐩稿樊0x34錛岃鏄庤繖涓や釜緇撴瀯鏄揣鎸ㄧ潃鐨勶紝涓嬩竴姝ュ湪璁╂垜浠潵鐪嬬湅DPH_HEAP_BLOCK緇撴瀯鏄浣曠粍緇囩殑銆?/font>
鎽樿嚜銆婅蔣浠惰皟璇曘?/font>
榪欎釜鏄暣涓殑欏靛爢緇撴瀯鍥撅紝鎴戜滑鍏堟潵璇磋DPH_HEAP_BLOCK鐨勭粍緇囧惂錛屽湪鍥句腑0x16d00000鏄〉鍫嗙殑棣栧湴鍧錛屼篃灝辨槸欏靛爢鐨勫彞鏌勶紝鎴戜滑璋冭瘯鍣ㄤ腑錛岄〉鍫嗛鍦板潃鍒欐槸0x024a0000錛屼負浜嗘暟鎹粺涓錛屾垜榪樻槸鎷?x024a0000浣滀負鍫嗗彞鏌勬潵璁茶В銆傛垜浠殑DPH_HEAP_BLOCK鍏跺疄灝卞湪鍫嗗潡鑺傜偣姹犻噷杈癸紝鎴戜滑鍙互榪戜技鎶婅繖涓妭鐐規睜鐪嬫垚涓涓ぇ鍨嬬殑DPH_HEAP_BLOCK鏁扮粍錛屼絾鏈変釜鍦版柟鍦ㄨ蔣浠惰皟璇曚腑娌℃湁鎻愬埌錛屽氨鏄湪win7涓嬶紝榪愯鏃惰繖浜汥PH_HEAP_BLOCK緇撴瀯閮芥槸浠ヤ簩鍙夊鉤琛℃暟鐨勭粨鏋勬潵緇勭粐鐨勶紝榪欎釜鏍戠殑緇撴瀯鐨勫叆鍙f鏄湪TableLinks瀛楁鍐咃紝榪欎箞鍋氱殑鍘熷洜涔熷ぇ姒傛槸鍥犱負鑳藉鍦ㄥ垎閰嶆椂鏇村揩鐨勭儲銆傛垜浠啀鐪嬬湅DPH_HEAP_ROOT緇撴瀯錛岃繖涓粨鏋勫偍瀛樹簡鏁翠釜欏靛爢鐨勫繀瑕佷俊鎭紝瀹冨氨鐩稿綋浜庢櫘閫氬爢鐨刜HEAP緇撴瀯銆?/font>
0:000> dt _dph_heap_root 24a1000
verifier!_DPH_HEAP_ROOT
+0x000 Signature : 0xffeeddcc
+0x004 HeapFlags : 0x1002
+0x008 HeapCritSect : 0x024a16cc _RTL_CRITICAL_SECTION
+0x00c NodesCount : 0x2c
+0x010 VirtualStorageList : _LIST_ENTRY [ 0x24a1fa0 - 0x24a1fa0 ]
+0x018 VirtualStorageCount : 1
+0x01c PoolReservedLimit : 0x024a5000 Void
+0x020 BusyNodesTable : _RTL_AVL_TABLE
+0x058 NodeToAllocate : (null)
+0x05c nBusyAllocations : 2
+0x060 nBusyAllocationBytesCommitted : 0x4000
+0x064 pFreeAllocationListHead : (null)
+0x068 FullPageHeapDelayedListTail : (null)
+0x06c DelayFreeQueueHead : (null)
+0x070 DelayFreeQueueTail : (null)
+0x074 DelayFreeCount : 0
+0x078 LookasideList : _LIST_ENTRY [ 0x24a1078 - 0x24a1078 ]
+0x080 LookasideCount : 0
+0x084 UnusedNodeList : _LIST_ENTRY [ 0x24a1ed0 - 0x24a16e4 ]
+0x08c UnusedNodeCount : 0x28
+0x090 nBusyAllocationBytesAccessible : 0x2000
+0x094 GeneralizedFreeList : _LIST_ENTRY [ 0x24a1f04 - 0x24a1f04 ]
+0x09c FreeCount : 1
+0x0a0 PoolCommitLimit : 0x024a2000 Void
+0x0a4 NextHeap : _LIST_ENTRY [ 0x5b3e9a58 - 0x23a10a4 ]
+0x0ac ExtraFlags : 3
+0x0b0 Seed : 0xfed6f13a
+0x0b4 NormalHeap : 0x027d0000 Void
+0x0b8 CreateStackTrace : 0x003d9824 _RTL_TRACE_BLOCK
+0x0bc ThreadInHeap : (null)
+0x0c0 BusyListHead : _LIST_ENTRY [ 0x24a10c0 - 0x24a10c0 ]
+0x0c8 SpecializedFreeList : [64] _LIST_ENTRY [ 0x24a10c8 - 0x24a10c8 ]
+0x2c8 DelayFreeListLookup : [257] (null)
+0x6cc HeapCritSectionStorage : _RTL_CRITICAL_SECTION
榪欓噷杈圭淮鎶や簡寰堝榪愯鏃朵俊鎭紝姣斿璇碊PH_BLOCK_INFORMATION涓殑閭d釜浜屽弶鏍戝叆鍙e叾瀹炲氨鏄繚瀛樺湪BusyNodesTable 瀛楁錛岃繖閲岄潰璁板綍浜嗘墍鏈夎鍒嗛厤浜嗙殑鍐呭瓨鍧楁墍瀵瑰簲鐨凞PH_BLOCK_INFORMATION銆傚綋鐒訛紝榪欓噷闈竴浜涗俊鎭蔣浠惰皟璇曢噷闈㈤兘鏈変粙緇嶏紝寰堝鐪嬪悕瀛椾篃鑳藉鐚滃埌澶ф鎰忔濓紝鐪嬪悕瀛楃寽涓嶅埌鍟ユ剰鎬濈殑瀛楁錛屽叾瀹炴垜涔熺寽涓嶅埌銆傘傘?_-|||鍦ㄥ垱寤洪〉鍫嗗悗錛屾墍鏈夊唴瀛樺垎閰嶉兘鍒嗛厤鍦ㄩ〉鍫嗕腑錛岄氳繃鍒嗛厤鐨勫湴鍧涔熻兘鐪嬪緱鍑烘潵錛堟垜浠垎閰嶇殑鍐呭瓨閮芥槸024a鎵撳ご錛夛紝鑰岄潪鏅氶〉鍫嗕腑錛屾櫘閫氶〉鍫嗕篃浠呬粎鍙槸淇濆瓨涓浜涚郴緇熷唴閮ㄤ嬌鐢ㄧ殑鏁版嵁銆備竴鑸潵璇達紝鍫嗗潡鑺傜偣姹犲姞涓奃PH_HEAP_ROOT緇撴瀯澶у皬姝eソ鏄?涓唴瀛橀〉錛屼篃灝辨槸16K銆?/font>
瀵逛簬璋冭瘯鍫嗙牬鍧忔潵璇達紝鍏跺疄鎴戜滑鍙浜嗚ВDPH_BLOCK_INFORMATION緇撴瀯鍜孌PH_HEAP_BLOCK涓殑鍩烘湰瀛楁灝卞樊涓嶅浜嗭紝榪欐牱鏇存柟渚挎垜浠畾浣嶅嚭閿欐簮澶淬傛瘮濡傚湪appverifier鎶ラ敊鍚庯紙鎴栬呬綘紼嬪簭鑷繁鑾悕鍏跺宕╂簝鎴栬呮暟鎹綃℃敼鍚庯紝瑕佺煡閬揳ppverifier騫朵笉鎬繪槸鍙俊鐨勶級錛屾垜浠彲浠ヨ嚜宸辨墜鍔ㄨ皟璇曞嚭閿欑殑鍫嗗潡緇撴瀯錛圖PH_BLOCK_INFORMATION錛孌PH_HEAP_BLOCK鍜孌PH_HEAP_ROOT錛夛紝媯嫻嬩互涓嬭繖浜涚偣錛?/font>
鍏跺疄欏靛爢榪樺ソ錛屽畠鏈夎緝寮虹殑瀹炴椂鎬э紝鎵浠ュ茍涓嶉渶瑕佸お澶氭墜宸ヨ皟璇曠殑鎿嶄綔錛岃秺鐣岃鍐欓兘浼氱珛鍗寵Е鍙戝紓甯稿茍涓斾腑鏂紝鎵浠ヤ粠榪欑偣鐪嬫潵錛屽畠鏄竴浜涜蔣浠剁敤鏉ユ嫻嬪爢璧勬簮鏄惁姝g‘浣跨敤鐨勫繀澶囪壇鑽瘇 浣嗘槸鐩稿浜庨〉鍫嗭紝鍑嗛〉鍫嗙殑璋冭瘯鍒欓渶瑕佹洿濂界殑鍘諱簡瑙e噯欏靛爢宸ヤ綔鍘熺悊浜嗭紝鍥犱負瀹冩彁渚涚殑鍫嗗潡媯嫻嬩笉鏄疄鏃剁殑錛屾墍浠ュ彂鐜伴棶棰樺悗錛岄渶瑕佸挶鈥滅簿婀涚殑璋冭瘯鍐呭姛鈥滃幓鎵懼嚭婧愬ご錛屽叧浜庡噯欏靛爢鐨勪笢瑗匡紝涓嬪洖鍐嶈鍚э紝鏁鏈熷緟~
鍜屽ぇ瀛︽椂涓嶄竴鏍鳳紝鎴戠殑浠g爜騫朵笉浼氶┈椹檸铏庤刀瀹屽幓鍙傚姞姣旇禌鍚庡氨寮冧箣涓嶇悊浜嗭紝榪欏茍涓嶆槸涓嬈℃т唬鐮侊紝瀹冮渶瑕佺淮鎶わ紝鏇撮渶瑕佷綋鐜板叾浠峰箋備紭鍖栧畬浜嗕竴涓姛鑳斤紝鐢氳嚦涓嶈兘璇村嚭瀹冩瘮浠ュ墠濂藉湪鍝噷錛屼篃娌℃湁鏁版嵁鍙噺鍖栵紝鏇磋鍛界殑鏄垜灝辮繖涔堣榪欓」鐩繃鍘諱簡錛岃姳浜?涓湀鍋氬嚭鏉ョ殑涓滆タ錛屽茍娌℃湁浠諱綍浜虹煡閬擄紝涔熸病浠諱綍浜哄幓鍏蟲敞錛屾病鏈変換浣曟祴璇曟暟鎹潵璇存槑鎴戣榪欎釜鍔熻兘鏈変簡寰堝ぇ紼嬪害涓婄殑榪涘睍銆傚氨鍍忎互鍓嶅鍑濊仛鐨勫▋鍎夸滑璇寸殑錛屽啓鍑烘潵鐨勮蔣浠舵病浜虹敤錛屼笉綆$敤鍒扮殑鎶鏈啀綺炬箾錛屼篃鏄爢搴熶唬鐮併傚垏璁板垏璁幫紝涓嶈濡備綍錛岃閲忓寲鑷繁鐨勫伐浣滐紝鏈夋暟鎹殑瀵規瘮鍒漢鎵嶇煡閬撴槸榪涙銆?/p>
浠庢潵鍒板叕鍙稿埌鐜板湪錛岀粓浜庣煡閬撲粈涔堝彨瓚呭嚭鏈熸湜浜嗐俛s涓涓悎鏍肩▼搴忓憳錛屼綘寰楁寜鏃跺畬鎴愯佸ぇ甯冪疆鐨勪換鍔°備絾浜嬫儏榪滆繙涓嶆榪欎簺錛岃佸ぇ寰堝鏃跺欏彧鏄粰浣犳寚鏄庢柟鍚戯紝騫朵笉浼氬憡璇変綘姣忎竴姝ユ庝箞璧幫紝榪欐牱鍋氱殑濂藉鑳藉璁╀綘鑷敱鍙戞尌錛屽潖澶勬槸瀹規槗榪瘋尗銆傝繖涔熻鏄ソ澶氭柊浜鴻繃鏉ユ椂鍊欑殑閫氱梾錛岃媧炬寚浠誨姟鍚庢棤浠庝笅鎵嬨傝繖涓彲鏄釜娌熼氱殑媧伙紝棣栧厛蹇呴』瑕佺簿紜簡瑙h佸ぇ鐨勯鏈燂紝璁頒綇錛屾垜榪欓噷璇寸殑鏄簿紜簡瑙o紝褰撶劧鑰佸ぇ鐨勯鏈熷茍涓嶄竴瀹氬畬鍏ㄦ紜紝浣嗘槸錛屽湪浣犳病娉曡京椹崇敤鏁版嵁杈╅┏浠栦笉姝g‘鐨勬椂鍊欙紝浣犺鍋氱殑灝辨槸鏀墮泦璧勬枡錛岀劧鍚庡垎鏋愬彲琛屾э紝鍐嶇劧鍚庣粰鑰佸ぇ澶嶈堪浣犵殑璁″垝錛屽湪鎴戠湅鏉ワ紝鎴戝叾瀹炲茍涓嶅笇鏈涙垜鐨勮鍒掑拰鑰佸ぇ鐨勯鎯沖畬鍏ㄤ竴鑷達紝鏇村鐨勮璁烘墠浼氫駭鐢熶竴涓畬緹庣殑鏂規錛屽鏋滀綘浠呬粎鍙槸鎸夎佸ぇ璇寸殑鍘誨仛錛岄偅涔堝氨鏄偅涓猶ualified programmer錛屼竴瀹氫竴瀹氳璁頒綇錛屼綘鏈濂藉緱鏈夎嚜宸辯殑瑙傜偣錛岃鐐瑰繀欏誨緱紕版挒錛岀鎾炰腑鎵嶄細鍙嶆濆悇鏀捐鐐圭殑浼樺姡錛屼竴涓潈琛$殑瑙傜偣鎵嶄細鍑烘潵銆傚叾瀹為渶姹傜‘璁よ繖涓姝ュ彲鑳藉緢澶氫漢鐪嬫潵寰堝啑浣欙紝浣嗘槸鍦ㄦ垜鐪嬫潵寰堟槸蹇呴渶錛屽洜涓哄彛鍙g浉浼犵殑闇姹傚茍涓嶄細綺劇‘鍒板摢閲屽幓錛屾墍浠ラ渶瑕佺‘璁ょ‘璁ゅ啀紜錛岀渷鐨勫仛瀹屽悗鍙堝緱鎵撶炕閲嶅仛銆?/p>
鎶鏈殑浜嬫儏錛屽崈涓囧埆緋婃秱錛屼綘鐨勭▼搴廲rash浜嗭紝浣犲緱鐭ラ亾涓哄暐錛屼綘鐨刵ew澶辮觸浜嗭紝浣犱篃寰楃煡閬撲負鍟ワ紝鍥犱負闅忕潃紼嬪簭瓚婃潵瓚婂ぇ錛屼綘debug鐨勯毦搴︿細瓚婃潵瓚婇珮錛屾湁闂錛屾棭瑙e喅錛岃屼笖瀵規墍鏈夐棶棰橈紝浣犲繀欏葷煡鍏舵墍浠ョ劧銆傚綋鐒訛紝閭d簺鎭跺績鐨勬病鏈夋枃妗h屼笖娉ㄩ噴鍙敞閲婁簡涓鍗婄殑絎笁鏂瑰簱闄ゅ錛岀敤榪欑搴撹繕涓嶅鑷繁閲嶆柊鍐欎竴涓幓錛屼竴鐩磋涓鴻繖縐嶆垚鍝佺殑瀛樺湪灝辨槸涓浮鑲嬨傜紪紼嬮噷闈㈡湁涓鍙ヨ瘽鍙玠onot repeat yourself錛屼綘寰楃鐞嗗ソ騫朵笖鎬葷粨浣犵殑浠g爜錛屾繪湁涓澶╋紝浣犳垨鑰呭埆浜鴻繕鑳界敤寰楀埌銆?/p>
榪欐槸鎴戞渶澶х殑涓涓瘺鐥呬簡鍚э紝鍏跺疄鏀懼湪浜掕仈緗戝叕鍙歌繖縐嶅偓榪涘害濂芥瘮鍌懡鑸殑澶х幆澧冧笅錛岃繖綆楁槸鍧忎範鎯紝鎴戝伐浣滄ā寮忎竴鑸槸涓茶鍖栦笖鍏充腑鏂ā寮忥紝涓浠朵簨蹇呴』寰楀厛鍋氬畬鎵嶅紑濮嬪仛涓嬩竴浠朵簨鎯咃紝涓棿瀹逛笉寰楁湁浠諱綍娉ㄦ剰鍔涚殑杞Щ銆備絾鏄線寰涓棿浼氭湁鏇村姞閲嶈鐨勪簨鎯呮彃鎾繘鏉ワ紝褰撶劧錛屽鏋滃嚭鐜拌繖縐嶆儏鍐甸偅鏄」鐩鐞嗕笂鐨勬偛鍝錛屼絾浜嬪疄濡傛錛岀瓑寰呯幇鐘舵敼鍙樿繕涓嶅鍘婚傚簲銆傛竻妤氱殑鐭ラ亾浼樺厛綰э紝榪欏叾瀹為潪甯擱噸瑕佺殑錛屽洜涓哄緢鏈夊彲鑳芥彃鎾繘鏉ョ殑浠誨姟鍏寵仈鍒板叾浠栧悓浜嬶紝澶勭悊涓嶅ソ錛屼細鍑虹幇欏圭洰鍙戝竷鍓峃涓漢絳変綘鐨勮繖縐嶇姸鍐碉紝璇撮毦鍚偣錛岃繖鏃跺欎綘灝辨垚浜嗗悗鑵匡紝閲嶇偣鏄埆浜烘庝箞鎷栦篃鎷栦笉鍔ㄣ?/p>
璇村ソ鐨勬瘡鍛ㄤ竴嬈¤繍鍔ㄥ湪宸ヤ綔涓変釜鏈堝悗灝辯儫娑堜簯鏁d簡錛屾垜鏄偅縐嶅仛浜嬫儏鐨勬椂鍊欏鏄撹蛋鐏叆欖旂殑紼嬪簭鍛橈紝浜嬫儏娌¤В鍐充箣鍓嶈剳瀛愰噷鍏ㄩ儴閮芥槸鐩稿叧鐨勪簨鎯咃紝浣嗗線寰榪欐牱鏄渶娌℃湁鏁堢巼鐨勶紝鍙嶅掑幓榪愬姩榪愬姩錛屽緟絎簩澶╄剳琚嬫竻鏅頒簡鍙嶅掑氨鏈夌粨鏋滀簡錛岃佸ぉ鍠冦傘傘傛垜鍏充腑鏂殑鎬濈淮妯″紡浣曟椂鑳借漿榪囨潵銆傘傘傜▼搴忓憳搴旇綆楁槸鏈鏈闇瑕侀敾鐐肩殑緹や綋浜嗗惂錛屼竴澶╁潗10涓皬鏃惰繕涓嶅甫涓婂帟鎵鐨勶紝鍙互閬囪濂藉浜哄湪鍑犲勾鍚庨兘浼氳剨妞庣瓑鍦版柟寮濮嬪嚭姣涚梾錛屼絾榪欐槸鎴戜滑鍙互閬囪寰楀埌鐨勫晩銆傘傘傜珶鐒墮兘鐭ラ亾浜嗭紝涓轟綍涓嶅幓闃繪鍏跺彂鐢熷憿錛熶笉涓哄埆浜猴紝鍗曟槸涓轟簡鐜板湪鎴栬呮湭鏉ョ殑瀹朵漢錛屽ソ濂界埍鎶よ嚜宸辯殑韜綋姣斾換浣曚簨鎯呴兘閲嶈錛屾湡寰呮湁涓涓漢錛岋紝錛岋紝鑳藉湪鎴戣蛋鐏叆欖斾箣闄呮妸鎴戞媺鍑烘潵鍘繪墦涓鍦虹悆錛屼互鍓嶆湁灝忓錛屾湁鐣柉錛屾湁钁¤悇鍝ワ紝鑰岀幇鍦ㄥ憿錛熸病鏈変綘浠殑鍩庡競閲屾垜涔熻鍋ュ悍鐨勬椿鐫錛屼笉涓哄埆鐨勶紝鍙負鐣欑潃鍙f皵鎶婅禋鏉ョ殑閽卞ソ濂界殑鑺卞嚭鍘?nbsp; -_-#錛屾寚涓嶅畾鍝ぉ鎴戞毚姣欎簡閾惰閲岃繕鏈夊ソ鍑犵櫨涓囷紝榪欎斧鐨勪笉浜忓ぇ浜嗐?/p>
鏆傛椂灝辮繖涔堝鍚э紝甯屾湜榪欎簺鑳藉湪鎴戜粖鍚庡崐騫存湁鎵鏀瑰杽錛屼篃璁稿湪鎴戠湅鏉ワ紝鎶鏈凡緇忎笉鍐嶆槸鍏ㄩ儴錛屽仛浜嬫儏鐨勬柟寮忔墠鏄垜浠婂悗鎯沖悇鍓嶈緢瀛︿範鐨勫湴鏂廣?/p>
鍐欓┍鍔ㄧ殑鏃跺欐湁涓湴鏂硅佹槸钃濆睆,鐪嬩簡dump鍙戠幇鏁版嵁琚潪娉曠鏀逛簡.
鏁版嵁鍒濆鍖栧涓?/p>
if(record_set_ptr != NULL )
{
record_set_ptr->look_aside_pool_ptr = g_user_control_context.look_aside_pools[type] ;
record_set_ptr->type = type ;
record_set_ptr->buffer_size = notify_count * unit_size_of ;
record_set_ptr->units_count = notify_count ;
record_set_ptr->complete_count = 0 ;
}
鐒跺悗鍦ㄨ皟鐢‥xFreeToNPagedLookasideList浼犲叆record_set_ptr->look_aside_pool_ptr 鐨勬椂鍊欐寕浜?鍙戠幇record_set_ptr->look_aside_pool_ptr宸茬粡琚敼浜?
涓轟簡璺熻釜鏁版嵁鍦ㄥ摢閲岃淇敼浜?鍏堝湪鏁版嵁鍒濆鍖栫殑鍦版柟涓嬫柇,鐒跺悗璁頒笅record_set_ptr->look_aside_pool_ptr 鐨勫湴鍧:0x85c16018
瀵硅繖涓唴瀛樹笅涓柇鐐?
1: kd> ba w4 85c16018
w琛ㄧず鍦ㄥ啓鍏ユ椂鏂笅,4琛ㄧず鐩戞帶鑼冨洿,鍗曚綅鏄瓧鑺?nbsp;
鏁翠釜鍛戒護鐨勬剰鎬濆氨鏄璋冭瘯鍣ㄥ湪緋葷粺鍐欏叆鍐呭瓨85c16018-85c1601b榪欎釜鍦板潃鑼冨洿鐨勬椂鍊欎腑鏂?
OK,鍛戒護涓嬪畬,F5涓涓嬪氨绔嬮┈鏂笅鏉ヤ簡
1: kd> g
Breakpoint 3 hit
nt!memcpy+0x33:
8053b583 f3a5 rep movs dword ptr es:[edi],dword ptr [esi]
姝ゆ椂edi鐨勫? 0x85c16018
鏈鍚庣湅涓涓嬪嚱鏁板爢鏍?鍙戠幇鏄瓧絎︿覆鎷瘋礉瓚婄晫瑕嗙洊浜嗗悗闈㈢殑鏁版嵁....
鍚庨潰鍙堟兂鍒?鍑洪敊鏃秗ecord_set_ptr->look_aside_pool_ptr 鐨勫兼槸0x005c0065
榪欎箞鏄庢樉鐨勫瓧絎︿覆鐗瑰緛绔熺劧娌℃剰璇嗗埌....涓鐪嬪嚭閿欏煎氨搴旇鐭ラ亾鏄瓧絎︿覆瑕嗙洊閫犳垚鐨?....
鍫嗘爤鍫嗘爤錛屽湪鎿嶄綔緋葷粺鍐呭瓨涓湁涓ょ瀛樺偍絀洪棿錛屼竴涓槸鍫嗭紝涓涓槸鏍堛傚爢涓昏鐢ㄤ簬瀛樺偍鐢ㄦ埛鍔ㄦ佸垎閰嶇殑鍙橀噺錛岃屾爤鍛紝鍒欐槸瀛樺偍鎴戜滑紼嬪簭榪囩▼涓殑涓存椂鍙橀噺銆傚綋鐒舵爤鐨勪綔鐢ㄨ繙涓嶆鐢ㄤ綔瀛樺偍鍙橀噺錛屼絾榪欎笉鏄垜浠繖綃囨枃绔犵殑璁ㄨ鍐呭銆?/p>
聽
鍫嗭紙HEAP錛夌殑鍒嗛厤錛屼嬌鐢紝鍥炴敹閮芥槸閫氳繃寰蔣鐨凙PI鏉ョ鐞嗙殑錛屾渶甯歌鐨凙PI鏄痬alloc鍜宯ew銆傚湪寰搴曞眰璧頒竴鐐瑰憿錛岃繖涓や釜鍑芥暟閮戒細璋冪敤HeapAlloc錛圧tlAllocateHeap錛夈傚悓鏍風殑鐩稿叧鍑芥暟榪樻湁HeapFree鐢ㄦ潵閲婃斁鍫嗭紝HeapCreate鐢ㄦ潵鍒涘緩鑷繁鐨勭鏈夊爢銆備笅闈㈡槸榪欎簺鍑芥暟鐨勮皟鐢ㄩ摼錛?/p>
HeapCreate->RtlCreateHeap->ZwAllocateVirtualMemory聽 (榪欓噷浼氱洿鎺ョ敵璇蜂竴澶х墖鍐呭瓨,鑷充簬鐢寵澶氬ぇ鍐呭瓨,鐢辮繘紼婸EB緇撴瀯涓殑瀛楁瑙夊緱錛孒eapSegmentReserve瀛楁鎸囧嚭瑕佺敵璇峰澶х殑铏氭嫙鍐呭瓨錛孒eapSegmentCommit鎸囨槑瑕佹彁浜ゅ澶у唴瀛橈紝瀵硅櫄鎷熷唴瀛樼殑鐢寵鍜屾彁浜ゆ蹇典笉娓呮鐨勭闉嬶紝璇峰弬瑙亀indows鏍稿績緙栫▼鐩稿叧鍐呭~)
HeapAlloc->RtlAllocateHeap錛堣嚦浜庤繖閲岀敵璇風殑鍐呭瓨錛岀敱浜嶩eapCreate宸茬粡鐢寵浜嗕竴澶х墖鍐呭瓨錛屽爢綆$悊鍣ㄨ繖鐗囧唴瀛樹腑鍒掑垎涓鍧楀嚭鏉ヤ互婊¤凍鐢寵鐨勯渶瑕併傝繖涓姝ョ敵璇鋒搷浣滄槸鍫嗙鐞嗗櫒鑷繁緇存姢鐨勶紝浠呭綋鐢寵鍐呭瓨涓嶅鐨勬椂鍊欐墠浼氬啀嬈¤皟鐢╖wAllocateVirtualMemory 錛?/p>
HeapFree->RtlFreeHeap 錛堝浜庨噴鏀劇殑鍐呭瓨錛屽爢綆$悊鍣ㄥ彧鏄畝鍗曠殑鎶婅繖鍧楀唴瀛樻爣蹇椾綅宸查噴鏀捐鍚庡姞鍏ュ埌絀洪棽鍒楄〃涓紝浠呭綋絀洪棽鐨勫唴瀛樿揪鍒頒竴瀹氶榾鍊肩殑鏃跺欎細璋冪敤ZwFreeVirtualMeMory 錛?/p>
HeapDestroy->RtlDestroyHeap->ZwFreeVirtualMeMory聽聽 錛堥攢姣佹垜浠敵璇風殑鍫嗭級
WINDBG瑙傚療鍫?/p>
婧愮爜錛?/p>
#include "windows.h"
int main()
{
HANDLE heap_handle = HeapCreate( NULL , 0x1000 , 0x2000 ) ;
char *buffer = (char*)HeapAlloc(heap_handle , NULL , 128) ;
char *buffer1 = (char*)HeapAlloc(heap_handle , NULL , 121) ;
HeapFree(heap_handle, 0 , buffer ) ;
HeapFree(heap_handle, 0 , buffer1 ) ;
HeapDestroy( heap_handle) ;
return 0 ;
}
璇ユ簮鐮佺敓鎴愮紪璇戠敓鎴恏eap.exe錛岀劧鍚庣敤windbg璋冭瘯榪欎釜紼嬪簭錛屽湪main鍑芥暟涓嬫柇錛岀揣鎺ョ潃鎵ц絎簲琛岃鍙ワ紝鎵ц緇撴灉濡備笅
0:000> p
eax=002e1ca0 ebx=00000000 ecx=6d29b6f0 edx=00000000 esi=00000001 edi=01033374
eip=01031012 esp=0022fe8c ebp=0022feac iopl=0聽聽聽聽聽聽聽聽 nv up ei pl nz na po nc
cs=001b聽 ss=0023聽 ds=0023聽 es=0023聽 fs=003b聽 gs=0000聽聽聽聽聽聽聽聽聽聽聽聽 efl=00000202
heap!main+0x12:
01031012 ff150c200301聽聽聽 call聽聽聽 dword ptr [heap!_imp__HeapCreate (0103200c)] ds:0023:0103200c={kernel32!HeapCreateStub (769a29d7)}
0:000> p
eax=002c0000 ebx=00000000 ecx=77429897 edx=77498500 esi=00000001 edi=01033374
eip=01031018 esp=0022fe98 ebp=0022feac iopl=0聽聽聽聽聽聽聽聽 nv up ei pl nz na pe nc
cs=001b聽 ss=0023聽 ds=0023聽 es=0023聽 fs=003b聽 gs=0000聽聽聽聽聽聽聽聽聽聽聽聽 efl=00000206
heap!main+0x18:
01031018 8945fc聽聽聽聽聽聽聽聽聽 mov聽聽聽聽 dword ptr [ebp-4],eax ss:0023:0022fea8=6d222201
0:000> !heap
Index聽聽 Address聽 Name聽聽聽聽聽 Debugging options enabled
聽 1:聽聽 00300000聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
聽 2:聽聽 00010000聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
聽 3:聽聽 00020000聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
聽 4:聽聽 002e0000聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
聽 5:聽聽 002c0000聽聽聽聽聽聽
HeapCreate鎵ц鐨勮繑鍥炲煎瓨鏀懼湪eax澶勶紝榪欎釜鍑芥暟榪斿洖浜嗕竴涓爢鍙ユ焺錛?x002c0000銆傜敤!heap鍛戒護鏌ョ湅鍙互鐪嬪埌絎簲涓爢灝辨槸鎴戜滑鍒涘緩鐨勫爢鍙ユ焺浜嗐?/p>
姣忎釜榪涚▼閮藉瓨鍦ㄥ涓爢錛屾垜浠篃鍙互閫氳繃PEB緇撴瀯鏉ュ緱鍒拌繘紼嬩腑瀛樺湪鐨勫爢錛岀粨鏋滃拰!heap鍛戒護鏄劇ず鐨勫唴瀹規槸涓鏍風殑銆?/p>
heap!_PEB
聽聽 +0x018 ProcessHeap聽聽聽聽聽 : 0x00300000 Void聽聽聽聽聽聽聽聽 ; 榪涚▼鐨勯粯璁ゅ爢
聽聽 +0x068 NtGlobalFlag聽聽聽聽 : 0聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ; 榪欎釜鏍囧織浣嶈褰曚簡褰撳墠鍫嗚皟璇曟ā寮?0涓烘櫘閫氳皟璇曟ā寮?br />聽聽 +0x078 HeapSegmentReserve : 0x100000聽聽聽聽聽聽聽聽聽 ; 榪涚▼鍦ㄦ柊寤哄爢鐨勬椂鍊欓粯璁ょ敵璇風殑铏氭嫙鍐呭瓨澶у皬
聽聽 +0x07c HeapSegmentCommit : 0x2000聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ; 榪涚▼鍦ㄦ瘡嬈$敵璇鋒彁浜ょ殑铏氭嫙鍐呭瓨澶у皬錛屽湪鎻愪氦鐨勫唴瀛樼敤瀹屽悗錛岃繘紼嬩細鍙堝湪涓嬈℃彁浜eapSegmentCommit涓寚瀹氱殑鍐呭瓨澶у皬
聽聽 +0x080 HeapDeCommitTotalFreeThreshold : 0x10000聽聽聽 ; 褰撻噴鏀劇殑鍐呭瓨澶у皬澶т簬榪欎釜闃鍊鹼紝灝辮繘琛屽唴瀛樿В闄ゆ彁浜ゆ搷浣?br />聽聽 +0x084 HeapDeCommitFreeBlockThreshold : 0x1000聽聽聽聽 ;聽 褰撲竴嬈℃ч噴鏀劇殑鍧楀ぇ灝忚秴榪囪繖涓榾鍊鹼紝灝辮繘琛屽唴瀛樿В闄ゆ彁浜ゆ搷浣滐紝鍙湁褰撴弧瓚寵繖涓や釜鏉′歡鏃舵墠浼氳皟鐢╖wFreeVirtualMeMory 閲婃斁鐗╃悊鍐呭瓨
聽聽 +0x088 NumberOfHeaps聽聽聽 : 5聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ; 褰撳墠榪涚▼鐨勫爢鏁扮洰,榪欎釜鏁扮洰瀵瑰簲鐫!heap鍛戒護鐨勫爢鏄劇ず涓暟
聽聽 +0x08c MaximumNumberOfHeaps : 0x10聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ; 榪涚▼鎵鑳借繍琛岀殑鏈澶у爢鏁扮洰,鑻ュ爢鏁扮洰瓚呰繃榪欎釜鍊間及璁eapCreate灝卞け璐ヤ簡鍚?br />聽聽 +0x090 ProcessHeaps聽聽聽聽 : 0x77498500聽 -> 0x00300000 Void ;瀛樺偍鍫嗗彞鏌勭殑鏁扮粍,榪欓噷鎴戜滑鍙互寰楀埌榪涚▼鐨勬墍鏈夊爢鍙ユ焺
鎴戜滑鍙互杈撳叆濡備笅鍛戒護鏉ユ煡鐪嬬幇鏈夌殑鍫嗗彞鏌?/p>
0:000> dd 0x77498500聽
77498500聽 00300000 00010000 00020000 002e0000
77498510聽 002c0000 00000000 00000000 00000000
77498520聽 00000000 00000000 00000000 00000000
77498530聽 00000000 00000000 00000000 00000000
77498540聽 00000000 77498340 7749bb08 77498220
77498550聽 00000000 00000000 00000000 00000000
77498560聽 77498220 00317bd0 00000000 00000000
77498570聽 00000000 00000000 00000000 00000000
鍙互鐪嬪緱鍒拌繖閲岄潰鐨勫唴瀹瑰拰!heap鍛戒護鐨勮緭鍑虹粨鏋滄槸涓鏍風殑
鑰屽爢鍙ユ焺鐨勫瓨鏀捐寖鍥?浠嶮aximumNumberOfHeaps 涓婃潵鐪?灝辨槸77498500-77498540榪?x40涓瓧鑺傦紝鍥犱負姣忎釜鍫嗗彞鏌勫崰4涓瓧鑺傦紝0x10涓爢鍙ユ焺鐨勫瓨鏀劇┖闂村氨鏄?x40銆?/p>
鍫嗙殑綆$悊錛屾垜浠彲浠ョ悊瑙d負涓涓唴瀛樻睜錛屽畠鐢寵涓澶у潡絀洪棿錛岀劧鍚庤礋璐f帴綆″簲鐢ㄧ▼搴忕殑鐢寵閲婃斁絳夎姹傘傚彧鏈夊湪鍒涘緩鍫嗭紝閲婃斁鍫嗭紙娉ㄦ剰錛佹槸閲婃斁鍫嗭紝涓嶆槸鍫嗕腑鐨勭┖闂達紒錛夊湪榪欎箣鍓嶏紝鎴戜滑闇瑕佸鍫嗘湁鍏崇殑鏁版嵁緇撴瀯鍋氫竴浜涜В閲?/p>
鎴戣繖閲岃瀵熷埌鐨凥EAP緇撴瀯錛孒EAP_SEGMENT緇撴瀯鍜孒EAP_ENTRY緇撴瀯閮藉拰杞歡璋冭瘯閲岄潰鎻忚堪鐨勪笉涓鏍鳳紝褰撳勾濂庡摜鍐欒蔣浠惰皟璇曠殑鏃跺欎及璁¤繕娌$敤涓奧IN7鍚с傘傘傛垜鐨勬紨紺虹郴緇熸槸WIN7
HeapCreate鍑芥暟榪斿洖鐨勫爢鍙ユ焺鍏跺疄灝辨槸涓涓寚鍚戝爢綆$悊緇撴瀯鐨勬寚閽堬紝姣忎釜鍫嗛兘浼氭秹鍙婂埌榪欐牱涓変釜緇撴瀯錛欻EAP,HEAP_SEGMENT,HEAP_ENTRY
HEAP_ENTRY緇撴瀯錛?/p>
鍦ㄥ爢綆$悊涓紝姣忎竴鍧楃敵璇蜂笅鏉ョ殑鍐呭瓨閮戒細鏈変笅闈㈡墍紺虹殑鍥哄畾妯″紡錛?/p>
|
HEAP_ENTRY錛? bytes錛?/p> |
|
鎴戜滑new鎴杕alloc鍒嗛厤鐨勭┖闂?/p> |
|
鍥哄畾濉厖絀洪棿 |
榪欎釜緇撴瀯鐢ㄦ潵璁板綍鎵鍒嗛厤鐨勭┖闂寸殑淇℃伅錛屽寘鎷敤鎴風敵璇風殑絀洪棿錛屽~鍏呯殑絀洪棿錛屾墍鍦ㄧ殑孌靛彿絳夌瓑淇℃伅銆傛墍浠ユ垜浠琻ew鎴栬卪alloc鐨勫湴鍧鍑忓幓8灝辨寚鍚戣緇撴瀯銆傜涓夐儴鍒嗙殑鍥哄畾濉厖絀洪棿鏄負浜嗗唴瀛樺榻愯岀敓鎴愮殑錛屽綋鐒惰繖閮ㄥ垎絀洪棿榪樻湁涓閮ㄥ垎鏄敤鏉ラ澶栬褰曡繖鍧楀唴瀛樼殑鍏跺畠淇℃伅錛岃繖閲屽氨涓嶈緇嗗仛浠嬬粛浜嗐?/p>
HEAP_SEGMENT緇撴瀯錛?/p>
鎴戜滑鍙互榪欎箞璁や負錛屽爢鐢寵鍐呭瓨鐨勫ぇ灝忔槸浠ユ涓哄崟浣嶇殑錛屽綋鏂板緩涓涓爢鐨勬椂鍊欙紝緋葷粺浼氶粯璁や負榪欎釜鍫嗗垎閰嶄竴涓鍙?鍙鋒錛岄氳繃鍒氬紑濮嬬殑new鍜宮alloc鍒嗛厤鐨勭┖闂撮兘鏄湪榪欎釜孌典笂鍒嗛厤鐨勶紝褰撹繖涓鐢ㄥ畬鐨勬椂鍊欙紝濡傛灉褰撳垵鍒涘緩鍫嗙殑鏃跺欐寚鏄庝簡HEAP_GROWABLE榪欎釜鏍囧織錛岄偅涔堢郴緇熶細涓鴻繖涓爢鍦ㄥ啀鍒嗛厤涓涓錛岃繖涓椂鍊欐柊鍒嗛厤鐨勬灝辯О涓?鍙鋒浜嗭紝浠ヤ笅浠ユ綾繪帹銆傛瘡涓鐨勫紑濮嬪垵渚挎槸HEAP_SEGMENT緇撴瀯鐨勯鍦板潃錛岀敱浜庤繖涓粨鏋勪篃鏄敵璇風殑涓鍧楀唴瀛橈紝鎵浠ュ畠鍓嶉潰涔熶細鏈変釜HEAP_ENTRY緇撴瀯錛?/p>
|
HEAP_ENTRY錛? bytes錛?/p> |
|
HEAP_SEGMENT |
|
HEAP_ENTRY錛? bytes錛?/p> |
|
鎴戜滑new鎴杕alloc鍒嗛厤鐨勭┖闂?/p> |
|
鍥哄畾濉厖絀洪棿 |
HEAP_SEGMENT緇撴瀯浼氳褰曟鐨勪竴浜涘熀鏈俊鎭紝璇ユ鐢寵鐨勫ぇ灝忥紝宸茬粡鎻愪氦鍐呭瓨鐨勫ぇ灝忥紝絎竴涓狧EAP_ENTRY緇撴瀯鐨勫叆鍙g偣銆傦紙鎴戣瀵熺湅璨屼技孌電敵璇風殑鍐呭瓨騫朵笉浼氫竴嬈℃у叏閮ㄦ彁浜わ紝鑰屾槸姣忔鎻愪氦涓涓〉鐨勫ぇ灝忥紝姣斿涓涓澶у皬2涓〉錛岄偅涔堝畠浼氬厛鎻愪氦涓涓〉鍐呭瓨錛岃嫢鐢ㄥ畬浜嗗啀鎻愪氦涓涓〉鐨勫唴瀛橈紝鑻ュ唴瀛樿繕鐢ㄥ畬浜嗛偅灝辨柊寤轟竴涓錛岃繖涓柊寤虹殑孌典篃浼氭槸鍏堟彁浜や竴涓〉鍐呭瓨銆傦級浣嗘槸0鍙鋒寰堢壒鍒紝榪欎釜孌電殑璧峰鍦板潃灝辨槸鍫嗗彞鏌勬寚閽堟寚鍚戠殑鍊鹼紝涔熷氨鏄錛?/font>HeapCreate榪斿洖鐨勫爢鍙ユ焺鎬繪槸鎸囧悜0鍙鋒錛屼負浠涔堝憿錛熷洜涓篐EAP緇撴瀯鏄疕EAP_ENTRY,HEAP_SEGMENT鐨勫悎浣撳姞闀跨増~
HEAP緇撴瀯錛?/p>
HEAP緇撴瀯鍒欐槸璁板綍浜嗚繖涓爢鐨勪俊鎭紝榪欎釜緇撴瀯鍙互鎵懼埌HEAP_SEGMENT閾捐〃鍏ュ彛錛岀┖闂插唴瀛橀摼琛ㄧ殑鍏ュ彛錛屽唴瀛樺垎閰嶇矑搴︾瓑絳変俊鎭侶EAP鐨勯鍦板潃渚挎槸鍫嗗彞鏌勭殑鍊鹼紝浣嗘槸鍫嗗彞鏌勭殑鍊煎張鏄?鍙鋒鐨勯鍦板潃涔熸槸鍫嗗彞鏌勶紝浣曡В錛熷叾瀹炲緢綆鍗曪紝0鍙鋒鐨凥EAP_SEGMENT灝卞湪HEAP緇撴瀯閲岄潰錛孒EAP緇撴瀯綾誨畾涔夊榪欐牱錛?/p>
struct _HEAP
{
_HEAP_ENTRY Entry ; //HEAP_ENTRY緇撴瀯錛岀敤鏉ユ弿榪板瓨鍌℉EAP鍐呭瓨鍧楀ぇ灝忕瓑淇℃伅鐨?
_HEAP_SEGMENT Segment ; //0鍙鋒鐨勯鍦板潃
鈥︹? //瀵逛簬璇EAP鐨勬弿榪頒俊鎭?
} ;
鍦ㄦ垜浠湅鏉ワ紝鍐呭瓨緇勭粐緇撴瀯搴旇濡備笅鎵紺猴細
|
HEAP_ENTRY錛? bytes錛?/p> |
|
HEAP_SEGMENT |
|
HEAP |
鏇寸‘鍒囩殑璇達紝HEAP緇撴瀯涓湰韜氨鍖呭惈浜咹EAP_ENTRY鍜孒EAP_SEGMENT錛孒EAP_ENTRY緇撴瀯鏄疕EAP鐨勭涓涓暟鎹垚鍛橈紝HEAP_SEGMENT鏄畠絎簩涓暟鎹垚鍛樸傝屽浜嶩EAP_SEGMENT,瀹冪殑絎竴涓暟鎹垚鍛樹究鏄疕EAP_ENTRY銆傝繖閲屼負浜嗘柟渚跨悊瑙o紝鎵嶅湪鍐呭瓨緇勭粐緇撴瀯涓妸瀹冧滑鎷嗗紑灞曠ず銆傦紙娉細榪欓噷鏄痺in7鐨勬儏鍐碉紝鍜岃蔣浠惰皟璇曡繖鏈功涓墍鎻忚堪鐨勬湁涓浜涘樊寮傦紝涔熷睘姝e父鐜拌薄錛屾瘯绔熻繖閮ㄥ垎緇撴瀯寰蔣騫舵湭鍏紑錛?/p>
鍦ㄤ箣鍓嶅凡緇忔紨紺轟簡濡備綍浠嶱EB緇撴瀯涓壘鍒版墍鏈夌殑鍫嗗彞鏌勶紝鍙互鐪嬪埌002c0000渚挎槸鎴戜滑鍒涘緩鐨勫彞鏌勩傜劧鍚庢垜浠墽紺轟緥紼嬪簭鐨勭7琛屼唬鐮併傛墽琛屽畬鍚庣粨鏋滃涓嬶細
0:000> p
eax=002c0000 ebx=00000000 ecx=77429897 edx=77498500 esi=00000001 edi=01033374
eip=01031026 esp=0022fe8c ebp=0022feac iopl=0聽聽聽聽聽聽聽聽 nv up ei pl nz na pe nc
cs=001b聽 ss=0023聽 ds=0023聽 es=0023聽 fs=003b聽 gs=0000聽聽聽聽聽聽聽聽聽聽聽聽 efl=00000206
heap!main+0x26:
01031026 ff1500200301聽聽聽 call聽聽聽 dword ptr [heap!_imp__HeapAlloc (01032000)] ds:0023:01032000={ntdll!RtlAllocateHeap (774120b5)}
0:000> p
eax=002c0590 ebx=00000000 ecx=774134b4 edx=002c0180 esi=00000001 edi=01033374
eip=0103102c esp=0022fe98 ebp=0022feac iopl=0聽聽聽聽聽聽聽聽 nv up ei pl zr na pe nc
cs=001b聽 ss=0023聽 ds=0023聽 es=0023聽 fs=003b聽 gs=0000聽聽聽聽聽聽聽聽聽聽聽聽 efl=00000246
heap!main+0x2c:
0103102c 8945f0聽聽聽聽聽聽聽聽聽 mov聽聽聽聽 dword ptr [ebp-10h],eax ss:0023:0022fe9c={heap!envp (0103301c)}
鍙互鐪嬪埌EAX淇濆瓨鐨勮繑鍥炲間負002c0590銆傛垜浠氳繃涓ょ閫斿緞鏉ヨ瀵熸垜浠敵璇風殑鍐呭瓨錛岄氳繃!heap鍛戒護瑙傚療鍜岄氳繃dt鍛戒護瑙傚療
杈撳叆鍛戒護!heap 鈥揳 2c0590寰楀埌鐨勭粨鏋滃涓嬶細
0:000> !heap -a 2c0000
Index聽聽 Address聽 Name聽聽聽聽聽 Debugging options enabled
聽 5:聽聽 002c0000
聽聽聽 Segment at 002c0000 to 002c2000 (00001000 bytes committed)
聽聽聽 Flags:聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 00001000
聽聽聽 ForceFlags:聽聽聽聽聽聽聽聽聽聽 00000000
聽聽聽 Granularity:聽聽聽聽聽聽聽聽聽 8 bytes
聽聽聽 Segment Reserve:聽聽聽聽聽 00100000
聽聽聽 Segment Commit:聽聽聽聽聽聽 00002000
聽聽聽 DeCommit Block Thres: 00000200
聽聽聽 DeCommit Total Thres: 00002000
聽聽聽 Total Free Size:聽聽聽聽聽 0000013a
聽聽聽 Max. Allocation Size: 7ffdefff
聽聽聽 Lock Variable at:聽聽聽聽 002c0138
聽聽聽 Next TagIndex:聽聽聽聽聽聽聽 0000
聽聽聽 Maximum TagIndex:聽聽聽聽 0000
聽聽聽 Tag Entries:聽聽聽聽聽聽聽聽聽 00000000
聽聽聽 PsuedoTag Entries:聽聽聽 00000000
聽聽聽 Virtual Alloc List:聽聽 002c00a0
聽聽聽 Uncommitted ranges:聽聽 002c0090
聽聽聽聽聽聽聽聽聽聽聽 002c1000: 00001000聽 (4096 bytes)
聽聽聽 FreeList[ 00 ] at 002c00c4: 002c0618 . 002c0618聽
聽聽聽聽聽聽聽 002c0610: 00088 . 009d0 [100] - free
聽聽聽 Segment00 at 002c0000:
聽聽聽聽聽聽聽 Flags:聽聽聽聽聽聽聽聽聽聽 00000000
聽聽聽聽聽聽聽 Base:聽聽聽聽聽聽聽聽聽聽聽 002c0000
聽聽聽聽聽聽聽 First Entry:聽聽聽聽 002c0588
聽聽聽聽聽聽聽 Last Entry:聽聽聽聽聽 002c2000
聽聽聽聽聽聽聽 Total Pages:聽聽聽聽 00000002
聽聽聽聽聽聽聽 Total UnCommit:聽 00000001
聽聽聽聽聽聽聽 Largest UnCommit:00000000
聽聽聽聽聽聽聽 UnCommitted Ranges: (1)
聽聽聽 Heap entries for Segment00 in Heap 002c0000
聽聽聽聽聽聽聽 002c0000: 00000 . 00588 [101] - busy (587)
聽聽聽聽聽聽聽 002c0588: 00588 . 00088 [101] - busy (80)
聽聽聽聽聽聽聽 002c0610: 00088 . 009d0 [100]
聽聽聽聽聽聽聽 002c0fe0: 009d0 . 00020 [111] - busy (1d)
聽聽聽聽聽聽聽 002c1000:聽聽聽聽聽 00001000聽聽聽聽聽 - uncommitted bytes.
榪欎釜鍛戒護鍒嗗埆鎻愮偧鍑轟簡HEAP錛堢豢鑹插尯鍩燂級,HEAP_SEGMENT錛堢孩鑹插尯鍩燂級鍜孒EAP_ENTRY錛堢伆鑹插尯鍩燂級緇撴瀯涓殑淇℃伅銆傝櫧鐒跺湪鐏拌壊鍖哄煙涓紝鎴戜滑鎵句笉鍒?c0590錛屼絾鏄壘鍒頒簡涓涓?c0588錛岃繖涓鏄?c0590-8鐨勭粨鏋滐紝涔熷氨鏄鏈鍙寵竟鐨勫湴鍧鏄瘡涓狧EAP_ENTRY鐨勯鍦板潃錛屾帴鐫00588榪欎釜瀛楁琛ㄧず浜嗗墠闈竴涓狧EAP_ENTRY鎵鍗犵敤鐨勫ぇ灝忥紝鍚庨潰鐨?088琛ㄧず榪欎釜鍐呭瓨鍧楃殑鎬誨ぇ灝忥紝鍗蟲垜浠敵璇風殑鍐呭瓨+HEAP_ENTRY錛?28+8=0x80+0x8=0x88錛夛紝[101]鏄繖鍧楀唴瀛樼殑鏍囧織浣嶏紝鏈鍙寵竟涓浣嶄負1琛ㄧず璇ュ唴瀛樺潡琚崰鐢ㄣ傜劧鍚巄usy錛?0錛夊氨鏄В閲婅榪欏潡鍐呭瓨鏄鍗犵敤鐨勶紙闈炵┖闂茬殑錛夛紝瀹冪敵璇風殑鍐呭瓨涓?x80錛岃漿鍖栨垚鍗佽繘鍒舵濂藉氨鏄垜浠敵璇風殑128瀛楄妭澶у皬銆?/p>
浣嗘槸榪欓噷鐢╠t _HEAP_ENTRY 2c0588鍛戒護鍗存病鍔炴硶鏌ョ湅瀵瑰簲鐨勭粨鏋勪俊鎭紝鐪熸槸鎬搲錛屾湁綃囧崥鏂囦篃鎻愬埌win2008涓璈EAP鐩稿叧緇撴瀯涔熸湁鍙橈紝鐪嬫潵鍒癗T6鍚庯紝HEAP緇撴瀯鍙樺緱涓嶅皬錛岃搗鐮亀indbg涓洿鎺t HEAP_ENTRY鏄棤娉曞師濮嬫暟鎹殑浜嗭紝璨屼技瀵笻EAP_ENTRY鍋氫簡緙栫爜銆?/font>
鍚屾牱鐨勶紝宸茬煡HEAP鐨勯鍦板潃錛岄偅涔堝厛浠嶩EAP涓嬫墜濂戒簡錛宒t _HEAP 002c0000鍙互鏄劇ずHEAP鐨勬暟鎹粨鏋?/p>
ntdll!_HEAP
聽聽 +0x000 Entry聽聽聽聽聽聽聽聽聽聽聽 : _HEAP_ENTRY
聽聽 +0x008 SegmentSignature : 0xffeeffee聽聽
聽聽 +0x00c SegmentFlags聽聽聽聽 : 0
聽聽 +0x010 SegmentListEntry : _LIST_ENTRY [ 0x2c00a8 - 0x2c00a8 ]
聽聽 +0x018 Heap聽聽聽聽聽聽聽聽聽聽聽聽 : 0x002c0000 _HEAP
聽聽 +0x01c BaseAddress聽聽聽聽聽 : 0x002c0000 Void
聽聽 +0x020 NumberOfPages聽聽聽 : 2
聽聽 +0x024 FirstEntry聽聽聽聽聽聽 : 0x002c0588 _HEAP_ENTRY
聽聽 +0x028 LastValidEntry聽聽 : 0x002c2000 _HEAP_ENTRY
聽聽 +0x02c NumberOfUnCommittedPages : 1
聽聽 +0x030 NumberOfUnCommittedRanges : 1
聽聽 +0x034 SegmentAllocatorBackTraceIndex : 0
聽聽 +0x036 Reserved聽聽聽聽聽聽聽聽 : 0
聽聽 +0x038 UCRSegmentList聽聽 : _LIST_ENTRY [ 0x2c0ff0 - 0x2c0ff0 ]
聽聽 +0x040 Flags聽聽聽聽聽聽聽聽聽聽聽 : 0x1000
聽聽 +0x044 ForceFlags聽聽聽聽聽聽 : 0
聽聽 +0x048 CompatibilityFlags : 0
聽聽 +0x04c EncodeFlagMask聽聽 : 0x100000
聽聽 +0x050 Encoding聽聽聽聽聽聽聽聽 : _HEAP_ENTRY
聽聽 +0x058 PointerKey聽聽聽聽聽聽 : 0x17c06e63
聽聽 +0x05c Interceptor聽聽聽聽聽 : 0
聽聽 +0x060 VirtualMemoryThreshold : 0xfe00
聽聽 +0x064 Signature聽聽聽聽聽聽聽 : 0xeeffeeff
聽聽 +0x068 SegmentReserve聽聽 : 0x100000
聽聽 +0x06c SegmentCommit聽聽聽 : 0x2000
聽聽 +0x070 DeCommitFreeBlockThreshold : 0x200
聽聽 +0x074 DeCommitTotalFreeThreshold : 0x2000
聽聽 +0x078 TotalFreeSize聽聽聽 : 0x13a
聽聽 +0x07c MaximumAllocationSize : 0x7ffdefff
聽聽 +0x080 ProcessHeapsListIndex : 5
聽聽 +0x082 HeaderValidateLength : 0x138
聽聽 +0x084 HeaderValidateCopy : (null)
聽聽 +0x088 NextAvailableTagIndex : 0
聽聽 +0x08a MaximumTagIndex聽 : 0
聽聽 +0x08c TagEntries聽聽聽聽聽聽 : (null)
聽聽 +0x090 UCRList聽聽聽聽聽聽聽聽聽 : _LIST_ENTRY [ 0x2c0fe8 - 0x2c0fe8 ]
聽聽 +0x098 AlignRound聽聽聽聽聽聽 : 0xf
聽聽 +0x09c AlignMask聽聽聽聽聽聽聽 : 0xfffffff8
聽聽 +0x0a0 VirtualAllocdBlocks : _LIST_ENTRY [ 0x2c00a0 - 0x2c00a0 ]
聽聽 +0x0a8 SegmentList聽聽聽聽聽 : _LIST_ENTRY [ 0x2c0010 - 0x2c0010 ]
聽聽 +0x0b0 AllocatorBackTraceIndex : 0
聽聽 +0x0b4 NonDedicatedListLength : 0
聽聽 +0x0b8 BlocksIndex聽聽聽聽聽 : 0x002c0150 Void
聽聽 +0x0bc UCRIndex聽聽聽聽聽聽聽聽 : (null)
聽聽 +0x0c0 PseudoTagEntries : (null)
聽聽 +0x0c4 FreeLists聽聽聽聽聽聽聽 : _LIST_ENTRY [ 0x2c0618 - 0x2c0618 ]
聽聽 +0x0cc LockVariable聽聽聽聽 : 0x002c0138 _HEAP_LOCK
聽聽 +0x0d0 CommitRoutine聽聽聽 : 0x17c06e63聽聽聽聽 long聽 +17c06e63
聽聽 +0x0d4 FrontEndHeap聽聽聽聽 : (null)
聽聽 +0x0d8 FrontHeapLockCount : 0
聽聽 +0x0da FrontEndHeapType : 0 ''
聽聽 +0x0dc Counters聽聽聽聽聽聽聽聽 : _HEAP_COUNTERS
聽聽 +0x130 TuningParameters : _HEAP_TUNING_PARAMETERS
灝卞鏈枃鍓嶉潰鎵榪扮殑錛岀涓涓瓧孌墊槸HEAP_ENTRY緇撴瀯錛屾帴鐫搴旇鏄疕EAP_SEGMENT錛岃繖閲屽彧涓嶈繃鎶奌EAP_SEGMENT緇撴瀯鐨勫瓧孌靛睍寮浜嗭紝鍙互dt _HEAP_SEGMENT鏉ヨ瀵熶笅榪欎釜緇撴瀯鐨勫瓧孌?/p>
0:000> dt _heap_segment
ntdll!_HEAP_SEGMENT
聽聽 +0x000 Entry聽聽聽聽聽聽聽聽聽聽聽 : _HEAP_ENTRY
聽聽 +0x008 SegmentSignature : Uint4B
聽聽 +0x00c SegmentFlags聽聽聽聽 : Uint4B
聽聽 +0x010 SegmentListEntry : _LIST_ENTRY
聽聽 +0x018 Heap聽聽聽聽聽聽聽聽聽聽聽聽 : Ptr32 _HEAP
聽聽 +0x01c BaseAddress聽聽聽聽聽 : Ptr32 Void
聽聽 +0x020 NumberOfPages聽聽聽 : Uint4B
聽聽 +0x024 FirstEntry聽聽聽聽聽聽 : Ptr32 _HEAP_ENTRY
聽聽 +0x028 LastValidEntry聽聽 : Ptr32 _HEAP_ENTRY
聽聽 +0x02c NumberOfUnCommittedPages : Uint4B
聽聽 +0x030 NumberOfUnCommittedRanges : Uint4B
聽聽 +0x034 SegmentAllocatorBackTraceIndex : Uint2B
聽聽 +0x036 Reserved聽聽聽聽聽聽聽聽 : Uint2B
聽聽 +0x038 UCRSegmentList聽聽 : _LIST_ENTRY
鍙互鐪嬪埌HEAP緇撴瀯涓伆鑹查儴鍒嗘槸鍜孒EAP_SEGMENT緇撴瀯涓殑瀛楁鏄噸澶嶇殑錛屼篃灝辨槸璇寸伆鑹查儴鍒嗗瓧孌典究鏄疕EAP_SEGMENT緇撴瀯銆傚湪HEAP_SEGMENT緇撴瀯涓紝鎴戜滑鍙互鎵懼埌FirstEntry瀛楁錛岃繖閲屾寚鐨勪究鏄垜浠殑鍒嗛厤鐨勫唴瀛橈紝涓嶈繃HEAP_ENTRY緇撴瀯鏃犳硶瑙傚療錛岃繖閲屼究娌″姙娉曟灇涓懼嚭鎵鏈夌殑HEAP_ENTRY緇撴瀯浜嗭紝浣嗘槸璇翠竴涓嬫濊礬錛?/p>
姣忎釜HEAP_ENTRY鍜屽畠瀵瑰簲鐨勫唴瀛樻垜浠彲浠ョО涓轟竴涓唴瀛樺潡錛岃綆椾笅涓涓唴瀛樺潡闇瑕佺敤鍒扮幇鏈夊唴瀛樺潡涓殑2涓瓧孌碉紝Size鍜孶nsedBytes錛孲ize鐨勫間箻涓婄矑搴︼紙灝辨槸0:000> !heap -a 2c0000鍛戒護鏄劇ず鐨勪俊鎭腑鐨凣ranularity: 8 bytes瀛楁錛岃繖閲屾槸8瀛楄妭錛夛紝涓嬩竴涓唴瀛樺潡鍦板潃灝辨槸 鏈唴瀛樺潡鍦板潃+Size*8+UnsedBytes銆傚綋鐒惰繖閲岀殑綺掑害鍙互閫氳繃HEAP瀛楁涓殑AlignMask 瀛楁綆楀嚭鏉ャ?/p>
鍦℉EAP緇撴瀯涓寚鏄庝簡鍒嗛厤綺掑害錛岃繖涓垎閰嶇矑搴︽槸璇存瘡嬈″爢鍒嗛厤鐨勬椂鍊欙紝閮戒互榪欎釜綺掑害涓烘渶灝忓崟浣嶏紝榪欓噷鐪嬪埌綺掑害涓?瀛楄妭銆傛墍浠ヨ繖閲屽氨鏈変簡絎簩嬈″垎閰嶅唴瀛樼殑瀹為獙錛屾垜浠紼嬪簭鎵ц絎?琛岋紝鐒跺悗鐢?heap -a 002c0000瑙傚療鍒嗛厤鎯呭喌
Heap entries for Segment00 in Heap 002c0000
聽聽聽 002c0000: 00000 . 00588 [101] - busy (587)
聽聽聽 002c0588: 00588 . 00088 [101] - busy (80)
聽聽聽 002c0610: 00088 . 00088 [101] - busy (79)
聽聽聽 002c0698: 00088 . 00948 [100]
聽聽聽 002c0fe0: 00948 . 00020 [111] - busy (1d)
聽聽聽 002c1000:聽聽聽聽聽 00001000聽聽聽聽聽 - uncommitted bytes.
榪欓噷鍙互鐪嬪嚭澶氬嚭浜嗕竴涓崰鐢ㄥ潡錛屽ぇ灝忔槸0x79錛?21錛?bytes錛屼絾鏄疄闄呭垎閰嶇殑澶у皬榪樻槸0x 88 錛?28錛塨ytes錛岃繖鏄洜涓虹郴緇熸槸浠? bytes涓虹矑搴﹀垎閰嶇殑錛屾墍浠ヤ負榪欏潡121 bytes鐨勫唴瀛樿嚜鍔ㄥ~鍏呬簡7涓瓧鑺傦紝鍙鐢寵121 bytes鍜岀敵璇?28 bytes鎵浣跨敤鐨勭┖闂存槸涓鏍風殑銆?/font>
鎵ц浜?1琛屽拰12琛岀殑浠g爜鍚庯紝鍫嗕腑鐨勫唴瀹瑰垎鍒涓嬶細
鎵ц11琛屼唬鐮佺殑鍫嗘儏鍐?/strong>
FreeList[ 00 ] at 002c00c4: 002c06a0 . 002c0590聽
聽聽聽 002c0588: 00588 . 00088 [100] 鈥?free聽聽 錛涚┖闂插垪琛ㄤ腑澶氬嚭浜嗕竴鍧楀唴瀛?/font>
聽聽聽 002c0698: 00088 . 00948 [100] 鈥?free聽聽 錛涚┖闂插唴瀛橈紝絀洪棽絀洪棿涓?48
鎵ц12琛屼唬鐮佺殑鍫嗘儏鍐?/strong>
FreeList[ 00 ] at 005c00c4: 005c0590 . 005c0590聽
聽聽聽 005c0588: 00588 . 00a58 [100] 鈥?free 錛涘洖鏀朵簡buffer1鐨勫唴瀛樺悗錛岀敱浜庣敱浜庣┖闂插唴瀛樻槸榪炵畫鐨勶紝鎵浠ョ洿鎺ュ悎騫舵垚涓鍧楀唴瀛樸傚彲浠ョ湅鍒頒箣鍓嶅唴瀛榝ree絀洪棿鏄?48錛岀幇鍦ㄥ悎騫朵簡浠ュ悗渚挎槸948+88+88=a58,涔熷氨鏄綋鍓嶅唴瀛樺ぇ灝?/font>
Heap entries for Segment00 in Heap 005c0000
聽聽聽 005c0000: 00000 . 00588 [101] - busy (587)
聽聽聽 005c0588: 00588 . 00a58 [100]
聽聽聽 005c0fe0: 00a58 . 00020 [111] - busy (1d)
聽聽聽 005c1000:聽聽聽聽聽 00001000聽聽聽聽聽 - uncommitted bytes.
鏈鍚庢墽琛?4琛屼唬鐮?瀵瑰爢榪涜閲婃斁,閲婃斁鍚庢垜浠氳繃!heap涔熷彲浠ョ湅鍒板彧鏈?涓爢浜?鎴戜滑鐢寵鐨勫爢琚噴鏀句簡.
0:000> !heap聽
鑷充簬HEAP_ENTRY緇撴瀯鐨勯棶棰?鏈夋椂闂村湪璋冭瘯鐪嬬湅鏄庝箞鍥炰簨鍚鍙﹀錛岃繖閲岃鏄庝笅錛宯ew鍜宮alloc鍐呴儴閮戒細璋冪敤HeapAlloc鏉ョ敵璇峰唴瀛橈紝浣嗘槸鍫嗗彞鏌勪粠鍝潵鍛紵瀹冧細媯嫻媉crtheap鍙橀噺鏄惁涓虹┖錛岃嫢涓嶄負絀哄垯鎷縚crtheap鍙橀噺鏉ヤ綔涓鴻嚜宸辯殑鍫嗗彞鏌勫幓璋冪敤HeapAlloc
鍙傝冿細
杞歡璋冭瘯聽聽聽 寮犲閾?/p>
MSDN聽聽聽
鏄ㄥぉ鍦ㄤ含涓滀笂涔扮殑TP-LINK WN821N v3鏃犵嚎緗戝崱錛屼粖澶╁氨鍒版墜浜?鍙戣揣鐪熷揩~~鍑屾櫒緇欐垜鍙戞潵閭歡璇村凡閫佽揣錛屾敞鎰忔煡鏀躲傘傘傘傛睏~~
榪欎釜鏃犵嚎緗戝崱鏄垜鐨勫紑鍙戠綉鍗★紝鑺變簡涓涓嬪崍鐮旂┒鎵嶇炕鍒扮殑涓涓猚ommview for wifi鍜宎ircrack閮借兘浣跨敤鐨勭綉鍗★紝鐢ㄧ殑atheros鐨勮姱鐗囷紝鍏蜂綋鍨嬪彿鍙互鍦?a >http://linuxwireless.org/en/users/Drivers/ath9k_htc/devices
榪欎釜緗戝潃涓婃煡鍒般?/p>鍙儨鎴戠殑鏄痷buntu 10.04鐨勭増鏈紝媯嫻嬩笉鍒拌繖涓綉鍗★紝鍙兘鑷繁鍔ㄦ墜瑁呬簡
鎴戣繖閲屽畨瑁呯殑鏄痑th9k_htc
澶氫簭浜嗕笅闈㈣繖涓ょ瘒鏂囩珷錛岀綉鍗℃垚鍔熷湪ubuntu涓婇潰璺戣搗鏉ヤ簡
ath9k_htc錛氫竴浜沀SB鏃犵嚎緗戝崱鐨勫師鐢熼┍鍔?/a>
涓嶈繃涓婇潰璇磋矊浼煎湪UBUNTU 11.04涓氨鍙互璇嗗埆鍑烘潵錛屾垜涔熶笉鏅撳緱 榪欎釜寰呴獙璇併?/p>
璇曚簡涓媋ircrack
sudo aircmon start wlan%d 錛堣矊浼肩綉鍗″悕瑙f瀽鏈夐敊銆傘傘傘傜珶鐒剁粰鎴戣В鏋愭垚wlan%d錛佷笉榪囦篃鑳界敤錛屽皢灝卞惂~錛?/p>
鎵撳紑wireshark鐩戝惉mon0榪欎釜铏氭嫙緗戝崱錛岀粨鏋滃涓?/p>
鍢垮樋 鍙互浣跨敤錛岄偅鎺ヤ笅鏉ュ彲浠ョ戶緇瓀ireless fundamental緋誨垪鏂囩珷浜嗭紝noctilio榪欎釜寮婧愰」鐩篃寮濮嬫鍏ュ紑鍙戦樁孌典簡
涔嬪墠鍐欎簡涓綃囨枃绔? VIM鈥撴寚瀹氳嚜宸辯殑VIM宸ヤ綔鐩綍
浠婂ぉ鍑嗗鎶妛indows涓嬬殑vim閰嶇疆寮勫埌铏氭嫙鏈轟腑鐨剈buntu鏉?浜庢槸灝辨湁浜嗚繖綃囨枃绔?浠呰褰曚笅鏈熼棿閬囧埌鐨勯棶棰?/p>
1. 鎶妛indows鏂囦歡澶規槧灝勫埌ubuntu涓?/p>
鎴戣繖閲屾槸鐢ㄤ簡vmware tools鏉ユ悶瀹氱殑,鍏堝畨瑁卾mware tools,鐒跺悗鍦╡dit virtual mechine setting涓殑options閲岄潰鏈変釜shared floders,鎶婂畠璁句負always enable鐒跺悗鍦ㄤ笅闈㈡坊鍔犺嚜宸辮鍏變韓鐨勭洰褰曞氨鏄簡,鎴戝湪榪欓噷闈㈡妸鎴戜箣鍓嶇殑$MY_VIM_DIR榪欎釜鐜鍙橀噺鐨勭洰褰曟坊鍔犺繘鍘諱簡,鎴戠殑floder name涓簐im.鐒跺悗鍦ㄨ櫄鎷熸満鐨刄BUNTU涓嬮潰,鍒?mnt/hgfs/vim鐩綍涓嬪氨鍙互璁塊棶鎴戠殑vim閰嶇疆鏂囦歡浜?絎竴姝ユ悶瀹?娌′粈涔堝ぇ闂.
2.鐒跺悗鍦ㄧ幆澧冨彉閲忎腑娣誨姞$MY_VIM_DIR(/mnt/hgfs/vim)鍜?VIMINIT(source $MY_VIM_DIR/_vimrc)鐜鍙橀噺,鎴戣繖閲屾煡浜嗕笅璧勬枡,鍦▇/.bashrc榪欎釜鏂囦歡涓姞涓婅繖涓ゅ彞璇濓細
export MY_VIM_DIR=/mnt/hgfs/vim
export VIMINIT="source $MY_VIM_DIR/_vimrc"
鍦ㄦ瘡嬈″惎鍔╞ash鐨勬椂鍊欎細鎵ц~/.bashrc榪欎釜鏂囦歡錛屾垜浠殑鐜鍙橀噺灝辮嚜鍔ㄨ榪涘幓浜嗭紝浣嗘槸榪欎釜璁劇疆鍙褰撳墠鐢ㄦ埛鏈夋晥錛屾崲涓敤鎴鋒垜浠緗殑鐜鍙橀噺灝變笉璧蜂綔鐢ㄤ簡. 濡傛灉浣犲笇鏈涘鍏ㄥ眬鐢ㄦ埛閮芥湁鏁?閭d箞鍙互鍘諱慨鏀?etc/profile鏂囦歡,鍦ㄦ枃浠舵湯灝懼姞涓婅繖涓ゅ彞璇?
3.濂戒簡,涓鍒囧氨緇?鍦ㄦ帶鍒跺彴鍚姩VIM, 澶辮觸! 鎻愮ず璇存嫻嬪埌鏈塣M, 鏃犳硶瑙f瀽.鏅?windows鏍煎紡緙栫爜闂....
瑙e喅鏂規硶寰堢畝鍗?鍏堣窇鍘昏涓猼ofrodos,鍛戒護: sudo apt-get install tofrodos
鐒跺悗鎵цsudo fromdos -p $MY_VIM_DIR/*/*.vim
鎶婇厤緗枃浠剁洰褰曚笅鐨勬墍浠?vim鏂囦歡鐨勬崲琛岄兘杞垚unix鏍煎紡鐨?/p>
鐒跺悗鍦ㄦ垜浠殑_vimrc涓姞鍏ヤ竴鍙ヨ瘽: set fileformat=unix
鍛婅瘔vim鎴戜滑鎹㈣絎︾敤unix鏍煎紡鐨?/p>
鍦╳indows涓? gvim鍙互璇嗗埆榪欑甯︽湁unix鎹㈣絎︾殑vimrc鏂囦歡
OK,闂瑙e喅
4.鎵цsudo vim, 鏅?... 绔熺劧娌℃湁鍔犺澆鎴戠殑_vimrc鏂囦歡,鑰屾槸杞屽姞杞戒簡榛樿鐨?vimrc鏂囦歡,涔熷氨鏄2涓緗殑鐜鍙橀噺涓嶈搗浣滅敤
鐒跺悗鎯沖彲鑳芥槸sudo鐢ㄧ殑鏄痳oot,涓嶄細緇ф壙鎴戣繖涓敤鎴風殑鐜鍙橀噺,OK 鎴戝湪/etc/profile涓緗幆澧冨彉閲忔誨彲浠ヤ簡鍚?/p>
鐧誨嚭鍚庣櫥鍏?鐪嬫晥鏋?/p>
鏅?.. 榪樻槸涓嶈
鐒跺悗鐧懼害浜嗕竴浜?鍘熸潵鍦╯udo鍛戒護鍑轟簬瀹夊叏鎬ц冭檻,鎵ц鏈熼棿浼氭妸鐜鍙橀噺reset,鐒跺悗淇濈暀鍙俊鐨勭幆澧冨彉閲?姣斿$PATH榪欑鍙橀噺
閭d箞闂鎵懼埌灝卞ソ鍔炰簡,鏈夊嚑縐嶆柟娉?/p>
a. 浣跨敤sudo -s鍛戒護錛屾寚鍑簊udo緇ф壙shell鐜鍙橀噺
b. 鎵цvisudo鍛戒護, 鎶奃efaults env_reset鏀規垚Defaults !env_reset銆?紱佹sudo瀵圭幆澧冨彉閲忛噸緗紝鍥犱負鎴戞槸鍦ㄨ櫄鎷熸満涓婁釜浜虹敤ubuntu鍋氬紑鍙?鎵浠ョ敤鐨勮繖縐嶆柟娉?鑻ュ湪澶氫漢鍏變韓浣跨敤鐨勬搷浣滅郴緇熶笂,榪樻槸鎺ㄨ崘浣跨敤a鏂規硶瀹夊叏浜?/p>
鏈榪戝湪灝濊瘯鐢╩oin wiki鏉ュ仛鍗忓悓寮鍙戯紝鐩存帴鐢╩oin鑷甫鐨勭紪杈戝櫒澶笉鐖戒簡錛屽瓧浣撻毦鐪嬩笉璇達紝榪樻病娉曠潃鑹詫紝鐪嬬潃涓嶈垝鏈嶃?/p>
鐒跺悗鍘繪悳绱簡涓媣im涓浉鍏砿oin鐨勬彃浠訛紝鎯充笉鍒拌繕鐪熸湁錛?/p>
棣栧厛鏄繖涓?a >editmoin錛岀敤python鍐欑殑錛屽彲浠ラ氳繃榪欎釜鎻掍歡鏉ョ洿鎺ユ搷浣渕oin鐨勯〉闈紝浣嗘槸鎴戣繖閲屾槸windows緋葷粺錛屽畠鑰佽涓嶅埌鎴戠殑閰嶇疆鏂囦歡銆傝繖涓柟娉昹inux涓嬬殑鐢ㄦ埛鍙互鐢紝鎴戝氨涓嶈鍜紝鎵浠ヤ綔緗紝閲嶆柊瀵繪壘鍏跺畠鏂規硶銆?/p>
鐒跺悗鍘籱oin涓婚〉涓婄湅錛屼笂闈㈡帹鑽愪簡涓涓猣irefox鐨勬彃浠訛紝鍙互浣跨敤鎸囧畾緙栬緫鍣ㄦ潵緙栬緫欏甸潰鍐呭錛佹彃浠跺湴鍧鍦ㄨ繖錛?a s All Text!
榪欐鎻掍歡涓綘鎸囧畾vim涓虹紪杈戝櫒灝卞彲浠ヤ簡錛岀劧鍚庡湪緙栬緫鐨勬椂鍊欐縺媧昏鎻掍歡鍗沖彲錛屽畠浼氬府浣犳妸鍐呭澶嶅埗鍒皏im涓紝緙栬緫瀹屽叧闂悗浼氭妸淇敼搴旂敤鍒扮綉欏電紪杈戝櫒鍐咃紝寰堝ソ鐢ㄧ殑璇磣~鍝堝搱
姝ゅ錛屽湪moin瀹樼綉涓婃彁鍒扮殑vim鎻掍歡moin.vim鍙互瀵筸oin wiki璇硶榪涜楂樹寒鏄劇ず錛屼絾鏄敤鐨勬椂鍊欐敞鎰忥紝璇鋒妸moin.vim涓殑 hi clear 榪欎竴鍙ヨ瘽娉ㄩ噴鎺?鍚﹀垯vim涓厤緗殑涓婚浼氬け鏁?/p>
聽
@Author錛歛y聽聽聽聽聽聽聽聽@Date錛?011-10-07聽聽聽聽@鏂囩珷鍑哄錛?a >http://cnss-ay.com
@Notice錛氳漿杞借娉ㄦ槑浣滆呬俊鎭紒
聽 聽
鍦ㄤ嬌鐢╲im鐨勮繃紼嬩腑涓紝鎴戝彂鐜版垜鐨剉im閰嶇疆瑕佽漿縐誨埌windows涓婂緢楹葷儲錛屽洜涓烘垜鐨勬彃浠跺拰vim鎻掍歡鏀懼湪vim瀹夎鐩綍涓嬶紝鍜寁im鍘熼厤鐨勬彃浠舵販涓璧蜂簡銆傝屼笖vimrc鏂囦歡涔熻鎴戞敼鐨勫緢涔憋紝鏀懼埌windows涓婇潰鏈繀鑳藉鐩存帴浣跨敤銆傛墍浠ュ氨鏈変簡榪欑瘒鏂囩珷錛岃璁哄浣曟寚瀹氱殑涓涓嚜宸辯殑鏂囦歡澶癸紝vim浠庤繖鏂囦歡澶逛腑杞藉叆鎴戠殑鎻掍歡鍜岃澆鍏ュ垵濮嬪寲鏂囦歡vimrc銆?
聽 聽
鐢ㄨ繃vim鐨勯兘鏅撳緱錛寁im鍦ㄥ垵濮嬪寲涔嬪浼氳澆鍏imrc鏂囦歡錛屽湪windows涓嬭繖涓枃浠舵槸_vimrc錛屽湪linux涓嬫槸.vimrc錛屾垜浠彲浠ヤ慨鏀硅繖涓枃浠舵潵瀹氬埗鎴戜滑鐨勫垵濮嬪寲鎿嶄綔銆備絾鏄垜浠繀欏誨緱鎶婅繖涓獀imrc鏂囦歡鏀懼湪鎸囧畾鐨勪綅緗墠鍙互琚玽im媯嫻嬪埌錛岃繖浜涗釜璺緞鍒嗗埆鏄?VIM,$VIMRUNTIME,$HOME榪欎笁涓幆澧冨彉閲忎笅鎵鎸囩殑璺緞銆傝繖閲屾湁涓ょ鏂規硶錛?
1 淇敼$HOME鐨勮礬寰勶紝鎶婅繖涓幆澧冨彉閲忔寚鍚戞垜浠嚜宸卞畾涔夌殑璺緞錛?VIM鍜?VIMRUNTIME鎸囧悜鐨勮礬寰勫彲鑳絭im榪樻湁鍏跺畠鐢ㄩ旓紝鏈濂藉埆鏀廣備絾鏄慨鏀?HOME涔熶笉鏄緢濂斤紝鐗瑰埆鏄痩inux涓嬶紝寰堝紼嬪簭閮芥槸渚濊禆浜?HOME鐜鍙橀噺鐨勩?
聽 聽
2鎸囧畾$VIMINIT錛屾垜鏄畾涔変簡涓涓?MY_VIM_PATH鐨勭幆澧冨彉閲忥紝榪欓噷闈㈠瓨浜嗘垜VIM閰嶇疆鏂囦歡鍜屾彃浠剁殑鐩綍鍦板潃錛岀劧鍚?VIMINIT涓殑鍐呭鏄細
source聽$MY_VIM_PATH/_vimrc
鍦╲im鍒濆鍖栦箣鍒濅細鏌ョ湅$VIMINIT鏈夋病鏈夎瀹氫箟錛岃嫢琚畾涔変簡灝辨斁寮冨悗闈㈣澆鍏imrc鐨勬搷浣滐紝杞屾墽琛?VIMINIT鍙橀噺鍐呯殑鎿嶄綔銆傚綋鐒朵篃鍙互璁劇疆$MYVIMRC鐨勭幆澧冨彉閲忎負$MY_VIM_PATH/_vimrc錛寁im鍚屾牱浼氬厛杞藉叆$MYVIMRC鍙橀噺涓寚瀹氱殑vimrc鏂囦歡銆傚彧鏈夊綋榪欎袱涓幆澧冨彉閲忛兘娌″畾涔夌殑鏃跺檝im鎵嶅洖鍘誨墿涓嬬殑鐩綍涓壘vimrc鏂囦歡銆?
娉細鍦╳indows涓病娉曞垱寤?vimrc鐨勬枃浠訛紝鎵浠ュ彧鑳界敤_vimrc浠f浛涔嬨?
聽 聽
鍏充簬濡備綍璁劇疆鎻掍歡錛屽府鍔╂枃妗g殑鏌ユ壘璺緞
鍦╲imrc涓姞鍏ュ涓嬭鍙ュ嵆鍙?
set runtimepath=$MY_VIM_PATH,$VIMRUNTIME
鍦╲im榪愯鏃訛紝浼氬湪runtimepath鍙橀噺涓褰曠殑璺緞涓幓鎵懼姞杞芥彃浠訛紝鑳屾櫙鑹茬瓑鍐呭銆?
聽 聽
聽 聽
聽
聽
聽