[原创]review assistant破解心得
发表于:
2013-7-20 01:47
12758
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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!