<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                這次拿三個問題來討論,是關于調試器的。因為對于反病毒工程師而言,類似于OllyDbg和IDA的使用方法是必須掌握的,但是在面試中又不太方便考察,所以只能對其快捷鍵或者調試器實現原理之類的問題進行提問。這里我還是選取比較權威的書籍上的答案,免得僅僅提供我自己的答案會誤導大家,也難有說服力。如果說大家以后在面試的時候遇到這些問題,只要回答出關鍵點就可以,無需一字不落地背下來。因為我摘錄的答案的篇幅往往比較長,為的就是讓大家更為全面地看待這個問題。 問題4——6如下: **4、在IDA中,快捷鍵X的作用是什么?什么是交叉引用?** 答:(以下內容選自**《加密與解密 第三版》**第3.2.5節) 通過交叉參考(XREF)可以知道指令代碼相互調用關系。如下面代碼所示,這句“CODE XREF:sub_401120+B↑j”,表示該調用地址是401120,“j”表示跳轉(jump)。其他一些符號:“o”表示偏移值(offset),“p”表示子程序(procedure)。雙擊這里或按回車鍵可以跳到調用該處的地方。 ~~~ .text:00401165 loc_401165: ;CODE XREF:sub_401120+B↑j .text:00401065 push 0 ;nExitCode .text:00401067 FF 15 B0 40 40 00 call ds:PostQuitMessage</span> ~~~ 在loc_401165字符上按X鍵,將打開交叉參考窗口。 (關于交叉引用更為詳細的說明,可參考**《IDA Pro權威指南 第2版》**第9章——交叉引用與繪圖功能) **** **5、請解釋一下什么是DR寄存器。** 答:(以下內容選自**《IDA Pro代碼破解揭秘》**第6.2節) 要真正理解調試,了解各種中斷及調試寄存器是很有必要的,特別是有關進程狀態變化的。Intel Software Developers Manual在這方面依然是最好的參考資料,我知道的與它相比,不過是小巫見大巫。不過,IA-32平臺處理調試基本上是通過二者(中斷或調試寄存器)之一實現的。 首先介紹一下調試寄存器。IA-32平臺有8個調試寄存器,最多可以監視4個地址。訪問這些寄存器是通過mov指令(調試寄存器暗中充當目的操作數或源操作數)的變體實現的。要知道,訪問這些寄存器是需要有RING0特權的,這當然是一個限制,但考慮其影響極大,這樣做也是有道理的。對每一個斷點,有必要具體指定涉及的地址、位置的長度(范圍在一個字節與雙字之間)、處理程序(當生成一個調試異常時)以及這個斷點是否被啟用。前4個調試寄存器,DR0到DR3可以包含4個32位地址(定義了斷點應該出現的地址)。接下來的2個調試寄存器DR4和DR5取決于操作模式可以交替使用。當DE(Debugging Extension,調試擴展)標志被設在CR4(Control Register4,控制寄存器4)里時,DR4和DR5保留,試圖引用它們時,將引發一個無效操作碼異常。如果這個標志沒有被設置,DR4和DR5則作為別名替代調試寄存器6和7。 DR6(DebugRegister 6,調試寄存器6),作為調試狀態寄存器指示對最后發生的調試異常進行條件檢查的結果。用位模式訪問DR6,位0到位3與前4個調試寄存器相關。這些位指示哪個斷點條件被滿足而生成了一個調試異常。DR6的位13在置位時表示下一條指令引用一個調試寄存器,連同DR7(我們隨后就會介紹)的一部分被使用。位14對我們來說或許是最有誘惑力的,它被置位時指示處理器處于單步模式(single-step mode),我們稍后介紹。最后使用的是位15,它指示當調試陷阱標志被置位時,作為任何切換的結果都會拋出調試異常。最后,我們介紹調試寄存器7,也就是DR7。所有的黑客都對這個寄存器垂涎欲滴,它也被稱為調試控制寄存器,像DR6一樣被理解為位字段。這個寄存器的第一個字節對應斷點是否是活動的,如果是活動的則對應它的作用域。位0、2、4和6確定調試寄存器是否被啟用,位1、3、5和7對應同樣的斷點,但基于全局的作用域。在這個例子里,作用域被定義為在任務切換時斷點是否保持,是否針對全局啟用的斷點對所有的任務都是可用的。根據Intel的手冊,現在的處理器不支持位8和9。不過在以前,可以用它們確定引起斷點事件的精確的指令。接下來是位13,這是一個比較有意思的位,它允許在訪問調試寄存器本身之前中斷。最后是位16到31,這些位確定什么類型的訪問會引起斷點,以及所在地址的數據長度。當CR4中的DE標志被置位時,位16到17、20到21、24到25、28到29被解釋成下面的意思: 00 – Break onexecution 01 – Break onwrite 10 – Break onI/O read or writes 11 – Break onread and writes but not instruction fetches 當DE標志沒有置位時,除了10的值沒有定義以外,其他的解釋同上面一樣。位18到19、22到23、26到27、30到31對應各種斷點的長度,值00表示長度為1,值01表示2字節長度。在32位平臺上10未被定義,在64位平臺上它表示8字節長度。你可能已經猜到了,11表示長度為4字節。 現在,把所有這些位與DR0至DR3聯系起來似乎比較困難,但實際并不是這樣的。每個2位組合對應DR0至DR3范圍里特定的連續的寄存器。這些長度必須對齊某些邊界(取決于它們的大小)——例如,16位需要以字為界,32位以雙字為界。這由處理器通過掩碼地址的低位相關地址來強制執行,因此,一個未對齊的地址將不會產生預期的結果。如果訪問起始地址加上它的長度范圍內的任意地址,將產生異常,通過使用2個斷點有效地允許未對齊的斷點;每個斷點被適當地對齊,在它們兩個之間包含了討論的長度。這里還有一點值得一提。當斷點訪問類型只是執行時,應當把長度設為00,其它的值導致未定義的行為。 注意:有趣的是,調試寄存器本身并沒有受到很多關注。不過,私下里還是有很多利用它們的rootkits和后門。比如說,可以在指向進程結構的指針上設置一個全局訪問斷點,在進程的鏈表里隱藏進程。當訪問這個地址時,將出現調試異常,并重定向到它們的處理程序并執行任意多的任務,包括返回列表里下一個進程的地址。 更糟的是,它們可以啟用DR7里的GD標志,并導致訪問調試寄存器本身并引發異常,阻撓審查寄存器來檢查它們當前的配置。 **6、請說明單步執行分為哪幾種,區別是什么,其實現原理是什么。** **答:(以下內容選自**《IDA Pro代碼破解揭秘》第5.2.2節) 單步是指每次執行一條指令,然后把控制權交給調試器的過程。IA-32系列處理器在硬件上直接支持單步。通過一次執行一條指令,我們可以仔細監視代碼的特定部分。不過不太可能用這個方法調試整個程序。單步通常用于理解特定部分的代碼。 從CPU的角度來看,調試器設置EFLAGS寄存器里的TF(Trap Flag,陷阱標志)位。一條指令執行完后就會生成調試異常,調試器會把這個調試異常當做中斷(INT 0x01)捕獲。 注意:大多數調試器都提供step(單步)命令。通常把他們稱為步入(step into)和步過(step over)。從用戶角度來看,它們之間唯一的不同是出現在某些指令上,其實就是call和rep指令上。當碰到call時,步入命令將跟隨call,而步過命令將在call之后的指令上中斷。這通常由設置斷點來完成,而不是單步執行到返回。 **知識擴展:** (以下內容選自**《加密與解密 第三版》**第2.1.5節) 當執行一個INT 3斷點時,該地址處的內容被調試器用INT 3指令替換了,此時OllyDbg將INT 3隱藏了,顯示出來仍是下斷前的指令,而實際上這個指令已經被替換成了CC。 這個INT 3指令,其機器碼是CCh,也常稱為CC指令。當被調試進程執行INT3指令導致一個異常時,調試器就會捕捉這個異常從而停在斷點處,然后將斷點處的指令恢復成原來的指令。當然,如果自己寫調試器,也可用其他一些指令代替INT 3來觸發異常。 用INT 3斷點的好處是可以設置無數個斷點,缺點是改變了原程序指令,容易被軟件檢測到。例如為了防范API被下斷,一些軟件會檢測API的首地址是否為CCh,以此來判斷是否被下了斷點。在這用C語言來實現這個檢測,方法是取得檢測函數的地址,然后讀取它的第一個字節,判斷它是否等于“CCh”。下面這段代碼就是對MessageBoxA函數進行的斷點檢測: ~~~ FARPROC Uaddr; BYTE Mark = 0; (FARPROC&)Uaddr = GetProcAddress(LoadLibrary("user32.dll"), "MessageBoxA"); Mark = *((BYTE*)Uaddr); //取MessageBoxA函數第一字節 if(Mark = = 0xCC) //如該字節為CC,則認為MessageBoxA函數被下斷 return TRUE; //發現斷點 ~~~ 程序編譯后,對MessageBoxA設斷,程序將會發現自己被設斷跟蹤。當然躲過檢測的方法是將斷點下在函數內部或末尾,例如可以將斷點下在函數入口的下一行,就可以躲過檢測了。 (以下內容選自**《加密與解密 第三版》**第15.3.7節——通過TrapFlag檢測) CPU符號位EFLAGS中一位叫做TF,即TRAP FLAG。當這個TF=1的時候CPU執行完EIP的指令就會觸發一個單步異常。例如這段代碼: ~~~ pushfd push eflags or dword ptr [esp],100h ;TF=1 popfd ;這條指令之后TF=1了 nop ;這一條執行后會觸發異常,應該提前安裝SHE,跳到其他地方執行 jmp die ;如果順序執行下來了,說明被跟蹤 ~~~ **本篇文章參考資料:** 1、段鋼(主編),Blowfish、沈曉斌、丁益青、單海波、王勇、趙勇、唐植明、softworm、afanty、李江濤、林子深、印豪、馮典、羅翼、林小華、郭春楊(編委),**《加密與解密(第三版)》**,電子工業出版社。 2、[美]Chris Eagle(著),石華耀、段桂菊(譯),**《IDA Pro權威指南(第2版)》**,人民郵電出版社。 3、[美]Dan Kaminsky、Justin Ferguson、Jason Larsen、Luis Miras、Walter Pearce(著),看雪論壇翻譯小組(譯),**《IDAPro代碼破解揭秘》**,人民郵電出版社。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看