锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
蹇樹簡鎿嶄綔緋葷粺浼?xì)鏍规嵁澶勭悊鍣ㄥ瀷鍙峰姞铦蹭笉鍚岀増鏈唴鏍镐?...
姝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箞緋葷粺浼?xì)鍔犺浇ntoskrnla 鎵浠ヨ繕寰楃鐢≒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
瀹屼簡鍚庡氨浼?xì)鍔犺浇ntoskrnl浜?鏁堟灉鍥?
鎸囧畾鍏跺畠緋葷粺鏂規(guī)硶綾諱技,鍦ㄦ浠呮姏鐮栧紩鐜?nbsp;
]]>
姝ゆ枃浼?xì)娑夊強(qiáng)鍒颁竴浜涙櫘閫氬爢鐨勭煡璇嗭紝榪欎簺鍐呭鍙互鍙傝鎴戜箣鍓嶇殑鏂囩珷 WINDBG鐨勫爢璋冭瘯--浜嗚ВHEAP緇勭粐
鎵璋撶殑鍫嗙牬鍧忥紝鏄娌℃帶鍒跺ソ鑷繁鐨勬寚閽堬紝鎶婁笉灞炰簬浣犲垎閰嶇殑閭e潡鍐呭瓨緇欏啓瑕嗙洊浜嗐傝繖鍧楀唴瀛樺彲鑳芥槸浣犵▼搴忕殑鏁版嵁錛屼篃鍙兘鏄爢鐨勭鐞嗙粨鏋勩傞偅涔堣繖涓細(xì)瀵艱嚧鎬庢牱鐨勫悗鏋滃憿錛熷彲鑳界殑鎯呭喌鎴戜滑鏉y涓?/font>
鍫嗙牬鍧忚緝涓虹悊鎯崇殑鎯呭喌鏄淇敼鐨勬暟鎹細(xì)椹笂瀵艱嚧紼嬪簭crash錛屾渶宸殑鎯呭喌鏄綘鐨勫爢鏁版嵁鑾悕鍏跺鍦ㄤ粖澶╄鏀逛簡錛屼絾鏄庡ぉ鎵峜rash銆傝繖涓椂鍊欏湪鍘誨垎鏋恈rash錛屽氨濡傛垜浠殑璀﹀療鍙斿彅鐜板湪鎺ユ墜涓妗?0騫村墠鐨勬瀛愪竴鑸?---鏃犱粠涓嬫墜銆傝佸縐頒箣涓篽eap corruption鏄緢璐村垏鐨勶紝鏈夋椂鍊欏挶鍫嗘暟鎹鎰忓綃℃敼鏄棤澹版棤鎭殑錛屼綘涔熻娌℃硶浠庣晫闈㈢敋鑷蟲棩蹇楁枃浠朵腑鐪嬪埌瀹冭綃℃敼鐨勪竴鐐硅抗璞★紝褰撳埌鏌愪竴涓椂鍒伙紝榪欑閿欒浼?xì)鏆撮湶鍑烘潵锛岀劧鑰岃繖涓椂鍊欐煡鐪嬪爢淇℃伅涔熻浼?xì)鏄鏃犲ご缛A銆傛墍浠ュ浜庡爢鐮村潖錛屽挶鐨勭瓥鐣ユ槸灝芥棭鍙戠幇鎴戜滑鐨勫爢琚鏀逛簡錛屾渶濂借兘澶熷湪鍫嗘暟鎹鎰忓綃℃敼鐨勯偅涓鏃跺埢璇卞彂涓涓紓甯告潵鎻愰啋鎴戜滑----鍏勫紵錛屼綘鐨勫爢琚厫铓浜嗐?/font>
寰蔣鎻愪緵浜嗕竴浜涙柟妗堬紝鏉ュ府鍔╂垜浠瘖鏂爢鐮村潖銆備竴鑸潵璇達(dá)紝鍫嗙牬鍧忓線寰閮芥槸鍐欐暟鎹秺鐣岄犳垚鐨勶紙yy鐨勭浜岀鎯呭喌錛屽鏋滄槸絎竴縐嶆儏鍐靛叾瀹炶繕綆鍗曪紝涓嬩釜鍐呭瓨鏂偣灝卞ソ錛夛紝鎵浠ュ井杞湪鍫嗗垎閰嶄笂錛岀粰紼嬪簭鍛橀棬棰濆鎻愪緵浜?縐嶅爢鍒嗛厤妯″紡--瀹屽叏欏靛爢錛坒ull page heap錛夛紝鍑嗛〉鍫?normal page heap)錛岀敤鏉ユ嫻嬪爢琚啓瓚婄晫鐨勬儏鍐點(diǎn)?/font>
瀹屽叏欏靛爢鐨勬嫻嬪熀鏈濊礬鏄氳繃鍒嗛厤鐩擱偦鐨勪竴涓〉錛屽茍灝嗗叾璁句負(fù)涓嶅彲璁塊棶灞炴э紝鐒跺悗鐢ㄦ埛鏁版嵁鍧椾細(xì)琚垎閰嶅埌鍐呭瓨欏電殑鏈鏈錛屼粠鑰屽疄鐜拌秺鐣岃闂殑媯嫻嬨傚綋鎴戜滑瀵瑰爢涓垎閰嶇殑鍐呭瓨璇誨啓瓚婄晫鍚庝究浼?xì)璁块棶鍒伴偅涓笉鍙潥剻宓锛尵p葷粺鎹曡幏鍒版敼嬈″紓甯稿悗浼?xì)璇曞浘涓柇鎵ц迤垶畣璇ュ紓甯镐笂鎶ゾl檇ebugger錛屾垨鑰呭穿婧冦傚叿浣撶殑鍐呭瓨緇勭粐緇撴瀯濡備笅鍥?/font>
鎽樿嚜銆婅蔣浠惰皟璇曘?/font>
涓庢櫘閫氬爢涓嶅悓鐨勬槸錛屽唴瀛樺潡鍓嶉潰鐨凥EAP_ENTRY緇撴瀯琚獶PH_BLOCK_INFORMATION緇撴瀯鍙栦唬錛岃繖涓粨鏋勫唴閮ㄨ褰曚簡欏靛爢妯″紡涓嬭繖涓唴瀛樺潡鐨勪竴浜涘熀鏈俊鎭傚鏋滅敤鎴鋒暟鎹尯鍓嶉潰鐨勬暟鎹紝涔熷氨鏄疍PH_BLOCK_INFORMATION緇撴瀯琚牬鍧忎簡錛岄偅涔堝湪閲婃斁鍐呭瓨鍧楃殑鏃跺欑郴緇熶細(xì)鎶ラ敊錛屽鏋滅紪紼嬭呭榪欏潡鍐呭瓨鍧楄鍐欒秺鐣屼簡錛屽綋鐒訛紝榪欓噷瓚婄晫鏈夊嚑縐嶆儏鍐碉細(xì)
榪欓噷闇瑕佹敞鎰忕殑榪樻槸鍧楀熬濉厖涓嶄竴瀹氬瓨鍦?/font>錛屽潡灝懼~鍏呮槸鍥犱負(fù)瑕佹弧瓚沖爢鍐呭瓨鐨勬渶灝忓垎閰嶇矑搴︼紝濡傛灉鏈韓鍐呭瓨鍧楃殑鍒嗛厤綺掑害灝卞凡緇忔槸鏈灝忓垎閰嶇矑搴︾殑鍊嶆暟浜嗭紝閭d箞鍧楀熬濉厖灝變笉瀛樺湪浜嗭紝姣斿鍫嗗唴瀛樺垎閰嶇矑搴︽槸鏄? bytes錛岄偅涔堝鏋滅敵璇蜂簡14 bytes鐨勮瘽浼?xì)鏈? bytes鐨勫ぇ寰愬皬鐨勫潡灝懼~鍏呭潡錛屽鏋滅敵璇蜂簡24bytes錛岄偅涔堝氨娌℃湁鍧楀熬濉厖浜嗭紝鍥犱負(fù)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錛岀洿鎺ヨ繍琛岋紝浼?xì)鍙戠幇鎶ラ敊濡備?/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鐨勫唴瀛樻椂鏄笉浼?xì)鏈夊潡灏惧~鍏呴儴鍒嗙殑锛?/font>
閭f垜浠帴涓嬫潵鐪嬪彟澶栦竴孌典唬鐮?/font>
鎴戜滑鎶婄10琛岀殑temp = buffer鏀規(guī)垚temp = buffer1
鍥犱負(fù)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>
榪欓噷涔熷氨鏄濡傛灉鎴戜滑鐨勪唬鐮佷腑瀵圭敵璇風(fēng)殑鍫嗗唴瀛樺啓瓚婄晫浜嗭紝鍐欐暟鎹鐩栧潡灝懼~鍏呴儴鍒嗙殑鏃跺欏茍涓嶄細(xì)寮曞彂寮傚父錛?/font>
浣嗘槸錛岃繖騫朵笉浠h〃鎴戜滑鐨勫啓瓚婄晫闂涓嶄細(xì)琚彂鐜般傚潡灝懼~鍏呴儴鍒嗘槸浼?xì)琚~鍏呬笂鍥哄畾鏁版嵁鐨勫Q岀郴緇熷湪閫傚悎鐨勬椂鏈猴紙姣斿閿姣佸爢鐨勬椂鍊欙級浼?xì)鏍¢獙鍧棡畱帧厖鍧楀Q屽鏋滃彂鐜板潡灝懼~鍏呭潡鏁版嵁鏈夊彉錛岄偅涔堜究浼?xì)鎶ヤ竴涓獀erifier寮傚父錛屾瘮濡傛垜浠妸浠g爜涓殑for寰幆嬈℃暟鏀逛負(fù)124
for( int i = 0 ; i < 124 ; ++i )
閭d箞windbg浼?xì)涓柇鍦ńW?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錛変簡
緇撹錛氬彧瑕佸啓瓚婄晫錛岀郴緇熼兘鑳藉媯嫻嬪嚭鏉ワ紝鍙笉榪囧鏋滃啓瓚婄晫鍐欏埌浜嗘爡鏍忛〉浼?xì)鐞嗚В瑙﹀彂寮傚告腑鏂紝鑰屽啓瓚婄晫鍙啓浜嗗潡灝懼~鍏呴儴鍒嗭紝閭d箞緋葷粺鍦ㄩ傚綋鏃舵満錛堟瘮濡傚爢琚攢姣侊紝鎴栬呰繖鍧楀唴瀛樿閲嶆柊鍒嗛厤絳夋椂鏈猴級浼?xì)瀵瑰潡灏惧~鍏呴儴鍒嗗仛瀹屾暣鎬ф嫻嬶紝濡傛灉鍙戠幇琚牬鍧忎簡錛屽氨浼?xì)鎶ラ敊銆傚綋鐒訛紝浣犲彲浠ユ牴鎹敊璇彿錛?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,涔熷氨鏄袱涓〉鐨勫ぇ灝?榪欏綋鐒舵槸鍥犱負(fù)欏靛爢鐨勫師鍥犲暒,鍏跺疄榪欎袱鍧楀唴瀛樺垎閰嶆槸鐩擱偦鐫鐨?铏氭嫙鍐呭瓨緇撴瀯濡備笅鍥炬墍紺?/font>
| buffer鍐呭瓨鍧楋紙4K錛?/font> | 鏍呮爮欏碉紙4K錛?/font> | buffer1鍐呭瓨鍧?4K) | 鏍呮爮欏?4K) |
鐢變簬buffer鍜宐uffer1鍒嗛厤鐨勫ぇ灝忔槸涓鏍風(fēng)殑錛坆uffer1鍔犱笂灝鵑儴濉厖鍧楀拰buffer鐨勫ぇ灝忕浉鍚岋級錛屾墍浠ヨ繖涓ゅ潡鍐呭瓨姝eソ鐩稿樊8K
鑰孌PH_BLOCK_INFORMATION灝卞湪鎴戜滑鐢寵鐨勫唴瀛樺潡鎸囬拡鐨勫墠0x20瀛楄妭澶勶紝鐢╠t鍛戒護(hù)鐪嬬殑緇撴灉濡備笅:
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錛屼負(fù)浜嗘暟鎹粺涓錛屾垜榪樻槸鎷?x024a0000浣滀負(fù)鍫嗗彞鏌勬潵璁茶В銆傛垜浠殑DPH_HEAP_BLOCK鍏跺疄灝卞湪鍫嗗潡鑺傜偣姹犻噷杈癸紝鎴戜滑鍙互榪戜技鎶婅繖涓妭鐐規(guī)睜鐪嬫垚涓涓ぇ鍨嬬殑DPH_HEAP_BLOCK鏁扮粍錛屼絾鏈変釜鍦版柟鍦ㄨ蔣浠惰皟璇曚腑娌℃湁鎻愬埌錛屽氨鏄湪win7涓嬶紝榪愯鏃惰繖浜汥PH_HEAP_BLOCK緇撴瀯閮芥槸浠ヤ簩鍙夊鉤琛℃暟鐨勭粨鏋勬潵緇勭粐鐨勶紝榪欎釜鏍?wèi)鐨劸l撴瀯鐨勫叆鍙f鏄湪TableLinks瀛楁鍐咃紝榪欎箞鍋氱殑鍘熷洜涔熷ぇ姒傛槸鍥犱負(fù)鑳藉鍦ㄥ垎閰嶆椂鏇村揩鐨勭儲銆傛垜浠啀鐪嬬湅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釜浜屽弶鏍?wèi)鍏ュ彛鍏跺疄灏辨槸淇濆瓨鍦?font color="#0000ff">BusyNodesTable 瀛楁錛岃繖閲岄潰璁板綍浜嗘墍鏈夎鍒嗛厤浜嗙殑鍐呭瓨鍧楁墍瀵瑰簲鐨凞PH_BLOCK_INFORMATION銆傚綋鐒訛紝榪欓噷闈竴浜涗俊鎭蔣浠惰皟璇曢噷闈㈤兘鏈変粙緇嶏紝寰堝鐪嬪悕瀛椾篃鑳藉鐚滃埌澶ф鎰忔濓紝鐪嬪悕瀛楃寽涓嶅埌鍟ユ剰鎬濈殑瀛楁錛屽叾瀹炴垜涔熺寽涓嶅埌銆傘傘?_-|||鍦ㄥ垱寤洪〉鍫嗗悗錛屾墍鏈夊唴瀛樺垎閰嶉兘鍒嗛厤鍦ㄩ〉鍫嗕腑錛岄氳繃鍒嗛厤鐨勫湴鍧涔熻兘鐪嬪緱鍑烘潵錛堟垜浠垎閰嶇殑鍐呭瓨閮芥槸024a鎵撳ご錛夛紝鑰岄潪鏅氶〉鍫嗕腑錛屾櫘閫氶〉鍫嗕篃浠呬粎鍙槸淇濆瓨涓浜涚郴緇熷唴閮ㄤ嬌鐢ㄧ殑鏁版嵁銆備竴鑸潵璇達(dá)紝鍫嗗潡鑺傜偣姹犲姞涓奃PH_HEAP_ROOT緇撴瀯澶у皬姝eソ鏄?涓唴瀛橀〉錛屼篃灝辨槸16K銆?/font>
瀵逛簬璋冭瘯鍫嗙牬鍧忔潵璇達(dá)紝鍏跺疄鎴戜滑鍙浜嗚ВDPH_BLOCK_INFORMATION緇撴瀯鍜孌PH_HEAP_BLOCK涓殑鍩烘湰瀛楁灝卞樊涓嶅浜嗭紝榪欐牱鏇存柟渚挎垜浠畾浣嶅嚭閿欐簮澶淬傛瘮濡傚湪appverifier鎶ラ敊鍚庯紙鎴栬呬綘紼嬪簭鑷繁鑾悕鍏跺宕╂簝鎴栬呮暟鎹綃℃敼鍚庯紝瑕佺煡閬揳ppverifier騫朵笉鎬繪槸鍙俊鐨勶級錛屾垜浠彲浠ヨ嚜宸辨墜鍔ㄨ皟璇曞嚭閿欑殑鍫嗗潡緇撴瀯錛圖PH_BLOCK_INFORMATION錛孌PH_HEAP_BLOCK鍜孌PH_HEAP_ROOT錛夛紝媯嫻嬩互涓嬭繖浜涚偣錛?/font>
鍏跺疄欏靛爢榪樺ソ錛屽畠鏈夎緝寮虹殑瀹炴椂鎬э紝鎵浠ュ茍涓嶉渶瑕佸お澶氭墜宸ヨ皟璇曠殑鎿嶄綔錛岃秺鐣岃鍐欓兘浼?xì)绔嬪崒櫑﹀彂寮傚父迤堜笖涓柇锛屾墍浠ヤ粠榪欑偣鐪嬫潵錛屽畠鏄竴浜涜蔣浠剁敤鏉ユ嫻嬪爢璧勬簮鏄惁姝g‘浣跨敤鐨勫繀澶囪壇鑽瘇 浣嗘槸鐩稿浜庨〉鍫嗭紝鍑嗛〉鍫嗙殑璋冭瘯鍒欓渶瑕佹洿濂界殑鍘諱簡瑙e噯欏靛爢宸ヤ綔鍘熺悊浜嗭紝鍥犱負(fù)瀹冩彁渚涚殑鍫嗗潡媯嫻嬩笉鏄疄鏃剁殑錛屾墍浠ュ彂鐜伴棶棰樺悗錛岄渶瑕佸挶鈥滅簿婀涚殑璋冭瘯鍐呭姛鈥滃幓鎵懼嚭婧愬ご錛屽叧浜庡噯欏靛爢鐨勪笢瑗匡紝涓嬪洖鍐嶈鍚э紝鏁鏈熷緟~
鍐欓┍鍔ㄧ殑鏃跺欐湁涓湴鏂硅佹槸钃濆睆,鐪嬩簡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;
鏁翠釜鍛戒護(hù)鐨勬剰鎬濆氨鏄璋冭瘯鍣ㄥ湪緋葷粺鍐欏叆鍐呭瓨85c16018-85c1601b榪欎釜鍦板潃鑼冨洿鐨勬椂鍊欎腑鏂?
OK,鍛戒護(hù)涓嬪畬,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銆傚湪寰搴曞眰璧頒竴鐐瑰憿錛岃繖涓や釜鍑芥暟閮戒細(xì)璋冪敤HeapAlloc錛圧tlAllocateHeap錛夈傚悓鏍風(fēng)殑鐩稿叧鍑芥暟榪樻湁HeapFree鐢ㄦ潵閲婃斁鍫嗭紝HeapCreate鐢ㄦ潵鍒涘緩鑷繁鐨勭鏈夊爢銆備笅闈㈡槸榪欎簺鍑芥暟鐨勮皟鐢ㄩ摼錛?/p>
HeapCreate->RtlCreateHeap->ZwAllocateVirtualMemory聽 (榪欓噷浼?xì)鐩存帴鐢宠涓澶х墖鍐呭瓨,鑷充簬鐢寵澶氬ぇ鍐呭瓨,鐢辮繘紼婸EB緇撴瀯涓殑瀛楁瑙夊緱錛孒eapSegmentReserve瀛楁鎸囧嚭瑕佺敵璇峰澶х殑铏氭嫙鍐呭瓨錛孒eapSegmentCommit鎸囨槑瑕佹彁浜ゅ澶у唴瀛橈紝瀵硅櫄鎷熷唴瀛樼殑鐢寵鍜屾彁浜ゆ蹇典笉娓呮鐨勭闉嬶紝璇峰弬瑙亀indows鏍稿績緙栫▼鐩稿叧鍐呭~)
HeapAlloc->RtlAllocateHeap錛堣嚦浜庤繖閲岀敵璇風(fēng)殑鍐呭瓨錛岀敱浜嶩eapCreate宸茬粡鐢寵浜嗕竴澶х墖鍐呭瓨錛屽爢綆$悊鍣ㄨ繖鐗囧唴瀛樹腑鍒掑垎涓鍧楀嚭鏉ヤ互婊¤凍鐢寵鐨勯渶瑕併傝繖涓姝ョ敵璇鋒搷浣滄槸鍫嗙鐞嗗櫒鑷繁緇存姢鐨勶紝浠呭綋鐢寵鍐呭瓨涓嶅鐨勬椂鍊欐墠浼?xì)鍐崑啤璋冪敤ZwAllocateVirtualMemory 錛?/p>
HeapFree->RtlFreeHeap 錛堝浜庨噴鏀劇殑鍐呭瓨錛屽爢綆$悊鍣ㄥ彧鏄畝鍗曠殑鎶婅繖鍧楀唴瀛樻爣蹇椾綅宸查噴鏀捐鍚庡姞鍏ュ埌絀洪棽鍒楄〃涓紝浠呭綋絀洪棽鐨勫唴瀛樿揪鍒頒竴瀹氶榾鍊肩殑鏃跺欎細(xì)璋冪敤ZwFreeVirtualMeMory 錛?/p>
HeapDestroy->RtlDestroyHeap->ZwFreeVirtualMeMory聽聽 錛堥攢姣佹垜浠敵璇風(fēng)殑鍫嗭級
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鍛戒護(hù)鏌ョ湅鍙互鐪嬪埌絎簲涓爢灝辨槸鎴戜滑鍒涘緩鐨勫爢鍙ユ焺浜嗐?/p>
姣忎釜榪涚▼閮藉瓨鍦ㄥ涓爢錛屾垜浠篃鍙互閫氳繃PEB緇撴瀯鏉ュ緱鍒拌繘紼嬩腑瀛樺湪鐨勫爢錛岀粨鏋滃拰!heap鍛戒護(hù)鏄劇ず鐨勫唴瀹規(guī)槸涓鏍風(fēng)殑銆?/p>
heap!_PEB
聽聽 +0x018 ProcessHeap聽聽聽聽聽 : 0x00300000 Void聽聽聽聽聽聽聽聽 ; 榪涚▼鐨勯粯璁ゅ爢
聽聽 +0x068 NtGlobalFlag聽聽聽聽 : 0聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ; 榪欎釜鏍囧織浣嶈褰曚簡褰撳墠鍫嗚皟璇曟ā寮?0涓烘櫘閫氳皟璇曟ā寮?br />聽聽 +0x078 HeapSegmentReserve : 0x100000聽聽聽聽聽聽聽聽聽 ; 榪涚▼鍦ㄦ柊寤哄爢鐨勬椂鍊欓粯璁ょ敵璇風(fēng)殑铏氭嫙鍐呭瓨澶у皬
聽聽 +0x07c HeapSegmentCommit : 0x2000聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ; 榪涚▼鍦ㄦ瘡嬈$敵璇鋒彁浜ょ殑铏氭嫙鍐呭瓨澶у皬錛屽湪鎻愪氦鐨勫唴瀛樼敤瀹屽悗錛岃繘紼嬩細(xì)鍙堝湪涓嬈℃彁浜eapSegmentCommit涓寚瀹氱殑鍐呭瓨澶у皬
聽聽 +0x080 HeapDeCommitTotalFreeThreshold : 0x10000聽聽聽 ; 褰撻噴鏀劇殑鍐呭瓨澶у皬澶т簬榪欎釜闃鍊鹼紝灝辮繘琛屽唴瀛樿В闄ゆ彁浜ゆ搷浣?br />聽聽 +0x084 HeapDeCommitFreeBlockThreshold : 0x1000聽聽聽聽 ;聽 褰撲竴嬈℃ч噴鏀劇殑鍧楀ぇ灝忚秴榪囪繖涓榾鍊鹼紝灝辮繘琛屽唴瀛樿В闄ゆ彁浜ゆ搷浣滐紝鍙湁褰撴弧瓚寵繖涓や釜鏉′歡鏃舵墠浼?xì)璋冪敤ZwFreeVirtualMeMory 閲婃斁鐗╃悊鍐呭瓨
聽聽 +0x088 NumberOfHeaps聽聽聽 : 5聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ; 褰撳墠榪涚▼鐨勫爢鏁扮洰,榪欎釜鏁扮洰瀵瑰簲鐫!heap鍛戒護(hù)鐨勫爢鏄劇ず涓暟
聽聽 +0x08c MaximumNumberOfHeaps : 0x10聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ; 榪涚▼鎵鑳借繍琛岀殑鏈澶у爢鏁扮洰,鑻ュ爢鏁扮洰瓚呰繃榪欎釜鍊間及璁eapCreate灝卞け璐ヤ簡鍚?br />聽聽 +0x090 ProcessHeaps聽聽聽聽 : 0x77498500聽 -> 0x00300000 Void ;瀛樺偍鍫嗗彞鏌勭殑鏁扮粍,榪欓噷鎴戜滑鍙互寰楀埌榪涚▼鐨勬墍鏈夊爢鍙ユ焺
鎴戜滑鍙互杈撳叆濡備笅鍛戒護(hù)鏉ユ煡鐪嬬幇鏈夌殑鍫嗗彞鏌?/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鍛戒護(hù)鐨勮緭鍑虹粨鏋滄槸涓鏍風(fēng)殑
鑰屽爢鍙ユ焺鐨勫瓨鏀捐寖鍥?浠嶮aximumNumberOfHeaps 涓婃潵鐪?灝辨槸77498500-77498540榪?x40涓瓧鑺傦紝鍥犱負(fù)姣忎釜鍫嗗彞鏌勫崰4涓瓧鑺傦紝0x10涓爢鍙ユ焺鐨勫瓨鏀劇┖闂村氨鏄?x40銆?/p>
鍫嗙殑綆$悊錛屾垜浠彲浠ョ悊瑙d負(fù)涓涓唴瀛樻睜錛屽畠鐢寵涓澶у潡絀洪棿錛岀劧鍚庤礋璐f帴綆″簲鐢ㄧ▼搴忕殑鐢寵閲婃斁絳夎姹傘傚彧鏈夊湪鍒涘緩鍫嗭紝閲婃斁鍫嗭紙娉ㄦ剰錛佹槸閲婃斁鍫嗭紝涓嶆槸鍫嗕腑鐨勭┖闂達(dá)紒錛夊湪榪欎箣鍓嶏紝鎴戜滑闇瑕佸鍫嗘湁鍏崇殑鏁版嵁緇撴瀯鍋氫竴浜涜В閲?/p>
鎴戣繖閲岃瀵熷埌鐨凥EAP緇撴瀯錛孒EAP_SEGMENT緇撴瀯鍜孒EAP_ENTRY緇撴瀯閮藉拰杞歡璋冭瘯閲岄潰鎻忚堪鐨勪笉涓鏍鳳紝褰撳勾濂庡摜鍐欒蔣浠惰皟璇曠殑鏃跺欎及璁¤繕娌$敤涓奧IN7鍚с傘傘傛垜鐨勬紨紺虹郴緇熸槸WIN7
HeapCreate鍑芥暟榪斿洖鐨勫爢鍙ユ焺鍏跺疄灝辨槸涓涓寚鍚戝爢綆$悊緇撴瀯鐨勬寚閽堬紝姣忎釜鍫嗛兘浼?xì)娑夊強(qiáng)鍒皹q欐牱涓変釜緇撴瀯錛欻EAP,HEAP_SEGMENT,HEAP_ENTRY
HEAP_ENTRY緇撴瀯錛?/p>
鍦ㄥ爢綆$悊涓紝姣忎竴鍧楃敵璇蜂笅鏉ョ殑鍐呭瓨閮戒細(xì)鏈変笅闈㈡墍紺虹殑鍥哄畾妯″紡錛?/p>
|
HEAP_ENTRY錛? bytes錛?/p> |
|
鎴戜滑new鎴杕alloc鍒嗛厤鐨勭┖闂?/p> |
|
鍥哄畾濉厖絀洪棿 |
榪欎釜緇撴瀯鐢ㄦ潵璁板綍鎵鍒嗛厤鐨勭┖闂寸殑淇℃伅錛屽寘鎷敤鎴風(fēng)敵璇風(fēng)殑絀洪棿錛屽~鍏呯殑絀洪棿錛屾墍鍦ㄧ殑孌靛彿絳夌瓑淇℃伅銆傛墍浠ユ垜浠琻ew鎴栬卪alloc鐨勫湴鍧鍑忓幓8灝辨寚鍚戣緇撴瀯銆傜涓夐儴鍒嗙殑鍥哄畾濉厖絀洪棿鏄負(fù)浜嗗唴瀛樺榻愯岀敓鎴愮殑錛屽綋鐒惰繖閮ㄥ垎絀洪棿榪樻湁涓閮ㄥ垎鏄敤鏉ラ澶栬褰曡繖鍧楀唴瀛樼殑鍏跺畠淇℃伅錛岃繖閲屽氨涓嶈緇嗗仛浠嬬粛浜嗐?/p>
HEAP_SEGMENT緇撴瀯錛?/p>
鎴戜滑鍙互榪欎箞璁や負(fù)錛屽爢鐢寵鍐呭瓨鐨勫ぇ灝忔槸浠ユ涓哄崟浣嶇殑錛屽綋鏂板緩涓涓爢鐨勬椂鍊欙紝緋葷粺浼?xì)榛樿湄?fù)榪欎釜鍫嗗垎閰嶄竴涓鍙?鍙鋒錛岄氳繃鍒氬紑濮嬬殑new鍜宮alloc鍒嗛厤鐨勭┖闂撮兘鏄湪榪欎釜孌典笂鍒嗛厤鐨勶紝褰撹繖涓鐢ㄥ畬鐨勬椂鍊欙紝濡傛灉褰撳垵鍒涘緩鍫嗙殑鏃跺欐寚鏄庝簡HEAP_GROWABLE榪欎釜鏍囧織錛岄偅涔堢郴緇熶細(xì)涓鴻繖涓爢鍦ㄥ啀鍒嗛厤涓涓錛岃繖涓椂鍊欐柊鍒嗛厤鐨勬灝辯О涓?鍙鋒浜嗭紝浠ヤ笅浠ユ綾繪帹銆傛瘡涓鐨勫紑濮嬪垵渚挎槸HEAP_SEGMENT緇撴瀯鐨勯鍦板潃錛岀敱浜庤繖涓粨鏋勪篃鏄敵璇風(fēng)殑涓鍧楀唴瀛橈紝鎵浠ュ畠鍓嶉潰涔熶細(xì)鏈変釜HEAP_ENTRY緇撴瀯錛?/p>
|
HEAP_ENTRY錛? bytes錛?/p> |
|
HEAP_SEGMENT |
|
HEAP_ENTRY錛? bytes錛?/p> |
|
鎴戜滑new鎴杕alloc鍒嗛厤鐨勭┖闂?/p> |
|
鍥哄畾濉厖絀洪棿 |
HEAP_SEGMENT緇撴瀯浼?xì)璁板綍娈电殑涓浜涘熀鏈俊鎭紝璇ユ鐢寵鐨勫ぇ灝忥紝宸茬粡鎻愪氦鍐呭瓨鐨勫ぇ灝忥紝絎竴涓狧EAP_ENTRY緇撴瀯鐨勫叆鍙g偣銆傦紙鎴戣瀵熺湅璨屼技孌電敵璇風(fēng)殑鍐呭瓨騫朵笉浼?xì)涓嬈℃у叏閮ㄦ彁浜わ紝鑰屾槸姣忔鎻愪氦涓涓〉鐨勫ぇ灝忥紝姣斿涓涓澶у皬2涓〉錛岄偅涔堝畠浼?xì)鍏堟彁浜や竴涓〉鍐呭瓨錛岃嫢鐢ㄥ畬浜嗗啀鎻愪氦涓涓〉鐨勫唴瀛橈紝鑻ュ唴瀛樿繕鐢ㄥ畬浜嗛偅灝辨柊寤轟竴涓錛岃繖涓柊寤虹殑孌典篃浼?xì)鏄厛鎻愪氦涓涓〉鍐呭瓨銆傦級浣嗘槸0鍙鋒寰堢壒鍒紝榪欎釜孌電殑璧峰鍦板潃灝辨槸鍫嗗彞鏌勬寚閽堟寚鍚戠殑鍊鹼紝涔熷氨鏄錛?/font>HeapCreate榪斿洖鐨勫爢鍙ユ焺鎬繪槸鎸囧悜0鍙鋒錛屼負(fù)浠涔堝憿錛熷洜涓篐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鐨勬弿榪頒俊鎭?
} ;
鍦ㄦ垜浠湅鏉ワ紝鍐呭瓨緇勭粐緇撴瀯搴旇濡備笅鎵紺猴細(xì)
|
HEAP_ENTRY錛? bytes錛?/p> |
|
HEAP_SEGMENT |
|
HEAP |
鏇寸‘鍒囩殑璇達(dá)紝HEAP緇撴瀯涓湰韜氨鍖呭惈浜咹EAP_ENTRY鍜孒EAP_SEGMENT錛孒EAP_ENTRY緇撴瀯鏄疕EAP鐨勭涓涓暟鎹垚鍛橈紝HEAP_SEGMENT鏄畠絎簩涓暟鎹垚鍛樸傝屽浜嶩EAP_SEGMENT,瀹冪殑絎竴涓暟鎹垚鍛樹究鏄疕EAP_ENTRY銆傝繖閲屼負(fù)浜嗘柟渚跨悊瑙o紝鎵嶅湪鍐呭瓨緇勭粐緇撴瀯涓妸瀹冧滑鎷嗗紑灞曠ず銆傦紙娉細(xì)榪欓噷鏄痺in7鐨勬儏鍐碉紝鍜岃蔣浠惰皟璇曡繖鏈功涓墍鎻忚堪鐨勬湁涓浜涘樊寮傦紝涔熷睘姝e父鐜拌薄錛屾瘯绔熻繖閮ㄥ垎緇撴瀯寰蔣騫舵湭鍏紑錛?/p>
鍦ㄤ箣鍓嶅凡緇忔紨紺轟簡濡備綍浠嶱EB緇撴瀯涓壘鍒版墍鏈夌殑鍫嗗彞鏌勶紝鍙互鐪嬪埌002c0000渚挎槸鎴戜滑鍒涘緩鐨勫彞鏌勩傜劧鍚庢垜浠墽紺轟緥紼嬪簭鐨勭7琛屼唬鐮併傛墽琛屽畬鍚庣粨鏋滃涓嬶細(xì)
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淇濆瓨鐨勮繑鍥炲間負(fù)002c0590銆傛垜浠氳繃涓ょ閫斿緞鏉ヨ瀵熸垜浠敵璇風(fēng)殑鍐呭瓨錛岄氳繃!heap鍛戒護(hù)瑙傚療鍜岄氳繃dt鍛戒護(hù)瑙傚療
杈撳叆鍛戒護(hù)!heap 鈥揳 2c0590寰楀埌鐨勭粨鏋滃涓嬶細(xì)
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.
榪欎釜鍛戒護(hù)鍒嗗埆鎻愮偧鍑轟簡HEAP錛堢豢鑹插尯鍩燂級,HEAP_SEGMENT錛堢孩鑹插尯鍩燂級鍜孒EAP_ENTRY錛堢伆鑹插尯鍩燂級緇撴瀯涓殑淇℃伅銆傝櫧鐒跺湪鐏拌壊鍖哄煙涓紝鎴戜滑鎵句笉鍒?c0590錛屼絾鏄壘鍒頒簡涓涓?c0588錛岃繖涓鏄?c0590-8鐨勭粨鏋滐紝涔熷氨鏄鏈鍙寵竟鐨勫湴鍧鏄瘡涓狧EAP_ENTRY鐨勯鍦板潃錛屾帴鐫00588榪欎釜瀛楁琛ㄧず浜嗗墠闈竴涓狧EAP_ENTRY鎵鍗犵敤鐨勫ぇ灝忥紝鍚庨潰鐨?088琛ㄧず榪欎釜鍐呭瓨鍧楃殑鎬誨ぇ灝忥紝鍗蟲垜浠敵璇風(fēng)殑鍐呭瓨+HEAP_ENTRY錛?28+8=0x80+0x8=0x88錛夛紝[101]鏄繖鍧楀唴瀛樼殑鏍囧織浣嶏紝鏈鍙寵竟涓浣嶄負(fù)1琛ㄧず璇ュ唴瀛樺潡琚崰鐢ㄣ傜劧鍚巄usy錛?0錛夊氨鏄В閲婅榪欏潡鍐呭瓨鏄鍗犵敤鐨勶紙闈炵┖闂茬殑錛夛紝瀹冪敵璇風(fēng)殑鍐呭瓨涓?x80錛岃漿鍖栨垚鍗佽繘鍒舵濂藉氨鏄垜浠敵璇風(fēng)殑128瀛楄妭澶у皬銆?/p>
浣嗘槸榪欓噷鐢╠t _HEAP_ENTRY 2c0588鍛戒護(hù)鍗存病鍔炴硶鏌ョ湅瀵瑰簲鐨勭粨鏋勪俊鎭紝鐪熸槸鎬搲錛屾湁綃囧崥鏂囦篃鎻愬埌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鍛戒護(hù)鏄劇ず鐨勪俊鎭腑鐨凣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涓虹矑搴﹀垎閰嶇殑錛屾墍浠ヤ負(fù)榪欏潡121 bytes鐨勫唴瀛樿嚜鍔ㄥ~鍏呬簡7涓瓧鑺傦紝鍙鐢寵121 bytes鍜岀敵璇?28 bytes鎵浣跨敤鐨勭┖闂存槸涓鏍風(fēng)殑銆?/font>
鎵ц浜?1琛屽拰12琛岀殑浠g爜鍚庯紝鍫嗕腑鐨勫唴瀹瑰垎鍒涓嬶細(xì)
鎵ц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鍐呴儴閮戒細(xì)璋冪敤HeapAlloc鏉ョ敵璇峰唴瀛橈紝浣嗘槸鍫嗗彞鏌勪粠鍝潵鍛紵瀹冧細(xì)媯嫻媉crtheap鍙橀噺鏄惁涓虹┖錛岃嫢涓嶄負(fù)絀哄垯鎷縚crtheap鍙橀噺鏉ヤ綔涓鴻嚜宸辯殑鍫嗗彞鏌勫幓璋冪敤HeapAlloc
鍙傝冿細(xì)
杞歡璋冭瘯聽聽聽 寮犲閾?/p>
MSDN聽聽聽