原文: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+参数加密)
- 数据加密(比如字符串常量)
- 代码校验和+调试器探测
- 动态数据提取