SQLServer2005里怎样对使用with encryption选项创建存储过程解密.doc
文本预览下载声明
SQLServer2005里怎样对使用with encryption选项创建的存储过程解密
--王成辉翻译整理,转贴请注明出自微软BI开拓者 HYPERLINK \t _blank -- HYPERLINK /Newsgroups/microsoft.public.sqlserver.security/2006-08/msg00286.html \t _blank 原帖地址SQLServer2005里使用with encryption选项创建的存储过程仍然和sqlserver2000里一样,都是使用XOR进行了的加密。和2000不一样的是,在2005的系统表syscomments里已经查不到加密过的密文了。要查密文必须使用DAC(专用管理员连接)连接到数据库后,在系统表sys.sysobjvalues查询,该表的列imageval存储了相应的密文。具体可以使用下面的查询:SELECT imageval FROM sys.sysobjvalues WHERE objid = object_id(@procedure) AND valclass = 1 AND subobjid = 1下面是解密的存储过程,具体代码如下:
create PROCEDURE [dbo].[sp__windbi$decrypt](@procedure sysname = NULL, @revfl int = 1)AS/*王成辉翻译整理,转贴请注明出自微软BI开拓者 HYPERLINK \t _blank 目前这个存储过程只能解密存储过程,至于解密函数、触发器、视图的存储过程本网站会进一步关注,调用形式为:exec dbo.sp__windbi$decrypt @procedure,0如果第二个参数使用1的话,会给出该存储过程的一些提示。--版本3.0? 修正存储过程过长引起的问题*/SET NOCOUNT ONIF @revfl = 1BEGINPRINT 警告:该存储过程会删除并重建原始的存储过程。PRINT 在运行该存储过程之前确保你的数据库有一个备份。PRINT 该存储过程通常应该运行在产品环境的一个备份的非产品环境下。PRINT 为了运行这个存储过程,将参数@refl的值更改为0。RETURN 0ENDDECLARE @intProcSpace bigint, @t bigint, @maxColID smallint,@procNameLength intselect @maxColID = max(subobjid) FROM sys.sysobjvalues WHERE objid = object_id(@procedure)--select @maxColID as Rows in sys.sysobjvaluesselect @procNameLength = datalength(@procedure) + 29DECLARE @real_01 nvarchar(max)DECLARE @fake_01 nvarchar(max)DECLARE @fake_encrypt_01 nvarchar(max)DECLARE @real_decrypt_01 nvarchar(max),@real_decrypt_01a nvarchar(max)declare @objtype varchar(2),@ParentName nvarchar(max)select @real_decrypt_01a = --提取对象的类型如是存储过程还是函数,如果是触发器,还要得到其父对象的名称select @objtype=type,@parentname=object_name(parent_object_id)from sys.objects where [object_id]=object_id(@procedure)-- 从sys.sysobjvalues里提出加密的imageval记录SET @real_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid = object_id(@procedure) and valclass = 1 order by subobjid)--创建一个临时表create table #output ( [ident] [int] IDENTITY (1, 1) NOT NULL ,[real_decrypt] NVARCHAR(MAX) )--开始一个事务,稍后回滚BEGIN TRAN--更改原始的存储过程,用短横线替换if @o
显示全部