国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

Win32調(diào)試API學習心得(二)

2019-11-18 18:30:36
字體:
供稿:網(wǎng)友
上一章講解了如何用調(diào)試API來打開一個被調(diào)試程序,并給出了一個簡單的例子,這一章將祥細
講解調(diào)試消息包含的內(nèi)容.

  類似于消息處理中的消息結(jié)構(gòu)TMessage一樣,調(diào)試事件也有自己特定的事件結(jié)構(gòu),那就是TDeb
ugEvent, TDebugEvent在Delphi中的定義為:
  TDebugEvent = _DEBUG_EVENT;
  _DEBUG_EVENT = record
    dwDebugEventCode: DWord;
    dwPRocessId: DWORD;
    dwThreadId: DWORD;
    case Integer of
      0: (Exception: TExceptionDebugInfo);
      1: (CreateThread: TCreateThreadDebugInfo);
      2: (CreateProcessInfo: TCreateProcessDebugInfo);
      3: (ExitThread: TExitThreadDebugInfo);
      4: (ExitProcess: TExitThreadDebugInfo);
      5: (LoadDll: TLoadDLLDebugInfo);
      6: (UnloadDll: TUnloadDLLDebugInfo);
      7: (DebugString: TOutputDebugStringInfo);
      8: (RipInfo: TRIPInfo);
  end;

  這個結(jié)構(gòu)很復(fù)雜,包含了三個基本類型和一個聯(lián)合類型的數(shù)據(jù).dwProcessId和dwThreadId指明
了產(chǎn)生調(diào)試事件的進程和線程的ID,dwDebugEventCode指明了產(chǎn)生了何種調(diào)試事件,可能的取值
如下表(摘自<<Win32匯編程序設(shè)計>>):
  1.CREATE_PROCESS_DEBUG_EVENT:進程被創(chuàng)建.當被調(diào)試進程剛被創(chuàng)建(還未運行) 或我們的程
序剛以DebugActiveProcess捆綁到一個運行中的進程時該事件發(fā)生. 這是我們的程序應(yīng)該獲得
的第一個事件. 
  2.EXIT_PROCESS_DEBUG_EVENT:被調(diào)試進程退出時產(chǎn)生此消息. 
  3.CREATE_THEAD_DEBUG_EVENT:當一個新線程在被調(diào)試進程中創(chuàng)建或我們的程序首次捆綁到運
行中的進程時該事件發(fā)生.要注意的是當被調(diào)試進程的主線程被創(chuàng)建時不會收到該通知.  
  4.EXIT_THREAD_DEBUG_EVENT:被調(diào)試進程中的線程退出時事件發(fā)生.被調(diào)試進程的主線程退出
時不會收到該通知.我們可以認為被調(diào)試進程的主線程與被調(diào)試進程是同義詞. 因此, 當我們
的程序看到CREATE_PROCESS_DEBUG_EVENT標志時,對主線程來說,就是CREATE_THREAD_DEBUG_E
VENT標志. 
  5.LOAD_DLL_DEBUG_EVENT:被調(diào)試進程裝入一個DLL.當PE裝載器第一次分解指向DLL的鏈接時
,我們將收到這一事件. (當調(diào)用CreateProcess裝入 被調(diào)試進程時)并且當被調(diào)試進程調(diào)用Lo
adLibrary時也會發(fā)生. 
  6.UNLOAD_DLL_DEBUG_EVENT:一個DLL從被調(diào)試進程中卸載時此事件發(fā)生.  
  7.EXCEPTION_DEBUG_EVENT:在被調(diào)試進程中發(fā)生異常時事件發(fā)生.異常實際上是一個調(diào)試中斷
(int 3h).如果想恢復(fù)被調(diào)試進程事,以 DBG_CONTINUE 標志調(diào)用ContinueDebugEvent 函數(shù). 
不要使用DBG_EXCEPTION_NOT_HANDLED 標志否則被調(diào)試進程會在NT下拒絕運行(Win98下運行得
很好). 
  8.OUTPUT_DEBUG_STRING_EVENT:當被調(diào)試進程調(diào)用DebugOutputString函數(shù)向我們的程序發(fā)送
消息字符串時該事件發(fā)生.  
  9.RIP_EVENT:系統(tǒng)調(diào)試發(fā)生錯誤.


  根據(jù)dwDebugEventCode的不同,應(yīng)調(diào)用聯(lián)合中相應(yīng)的結(jié)構(gòu)來獲得相關(guān)的調(diào)試信息.例如我們有
個名為Debug的TDebguEvent的結(jié)構(gòu),在調(diào)用WaitForDebugEvent(Debug, INFINITE)后接收到調(diào)
試信息時,并且dwDebugEventCode的值為CREATE_PROCESS_DEBUG_EVENT,我們就可以通過仿問D
ebug.CreateProcessInfo.hProcess來獲得剛創(chuàng)建的被調(diào)試進程的進程句柄.

  下面將祥細講解TDebugEvent結(jié)構(gòu)中可能包括的每個結(jié)構(gòu)的含義.因為沒有相關(guān)的祥細資料,大
部分結(jié)果是靠測試所得,如有錯漏敬請指正.

  一.CreateProcessInfo結(jié)構(gòu): 對應(yīng)的調(diào)試消息CREATE_PROCESS_DEBUG_EVENT.
CreateProcessInfo.hFile:被調(diào)試進程的EXE文件被映射到內(nèi)存中的內(nèi)存文件映射句柄,可以
通過打開這個句柄(用OpenFileMapping和MapViewOfFile)來讀取此EXE文件的相關(guān)信息.如引入
引出表等.
CreateProcessInfo.hProcess:被調(diào)試進程的進程句柄,如果要使用ReadProcessMemory和Wri
teProcessMemory等函數(shù)來修改被調(diào)試進程,就需要用到這個句柄,可以用一個變量保存起來供
以后使用.
CreateProcessInfo.hThread:主線程句柄.
CreateProcessInfo.lpBaSEOfImage:可執(zhí)行文件被裝載到虛似地址空間中的基址.
CreateProcessInfo.dwDebugInfoFileOffset:調(diào)試信息在可執(zhí)行文件中的偏移地址(一般為0
,即沒有調(diào)試信息).
CreateProcessInfo.nDebugInfoSize:調(diào)試信息的長度.
CreateProcessInfo.lpThreadLocalBase:主線程基址.
CreateProcessInfo.lpStartAddress:主線程的線程函數(shù)地址.
CreateProcessInfo.lpImageName:文件映像名,注意這是一個RVA地址(相對虛擬地址).
CreateProcessInfo.fUnicode:如果此值大于0,則lpImageName指向的文件名為UNICODE碼.

  二.ExitProcess結(jié)構(gòu): 對應(yīng)的調(diào)試消息EXIT_PROCESS_DEBUG_EVENT.
ExitProcess.dwExitCode:即被調(diào)試程序調(diào)用ExitProcess函數(shù)時傳入的退出代碼.

  三.CreateThread結(jié)構(gòu): 對應(yīng)的調(diào)試消息CREATE_THEAD_DEBUG_EVENT.
CreateThread.hThread:新建線程的句柄.線程句柄,如果以后會涉及到對線程的操作,如掛起
線程等,則可以用一個TList來保存進程ID(TDebugEvent.dwThreadId)和相對應(yīng)的句柄.再在其
它調(diào)試事件發(fā)生時,根據(jù)dwThreadId得到線程句柄.
CreateThread.lpThreadLocalBase:新線程的基址.
CreateThread.lpStartAddress:新線程的線程函數(shù)地址.

  四.ExitThread結(jié)構(gòu): 對應(yīng)的調(diào)試消息EXIT_THREAD_DEBUG_EVENT.
ExitThread.dwExitCode:即退出的線程調(diào)用ExitThread函數(shù)時傳入的退出代碼.

  五.LoadDll結(jié)構(gòu): 對應(yīng)的調(diào)試消息LOAD_DLL_DEBUG_EVENT.
LoadDll.hFile:被加載的DLL文件映射到內(nèi)存中的內(nèi)存文件映射句柄,可以通過打開這個句柄
來讀取此DLL文件的相關(guān)信息.
LoadDll.lpBaseOfDll:DLL文件被裝載到虛似地址空間中的基址.這個地址加上DLL文件引出的
函數(shù)的地址,就是這個函數(shù)在內(nèi)存中的地址.
LoadDll.dwDebugInfoFileOffset:調(diào)試信息在DLL文件中的偏移地址.
LoadDll.nDebugInfoSize:調(diào)試信息的長度.
LoadDll.lpImageName:DLL文件名的地址,是一個RVA地.
LoadDll.fUnicode:如果此值大于0,則lpImageName指向的文件名為UNICODE碼.

  六.UnLoadDll結(jié)構(gòu): 對應(yīng)的調(diào)試消息UNLOAD_DLL_DEBUG_EVENT.
UnloadDll.lpBaseOfDll:卸載的DLL文件的基址,可以通過在處理LOAD_DLL_DEBUG_EVENT消息
中保存DLL信息和對應(yīng)的基址的方法,來得到卸載的DLL信息.

  七.Exception結(jié)構(gòu): 對應(yīng)的調(diào)試消息EXCEPTION_DEBUG_EVENT.
Exception.ExceptionRecord: 這是一個TExceptionRecord結(jié)構(gòu),里面包含了被調(diào)試程序產(chǎn)生
的中斷或異常的代碼,產(chǎn)生的中斷或異常的地址等信息.

  八.DebugString結(jié)構(gòu): 對應(yīng)的調(diào)試消息OUTPUT_DEBUG_STRING_EVENT.
DebugString.lpDebugStringData:被調(diào)試進程調(diào)用DebugOutputString函數(shù)發(fā)送的消息字符串
的地址.
DebugString.nDebugStringLength:被調(diào)試進程調(diào)用DebugOutputString函數(shù)發(fā)送的消息字符
串的長度.
DebugString.fUnicode:如果此值大于0,則消息字符串為UNICODE碼.

  九.RipInfo結(jié)構(gòu): 對應(yīng)的調(diào)試消息RIP_EVENT.
RipInfo.dwError:錯誤代碼.
RipInfo.dwType:錯誤類型.

  了解了以上的知識,我們就可以在調(diào)試器中監(jiān)視這些調(diào)試消息,并獲得我們感興趣的信息.但這
僅僅實現(xiàn)了對被調(diào)試調(diào)試程序的監(jiān)視.下一章將講解如何修改被調(diào)試程序.

上一篇:關(guān)于在VCL寫作過程中提示找不Proxies單元的解決方法

下一篇:tlistview使用--拖放操作

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 屏东县| 伽师县| 莒南县| 微博| 宁明县| 富裕县| 长治市| 张家川| 资阳市| 定日县| 浦县| 大姚县| 焉耆| 泾川县| 盐源县| 广宁县| 萍乡市| 抚松县| 桓仁| 石门县| 漠河县| 曲靖市| 潍坊市| 临夏县| 晋州市| 宁国市| 延川县| 和顺县| 舒兰市| 平顶山市| 长汀县| 富阳市| 将乐县| 泗水县| 商都县| 英吉沙县| 清丰县| 鄯善县| 辽宁省| 阿克| 赞皇县|