微软的软件授权及保护服务(SLPS)试用分析

这些天都在绞尽脑汁地想怎么样设计一个授权方式来保护我的组件,今天看了一下同事从广州带回来的Tech2007的讲稿,里面提到了 微软的软件授权及保护服务(SLPS),对其非常感兴趣。

但到网上搜索的时候,只有一个页面有相关信息,里面是上海站的讲稿,还好,找到了一个SLP的链接 http://www.microsoft.com/slps/

打开看了一下介绍,马上下载:http://www.microsoft.com/downloads/details.aspx?FamilyID=7ae70aaa-8b7c-4e3a-af83-b71b6877705b&displaylang=en

安装试用。一启动就要我输入用户名密码,但是不管我怎么输都是错的,只好取消进入,后来看手册才知道,那是要到官方服务器上授权的,如果没有授权的话,这个功能只能保护产品,而不能对产品进行授权控制,并且只能保护三个方法。

加入几个程序集,Protect,然后用Reflector打开我选择加密的那几个方法,居然没有报异常。

而方法体内容都变成这样了:

public static void WriteLine(string msg)

{

    object[] args = new object[] { msg };

    SLMRuntime.SVMExecMethod(null, "b0199ec367594bd1b03b3fb29ff12f86", args);

}

用Reflector看SLP的各个类时,也发现所有的公开方法都是这种写法,都需要经过SLMRuntime.SVMExecMethod这个门神。

第一个参数在静态方法中是null,在实例方法中是this,可能是供反射用的吧;第二个参数似乎是方法名的散列,第三个方法是参数数组,即使没有参数,也要构造一个没有元素的数组。

这个方法的代码:

public static object SVMExecMethod(object obj, string SVMMethodId, object[] args)

{

    Assembly callingAssembly = Assembly.GetCallingAssembly();

    TrivialVirtualMachineParamsReader paramsReader = new TrivialVirtualMachineParamsReader(obj, args);

    return InternalSVMExecMethod(callingAssembly, SVMMethodId, paramsReader);

}

再进去:

public static object InternalSVMExecMethod(Assembly declaringAssembly, string SVMMethodId, ISLMVirtualMachineParams paramsReader)

{

    using (ISLMRuntime runtime = new SLMRuntime(null, declaringAssembly, true))

    {

        return runtime.SVM.SVMExecMethod(declaringAssembly, SVMMethodId, paramsReader);

    }

}

SVM已经是ISLMVirtualMachine接口了,查不到SVM.SVMExecMethod在哪里实现。

回过头来,程序集被加密(暂且这么叫)后,不仅那几个方法改变了,还多了几个文件,分别是:Microsoft.Licensing.Utils2.0.dll、Microsoft.Licensing.Runtime2.0.dll、Microsoft.Licensing.Permutation_1cc06_2.0.dll、Microsoft.Licensing.LicAdmin.exe。

其中第三个文件的1cc06_2是我安装SLP后得到的默认授权,最后一个文件是授权管理器。第一第二个文件和SLP安装目录中的一样。看来,第三个文件是临时生成的,里面的名字被混淆得厉害,类名都是两个字母,方法名和属性名都是一个大写字母。

仔细查看第三个文件,居然发现里面有一个fu类实现了ISLMVirtualMachine接口,而只有一个Microsoft.Licensing.SLMRuntimeRedirect类使用了fu类。SLMRuntimeRedirect中刚好有个SVMExecMethod方法,前面的双字母的类方法大多数都调用了这个方法,这可能是自保护吧。

看来fu类是关键了。里面的东西被混淆得乱七八糟的,就不多说了。

分析中注意到,fu的主要方法调用了一个bB类,而bB类实现了SLMLicenses等接口,再看看这个类的内容,非常明显,这是一个授权控制文件,可能这就是SLP的弱点了。

从上面分析可以看到,SLP非常强大好用,但是它毕竟还是完整的.net实现,还是有弱点的,具体要怎么利用,我就不多说了,也不想想了。如果你想到了,不要忘记告诉我哦!^_^

QQ:99363590

EMail:gxuhy@21cn.com

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

一个二进制POC的诞生之旅CVE-2018-0802

背景 在潜伏17年的“噩梦公式”漏洞(CVE-2017-11882)被曝光修补之后,之前的漏洞程序EQNEDT32.EXE在windows 10系统下仍然没有开...

2699
来自专栏芋道源码1024

【Netty 专栏】深入浅出 Netty 内存管理 PoolChunk

摘要: 原创出处 https://www.jianshu.com/p/c4bd37a3555b 「占小狼」欢迎转载,保留摘要,谢谢!

1080
来自专栏iKcamp

手把手教你撸一个 Webpack Loader

文:小 boy(沪江网校Web前端工程师) 本文原创,转载请注明作者及出处 ? 经常逛 webpack 官网的同学应该会很眼熟上面的图。正如它宣传的一样,w...

4434
来自专栏PHP实战技术

PHP经典面试题目汇总(上篇)

1、双引号和单引号的区别 双引号解释变量,单引号不解释变量 双引号里插入单引号,其中单引号里如果有变量的话,变量解释 双引号的变量名后面必须要有一个非数字、字母...

3227
来自专栏窗户

深入设计电子计算器(一)——CPU框架及指令集设计

前几天写了一篇《如何设计一个电子计算器》,一个朋友看了之后说实在太low,好吧,依照他的意思,那我就采用文中FPGA设计的方式,然后自己从指令集设计、cpu设...

2006
来自专栏生信宝典

不用Linux也可以的强大文本处理方法

标题党了,其实是论VIM的使用。 做生物信息分析最合适的还是Linux操作系统,所以生信宝典在最开始就推出了Linux学习系列,由浅入深的讲述了Linux学习中...

1856
来自专栏ChaMd5安全团队

PY交易之简单沙盒绕过

p猫表哥要我写一些有趣的东西,本人比较菜,见识也比较短浅,也不会ri站,更不会打ctf,只能随便说点我觉得还是比较好玩的东西。 ? 本人在大二上学期的时候自学了...

4907
来自专栏编舟记

Clojure component 设计哲学

Component 是一个微型的 Clojure 框架用于管理那些包含运行时状态的软件组件的生命周期和依赖。

850
来自专栏IT派

Python链式操作:PyFunctional

PyFunctional通过使用链式功能操作符使得创建数据管道变得简单。以下是pyfunctional及其内置工具可以做什么的几个例子:

1554
来自专栏cs

python经常用到的东西。

语法: 'sep'.join(seq) 参数说明 sep:分隔符。可以为空 seq:要连接的元素序列、字符串、元组、字典 上面的语法即:以sep作为分...

481

扫码关注云+社区