原文: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+參數加密)
- 數據加密(比如字符串常量)
- 代碼校驗和+調試器探測
- 動態數據提取