<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 5.4 搞定反調試機制 現在的病毒是越來越狡猾了,無論是在感染,傳播還是在反分析方面。一方面,將代碼打包或者加密代碼使代碼模糊化,另一個方面使用反調試機制,郁悶調試者。接下來我們將 了解常用反調試機制,并用 Immunity 調試器和 Python 創造自己的腳本繞過反調試機制。 ### 5.4.1 IsDebuggerPresent 現在最常用的反調試機制就是用 IsDebuggerPresent(由 kernel32.導出)。函數不需要參 數,如果發現有調試器附加到當前進程,就返回 1,否則返回 0.如果我們反匯編這個函數: ``` 7C813093 &gt;/$ 64:A1 18000000 MOV EAX,DWORD PTR FS:[18] 7C813099 &#124;. 8B40 30 MOV EAX,DWORD PTR DS:[EAX+30] 7C81309C &#124;. 0FB640 02 MOVZX EAX,BYTE PTR DS:[EAX+2] 7C8130A0 \. C3 RETN ``` 代碼通過不斷的尋址找到能證明進程被調試的數據位,第一行,通過 FS 寄存器的第 0x18 位找到 TIB(線程信息塊)的地址。第二行通過 TIB 的第 0x30 位找到 PEB(進程環境信息塊) 的地址。第三行將 PEB 的 0x2 位置上的 BeingDebugged 變量存在 EAX 寄存器中,如果有調 試器附加到進程,該值為 0x1。Damian Gomez 提供了一個簡單的方式繞過 IsDebuggerPresent, 可以很方便的在 Immunity 執行,或者在 PyCommand 中調用。 ``` imm.writeMemory( imm.getPEBaddress() + 0x2, "\x00" ) ``` 上面的代碼將 PEB 的 BeingDebugged 標志就當的設置成0\.現在病毒無法使用 IsDebuggerPresent 來判斷了調試器了,它傻了。 ### 5.4.2 解決進程枚舉 病毒會測試枚舉所有運行的進程以確認是否有調試器在運行。舉個例子,如果你正在用 Immunity 調試 一個病毒,就會注冊一個名為 ImmunityDebugger.exe 的進程。病毒通過用 Process32First 查找第一個注冊的進程,接著用 Process32Next 循環獲取剩下的進程。這兩個 函數調用會返回一個布爾值,告訴調用者函數是否執行成功。我們重要將函數的返回值(存 儲在 EAX 寄存器中),就當的設置為 0 就能夠欺騙那些調用者了。代碼如下: ``` process32first = imm.getAddress("kernel32.Process32FirstW") process32next = imm.getAddress("kernel32.Process32NextW") function_list = [ process32first, process32next ] patch_bytes = imm.Assemble( "SUB EAX, EAX\nRET" ) for address in function_list: opcode = imm.disasmForward( address, nlines = 10 ) imm.writeMemory( opcode.address, patch_bytes ) ``` 首先獲取兩個函數的地址,將它們放到列表中。然后將一段補丁代碼匯編成操作碼,代 碼將 EAX 設置成 0,然后返回。接下來反匯編 Process32First 和 Process32Next 函數第十行 的代碼。這樣做的目的就是一些高級的病毒會確認函數的頭部是否被修改過。我們在第 10行再寫入補丁,就能瞞天過海了。然后簡單的將我們的補丁代碼寫入第 10 行,現在無論怎 么調用兩個函數都會返回失敗。 我們通過兩個例子講解了如何使用 Python 和 Immunity 調試器,使病毒無法發現我們。 越來越多的的反調試技術將在病毒中使用,對付他們的方法也不會完結。但是 Immunity 無 疑將會成為你對付病毒或者開發 exploit 的利器。 接下來看看在逆向工程中的 hooking 技術。
                  <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>

                              哎呀哎呀视频在线观看