畅享博客 > 航行日志——理论与实践并行 > 程序人生 > [原创]关于对SQL2005加密存储过程的破解
2008-5-6 12:40:19

[原创]关于对SQL2005加密存储过程的破解

造盾之前,需要先了解矛的锋利。这就是本文的由来。

MS-SQL2005的加密方式基本延续了2000,仍然采用了基于XOR的方式。

 对于2000,有如下代码可以破解:见附件1  decrypt2000.sql

 

针对SQL2005,加密数据储存在sys.sysobjvalues 中:

SELECT imageval

    FROM sys.sysobjvalues

    WHERE id = object_id(@procedure) AND valclass = 1 AND subobjid = 1

如果是函数,需要 subobjid=0。

注意:sys.sysobjvalues 需要在 (DAC)模式下使用。

方法如下:

使用 DAC 与服务器连接
我参考了:http://www.derkeiler.com/Newsgroups/microsoft.public.sqlserver.security/2006-08/msg00286.html

  • 在 SQL Server Management Studio 中,不打开其他 DAC,单击工具栏上的“数据库引擎查询”
  • “连接到数据库引擎”对话框的“服务器名称”框中,键入 ADMIN:,并在其后继续键入服务器实例的名称。例如,若要连接到名为 ACCT\PAYABLE 的服务器实例,请键入 ADMIN:ACCT\PAYABLE
  • 完成“身份验证”部分(提供 sysadmin 组成员的凭据),然后单击“连接”
          将建立连接。

当然,也可以用过SQLcmd进行连接。

这里提供一个function解密的Script: function解密:decryptFunciton2005.sql

上面的Script有个问题,当需要解密的函数过长,超过8000时,会无法给出结果。

 

进行了加强改良,可以解密40000长度的存储过程。

 decryptProcedure2005_en.sql

下面写个测试:

CREATE procedure getall

with encryption 
as

select col1='解密'

使用sp_helptext getall

结果:对象 'getall' 的文本已加密。

下面使用:  dbo.sp__procedure$decrypt 'getall',0 第二个参数0表示执行

现在看看结果:

Text
------------------------------------------------------------------------------------------------------------------------------------------------------------------CREATE procedure getall with encryption
as--select col1='解密'

很好,这就是我们看到的效果。

 

 待续。。。。

 



推荐到鲜果: 查阅更多相关主题的帖子: 程序开发

评论

大家好

发布者 oscar8105
2008-7-14 15:14:36


我试了下,加密后的text为空?是不是版本的缘故?
Microsoft SQL Server Management Studio 9.00.1399.00
Microsoft Analysis Services 客户端工具 2005.090.1399.00
Microsoft 数据访问组件 (MDAC) 2000.086.3959.00 (srv03_sp2_rtm.070216-1710)
Microsoft MSXML 2.6 3.0 6.0
Microsoft Internet Explorer 6.0.3790.3959
Microsoft .NET Framework 2.0.50727.1433
操作系统 5.2.3790

发布者 yangkee911
2008-9-3 22:42:43


对不起,打错了
我试了下,解密后的text为空?是不是版本的缘故?
Microsoft SQL Server Management Studio 9.00.1399.00
Microsoft Analysis Services 客户端工具 2005.090.1399.00
Microsoft 数据访问组件 (MDAC) 2000.086.3959.00 (srv03_sp2_rtm.070216-1710)
Microsoft MSXML 2.6 3.0 6.0
Microsoft Internet Explorer 6.0.3790.3959
Microsoft .NET Framework 2.0.50727.1433
操作系统 5.2.3790


发布者 yangkee911
2008-9-3 22:44:52


是有点小问题,不过不是在这里。Proc过长时,里面的

-- 从sys.sysobjvalues里提出加密的imageval记录

SET @real_01=(__select imageval FROM sys.sysobjvalues WHERE objid =

object_id(@function) __and valclass = 1 __and subobjid = 0 )

这个部分应该把 imageval convert成nvarchar(max),否则,虽然定义@real_01是nvarchar(max),但imageval 还是会自动转化为8000字符长度。

发布者 wooley
2008-9-4 9:17:55


您正在以 匿名用户 的身份发表评论  快速登录
(不得超过 50 个汉字)
       看不清,换一个
提示消息
(输入完内容可以直接按Ctrl+Enter提交)