-
-
[原创]{smartassembly}不完全分析
-
发表于:
2007-8-17 23:43
24850
-
由于工作的原因,很长时间没有写文章了。和kanxue聊下天,觉得坛里关注.net的人不少,但讨论.net的人不多,因此决定还是抽空写一点东西。质量如何倒是第二位的了,关键是能拉动一些讨论的热情。.net加解密这方面,玩儿这个的感觉发展是突飞猛进,上半年刚学的知识,下半年就有点过时了,这种情况下,.net的加解密似乎成了一个小圈子里几个人的爱好。.net保护这两年发展迅猛,个人感觉今年尤其快速。基本现在分四大类了:混淆、加密(壳)、授权、VM。这四方面都是有机的结合,使得保护的强度更上一层楼。有机会,大家应该都了解一下,其中也有很有技术含量的东西,并非早几年那样,拿到个程序,reflector反编译看下,修改了再ilasm就完事儿了。
废话说到这,今天分析是{smartassembly} v2.2,说不完全分析是因为当逆向了80%的时候,发现0day出破解了。于是没有继续搞下去,只能把所做的工作拿出来献丑,希望引起大家的兴趣,共同研究.net软件安全。
{smartassembly}是一款.net混淆软件,采用了基本上目前所有主流的混淆技术,其实也就两种:名称、流程。但混淆保护中辅助手段是不可少的:打包、强名称校验、错误元数据等。软件名字起的不错,所以安装后在Program Files目录下总是排在第一。
拿到软件先运行一下,提示还有几天试用到期,到期后则无法进入。
习惯性的,用Reflector载入,来到入口点,直接显示// This item is obfuscated and can not be translated。切换成IL,看一下流程混淆的形式,开始的几句代码如下:
L_0000: call bool .:: ()
L_0005: brtrue.s L_000c
L_0007: leave L_0799
L_000c: br L_0698
L_0011: br L_06a2
L_0016: br L_06ac
L_001b: brtrue.s L_0022
L_001d: leave L_0799
L_0022: br L_06b6
L_0027: ldlen
IL_0015: ldsfld class [mscorlib]System.IO.Stream ' '.' '::' '
IL_001a: brtrue IL_0067
IL_001c: call class [mscorlib]System.Reflection.Assembly [mscorlib]System.Reflection.Assembly::GetExecutingAssembly()
IL_0021: stloc.1
IL_0022: ldloc.1
IL_0023: ldstr "{e75060b3-2d5b-48f0-8182-1dfcf56cfa33}"
IL_0028: callvirt instance class [mscorlib]System.IO.Stream [mscorlib]System.Reflection.Assembly::GetManifestResourceStream(string)
IL_002d: stsfld class [mscorlib]System.IO.Stream ' '.' '::' '
IL_0032: ldloc.1
IL_0033: callvirt instance class [mscorlib]System.Reflection.AssemblyName [mscorlib]System.Reflection.Assembly::GetName()
IL_0038: callvirt instance uint8[] [mscorlib]System.Reflection.AssemblyName::GetPublicKeyToken()
L_0096: ldc.i4 0x3076
L_009b: call string . :: (int32)
L_00a0: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课