亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Win32調試API學習心得(一)

2019-11-18 18:35:00
字體:
來源:轉載
供稿:網友
  最近學習了一下WIN32的調試API,并做了一個簡單的調試器,略有心得,特寫出來希望對需要的朋友有所幫助.
參考資料:lczlion:<<win32匯編程序設計>>
               彭春華:<<用Debug函數實現API函數的跟蹤>>

概述:
   Windows提供了一組供程序員使用的API,使用這些API,我們能夠建立或捆綁到已運行的程序上來對他們進行調試,能獲得程序的底層信息和調試信息.如果你原意的話,甚至可以對被調試程序進行任意的修改(用WritePRocessMemory).

    先讓我們從一個有趣的小例子開始吧: 打開DELPHI,新建工程,然后雙擊主窗體,在主窗體的Create事件中寫下如下代碼.
procedure TForm1.FormCreate(Sender: TObject);
var
  isDebuggerPresent: function:Boolean;
  DllModule: THandle;
begin
  DllModule := LoadLibrary('kernel32.dll');
  isDebuggerPresent := GetProcAddress(DllModule, 'IsDebuggerPresent');
  if isDebuggerPresent then
  begin
    MessageBox(self.Handle, '請不要調試我!', '抗議', MB_OK or MB_ICONASTERISK);
    application.Terminate;
  end;
end;
     按F9運行,程序執行得并不順利,在彈出來一個抱怨你調試了它的窗口后就中止了.然后我們再在DELPHI的Projecs目錄下找到剛剛編釋出來的程序, 雙擊執行它,這次窗口就老老實實的出來了,這是怎么回事呢?

    原來上面的isDebuggerPresent就是Win32調試API中的一員,它的作用是判斷調用它的進程是否在調試描述表下運行(也就是是否處于被調試狀態),另一方面也說明了DELPHI的調試器也是用Win32調試API實現的.這下對調試API有興趣了吧?那讓我們來繼續深入調試API的世界!

得到一個供調試的程序:
    由于我們的程序要扮演調試器的角色,我們還必需要有一個供調試的程序.這個程序可以通過二種方法獲得:
   1:使用DebugActiveProcess函數.
     這個函數的定義是DebugActiveProcess(dwProcessID: DWord):Bool; stdcall, dwProcessID用于指定被調試的進程的標識符,如果函數調用成功返回TRUE,失敗返回FALSE.注意,如果是在NT/2000/XP上,如果目標進程是由一個安全描述器創建的,而該安全描述符使調試器沒有充分的訪問權,那么此函數的調用可能失敗. 
   2:使用CreateProcess函數.
    這個函數的定義是CreateProcess(lpApplicationName: PChar; lpCommandLine:     PChar;lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
  bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
  lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo;
  var lpProcessInformation: TProcessInformation): BOOL; stdcall
    由于篇幅原因,這兒就不詳解CreateProcess的每個參數的含義,具體請參考API大全,我們這兒只談如何創建一個被調試的進程.即設置dwCreationFlags參數,你可以指定DEBUG_PROCESS標志來建立一個被調試進程,同時被調試進程的子進程的調試信息也將通知我們的調試器.還可以指定DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS標志來表示只調試當前過程.

處理調試信息:
    當我們用上面的方法之一打開了被調試的程序后,我們的程序應調用WaitForDebugEvent等待處理調試事件.它阻塞調用線程直到調試的事件發生.此函數的定義是:
  WaitForDebugEvent(var lpDebugEvent: TDebugEvent; dwMilliseconds: DWORD): BOOL; stdcall;
其中lpDebugEvent結構將在調試事件發生時返回發生的調試事件信息.dwMilliseconds值指定函數等待調試事件的時間,以毫秒為單位,一般設為INFINITE,表示一直等待直到調試事件發生.
    這有點于類似于一個消息循環.我們一般都會新建一個線程,在線程中使用DebugActiveProcess或CreateProcess得到一個供調試的程序,然后用一個循環調用WaitForDebugEvent來處理隨后發生的調試事件.至于為什么要在新的線程中處理呢?你不會想你的調試器一打開被調試程序后就一動也不能動了吧 ;-)

繼續運行被調試程序:
    當調試事件發生后,被調試程序會被WINDOWS掛起,當我們處理完了調試事件后,還要讓被調試程序繼續運行,這就要用到ContinueDebugEvent函數,定義如下:
  ContinueDebugEvent(dwProcessId, dwThreadId, dwContinueStatus: DWORD): BOOL; stdcall;
其中dwProcessID和dwThreadID是要被恢復的進程和線程ID,可以從lpDebugEvent結構中的dwProcessID和dwThreadID取得.dwContinueStatus是指明如何恢復線程,可能的取值有DBG_CONTINUE 和DBG_EXCEPTION_NOT_HANDLED,DBG_CONTINUE指明了如果被調試程序發生了異常,由調試器來處理異常.DBG_EXCEPTION_NOT_HANDLED則表示調試器不處理被調試程序的異常,由被調試程序的默認異常處理程序來處理異常.

下面是一個簡單的例子,實現了監視被調試程序的建立和退出.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{調試信息處理過程} 
procedure DebugPro;
var
  si: _STARTUPINFOA;       {進程啟動信息}
  pi: _PROCESS_INFORMATION; {進程信息}
  Flage: DWORD;
  DebugD: DEBUG_EVENT;  {調試事件}
  Rc: Boolean;
begin
  {建立調試進程}
  Flage := DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS;
  GetStartupInfo(si);    {初始化si結構,不然無法正常建立進程}
  if not CreateProcess(nil, Pchar('C:/winnt/NOTEPAD.EXE C:/Boot.ini'), nil, nil,
    False, Flage, nil, nil, si, pi) then
  begin
    MessageBox(Application.Handle, '建立被調試進程失敗', '!!!', MB_OK or MB_ICONERROR);
    exit;
  end;
  while WaitForDebugEvent(DebugD, INFINITE) do
  begin  {根據事件代碼進行相應處理}
    case DebugD.dwDebugEventCode of
      EXIT_PROCESS_DEBUG_EVENT:
      begin
        MessageBox(Application.Handle, '被調試進程中止', '!!!', MB_OK or MB_ICONERROR);
        Break;
      end;
      CREATE_PROCESS_DEBUG_EVENT:
        MessageBox(Application.Handle, '被調試進程建立', '!!!', MB_OK or MB_ICONERROR);
      EXCEPTION_DEBUG_EVENT:
      begin
        if (DebugD.Exception.ExceptionRecord.ExceptionCode <> EXCEPTION_SINGLE_STEP) and
           (DebugD.Exception.ExceptionRecord.ExceptionCode <> EXCEPTION_BREAKPOINT) then
          Rc := False    {如果被調試程序產生了異常,讓它自己處理}
        else
          Rc := True;
      end;
    end;
    if Rc then
      ContinueDebugEvent(DebugD.dwProcessId, DebugD.dwThreadId,
         DBG_CONTINUE)
    else
      ContinueDebugEvent(DebugD.dwProcessId, DebugD.dwThreadId,
         DBG_EXCEPTION_NOT_HANDLED);
  end;
  CloseHandle(pi.hProcess);
  Closehandle(pi.hThread);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ThreadHandle, ThreadID: THandle;
begin
  ThreadHandle := CreateThread(nil, 0, @DebugPro, nil, 0, ThreadID);
end;

end.

下一篇文章將祥細講解調試事件的處理和事件結構的含義.敬請關注.


上一篇:組件技術的本質COM實例分析一

下一篇:讀取硬盤的物理序列號

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

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品一久久香蕉国产线看观看| 欧美麻豆久久久久久中文| 国产不卡av在线免费观看| 国产男女猛烈无遮挡91| 日韩欧美在线网址| 日韩av一区在线观看| 91美女片黄在线观| 日韩免费在线播放| 少妇高潮久久久久久潘金莲| 国产亚洲一区二区精品| 欧美丰满片xxx777| 日韩一区二区精品视频| 国产精品爽爽爽爽爽爽在线观看| 91精品久久久久| 亚洲a区在线视频| 亚洲一区二区三区777| 国产亚洲视频在线观看| 欧美成人午夜影院| 日韩在线观看免费| 伊人成人开心激情综合网| 亚洲色图13p| 成人亲热视频网站| 欧美日韩免费区域视频在线观看| 国产精品偷伦免费视频观看的| 午夜精品福利在线观看| 成人高h视频在线| 92版电视剧仙鹤神针在线观看| 国产精品亚洲片夜色在线| 国产精品视频区1| 色无极亚洲影院| 国产精品九九久久久久久久| 影音先锋欧美精品| 国产精品一区二区性色av| 久久久久国产一区二区三区| 久久精品久久久久| 欧美日韩成人免费| 国产精品一区久久久| 欧美电影免费观看电视剧大全| 欧美大人香蕉在线| 欧美老妇交乱视频| 精品丝袜一区二区三区| 欧美午夜女人视频在线| 136fldh精品导航福利| 78m国产成人精品视频| 18一19gay欧美视频网站| 91精品中国老女人| 欧美日韩国产成人高清视频| 中文字幕亚洲在线| 国产精品美腿一区在线看| 久久五月天综合| 欧美重口另类videos人妖| 91久久精品国产91性色| 久久精品欧美视频| 成人综合网网址| 欧美乱妇40p| 国产亚洲a∨片在线观看| 欧美贵妇videos办公室| 精品视频在线导航| 97**国产露脸精品国产| 亚洲免费视频在线观看| 欧美激情欧美狂野欧美精品| 亚洲91精品在线观看| 亚洲欧美激情另类校园| 亚洲成av人影院在线观看| 亚洲xxx视频| 一区二区欧美亚洲| 国产精品99久久久久久白浆小说| 日韩高清a**址| 日本国产一区二区三区| 黑人巨大精品欧美一区免费视频| 亚洲欧美另类在线观看| 中文字幕欧美精品日韩中文字幕| 欧美裸身视频免费观看| 日本精品免费一区二区三区| 国产精品一区二区三区免费视频| 成人在线一区二区| 日韩在线资源网| 国产亚洲精品激情久久| 欧美日韩国产综合新一区| 欧美视频在线免费看| 亚洲国产精品成人精品| 97超碰蝌蚪网人人做人人爽| 日本亚洲欧洲色| 日韩在线观看成人| 国内精品视频在线| 日韩网站免费观看| 亚洲激情电影中文字幕| 亚洲亚裔videos黑人hd| 色天天综合狠狠色| 欧美视频一区二区三区…| 欧美久久精品午夜青青大伊人| 亚洲电影免费观看高清完整版在线| 不卡毛片在线看| 欧美在线观看一区二区三区| 国产精品久久久久久久久久东京| 欧美大尺度电影在线观看| 久久亚洲精品一区二区| 欧美激情三级免费| 欧美高清不卡在线| 亚洲夜晚福利在线观看| 亚洲国产精品久久久久久| 亚洲高清一区二| 欧美激情videos| 精品久久久视频| 色综合久综合久久综合久鬼88| 欧美日韩精品在线视频| 97视频在线观看免费高清完整版在线观看| 清纯唯美亚洲综合| 亚洲一区二区精品| 亚洲跨种族黑人xxx| 日韩av一区在线观看| 97激碰免费视频| 国产精品视频永久免费播放| 久久国产精品久久国产精品| 国产又爽又黄的激情精品视频| 96pao国产成视频永久免费| 久久久久五月天| 久久人人爽人人爽人人片av高请| 欧美一级大胆视频| 亚洲人成在线观看网站高清| 亚洲精品动漫久久久久| 国产精品久久久久久av下载红粉| 国产精品久久久久久久久久ktv| 国产精品第一视频| 国产精品免费久久久久影院| 国产精品久久不能| 国产精品久久久久7777婷婷| 日韩精品在线第一页| 久久久久久久久久久久久久久久久久av| 久久精品亚洲热| 欧美日韩一区二区免费视频| 久久国产视频网站| 亚洲欧洲一区二区三区在线观看| 91在线看www| 亚洲视频网站在线观看| 久久久久久噜噜噜久久久精品| 亚洲天堂影视av| 久久久国产一区| 日韩欧美国产激情| 91久久精品在线| 日韩中文视频免费在线观看| 国产午夜精品麻豆| 日韩av手机在线观看| 成人h片在线播放免费网站| 亚洲综合av影视| 久久久精品在线观看| 欧美国产日韩中文字幕在线| 亚洲第一精品自拍| 欧美成人h版在线观看| 欧美日韩在线免费| 久久精品国产亚洲一区二区| 欧美激情精品久久久久| 国产亚洲欧美视频| 欧美精品久久久久久久久| 美女性感视频久久久| 91国偷自产一区二区三区的观看方式| 国产精品一区久久久| 亚洲欧美制服另类日韩| 成人中文字幕+乱码+中文字幕| 红桃视频成人在线观看| 国产精品久久77777| 中文字幕日韩有码| www.亚洲免费视频| 欧美日韩国产91|