windbg調試心得

題記:積點滴之水,縱難成滄海,亦能得一窪。

作者:A1Pass [www.hackav.com / a1pass.blog.163.com](轉載請註明版權)

       有些朋友建議我多寫一些心得與筆記,也好便於其他人學習進步,其實這些朋友高看我了,我的心得也是很有限的,簡單的東西不成系統,複雜的東西一句兩句的也說不清楚,抖出來有裝X之嫌。我之所以最近幾年少有技術文章發表,主要因爲精力有限,且本身就在寫書,由於做過的一些項目都過於複雜,因此很多東西也難得總結。

       我寫文章的原則就是獨到、有用,如果我想寫一篇文章來闡述一個技術問題,那麼勢必要做到簡單易懂、觀點獨到,否則重複別人做過的工作我認爲意義不大。對於寫技術文章而言,我比較欣賞國外的一些技術團隊與國內的羅聰,他們的特點就是能非常認真的對待自己發表的作品,從排版、示例再到章節段落的組織,只需稍稍一看就能知道他們在認真對待自己的作品。

       而最近隨着圈內各大論壇的逐漸落寞,各個領域的前輩或牛人們都已經鮮有新技術發表,這種風氣從04年的入侵滲透領域開始,各個牛人們都開始蟄居地下,不消幾年光景,一個個搖身一變都成了老闆了。雖然他們利用技術成爲了老闆,雖然做老闆並不需要技術,但是他們還是沒能抽出些時間來公佈一下他們的“存貨”,那些東西隨着時間的流逝,也就都爛到硬盤裏了,甚是可惜。

       而我一人之力有限,爲了生存亦難以獨善其身,因此一些喫飯的東西也很難做到公佈出來與大家衆樂樂,但是我嘗試從點滴做起,以求盡我所能記錄並公佈一些我的心得體會,也好使得朋友們能有個方向、有所啓發。

       這個帖子我將置頂一年,然後歸納到《置頂導航》中,此貼子的內容我將常年更新,一般來講每條心得不會超過200字,暫定分爲“技術感悟”、“環境搭建”、“編程心得”、“調試心得”這幾個類別,如果有什麼不足還請各位朋友們指出,我會盡量完善。

【從 2012-12-21 到 2013-02-08 ,共收集了 15 個心得】

【技術感悟】(共計04個心得)
2012-12-21  x64位下彙編變化之一
1 所有指針都是64位(8字節);
2 常用寄存器由32位的eax、ebx等變成64位的rax、rbx;
3 新增了r8、r9 ~ r15這8個通用寄存器;
4 原先的eax,ax,al,ah仍然可以使用。


2012-12-22  x64位下彙編變化之二
       函數傳遞參數的方式發生變化,64位下將不再使用棧傳遞參數,而改用通用寄存器加內存地址的方式,其規則如下:
第1個參數:rcx
第2個參數:rdx
第3個參數:r8
第4個參數:r9
第5個參數:rdi+0x08
第6個參數:rdi+0x10
第7個參數:rdi+0x18
第8個參數:rdi+0x20
……
       因此在編寫x64位下的程序時,函數的參數不超過4個將有利於程序的執行效率。


2012-12-25  x64位下遠程注入的注意事項
       隨着x64系統的不斷普及,向x64進程注入代碼也越來越成爲我們不得不面對的一個問題,以下是A1Pass總結出的一些注意事項:
1. 不能將x32的代碼注入到x64的進程中,反之亦然;
2. 不能將x32的DLL加載到x64的進程中,反之亦然;
3. 在目標進程做PE解析相關的操作時,要着重注意x64的PE結構與x32是不完全相同的;
4. 由於遠程注入不可避免的會涉及到大量的指針操作,因此要時刻注意x64下的指針長度問題。


2013-01-01  建立ipc$時遇到帶"號密碼該如何處理
       比如密碼爲123"abc時,那麼建立ipc$時應當使用如下格式的命令:

net use \\127.0.0.1 "123\"abc" /u:administrator

       也就是在“ " ”號前加轉義符“ \ ”即可解決問題,這點與C語言有些類似。





【環境搭建】(共計05個心得)

2012-12-21  解決WinDBG符號(Symbol)加載不正常的情況
       我們都知道WinDBG在使用之前需要配置Symbol信息,這樣你在查看系統結構時,會得到非常詳盡的信息,我們一般情況下會這樣配置。
1. 運行WinDBG後,按快捷鍵【Ctrl】+【S】調出符號信息配置對話框(或依次點擊菜單欄上的“File”>“Symbol File Path...”);
2. 輸入如下配置信息:C:\Symbols;SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols  ;
       至此我們已經完成了對WinDBG的符號配置問題,但是有時我們這樣配置完成後由於某種原因並未生效,如果你遇到這樣的問題,那麼你或許可以試試如下方法。
1. 輸入命令設置WinDBG符號;

kd>.sympath SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols

2. 用!sym noisy命令使得WinDBG在獲得符號的時候取得更多的信息,然後使用!lmi命令讓WinDBG查看Windows的ntoskrnl模塊,最後然後使用.reload /f嘗試獲取ntoskrnl的符號。

kd>!sym noisy
kd>!lmi
kd>.reload /f
 [注意:以上的“kd>”是提示符,不要將其誤當成命令中的一部分]
        現在,你可以嘗試輸入一下例如“dt _teb”等命令查看是否成功了。
        如果仍然不成功,你可以檢查一下你是否安裝了Symbol,如果安裝了,則檢查一下Symbol的版本是否正確(與當前操作系統版本比對),如果版本不正確,請卸載此Symbol,並重新安裝正確版本的Symbol,或乾脆不安裝。


2012-12-23  解決Windows 7下編寫驅動時DbgPrint / KDPrint不能打印的問題
       造成這個問題的原因主要是因爲Windows 7爲了避免不必要的系統開銷而默認關閉了調試信息過濾,因此導致我們無法正常打印出調試字符串。開啓的方法非常簡單,我們只需要操作註冊表就可以建立一個調試打印過濾器,將以下內容保存爲*.reg文件後,雙擊執行後即可完成設置工作。

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]
"DEFAULT"=dword:0000000f



2012-12-24  在Windows Vista/7/8下關閉系統PAE功能
       計算機物理地址擴展(Physical Address Extension,PAE)技術最初是爲了彌補32位地址在PC服務器應用上的不足而推出的,我們在執行一些試驗的時候可能要求系統處於未開啓PAE的狀態,這樣內存分頁相對來說更簡單、更可控,因此我們就需要通過以下兩條CMD命令關閉系統的PAE功能,執行完以下兩條命令後,重啓系統即可完成操作。

BCDEdit /set PAE ForceDisable
BCDEdit /set NX  AlwaysOff



2012-12-26  解決WinDBG在Windows 7下不能使用Local kernel(調試本機內核)模式的問題
        由於Windows 7系統默認不允許進行本地內核調試,因此你需要執行以下步驟來開啓它。
        (1)以管理員權限運行CMD,並輸入“bcdedit -debug on”命令;
        (2)重啓計算機;
        (3)以管理員權限運行WinDBG,執行本地內核調試。


2013-01-07  怎樣使用VMware提供的Visual Studio遠程調試插件
       如果我們安裝VMware之前已經安裝了Visual Studio,那麼VMware就會爲Visual Studio提供一個遠程調試插件,並默認顯示在工具欄中。總體來說,VMware提供的這個插件還是非常貼心的,現在的內存越來越大,我們爲了使用大內存基本上都已經開始使用x64的系統了,這樣在進行x86程序開發時就會有些不便,或者我們爲了測試程序在不同系統下的兼容性等等,但是不管怎麼說,你總會用到的,不是嗎?
    總體而言,VMware提供的遠程調試插件還是比較簡單的,我們只需要注意以下幾點即可:
    (1)在VMware在Visual Studio的插件設置中,不要忘記設置Shared Folders(共享目錄)項;
    (2)虛擬機本身的Shared Folders(共享目錄)也必須爲啓用狀態;
    (3)作爲被調試機的虛擬機用戶名與用戶密碼一定要與宿主機的一樣,且必須爲管理員權限;
    (4)宿主機與虛擬機要保證在網上鄰居中可以互相訪問;
    (5)最好關閉虛擬機的系統防火牆,或配置相應的規則;
    (6)將本地安全策略中的“網絡訪問:本地帳戶的共享和安全模型”修改爲“經典 - 對本地用戶進行身份驗證,不改變其本來身份”。
    [:在“控制面板>管理工具>本地安全策略>本地策略>安全選項”中可以找到設置以上選項的地方]
    [:以上設置方法適用於VMware Workstation的6.0至8.0版本,理論上也適用於8.0以後的版本]
    做好以上這些後,你就可以進行暢快的雙機調試了,那種感覺很爽,真的!





【編程心得】(共計04個心得 新!)

2012-12-21  C/C++ system函數用法
原型:

int system( const char *command );
int _wsystem( const wchar_t *command );
system函數可以調用一些DOS命令,比如“system("cls");”是清屏,“system("pause");”是暫停。


2012-12-23  善用#pragma comment以增加工程的編譯兼容性
1. 包含某個庫
#pragma comment(lib, "xxxxxx.lib")
2. 忽略某個庫
#pragma comment(linker, "/NODEFAULTLIB:\"xxxxxx.lib\"")
3. 忽略某個錯誤
#pragma warning(disable: 9999) // 9999錯誤標號


2012-12-27  Visual Studio中,用宏來區分平臺類型(32位/64位)
       用於區分編譯環境的宏有_M_AMD64/_M_X64/_WIN64/_IA64_/_AMD64_這幾個,一般情況下使用_M_AMD64,示例如下:

#ifdef _M_AMD64
#pragma message ("This is Win64")
#else
#pragma message("This is Win32")
#endif

       更多相關信息請參見MSDN:http://msdn.microsoft.com/zh-cn/library/b0084kay(v=vs.90).aspx


2013-02-08  用宏封裝變參函數的方法
    以下示例演示的是將變長參數printf()用宏封裝爲自己的my_printf()。

#define my_printf(lpstrDst,strFormat, ...) \
    printf(lpstrDst,_T(strFormat), __VA_ARGS__);






【調試心得】(共計02個心得)

2012-12-21 Visual Studio調試出現莫名其妙的問題,實在無法解決時
1. 嘗試重新生成工程;
2. 嘗試重啓Visual Studio;
3. 嘗試重啓Windows。
(雖然看起來很弱,但是作爲我來講,凡是搞不明白的錯誤基本上都是通過以上3個方法之一解決的-_-! )


2012-12-24  迭代器報“vector iterators incompatible”錯的幾種可能
       以下3中可能會導致此種錯誤發生,但也並不排除會有其他可能。
1. 類型不匹配,例如用int型的向量迭代器與char型的向量迭代器進行比對操作;
2. 比對時向量結構發生變化(比如對向量進行了增刪等操作);
3. 結構體內的某個元素是向量類型,但在使用前對整個結構體進行了清零操作,從而導致向量被破壞。
      更多詳細信息請參見我爲此專門寫的一篇文章:http://a1pass.blog.163.com/blog/static/2971373220119242245951/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章