1、一类代码迷惑的反解复杂性一类代码迷惑的反解复杂性问题摘要 证明了借助函数指针数组的混淆的反解复杂度是NP-Hard的。本文重点介绍该结论。关键词 代码迷惑 复杂度 函数指针数组1借助函数指针数组的混淆技术简介1.1 函数指针在软件混淆中的使用基于函数指针的混淆技术包含3个阶段:1、函数的分解:首先我们随机挑选一个函数并把它分解为更小的函数,然后在保持原函数语义的情况下用这几个小函数重新构造原函数。2、函数指针的使用:函数和随机选择的分解函数可以凭借函数指针调用。例如,图中2右侧的程序可以被转换为图3中的程序。两个新的if模块被引入了,这两个新的if模块的条件值恒为1,而源程序的语义被保留了。然
2、而,静态分析很难评估这些模块从而很难确定在这些if模块存在下的可执行路径。所以,if模块使确定函数指针指向的函数地址变得困难了。3、函数指针数组的引入:这里我们引入函数指针数组,然后把函数地址随机地存在数组中并做出表达式用一些(直接或非直接的)函数调用来计算每个索引。现在一些函数调用被替换为通过这种数组的调用。例如,图3的程序可以转换为图4的程序。现在对于fp的分配取决于凭借fp先前的值的函数调用和A的相关元素。它们一起有效地抵御了静态分析。1.2 增加不可实现路径的数量跨函数分析很困难的原因之一就是它必须遵循可执行路径,基于这个事实,我们提出两种软件混淆技术来阻止跨函数分析:1、合并多个函数
3、调用为一个:这个技术把多个函数调用合并为一个新创建的函数,如图5所示,随机选取两个函数调用func1()和func2(),函数func3()是新创建的,最后两个调用以某个混淆的方式嵌入到了func3()中。经过这样的混淆处理,调用图的变化如图6所示,转换后比转换前多了两个不可实现路径。如果跨函数分析忽略了不可实现路径,它只会失败或产生不精确的分析结果。即使跨函数分析努力地要遵循可实现路径也会非常困难。2、加入大量的return模块:加入大量的return模块的混淆技术也可以使调用图变得复杂并且阻止跨函数分析,如图7所示,相应的调用图如图8所示。不难看出调用图变得更复杂了并且不可实现路径的数量从
4、2个增加到4个。所以同理这个混淆技术也很有效。2 借助函数指针数组的混淆技术反解复杂度定理1:在从具有函数指针或通过函数指针进行函数调用的数组中分配函数指针的情况下(函数返回整数),确定程序中是否存在可执行路径是NP困难的。证明 我们通过证明3-SAT问题(NP完全的)在多项式时间内可归约为定理1的问题来证明定理1。现在,假设给定3-SAT问题,定义值为true或false的变量,以及公式:其中的值为或,然后我们构造一个如图1的C程序,假设所有路径都是可执行的,所有if模块的条件部分没有影响,这样用标志“-”来代替所有if模块的条件。在代码L1部分,被定义为函数指针并与3-SAT问题中的命题变
5、量相关联。L2分别把true和false赋给A0和A1。在L3中的任意的经过if模块的可执行路径都与3-SAT问题的真假值指派相对应。所以如果3-SAT问题有答案,我们也就有相应的可执行路径,函数指针fp指向L5上的函数true。而且,如果3-SAT问题没有答案,至少存在一个子句它的三个变元都是假的,在这种情况下,fp指向函数false。另一方面,如果函数指针指向在一个可执行路径上的L5上的函数true,那么有相同真假赋值的3-SAT问题也有解。根据上面陈述的理由,3-SAT问题有解当且仅当我们能确定是否有可执行路径,在这个路径上函数fp指向L5上的函数地址true。第3节 我们的实验为了验证
6、定理1中的问题是否真是NP-HARD,我们将文章中未作任何处理的程序和经过混淆处理的程序分别运行并列出相应的汇编代码,然后进行比较。3.1 未作处理的程序代码3: int a,b;4:5: if (a b)00401028 8B 45 FC mov eax,dword ptr ebp-40040102B 3B 45 F8 cmp eax,dword ptr ebp-80040102E 7E 06 jle main+26h (00401036)6: 7: a = b;00401030 8B 4D F8 mov ecx,dword ptr ebp-800401033 89 4D FC mov dw
7、ord ptr ebp-4,ecx8: 9:10: b = a + 1;00401036 8B 55 FC mov edx,dword ptr ebp-400401039 83 C2 01 add edx,13.2 应用函数指针数组混淆处理过的程序代码3.2.1 源程序int a,b,c;int (*fp1)(),(*fp2)();int (*A10)();int func0() if (a * (a + 1) * (a + 2) % 6) return (a * (a + 2); else return (a - 1) * a); int func1() a = b; return 0;in
8、t func2() b = a + 1; return 0;int func3() switch (c) case 0: fp1 = func1;break; case 1: fp1 = func2;break; (fp1)(); return 0;void main() A0 = A1 = func0; A2 = A3 = func3; A4 = A6 = func0; A5 = A9 = func1; A7 = A8 = func2; fp2 = A(func0() % 2) * a * b; if (a b) if (a * (a + 1) % 2 = 0) fp2 = A(fp2)()
9、 % 2) + 2; else fp2 = A(fp2)() % 2) + 4; (fp2)(); fp2 = Ab & 1; if (b - 2) * (b - 1) * b % 6 != 0) fp2 = A(fp2)() % 2) + 5; else fp2 = A(fp2)() % 2) + 3; c = c * c * (c + 1) * (c + 1) % 4 + 1; (fp2)();3.2.2 汇编代码1: int a,b,c;2:3: int (*fp1)(),(*fp2)();4: int (*A10)();5:6: int func0()7: 0040B550 55 pu
10、sh ebp0040B551 8B EC mov ebp,esp0040B553 83 EC 40 sub esp,40h0040B556 53 push ebx0040B557 56 push esi0040B558 57 push edi0040B559 8D 7D C0 lea edi,ebp-40h0040B55C B9 10 00 00 00 mov ecx,10h0040B561 B8 CC CC CC CC mov eax,0CCCCCCCCh0040B566 F3 AB rep stos dword ptr edi8: if (a * (a + 1) * (a + 2) % 6
11、)0040B568 A1 D8 27 42 00 mov eax,a (004227d8)0040B56D 83 C0 01 add eax,10040B570 8B 0D D8 27 42 00 mov ecx,dword ptr a (004227d8)0040B576 0F AF C8 imul ecx,eax0040B579 8B 15 D8 27 42 00 mov edx,dword ptr a (004227d8)0040B57F 83 C2 02 add edx,20040B582 0F AF CA imul ecx,edx0040B585 8B C1 mov eax,ecx0
12、040B587 99 cdq0040B588 B9 06 00 00 00 mov ecx,60040B58D F7 F9 idiv eax,ecx0040B58F 85 D2 test edx,edx0040B591 74 13 je func0+56h (0040b5a6)9: 10: return (a * (a + 2);0040B593 8B 15 D8 27 42 00 mov edx,dword ptr a (004227d8)0040B599 83 C2 02 add edx,20040B59C A1 D8 27 42 00 mov eax,a (004227d8)0040B5
13、A1 0F AF C2 imul eax,edx0040B5A4 EB 0F jmp func0+65h (0040b5b5)11: 12:13: else14: 15: return (a - 1) * a);0040B5A6 A1 D8 27 42 00 mov eax,a (004227d8)0040B5AB 83 E8 01 sub eax,10040B5AE 0F AF 05 D8 27 42 00 imul eax,dword ptr a (004227d8)16: 17: 0040B5B5 5F pop edi0040B5B6 5E pop esi0040B5B7 5B pop
14、ebx0040B5B8 8B E5 mov esp,ebp0040B5BA 5D pop ebp0040B5BB C3 ret32:33: int func3()34: 0040B5C0 55 push ebp0040B5C1 8B EC mov ebp,esp0040B5C3 83 EC 44 sub esp,44h0040B5C6 53 push ebx0040B5C7 56 push esi0040B5C8 57 push edi0040B5C9 8D 7D BC lea edi,ebp-44h0040B5CC B9 11 00 00 00 mov ecx,11h0040B5D1 B8
15、CC CC CC CC mov eax,0CCCCCCCCh0040B5D6 F3 AB rep stos dword ptr edi35: switch (c)36: 0040B5D8 A1 E0 27 42 00 mov eax,c (004227e0)0040B5DD 89 45 FC mov dword ptr ebp-4,eax0040B5E0 83 7D FC 00 cmp dword ptr ebp-4,00040B5E4 74 08 je func3+2Eh (0040b5ee)0040B5E6 83 7D FC 01 cmp dword ptr ebp-4,10040B5EA
16、 74 0E je func3+3Ah (0040b5fa)0040B5EC EB 16 jmp func3+44h (0040b604)37: case 0: fp1 = func1;break;0040B5EE C7 05 E4 27 42 00 1E mov dword ptr fp1 (004227e4),offset ILT+25(func1) (0040101e)0040B5F8 EB 0A jmp func3+44h (0040b604)38: case 1: fp1 = func2;break;0040B5FA C7 05 E4 27 42 00 19 mov dword pt
17、r fp1 (004227e4),offset ILT+20(func2) (00401019)39: 40: (fp1)();0040B604 8B F4 mov esi,esp0040B606 FF 15 E4 27 42 00 call dword ptr fp1 (004227e4)0040B60C 3B F4 cmp esi,esp0040B60E E8 ED 5A FF FF call _chkesp (00401100)41:42: return 0;0040B613 33 C0 xor eax,eax43: 0040B615 5F pop edi0040B616 5E pop
18、esi0040B617 5B pop ebx0040B618 83 C4 44 add esp,44h0040B61B 3B EC cmp ebp,esp0040B61D E8 DE 5A FF FF call _chkesp (00401100)0040B622 8B E5 mov esp,ebp0040B624 5D pop ebp0040B625 C3 ret44:45: void main()46: 0040B630 55 push ebp0040B631 8B EC mov ebp,esp0040B633 83 EC 40 sub esp,40h0040B636 53 push eb
19、x0040B637 56 push esi0040B638 57 push edi0040B639 8D 7D C0 lea edi,ebp-40h0040B63C B9 10 00 00 00 mov ecx,10h0040B641 B8 CC CC CC CC mov eax,0CCCCCCCCh0040B646 F3 AB rep stos dword ptr edi47: A0 = A1 = func0;0040B648 C7 05 B4 27 42 00 14 mov dword ptr A+4 (004227b4),offset ILT+15(func0) (00401014)00
20、40B652 A1 B4 27 42 00 mov eax,A+4 (004227b4)0040B657 A3 B0 27 42 00 mov A (004227b0),eax48: A2 = A3 = func3;0040B65C C7 05 BC 27 42 00 23 mov dword ptr A+0Ch (004227bc),offset ILT+30(func3) (00401023)0040B666 8B 0D BC 27 42 00 mov ecx,dword ptr A+0Ch (004227bc)0040B66C 89 0D B8 27 42 00 mov dword pt
21、r A+8 (004227b8),ecx49: A4 = A6 = func0;0040B672 C7 05 C8 27 42 00 14 mov dword ptr A+18h (004227c8),offset ILT+15(func0) (00401014)0040B67C 8B 15 C8 27 42 00 mov edx,dword ptr A+18h (004227c8)0040B682 89 15 C0 27 42 00 mov dword ptr A+10h (004227c0),edx50: A5 = A9 = func1;0040B688 C7 05 D4 27 42 00
22、 1E mov dword ptr A+24h (004227d4),offset ILT+25(func1) (0040101e)0040B692 A1 D4 27 42 00 mov eax,A+24h (004227d4)0040B697 A3 C4 27 42 00 mov A+14h (004227c4),eax51: A7 = A8 = func2;0040B69C C7 05 D0 27 42 00 19 mov dword ptr A+20h (004227d0),offset ILT+20(func2) (00401019)0040B6A6 8B 0D D0 27 42 00
23、 mov ecx,dword ptr A+20h (004227d0)0040B6AC 89 0D CC 27 42 00 mov dword ptr A+1Ch (004227cc),ecx52:53: fp2 = A(func0() % 2) * a * b;0040B6B2 E8 5D 59 FF FF call ILT+15(func0) (00401014)0040B6B7 25 01 00 00 80 and eax,80000001h0040B6BC 79 05 jns main+93h (0040b6c3)0040B6BE 48 dec eax0040B6BF 83 C8 FE
24、 or eax,0FEh0040B6C2 40 inc eax0040B6C3 0F AF 05 D8 27 42 00 imul eax,dword ptr a (004227d8)0040B6CA 0F AF 05 DC 27 42 00 imul eax,dword ptr b (004227dc)0040B6D1 8B 14 85 B0 27 42 00 mov edx,dword ptr eax*4+4227B0h0040B6D8 89 15 E8 27 42 00 mov dword ptr fp2 (004227e8),edx54:55: if (a b)0040B6DE A1
25、D8 27 42 00 mov eax,a (004227d8)0040B6E3 3B 05 DC 27 42 00 cmp eax,dword ptr b (004227dc)0040B6E9 0F 8E 83 00 00 00 jle main+142h (0040b772)56: 57: if (a * (a + 1) % 2 = 0)0040B6EF 8B 0D D8 27 42 00 mov ecx,dword ptr a (004227d8)0040B6F5 83 C1 01 add ecx,10040B6F8 8B 15 D8 27 42 00 mov edx,dword ptr
26、 a (004227d8)0040B6FE 0F AF D1 imul edx,ecx0040B701 81 E2 01 00 00 80 and edx,80000001h0040B707 79 05 jns main+0DEh (0040b70e)0040B709 4A dec edx0040B70A 83 CA FE or edx,0FEh0040B70D 42 inc edx0040B70E 85 D2 test edx,edx0040B710 75 29 jne main+10Bh (0040b73b)58: 59: fp2 = A(fp2)() % 2) + 2;0040B712
27、8B F4 mov esi,esp0040B714 FF 15 E8 27 42 00 call dword ptr fp2 (004227e8)0040B71A 3B F4 cmp esi,esp0040B71C E8 DF 59 FF FF call _chkesp (00401100)0040B721 25 01 00 00 80 and eax,80000001h0040B726 79 05 jns main+0FDh (0040b72d)0040B728 48 dec eax0040B729 83 C8 FE or eax,0FEh0040B72C 40 inc eax0040B72
28、D 8B 04 85 B8 27 42 00 mov eax,dword ptr eax*4+4227B8h0040B734 A3 E8 27 42 00 mov fp2 (004227e8),eax60: 61:62: else0040B739 EB 28 jmp main+133h (0040b763)63: 64: fp2 = A(fp2)() % 2) + 4;0040B73B 8B F4 mov esi,esp0040B73D FF 15 E8 27 42 00 call dword ptr fp2 (004227e8)0040B743 3B F4 cmp esi,esp0040B7
29、45 E8 B6 59 FF FF call _chkesp (00401100)0040B74A 25 01 00 00 80 and eax,80000001h0040B74F 79 05 jns main+126h (0040b756)0040B751 48 dec eax0040B752 83 C8 FE or eax,0FEh0040B755 40 inc eax0040B756 8B 0C 85 C0 27 42 00 mov ecx,dword ptr eax*4+4227C0h0040B75D 89 0D E8 27 42 00 mov dword ptr fp2 (00422
30、7e8),ecx65: 66: (fp2)();0040B763 8B F4 mov esi,esp0040B765 FF 15 E8 27 42 00 call dword ptr fp2 (004227e8)0040B76B 3B F4 cmp esi,esp0040B76D E8 8E 59 FF FF call _chkesp (00401100)67: 68:69: fp2 = Ab & 1;0040B772 8B 15 DC 27 42 00 mov edx,dword ptr b (004227dc)0040B778 83 E2 01 and edx,10040B77B 8B 04 95 B0 27 42 00 mov eax,dword ptr
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1