[原创]关于对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
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
-- 从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