混淆你的代碼

原文:http://blogs.msdn.com/xiangfan/archive/2008/09/16/obfuscate-your-code.aspx

混淆是防止你的代碼被別人逆向工程的有效手段。

下面是在x86架構上利用間接調用和指令碼重疊進行混淆的一個例子:

__declspec(naked)
void Fun1()
{
     __asm {
         //混淆代碼
         call LABEL1
LABEL1:
         pop eax
         add eax, 6
         jmp eax
 
         //目標函數的代碼
         ret
     }
}
 
__declspec(naked)
void Fun2()
{
     __asm {
         //混淆代碼
         call LABEL1
LABEL1:
         pop eax
         add eax, 7
/*
         jmp -1
         jmp eax (和前一條指令合併) 0xEB 0xFF 0xFF 0xE0 -> 0xEB 0xFF 0xE0
*/
         __emit 0xEB
         __emit 0xFF
         __emit 0xE0

         //目標函數的代碼
         ret
     }
}

int main()
{
#if 0
     Fun1();
#else
     Fun2();
#endif
}

在Fun1中,混淆代碼作了如下的工作:

  • 獲取當前的EIP (LABEL1)
  • 將EIP修改爲目標函數的地址
  • 跳轉到目標地址繼續執行

在Fun2中,將兩個跳轉指令合併,從而達到迷惑反彙編器的目的。爲了使得逆向分析更爲困難,我們可以利用“add eax, 7”(假設目標函數在我們的混淆代碼之後)這條指令不會溢出的事實,將“jmp –1”改爲“jno -1”。或者我們可以使用更爲複雜的算術運算來計算目標函數的實際地址。

其它的代碼混淆手段包括:

  • API調用混淆(LoadLibrary+參數加密)
  • 數據加密(比如字符串常量) 
  • 代碼校驗和+調試器探測
  • 動態數據提取
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章