天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

Visual Studio插件GDIWatch實(shí)現(xiàn)淺析

  GDIWatch 是Virgo Software 開(kāi)發(fā)的一個(gè)for Visual Studio的插件,支持2005/2008/2010,它的功能主要是在一個(gè)類似watch的窗口上顯示被調(diào)試程序的GDI對(duì)象的當(dāng)前狀態(tài),比如HBRUSH的顏色,大小,圖片等等,并且它還能在調(diào)試過(guò)程中高亮顯示有變化的項(xiàng)目,方便程序員跟蹤調(diào)試畫(huà)圖函數(shù)。

  下載地址: http://www.gdiwatch.com/GDIWatch.msi

  (小聲說(shuō)一下,crack在文中提供了) 

  這是官方的截圖:

  順便再貼一個(gè) GDIWatch 在 VS2010上使用的效果圖:

  感覺(jué)還不賴,使用起來(lái)也挺方便的,就是拽個(gè)變量到它上面就可以了。

  GDIWatch 不是免費(fèi)軟件,作者給了15天的試用期,如果需要繼續(xù)使用就要到官網(wǎng) www.gdiwatch.com 聯(lián)系作者獲取注冊(cè)碼。

  P.S. 話說(shuō)前天我在公司正好想上他的網(wǎng)站看看價(jià)錢(qián)如何,結(jié)果發(fā)現(xiàn)他的主頁(yè)不知出現(xiàn)神馬問(wèn)題沒(méi)法顯示了,囧啊。

  P.P.S. 印象中貌似是要100多美刀的樣子。

  P.P.P.S. 在15天后我偶爾還想繼續(xù)使用,但是中國(guó)國(guó)情告訴我,花100多美刀買(mǎi)個(gè)插件是稍微有點(diǎn)貴了的說(shuō),而且目前在公司還沒(méi)用上VS2010,所以便可恥地嘗試crack,沒(méi)想到很好crack的說(shuō),稍微改動(dòng)一下居然就搞定了,主要是該作者的防范意識(shí)不夠啊,犯了很多防破解的大忌,給了人家很多線索,有需要的童鞋請(qǐng)猛擊此處下載,適用于1.5.1.254版本,替換原版之前請(qǐng)自行備份以防萬(wàn)一!

  好了, 言歸正傳,我當(dāng)初之所以找到這個(gè)軟件是因?yàn)榍瓣囎右恢痹趯?xiě)畫(huà)圖的代碼,本來(lái)是想說(shuō)在網(wǎng)上找個(gè)VC6的插件的(沒(méi)辦法,公司還是在用),先是在 CodeProject 上找到一篇某位國(guó)人很久以前發(fā)表的文章,可是他居然不是開(kāi)源的(這不坑爹嗎),而且遠(yuǎn)沒(méi)有 GDIWatch 那么方便好用(不給力啊),最奇怪的是CodeProject 居然讓他把文章給發(fā)表上去了(我勒個(gè)去),真是無(wú)奈。

  不過(guò)該作者倒是簡(jiǎn)單提到了一下他實(shí)現(xiàn)的方法:

  The steps to do watch Image is :
  (1)get the selection text by ISelectionText interface
  (2)get the value of selection text by IDebugger interface
  (3)Read the memeory or bitmap data from the debugged process memory space
  (4)show it

  最后只找到這個(gè)支持VS2005+的 GDIWatch,于是開(kāi)始尋思這玩意怎么實(shí)現(xiàn),我想如果不是很復(fù)雜的話說(shuō)不定可以在閑暇時(shí)間做一個(gè)for VC6的版本出來(lái)的說(shuō)。

  我首先思考的是要實(shí)現(xiàn)這樣的插件最重要是要解決哪些問(wèn)題:

  1、最最重要的是,必須能夠跨進(jìn)程“訪問(wèn)”被調(diào)試進(jìn)程的GDI objects,這是當(dāng)然的;

  2、必須能跟VS協(xié)調(diào)運(yùn)作,響應(yīng)調(diào)試動(dòng)作并及時(shí)更新GUI,要像VS自己的watch那么好用;

  3、必須有界面能顯示GDI objects,這......必須的;

  當(dāng)然要完善這個(gè)插件的話,還需要盡量滿足下列條件:

  1、避免使用undocumented trick,保證兼容性;

  2、如GDIWatch那樣支持拖放變量名到GUI上;

  3、高亮有變化的內(nèi)容,方便跟蹤;

  在定下上面這些條件后,下一步就是逐個(gè)解決問(wèn)題了。

  首先,要獲取GDI對(duì)象的屬性,基本是要走這條路:

DWORD GetObjectType(__in  HGDIOBJ h);

HGDIOBJ GetCurrentObject(__in  HDC hdc,__in  UINT uObjectType);

int GetObject(__in   HGDIOBJ hgdiobj, __in   int cbBuffer, __out  LPVOID lpvObject);

  然而,GDI對(duì)象是基于進(jìn)程的,GDIWatch作為一個(gè)插件,也就是VS的一個(gè)DLL,它如果要拿被調(diào)試進(jìn)程的GDI對(duì)象句柄來(lái)直接用必然是不行的,

  GDI objects 也不在 DuiplicateHandle 這個(gè)API支持的 object handle 的范疇之內(nèi)。

  當(dāng)然了,GDI對(duì)象畢竟也是數(shù)據(jù),在用戶模式不能做到的,在內(nèi)核模式肯定有奇淫巧計(jì)可以做到,比如說(shuō)訪問(wèn)GDI對(duì)象表:

http://topic.csdn.NET/t/20031009/14/2337150.html

http://hi.baidu.com/qzccan/blog/item/154b542375171440ac34de08.html

  說(shuō)起來(lái)有一款軟件很可能就是這么實(shí)現(xiàn)的,叫做 GDIView,它可以查看指定進(jìn)程當(dāng)前打開(kāi)的所有GDI objects并顯示其屬性:

  不過(guò)這些都屬于tricks,不是標(biāo)準(zhǔn)的做法,而且我也不熟悉具體實(shí)現(xiàn)方法,所以只能放棄。

  其實(shí),畢竟目標(biāo)進(jìn)程是在被調(diào)試的狀態(tài)下,這還是給了插件解決這個(gè)問(wèn)題的環(huán)境,或者說(shuō)至少有一些條件可以被利用。

  調(diào)試器是可以有辦法讀寫(xiě)被調(diào)試進(jìn)程的內(nèi)存的,可以在被調(diào)試進(jìn)程的運(yùn)行空間插入一段代碼讓它執(zhí)行,只要上面提到的 GetObjectType 等API是在被調(diào)試進(jìn)程的領(lǐng)域執(zhí)行的,那么句柄就是有效的,自然能得到所需的結(jié)果。

  要讀寫(xiě)內(nèi)存,必然是這條路:

HANDLE WINAPI OpenProcess(__in  DWORD dwDesiredAccess,  __in  BOOL bInheritHandle,  __in  DWORD dwProcessId);

BOOL WINAPI ReadProcessMemory(__in   HANDLE hProcess,  __in   LPCVOID lpBaseAddress,  __out  LPVOID lpBuffer,  __in   SIZE_T nSize,  __out  SIZE_T *lpNumberOfBytesRead);

LPVOID WINAPI VirtualAllocEx(__in HANDLE hProcess,  __in_opt LPVOID lpAddress,  __in SIZE_T dwSize,  __in DWORD flAllocationType,  __in DWORD flProtect);

BOOL WINAPI WriteProcessMemory(__in   HANDLE hProcess,  __in   LPVOID lpBaseAddress,  __in   LPCVOID lpBuffer,  __in   SIZE_T nSize,  __out  SIZE_T *lpNumberOfBytesWritten);

  接下來(lái)的事情大概是這樣:

  設(shè)計(jì)一段代碼,主要做的事情是接受指定的GDI句柄,然后通過(guò) GetObjectType/GetCurrentObject/GetObject 等API去獲取 GDI object 的相關(guān)信息,然后將結(jié)果保存在某個(gè)buffer。

  假設(shè)這段代碼是一個(gè)C函數(shù),那么代碼大致是:

typedef struct tagBrushInfo{    HBRUSH      hBrush;    LOGBRUSH    logBrush;}BrushInfo, *PBrushInfo;typedef struct tagPenInfo{    HPEN		hPen;    LOGPEN      logPen;}PenInfo, *PPenInfo;typedef struct tagDCInfo{    HDC         hDC;    BrushInfo   brushInfo;    PenInfo     penInfo;}DCInfo, *PDCInfo;LPVOID GetGDIObjectInfo(HGDIOBJ hGDIObjects){	LPVOID pInfo = NULL;    DWORD dwObjType = GetObjectType(hGDIObjects);    switch ( dwObjType )    {    case OBJ_DC:        {			PDCInfo pDCInfo = new DCInfo;            pDCInfo->hDC = (HDC)hGDIObjects;            // retrieve the brush info            pDCInfo->brushInfo.hBrush = (HBRUSH)GetCurrentObject(pDCInfo->hDC, OBJ_BRUSH);            if ( pDCInfo->brushInfo.hBrush )            {                GetObject(pDCInfo->brushInfo.hBrush, sizeof(LOGBRUSH), &pDCInfo->brushInfo.logBrush);            }            // retrieve the pen info            pDCInfo->penInfo.hPen = (HPEN)GetCurrentObject(pDCInfo->hDC, OBJ_PEN);            if ( pDCInfo->penInfo.hPen )            {                GetObject(pDCInfo->penInfo.hPen, sizeof(LOGPEN), &pDCInfo->penInfo.logPen);            }            pInfo = pDCInfo;        }        break;    case OBJ_BRUSH:        if ( hGDIObjects )        {			PBrushInfo pBrushInfo = new BrushInfo;            GetObject(hGDIObjects, sizeof(LOGBRUSH), &pBrushInfo->logBrush);			pInfo = pBrushInfo;        }        break;    }    return pInfo;}

NET技術(shù)Visual Studio插件GDIWatch實(shí)現(xiàn)淺析,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产成人小视频在线观看 | 色婷婷综合久久久久中文一区二区 | 精品一卡2卡三卡4卡乱码精品视频 | 黄色精品视频 | 无套日出白浆在线播放 | 日韩精品 中文字幕 有码 | 欧美午夜免费观看福利片 | 俄罗斯极品hd | 亚洲蜜芽在线观看精品一区 | 18禁黄无遮挡禁游戏在线下载 | 伦理79电影网在线观看 | 久久精品在现线观看免费15 | 99久久精品免费看国产一区二区 | 成人网站国产在线视频内射视频 | 蜜芽丅v新网站在线观看 | 久久er国产精品免费观看2 | 欧美国产一区二区三区激情无套 | 日本一本免费线观看视频 | 最近中文字幕高清中文 | 久就热视频精品免费99 | 99精品在线免费 | 亚洲天堂一区二区三区 | 超碰在线视频 免费 | 国产精品人妻无码久久久奥特曼 | 天天操夜夜噜 | 一区三区不卡高清影视 | 少妇高潮A片特黄久久精品网 | 国产成人精品自线拍 | 共妻肉多荤文高h一女n男 | 麻豆精选2021 | 乱xxxjapanese黑人| 无人在线观看免费高清视频播放 | 肉动漫无码无删减在线观看 | 女张腿男人桶羞羞漫画 | 欧美18精品久久久无码午夜福利 | 国产精品69人妻无码久久久 | 熟妇久久无码人妻AV蜜桃 | 亚洲欧美在无码片一区二区 | 桃花在线视频观看免费 | 国产高清美女一级a毛片久久w | 国产成人精品免费视频软件 |