一类代码迷惑的反解复杂性.docx

上传人:b****5 文档编号:4065724 上传时间:2022-11-27 格式:DOCX 页数:18 大小:325.85KB
下载 相关 举报
一类代码迷惑的反解复杂性.docx_第1页
第1页 / 共18页
一类代码迷惑的反解复杂性.docx_第2页
第2页 / 共18页
一类代码迷惑的反解复杂性.docx_第3页
第3页 / 共18页
一类代码迷惑的反解复杂性.docx_第4页
第4页 / 共18页
一类代码迷惑的反解复杂性.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

一类代码迷惑的反解复杂性.docx

《一类代码迷惑的反解复杂性.docx》由会员分享,可在线阅读,更多相关《一类代码迷惑的反解复杂性.docx(18页珍藏版)》请在冰豆网上搜索。

一类代码迷惑的反解复杂性.docx

一类代码迷惑的反解复杂性

一类代码迷惑的反解复杂性问题

摘要@@证明了借助函数指针数组的混淆的反解复杂度是NP-Hard的。

本文重点介绍该结论。

关键词代码迷惑复杂度函数指针数组

§1借助函数指针数组的混淆技术简介

§1.1函数指针在软件混淆中的使用

基于函数指针的混淆技术包含3个阶段:

1、函数的分解:

首先我们随机挑选一个函数并把它分解为更小的函数,然后在保持原函数语义的情况下用这几个小函数重新构造原函数。

2、函数指针的使用:

函数和随机选择的分解函数可以凭借函数指针调用。

例如,图中2右侧的程序可以被转换为图3中的程序。

两个新的if模块被引入了,这两个新的if模块的条件值恒为1,而源程序的语义被保留了。

然而,静态分析很难评估这些模块从而很难确定在这些if模块存在下的可执行路径。

所以,if模块使确定函数指针指向的函数地址变得困难了。

3、函数指针数组的引入:

这里我们引入函数指针数组,然后把函数地址随机地存在数组中并做出表达式用一些(直接或非直接的)函数调用来计算每个索引。

现在一些函数调用被替换为通过这种数组的调用。

例如,图3的程序可以转换为图4的程序。

现在对于fp的分配取决于凭借fp先前的值的函数调用和A的相关元素。

它们一起有效地抵御了静态分析。

§1.2增加不可实现路径的数量

跨函数分析很困难的原因之一就是它必须遵循可执行路径,基于这个事实,我们提出两种软件混淆技术来阻止跨函数分析:

1、合并多个函数调用为一个:

这个技术把多个函数调用合并为一个新创建的函数,如图5所示,随机选取两个函数调用func1()和func2(),函数func3()是新创建的,最后两个调用以某个混淆的方式嵌入到了func3()中。

经过这样的混淆处理,调用图的变化如图6所示,转换后比转换前多了两个不可实现路径。

如果跨函数分析忽略了不可实现路径,它只会失败或产生不精确的分析结果。

即使跨函数分析努力地要遵循可实现路径也会非常困难。

2、加入大量的return模块:

加入大量的return模块的混淆技术也可以使调用图变得复杂并且阻止跨函数分析,如图7所示,相应的调用图如图8所示。

不难看出调用图变得更复杂了并且不可实现路径的数量从2个增加到4个。

所以同理这个混淆技术也很有效。

 

§2借助函数指针数组的混淆技术反解复杂度

定理1

在从具有函数指针或通过函数指针进行函数调用的数组中分配函数指针的情况下(函数返回整数),确定程序中是否存在可执行路径是NP困难的。

证明我们通过证明3-SAT问题(NP完全的)在多项式时间内可归约为定理1的问题来证明定理1。

现在,假设给定3-SAT问题,定义值为true或false的变量

,以及公式:

其中

的值为

,然后我们构造一个如图1的C程序,假设所有路径都是可执行的,所有if模块的条件部分没有影响,这样用标志“-”来代替所有if模块的条件。

在代码L1部分,

被定义为函数指针并与3-SAT问题中的命题变量

相关联。

L2分别把true和false赋给A[0]和A[1]。

在L3中的任意的经过if模块的可执行路径都与3-SAT问题的真假值指派相对应。

所以如果3-SAT问题有答案,我们也就有相应的可执行路径,函数指针fp指向L5上的函数true。

而且,如果3-SAT问题没有答案,至少存在一个子句它的三个变元都是假的,在这种情况下,fp指向函数false。

另一方面,如果函数指针指向在一个可执行路径上的L5上的函数true,那么有相同真假赋值的3-SAT问题也有解。

根据上面陈述的理由,3-SAT问题有解当且仅当我们能确定是否有可执行路径,在这个路径上函数fp指向L5上的函数地址true。

第3节我们的实验

为了验证定理1中的问题是否真是NP-HARD,我们将文章中未作任何处理的程序和经过混淆处理的程序分别运行并列出相应的汇编代码,然后进行比较。

§3.1未作处理的程序代码

3:

inta,b;

4:

5:

if(a>b)

004010288B45FCmoveax,dwordptr[ebp-4]

0040102B3B45F8cmpeax,dwordptr[ebp-8]

0040102E7E06jlemain+26h(00401036)

6:

{

7:

a=b;

004010308B4DF8movecx,dwordptr[ebp-8]

00401033894DFCmovdwordptr[ebp-4],ecx

8:

}

9:

10:

b=a+1;

004010368B55FCmovedx,dwordptr[ebp-4]

0040103983C201addedx,1

§3.2应用函数指针数组混淆处理过的程序代码

3.2.1源程序

inta,b,c;

int(*fp1)(),(*fp2)();

int(*A[10])();

intfunc0()

{

if(a*(a+1)*(a+2)%6)

{

return(a*(a+2));

}

else

{

return((a-1)*a);

}

}

intfunc1()

{

a=b;

return0;

}

intfunc2()

{

b=a+1;

return0;

}

intfunc3()

{

switch(c)

{

case0:

fp1=func1;break;

case1:

fp1=func2;break;

}

(fp1)();

return0;

}

voidmain()

{

A[0]=A[1]=func0;

A[2]=A[3]=func3;

A[4]=A[6]=func0;

A[5]=A[9]=func1;

A[7]=A[8]=func2;

fp2=A[(func0()%2)*a*b];

if(a>b)

{

if(a*(a+1)%2==0)

{

fp2=A[((fp2)()%2)+2];

}

else

{

fp2=A[((fp2)()%2)+4];

}

(fp2)();

}

fp2=A[b&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:

inta,b,c;

2:

3:

int(*fp1)(),(*fp2)();

4:

int(*A[10])();

5:

6:

intfunc0()

7:

{

0040B55055pushebp

0040B5518BECmovebp,esp

0040B55383EC40subesp,40h

0040B55653pushebx

0040B55756pushesi

0040B55857pushedi

0040B5598D7DC0leaedi,[ebp-40h]

0040B55CB910000000movecx,10h

0040B561B8CCCCCCCCmoveax,0CCCCCCCCh

0040B566F3ABrepstosdwordptr[edi]

8:

if(a*(a+1)*(a+2)%6)

0040B568A1D8274200moveax,[a(004227d8)]

0040B56D83C001addeax,1

0040B5708B0DD8274200movecx,dwordptr[a(004227d8)]

0040B5760FAFC8imulecx,eax

0040B5798B15D8274200movedx,dwordptr[a(004227d8)]

0040B57F83C202addedx,2

0040B5820FAFCAimulecx,edx

0040B5858BC1moveax,ecx

0040B58799cdq

0040B588B906000000movecx,6

0040B58DF7F9idiveax,ecx

0040B58F85D2testedx,edx

0040B5917413jefunc0+56h(0040b5a6)

9:

{

10:

return(a*(a+2));

0040B5938B15D8274200movedx,dwordptr[a(004227d8)]

0040B59983C202addedx,2

0040B59CA1D8274200moveax,[a(004227d8)]

0040B5A10FAFC2imuleax,edx

0040B5A4EB0Fjmpfunc0+65h(0040b5b5)

11:

}

12:

13:

else

14:

{

15:

return((a-1)*a);

0040B5A6A1D8274200moveax,[a(004227d8)]

0040B5AB83E801subeax,1

0040B5AE0FAF05D8274200imuleax,dwordptr[a(004227d8)]

16:

}

17:

}

0040B5B55Fpopedi

0040B5B65Epopesi

0040B5B75Bpopebx

0040B5B88BE5movesp,ebp

0040B5BA5Dpopebp

0040B5BBC3ret

32:

33:

intfunc3()

34:

{

0040B5C055pushebp

0040B5C18BECmovebp,esp

0040B5C383EC44subesp,44h

0040B5C653pushebx

0040B5C756pushesi

0040B5C857pushedi

0040B5C98D7DBCleaedi,[ebp-44h]

0040B5CCB911000000movecx,11h

0040B5D1B8CCCCCCCCmoveax,0CCCCCCCCh

0040B5D6F3ABrepstosdwordptr[edi]

35:

switch(c)

36:

{

0040B5D8A1E0274200moveax,[c(004227e0)]

0040B5DD8945FCmovdwordptr[ebp-4],eax

0040B5E0837DFC00cmpdwordptr[ebp-4],0

0040B5E47408jefunc3+2Eh(0040b5ee)

0040B5E6837DFC01cmpdwordptr[ebp-4],1

0040B5EA740Ejefunc3+3Ah(0040b5fa)

0040B5ECEB16jmpfunc3+44h(0040b604)

37:

case0:

fp1=func1;break;

0040B5EEC705E42742001Emovdwordptr[fp1(004227e4)],offset@ILT+25(func1)(0040101e)

0040B5F8EB0Ajmpfunc3+44h(0040b604)

38:

case1:

fp1=func2;break;

0040B5FAC705E427420019movdwordptr[fp1(004227e4)],offset@ILT+20(func2)(00401019)

39:

}

40:

(fp1)();

0040B6048BF4movesi,esp

0040B606FF15E4274200calldwordptr[fp1(004227e4)]

0040B60C3BF4cmpesi,esp

0040B60EE8ED5AFFFFcall__chkesp(00401100)

41:

42:

return0;

0040B61333C0xoreax,eax

43:

}

0040B6155Fpopedi

0040B6165Epopesi

0040B6175Bpopebx

0040B61883C444addesp,44h

0040B61B3BECcmpebp,esp

0040B61DE8DE5AFFFFcall__chkesp(00401100)

0040B6228BE5movesp,ebp

0040B6245Dpopebp

0040B625C3ret

44:

45:

voidmain()

46:

{

0040B63055pushebp

0040B6318BECmovebp,esp

0040B63383EC40subesp,40h

0040B63653pushebx

0040B63756pushesi

0040B63857pushedi

0040B6398D7DC0leaedi,[ebp-40h]

0040B63CB910000000movecx,10h

0040B641B8CCCCCCCCmoveax,0CCCCCCCCh

0040B646F3ABrepstosdwordptr[edi]

47:

A[0]=A[1]=func0;

0040B648C705B427420014movdwordptr[A+4(004227b4)],offset@ILT+15(func0)(00401014)

0040B652A1B4274200moveax,[A+4(004227b4)]

0040B657A3B0274200mov[A(004227b0)],eax

48:

A[2]=A[3]=func3;

0040B65CC705BC27420023movdwordptr[A+0Ch(004227bc)],offset@ILT+30(func3)(00401023)

0040B6668B0DBC274200movecx,dwordptr[A+0Ch(004227bc)]

0040B66C890DB8274200movdwordptr[A+8(004227b8)],ecx

49:

A[4]=A[6]=func0;

0040B672C705C827420014movdwordptr[A+18h(004227c8)],offset@ILT+15(func0)(00401014)

0040B67C8B15C8274200movedx,dwordptr[A+18h(004227c8)]

0040B6828915C0274200movdwordptr[A+10h(004227c0)],edx

50:

A[5]=A[9]=func1;

0040B688C705D42742001Emovdwordptr[A+24h(004227d4)],offset@ILT+25(func1)(0040101e)

0040B692A1D4274200moveax,[A+24h(004227d4)]

0040B697A3C4274200mov[A+14h(004227c4)],eax

51:

A[7]=A[8]=func2;

0040B69CC705D027420019movdwordptr[A+20h(004227d0)],offset@ILT+20(func2)(00401019)

0040B6A68B0DD0274200movecx,dwordptr[A+20h(004227d0)]

0040B6AC890DCC274200movdwordptr[A+1Ch(004227cc)],ecx

52:

53:

fp2=A[(func0()%2)*a*b];

0040B6B2E85D59FFFFcall@ILT+15(func0)(00401014)

0040B6B72501000080andeax,80000001h

0040B6BC7905jnsmain+93h(0040b6c3)

0040B6BE48deceax

0040B6BF83C8FEoreax,0FEh

0040B6C240inceax

0040B6C30FAF05D8274200imuleax,dwordptr[a(004227d8)]

0040B6CA0FAF05DC274200imuleax,dwordptr[b(004227dc)]

0040B6D18B1485B0274200movedx,dwordptr[eax*4+4227B0h]

0040B6D88915E8274200movdwordptr[fp2(004227e8)],edx

54:

55:

if(a>b)

0040B6DEA1D8274200moveax,[a(004227d8)]

0040B6E33B05DC274200cmpeax,dwordptr[b(004227dc)]

0040B6E90F8E83000000jlemain+142h(0040b772)

56:

{

57:

if(a*(a+1)%2==0)

0040B6EF8B0DD8274200movecx,dwordptr[a(004227d8)]

0040B6F583C101addecx,1

0040B6F88B15D8274200movedx,dwordptr[a(004227d8)]

0040B6FE0FAFD1imuledx,ecx

0040B70181E201000080andedx,80000001h

0040B7077905jnsmain+0DEh(0040b70e)

0040B7094Adecedx

0040B70A83CAFEoredx,0FEh

0040B70D42incedx

0040B70E85D2testedx,edx

0040B7107529jnemain+10Bh(0040b73b)

58:

{

59:

fp2=A[((fp2)()%2)+2];

0040B7128BF4movesi,esp

0040B714FF15E8274200calldwordptr[fp2(004227e8)]

0040B71A3BF4cmpesi,esp

0040B71CE8DF59FFFFcall__chkesp(00401100)

0040B7212501000080andeax,80000001h

0040B7267905jnsmain+0FDh(0040b72d)

0040B72848deceax

0040B72983C8FEoreax,0FEh

0040B72C40inceax

0040B72D8B0485B8274200moveax,dwordptr[eax*4+4227B8h]

0040B734A3E8274200mov[fp2(004227e8)],eax

60:

}

61:

62:

else

0040B739EB28jmpmain+133h(0040b763)

63:

{

64:

fp2=A[((fp2)()%2)+4];

0040B73B8BF4movesi,esp

0040B73DFF15E8274200calldwordptr[fp2(004227e8)]

0040B7433BF4cmpesi,esp

0040B745E8B659FFFFcall__chkesp(00401100)

0040B74A2501000080andeax,80000001h

0040B74F7905jnsmain+126h(0040b756)

0040B75148deceax

0040B75283C8FEoreax,0FEh

0040B75540inceax

0040B7568B0C85C0274200movecx,dwordptr[eax*4+4227C0h]

0040B75D890DE8274200movdwordptr[fp2(004227e8)],ecx

65:

}

66:

(fp2)();

0040B7638BF4movesi,esp

0040B765FF15E8274200calldwordptr[fp2(004227e8)]

0040B76B3BF4cmpesi,esp

0040B76DE88E59FFFFcall__chkesp(00401100)

67:

}

68:

69:

fp2=A[b&1];

0040B7728B15DC274200movedx,dwordptr[b(004227dc)]

0040B77883E201andedx,1

0040B77B8B0495B0274200moveax,dwordptr

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1