混淆你的代码

本文介绍了在x86架构下通过间接调用和指令码重叠进行代码混淆的方法,并提供了具体的汇编代码实例。此外还探讨了其他混淆手段,如API调用混淆、数据加密等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值