当前位置: 代码迷 >> Sql Server >> 求 sql server2005 存储过程解密解决办法
  详细解决方案

求 sql server2005 存储过程解密解决办法

热度:335   发布时间:2016-04-24 10:46:44.0
求 sql server2005 存储过程解密
各位好,
      网上找的解密存储,当过程比较长时,解密后格式很乱,没法用,求更好的解密方法,谢谢!

create  PROCEDURE [dbo].[sp_test]
 (@procedure sysname = NULL, @revfl int = 1) 
 AS 
 /**//* 
 王成辉翻译整理,转贴请注明出自微软BI开拓者www.windbi.com 
 调用形式为:
 exec dbo.sp__windbi$decrypt @procedure,0 
 如果第二个参数使用的话,会给出该存储过程的一些提示。
 --版本.0 修正存储过程过长解密出来是空白的问题
*/ 
SET NOCOUNT ON 
IF @revfl = 1 
BEGIN 
PRINT '警告:该存储过程会删除并重建原始的存储过程。' 
PRINT ' 在运行该存储过程之前确保你的数据库有一个备份。' 
PRINT ' 该存储过程通常应该运行在产品环境的一个备份的非产品环境下。' 
PRINT ' 为了运行这个存储过程,将参数@refl的值更改为。' 
RETURN 0 
END 
DECLARE @intProcSpace bigint, @t bigint, @maxColID smallint,@procNameLength int 
select @maxColID = max(subobjid) FROM 
sys.sysobjvalues WHERE objid = object_id(@procedure) 
--select @maxColID as 'Rows in sys.sysobjvalues' 
select @procNameLength = datalength(@procedure) + 29 
DECLARE @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 @objtype='P' 
SET @fake_01='ALTER PROCEDURE '+ @procedure +' WITH ENCRYPTION AS select 1 
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/' 
else if @objtype='FN' 
SET @fake_01='ALTER FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1 
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/ END' 
else if @objtype='V' 
SET @fake_01='ALTER view '+ @procedure +' WITH ENCRYPTION AS select 1 as col 
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/' 
else if @objtype='TR' 
SET @fake_01='ALTER trigger '+ @procedure +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10) 
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/' 
EXECUTE (@fake_01) 
--从sys.sysobjvalues里提出加密的假的
SET @fake_encrypt_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid = 
object_id(@procedure) and valclass = 1 order by subobjid ) 
if @objtype='P' 
SET @fake_01='Create PROCEDURE '+ @procedure +' WITH ENCRYPTION AS select 1 
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/' 
else if @objtype='FN' 
SET @fake_01='CREATE FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1 
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/ END' 
else if @objtype='V' 
SET @fake_01='Create view '+ @procedure +' WITH ENCRYPTION AS select 1 as col 
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/' 
else if @objtype='TR' 
SET @fake_01='Create trigger '+ @procedure +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10) 
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/' 
--开始计数
SET @intProcSpace=1 
--使用字符填充临时变量
SET @real_decrypt_01 = replicate(cast('A'as nvarchar(max)), (datalength(@real_01) /2 )) 
--循环设置每一个变量,创建真正的变量
--每次一个字节
SET @intProcSpace=1 
--如有必要,遍历每个@real_xx变量并解密
WHILE @intProcSpace<=(datalength(@real_01)/2) 
BEGIN 
--真的和假的和加密的假的进行异或处理
SET @real_decrypt_01 = stuff(@real_decrypt_01, @intProcSpace, 1, 
NCHAR(UNICODE(substring(@real_01, @intProcSpace, 1)) ^ 
  相关解决方案