<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國際加速解決方案。 廣告
                # 第29章 花指令 花指令是企圖隱藏掉不想被逆向工程的代碼塊(或其它功能)的一種方法。 ## 文本字符串 我發現在文本字符串使用可能會很有用,程序員意識某字符串不想被逆向工程的時候,可能會試圖隱藏掉該字符串,讓IDA或者其他十六進制編輯器無法找到。 這里說明一個簡單的方法,那就是怎么去構造這樣的字符串的實現方式: ``` mov byte ptr [ebx], ’h’ mov byte ptr [ebx+1], ’e’ mov byte ptr [ebx+2], ’l’ mov byte ptr [ebx+3], ’l’ mov byte ptr [ebx+4], ’o’ mov byte ptr [ebx+5], ’ ’ mov byte ptr [ebx+6], ’w’ mov byte ptr [ebx+7], ’o’ mov byte ptr [ebx+8], ’r’ mov byte ptr [ebx+9], ’l’ mov byte ptr [ebx+10], ’d’ ``` 當兩個字符串進行比較的時候看起來是這樣: ``` mov ebx, offset username cmp byte ptr [ebx], ’j’ jnz fail cmp byte ptr [ebx+1], ’o’ jnz fail cmp byte ptr [ebx+2], ’h’ jnz fail cmp byte ptr [ebx+3], ’n’ jnz fail jz it_is_john ``` 在這兩種情況下,是不可能通過十六進制編輯器中找到這些字符串的。 順便提一下,這種方法使得字符串不可能被分配到程序的代碼段中。在某些場合可能會用到,比如,在PIC或者在shellcode中。 另一種方法是,我曾經看到用sprintf()構造字符串。 ``` sprintf(buf, "%s%c%s%c%s", "hel",’l’,"o w",’o’,"rld"); ``` 代碼看起來比較怪異,但是做為一個簡單的防止逆向工程確實一個有用的方法。 文本字符串也可能存在于加密的形式,那么所有字符串在使用前比較閑將字符串解密了。 ## 29.2 可執行代碼 ### 29.2.1 可執行代碼花指令的意思是在真實的代碼中插入一些垃圾代碼,但是保證原有程序的執行正確。 舉個簡單的例子: ``` add eax, ebx mul ecx ``` 代碼清單29.1: 花指令 ``` xor esi, 011223344h ; garbage add esi, eax ; garbage add eax, ebx mov edx, eax ; garbage shl edx, 4 ; garbage mul ecx xor esi, ecx ; garbage ``` 這里的花指令使用原程序代碼中沒有使用的寄存器(ESI和EDX)。無論如何,增加花指令之后,原有的匯編代碼變得更為枯澀難懂,從而達到不輕易被逆向工程的效果。 ## 29.2.2 替換與原有指令等價的指令 * mov op1, op2可以替換為 push op2/pop op1這兩條指令。 * jmp label可以替換為 push label/ret這兩條指令,IDA將不會顯示被引用的label。 * call label可以替換為push label_after_call_instruction/push label/ref這三條指令。 * push op可以替換為 sub esp, 4(或者8)/mov [esp], op這兩條指令。 ## 29.2.3 絕對被執行的代碼與絕對不被執行的代碼 如果開發人員肯定ESI寄存器始終為0: ``` mov esi, 1 ... ; some code not touching ESI dec esi ... ; some code not touching ESI cmp esi, 0 jz real_code ;fakeluggage real_code: ``` 逆向工程需要一段時間才能夠執行到real_code。這也被稱為opaque predicate。 另一個例子(同上,假設可以肯定ESI寄存器始終為0): ``` add eax, ebx ; real code mul ecx ; real code add eax, esi ; opaque predicate. XOR, AND or SHL, etc, can be here instead of ADD. ``` ## 29.2.4打亂執行流程 舉個例子,比如執行下面這三條指令: ``` instruction 1 instruction 2 instruction 3 ``` 可以被替換為: ``` begin: jmp ins1_label ins2_label: instruction 2 jmp ins3_label ins3_label: instruction 3 jmp exit ins1_label: instruction 1 jmp ins2_label exit: ``` ## 29.2.4使用間接指針 ``` dummy_data1 db 100h dup (0) message1 db ’hello world’,0 dummy_data2 db 200h dup (0) message2 db ’another message’,0 func proc ... mov eax, offset dummy_data1 ; PE or ELF reloc here add eax, 100h push eax call dump_string ... mov eax, offset dummy_data2 ; PE or ELF reloc here add eax, 200h push eax call dump_string ... func endp ``` IDA僅會顯示dummy_data1和dummy_data2的引用,但無法引導到文本字符串,全局變量甚至是函數的訪問方式都可能使用這種方法以達到混淆代碼的目地。 ## 29.3 虛擬機/偽代碼 程序員可能寫一個PL或者ISA來解釋程序(例如Visual Basic 5.0與之前的版本, .NET, Java machine)。這使得逆向工程不得不花費更多的時間去了解這些語言它們的所有ISP指令詳細信息。更有甚者,他們可能需要編寫其中某些語言的反匯編器。 ## 29.4 其它 我有一個為TCC(Tiny C compiler)添加一個產生花指令功能的補丁:http://blog.yurichev.com/node/58。
                  <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>

                              哎呀哎呀视频在线观看