日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

gflags调试访问越界

發(fā)布時(shí)間:2025/1/21 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gflags调试访问越界 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  2011-9-27

  燭秋

?

  昨天、今天調(diào)dump,對(duì)windbg相當(dāng)?shù)牟皇煜?#xff0c;但也慢慢的知道了一些常用的命令,幾周前聽(tīng)說(shuō)到有g(shù)flags這樣個(gè)工具,今天正好測(cè)試下。

?

  gflags.exe是<Debugging Tools for Windows>中的一個(gè)小工具。

  安裝下載鏈接:http://msdn.microsoft.com/en-us/windows/hardware/gg463016

?

  安裝好之后,把gflags所在文件夾(這里邊還有很多好東西)設(shè)置到環(huán)境變量的path中,方便命令行使用。(我的電腦-->右鍵-->屬性-->高級(jí)-->環(huán)境變量-->系統(tǒng)變量-->path)

?

  在命令行cmd里輸入:cdb -iae 。

  設(shè)置cdb為默認(rèn)JIT(just in time) debugger,這樣在命令行執(zhí)行遇到崩潰的時(shí)候就會(huì)停下來(lái)。

?

  (本文最后的學(xué)習(xí)資料相當(dāng)好)

?

?

測(cè)試程序:///int main(){char *p = new char[10];for(int i = 0; i != 11; ++i) p[i] = i;return 0;}///

?

  ?這是一個(gè)非常簡(jiǎn)單的越界程序,當(dāng)i = 10時(shí),訪問(wèn)越界了。但是如果不采用測(cè)試工具,這里是不會(huì)發(fā)生崩潰的。一般情況下,程序獲取的空間是16字節(jié)對(duì)齊的,所以p[10]訪問(wèn)到的是對(duì)齊之后增加的空間,不會(huì)導(dǎo)致越界崩潰。但這是隱患,為了使隱患盡早被發(fā)現(xiàn),使用工具是很好的選擇。
  gflags用來(lái)跟蹤這個(gè)程序的執(zhí)行,可以設(shè)置每一次new分配的堆空間都單獨(dú)的占有一塊空間,并且這個(gè)空間相鄰的位置被設(shè)置為不可訪問(wèn)的,一旦訪問(wèn)越界立即觸發(fā)訪問(wèn)無(wú)效錯(cuò)誤,盡早的觸發(fā)崩潰。

  測(cè)試過(guò)程如下:

1、用vc編譯出release版本的可執(zhí)行文件:test.exe。(注意:不是debug版本)

2、用gflag注冊(cè)需要監(jiān)控的可執(zhí)行文件test.exe。

在cmd下,輸入命令如下:gflags /p /enable test.exe /full /unaligned

回車,顯示如下信息:

*************************************************************************************

path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

??test.exe: page heap enabled。

*************************************************************************************

這個(gè)時(shí)候,已經(jīng)把要監(jiān)控的test.exe注冊(cè)上了。

?

/p /enable是必備的。

/full說(shuō)明分配的空間是獨(dú)占的,并且相鄰的是不可訪問(wèn)的空間。

/unaligned說(shuō)明分配空間時(shí)不對(duì)齊,保證一旦越界立即發(fā)現(xiàn),不會(huì)因?yàn)閮?nèi)存對(duì)齊而隱藏起來(lái)。

3、接著雙擊執(zhí)行test.exe,這個(gè)時(shí)候,會(huì)中斷下來(lái):

*************************************************************************************

(17f8.5d0): Access violation - code c0000005 (!!! second chance !!!)

eax=0161eff6 ebx=7c80ac61 ecx=0000000a edx=015c5000 esi=00000002 edi=00000a28

eip=00401010 esp=0012ff74 ebp=0012ffc0 iopl=0 ? ? ? ? nv up ei ng nz ac pe cy

cs=001b ?ss=0023 ?ds=0023 ?es=0023 ?fs=003b ?gs=0000 ? ? ? ? ? ? efl=00000297

WindbgTest!main+0x10:

00401010 880c01 ? ? ? ? ?mov ? ? byte ptr [ecx+eax],cl ? ? ?ds:0023:0161f000=??

*************************************************************************************

如果把exe放到windbg里執(zhí)行,用命令:!address,可以發(fā)現(xiàn)eax是可以讀寫的,

eax+ecx是不可訪問(wèn)的:

*************************************************************************************

0:000>?!address eax

?? ?015c0000 : 0161e000 - 00001000

?? ?Type ? ? 00020000 MEM_PRIVATE

?? ?Protect ?00000004 PAGE_READWRITE

?? ?State ? ?00001000 MEM_COMMIT

?? ?Usage ? ?RegionUsagePageHeap

?? ?Handle ? 015c1000

0:000>?!address eax+ecx

?? ?015c0000 : 0161f000 - 000a1000

?? ?Type ? ? 00020000 MEM_PRIVATE

?? ?Protect ?00000001 PAGE_NOACCESS

?? ?State ? ?00001000 MEM_COMMIT

?? ?Usage ? ?RegionUsagePageHeap

?? ?Handle ? 015c1000

*************************************************************************************

4、取消跟蹤:

通過(guò)/p命令可以看到當(dāng)前跟蹤的程序有哪些:

*************************************************************************************

C:\Documents and Settings\cs_wuyg>gflags /p

path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

?? ?player.exe: page heap enabled with flags (full traces )

?? ?program: page heap enabled with flags (full unaligned traces )

?? ?test.exe: page heap enabled with flags (full unaligned traces )

?? ?windbgtest.exe: page heap enabled with flags (full unaligned traces )

*************************************************************************************

通過(guò)/p /disble取消跟蹤:情況如下:

*************************************************************************************

C:\Documents and Settings\cs_wuyg>gflags /p /disable player.exe

path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

?? ?player.exe: page heap disabled

?

C:\Documents and Settings\cs_wuyg>gflags /p

path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

?? ?program: page heap enabled with flags (full unaligned traces )

?? ?test.exe: page heap enabled with flags (full unaligned traces )

?? ?windbgtest.exe: page heap enabled with flags (full unaligned traces )

*************************************************************************************

?? 發(fā)現(xiàn)program是無(wú)法取消的,很奇怪。另外,發(fā)現(xiàn)注冊(cè)表里相應(yīng)的項(xiàng)目在disable之后,仍然存在,只不過(guò)一些鍵值被刪除掉了。

?? 同事跟我說(shuō),不使用gflags的時(shí)候,最好把注冊(cè)表里的項(xiàng)目刪除,gflags對(duì)機(jī)器性能的影響很大。

?? 注冊(cè)表的位置是:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/WindowsNT/Image File Execution Options

?

5、注意事項(xiàng)

一、gflags要跟蹤的程序,是把這個(gè)程序的名稱記錄到了注冊(cè)表中,在設(shè)置的時(shí)候不需要可執(zhí)行文件的路徑名,只需要文件名稱。

二、可以使用命令行,也可以使用GUI界面。GUI界面中的前兩個(gè)TAB頁(yè)面是對(duì)所有的可執(zhí)行程序都有效的。第三個(gè)才是設(shè)置想要跟蹤的程序。

三、還有其它更強(qiáng)大的工具。

6、總結(jié)

通過(guò)這個(gè)工具的簡(jiǎn)單使用,就可以很快發(fā)現(xiàn)代碼中有訪問(wèn)越界。

??在大工程下,是否也非常有用,現(xiàn)在還沒(méi)實(shí)踐過(guò)。

使用gflags,并且在VS下調(diào)試,有源代碼更方便。

?

?

?

?

?

?

?

?

?

7、附今天用上的幾個(gè)windbg命令:

1\ !analyze -v

2\ kv ? kf ? ?kb

3\ ~*k

4\ .ecxr

5\ lmvm xxx.exe?? ? ? ??

?

分析dump的時(shí)候,看調(diào)用堆棧是從下往上看的。

調(diào)用堆棧前部分的數(shù)值一部分是參數(shù),一部分是無(wú)用的信息。

設(shè)置好source file path之后,.ecxr命令可以看到當(dāng)前的寄存器信息,還可以看到源代碼。

?

發(fā)現(xiàn)很多的崩潰是由于空指針、野指針導(dǎo)致的。而空指針、野指針是由于多線程導(dǎo)致卸載、裝載重疊導(dǎo)致的。

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

學(xué)習(xí)資料:

http://www.cppblog.com/sandy/archive/2007/03/13/19723.html

http://blog.csdn.net/ayw_hehe/article/details/6796333

http://www.cppblog.com/sandy/archive/2008/09/27/62877.html

http://www.cnblogs.com/awpatp/archive/2011/01/01/1923913.html

http://blog.sina.com.cn/s/blog_484f16880100jrwj.html

?

總結(jié)

以上是生活随笔為你收集整理的gflags调试访问越界的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。