惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - Kriss Liu

如何通过活动目录(ADSI)修改IIS6中的 Web 服务扩展 XMLDOM/XMLHTTP的跨域访问和页面代理 关于如何让页面同时下载多个文件的尝试 - Kriss Liu - 博客园 Remoting中的线程与网络通信内幕初探 Remoting多个信道(Chennel)的注册问题 基于强名称签名的代码访问保护及其改进 利用命名管道(Named Pipe)向Flash Player模拟Flash媒体文件 多样、互动的WinForm UI设计与开发思路(Flash、Html等) WinForm中设计时与DesignMode的区别 ServU插件设计 如何在C#中直接操作C++结构体 .NET中Flags枚举的使用 最近的计划。。VOS和DataSetBrowser。。 看完《仙剑奇侠传》前20集的一点牢骚。。 一套可嵌入或独立使用的翻页控件: WebPager(附源码) ASP.NET 2.0 中创建DataList子类控件时的一个错误 在.NET中使用DirectMusic 我与电脑的十年 关于 Windows Media DRM 0xC00D2840 错误
绕开 CoreLab.MySql 验证
Kriss Liu · 2008-10-16 · via 博客园 - Kriss Liu

随着微软在.NET 3.5 SP1中正式推出Entity Framework,很多数据访问提供者开始支持这一新框架。本文涉及到的 Devart MyDirect.NET 就是目前MySql数据库领域支持EF的数据访问组件(MySql Connector据说要等本月底才推出支持EF的新版本)。MyDirect.NET对EF提供了很好的支持,不过免费版只能试用1个月。以下从技术角度阐述如何绕开其验证,仅供学习研究之用。

1、寻找验证相关的入口函数:

    当到期时,异常信息和调用堆栈如下:
    ----> CoreLab.MySql.MySqlException : Sorry, your trial period has expired.
    --MySqlException
         at CoreLab.MySql.MySqlConnection.Open() 

    在打开MySqlConnection出错,用Reflector分析CoreLab.MySql.dll看一下代码:

Code

可以看到,ac这个类实现LicenseProvider用于产生License,而u这个类继承License对象,同时保存更具体的认证信息。
由于混淆过,我们无从知道u这个类每个字段的含义(a,b,c,d,e,f),这个时候我们需要人为执行一下GetLicense,看里面到底包含什么数据:

Code

调试的时候我们可以看到,u.a包含了LicenseString, u.c则包含了认证失败的错误信息,u.e=3,这个貌似是返回码。
我们把系统时间调前,看一下未到期的时候,产生的license是什么样子:
u.a=LicenseString, u.c=null, u.e=0

2、产生可以使用的License

Code

自己运行一下,OK,可以产生一个正常的license

3、修改DLL
     首先,将上述MyLicenseProvider编译成一个DLL,我们需要得到上述代码的IL:
     ilasm MyLicenseProvider.dll /out=MyLicenseProvider.il
     找到 GetLicense 方法:

Code

接下来我们要反汇编 CoreLab.MySql.dll
运行 ildasm CoreLab.MySql.dll /out=source.il
这时出现提示信息 "Protected Module",无法反汇编。这是因为这个动态库增加了SuppressIldasmAttribute属性,从而ildasm不允许反汇编。我们可以很容易制造一个hack过的ildasm.exe版本,方法如下:
用二进制编辑器(如WinHex)打开C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\ildasm.exe
查找SuppressIldasmAttribute,将其修改为任意字符串,保存。

现在重新执行ildasm CoreLab.MySql.dll /out=source.il,得到CoreLab.MySql的il代码,查找以下代码:

Code

用我们之前得到的MyLicenseProvider里面的il代码替换a()方法,注意保留第一行的.override [System]System.ComponentModel.LicenseProvider::GetLicense

我们在重新编译il之前,还有一些工作要做,其中最重要的就是产生强名称签名。没有强名称签名,这个修改过的dll是无法工作的。

4、产生和修改强名称
    首先产生一对key:
    sn -k key.snk
    然后从中提取公钥
    sn -p key.snk public.key
    然后显示PublicKeyToken
    sn -t public.key
    这个时候会显示Public key token is a603cb3085449c2c
    这个public key token要记下来,我们下面要用到

    这里需要说明一下CoreLab.MySql.dll和CoreLab.MySql.Entity.dll的关系。
    从名称上可以看出,CoreLab.MySql.Entity.dll用于支持Entity Framework,所以其必然会引用强名称版本的CoreLab.MySql.dll,通过Reflector查看Reference可以验证我们的猜想。按照我们的思路,修改CoreLab.MySql.dll的验证部分代码,然后用我们产生的新的key去签名,为了支持EF,有必要同时产生一个配套的修改版CoreLab.MySql.Entity.dll。

    回头看CoreLab.MySql.dll,我们使用EF也好,使用ADO.NET也好,其Data Provider都是指向CoreLab.MySql。通过反射可知,这些功能都是由 CoreLab.MySql.MySqlDirectFactory工厂来支持的,这个类实现了接口DbProviderFactory和IServiceProvider,前者用于支持ADO.NET Data Provider,后者用于支持Entity Framework。我们看到MySqlDirectFactory里有如下方法签名:private object a(Type A_0); 这个方法便实现了IServiceProvider.GetService(Type serviceType)方法。在它的实现里,可以看到如下代码:

Code

把这里的PublicKeyToken=09af7300eec23701替换成我们刚才自己产生的KeyToken, a603cb3085449c2c。

好了,现在可以重新编译 CoreLab.MySql.dll 了,运行以下命令:
ilasm source.il /dll /key=key.snk /out=CoreLab.MySql.dll

接下来我们修改CoreLab.MySql.Entity.dll对CoreLab.MySql.dll的引用。
  1) 反汇编IL
   ildasm CoreLab.MySql.Entity.dll /out=entity_source.il
  2) 查找 .assembly extern CoreLab.MySql
   将publickeytoken改成上面产生的新key,每个字节用空格隔开
  3) 重新编译
   ilasm entity_source.il /dll /key=key.snk /out=CoreLab.MySql.Entity.dll

对DLL和强名称的修改完成后,我们可以重新注册这些DLL并且使用了。

5、注册GAC
     gacutil /i CoreLab.MySql.dll
     gacutil /i CoreLab.MySql.Entity.dll
     如果打开C:\Windows\Assembly,我们现在应该可以看到两个版本的DLL,一个是原始版,一个是修改版

6、最后一步,修改machine.config使用修改版Data Provider.
    编辑 C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config
    找到以下这一段配置:
      <add name="MyDirect .NET" invariant="CoreLab.MySql" description="CoreLab MyDirect .NET"
        type="CoreLab.MySql.MySqlDirectFactory, CoreLab.MySql, Version=4.85.35.0, Culture=neutral, PublicKeyToken=09af7300eec23701" />
   将PublicKeyToken改成我们的key

大功告成~!