首页
社区
课程
招聘
[原创]review assistant破解心得
发表于: 2013-7-20 01:47 12695

[原创]review assistant破解心得

2013-7-20 01:47
12695

review assistant是一个能集成在visual studio的代码评审工具,目前最新版本是1.2.30,网址为:
http://www.devart.com/review-assistant/

花了两天分析破解,基本破解成功,将这两天的破解思路汇报一下。

1.通过查看review assistant的目录结构和文件命名规则,判断它为C#程序,决定选用Reflector和reflexil进行破解;

2.初步猜测其会在Devart.ReviewAssistant.Common.dll实现注册、加密等逻辑,于是通过Reflector打开查看,发现一个命名空间Devart.ReviewAssistant.Common.License,其中包含LicenseInfo类,分析LicenseInfo类,发现其中包含它的各种注册等代码;

3.LicenseInfo有一个方法DaysBeforeExpired,内容如下:
public int DaysBeforeExpired
{
    get
    {
        TimeSpan span = (TimeSpan) (this.EndDate.Date - DateTime.Now.Date);
        return (span.Days + 1);
    }
}
以为破解会非常简单,只要将+1改为+1000便可完成破解,但改完后发现没有效果。

4.猜测别的程序或动态库会使用LicenseInfo,于是将所有程序载入Reflector,F3搜索LicenseInfo,发现ReviewAssistantServer.exe有一个类"#=q9VXlN7R77KJQsIcXNDOyoQZ5uVA_SQytMl0gr9McnSnn4v$Kwf$S1rtOrCtwbGbTM5JUujvNgx2UmXGkSjsIKQ=="(已被混淆)创建了LicenseInfo,如下所示:
public OperationResult GetLicenseInformation(LoginInfo #=qZG2sgtPtY$hvFevuYpDgzQ==, out byte[][] #=qM970WgKWmT1RKDhOAzW4BA==)
{
    DateTime now = DateTime.Now;
    #=qM970WgKWmT1RKDhOAzW4BA== = null;
    List<byte[]> list = new List<byte[]>();
    try
    {
        foreach (LicenseInfo info in #=qzJZguenem3lycvMKsZrLYMlx5ni1fzNqKrhQfvGoGXow9pKX3W9ndyn3WLIUAMiX.#=q_egRSvuus951dsxJkBD1ng==().#=qDfpT$TbjCumxO6pwEVpvBg==())
        {
            info.Signature = null;
            list.Add(info.ToBytes());
        }
    }
    catch (Exception exception)
    {
        return this.#=qNvV_s1I$7V9ukfZAO0fQtP0eEgV966_EzLkM$xWQFug=(null, #=q$BFJDxTd1oZkxfbLBg3DYMJIdM1MO0Sa0t8Q8Z$3KdE=.#=qgfjJC0lJg6Mz314CRmsMEw==(-277034973), exception, now);
    }
    #=qM970WgKWmT1RKDhOAzW4BA== = list.ToArray();
    return new OperationResult(OperationResultStatus.Ok, now);
}

可以看出,类"qzJZguenem3lycvMKsZrLYMlx5ni1fzNqKrhQfvGoGXow9pKX3W9ndyn3WLIUAMiX"需要重点关注;

5.分析查看类“qzJZguenem3lycvMKsZrLYMlx5ni1fzNqKrhQfvGoGXow9pKX3W9ndyn3WLIUAMiX”,发现其确实与注册有关;

6.类“qzJZguenem3lycvMKsZrLYMlx5ni1fzNqKrhQfvGoGXow9pKX3W9ndyn3WLIUAMiX”初始化时,创建了两个Licsense,如下所示:
static #=qzJZguenem3lycvMKsZrLYMlx5ni1fzNqKrhQfvGoGXow9pKX3W9ndyn3WLIUAMiX()
{
    LicenseInfo info = new LicenseInfo {
        UserName = #=qKcATx1QrcSRw846XymY4aA==(),
        Company = #=qgxYhyF6W0XXcoV7jXR53gvHFwt$klSOUQTkuEzLby8w=(),
        Type = LicenseType.Trial,
        UserCount = 0x7fffffff,
        EndDate = DateTime.Now.Date.AddDays((double) (#=q2cBrNNFo14ZAXwSnSHPPQHRh2V1kmI0H21MoTOkrIAXJ4rhkj78wx4SNJb0Y4Unh.#=qgds4YRA1s7lnD2tqMclPwA==() - 1))
    };
    #=qCnV2kgLhXvPXd38e$TkKPg== = info;
    LicenseInfo info2 = new LicenseInfo {
        UserName = #=qKcATx1QrcSRw846XymY4aA==(),
        Company = #=qgxYhyF6W0XXcoV7jXR53gvHFwt$klSOUQTkuEzLby8w=(),
        Type = LicenseType.Free,
        UserCount = 3,
        EndDate = DateTime.MaxValue
    };
    #=q76MDXyntEgMQZR6lSfq8PAMGGRM0iOx6gtw68Z7sxQM= = info2;
}

6.试着将第一个License的超期日期由-1改为+1000,修改之后能够工作,各种功能正常,但5-10分钟后系统退出,不再可用;

7.猜测系统在启动后,会Seep5-10分钟后进行各种检查,于是搜索Sleep,发现多处有多处Sleep5-10分钟的代码,如下所示:
     Random random = new Random();
       Thread.Sleep(random.Next(0x493e0, 0x927c0));
       ......
其中0x493e0十进制为300000,0x927c0十进制为600000。

8.系统初始能够正常运行,过了5-10分钟之后便不能运行,应该是Sleep5-10分钟之后开始干坏事,于是搜索所有的0x493e0和0x927c0,如果其与Sleep配对的地方直接短路返回,不让它干坏事,如下所示:
       Random random = new Random();
       Thread.Sleep(random.Next(0x493e0, 0x927c0));
       ret

8.这样修改之后,系统能正常工作。

9.其它心得要点:

A、Devart.ReviewAssistant.Common.dll确实为其包含了注册相关功能,它检查系统中是否有Licsense文件并读出,刚开始我曾经想利用它直接产生注册文件,但它的注册文件采用RSA加密且包含签名信息,在ReviewAssistantServer.exe中能找到它的公钥,但无法得到私钥,此方法行不通;

B、ReviewAssistantServer.exe中采用了签名检查,能检查ReviewAssistantServer.exe是否被修改,如果被修改,则5至10分钟之后开始干坏事;

C、review assistant采用了Eaz混淆工具的最新版本,de4dot对它不能完成反混淆;

D、ReviewAssistantServer.exe随机插入了5个防破解处理类,这些类中在所台启动了很多线程。

总结:
相对于.NET平台下的代码很容易被破解。

欢迎各位朋友一起交流心得,我的邮箱:linkman2002#sina.com QQ:2998143609

收藏
免费 5
支持
分享
最新回复 (2)
雪    币: 680
活跃值: (68)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
看完了,撸主的思路很好,但是那个5分钟-10分钟时怎么想出来的?不好确定啊
2013-7-20 09:28
0
雪    币: 70
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
我当时的思路:
1、这是一个代码评审的工具服务端,没有什么工作需要每隔5分钟进行处理;
2、查出所有Sleep5-10分钟的线程所属的类,都属于顶层命名空间,而不是象它的其它类一样,有较良好的命名空间分类,这些类从代码特征分析,明显是用于防破解的;
3、这些防破解类的数量大约7-10个,这7-10个类与系统其它正常类的交互很少,都是被其它类调用,都只调用一起,猜测是开发者买了一套防破解工具。
2013-7-20 12:40
0
游客
登录 | 注册 方可回帖
返回
//