解密SQL SERVER 2005加密存储过程,函数

在SQL SERVER 2005中必须用专用管理连接才可以查看过程过程中用到的表

EG:sqlcmd -A

1>use test

2>go

1>sp_decrypt ‘p_testa‘

2>go

Text
----------------------
Create procedure P_testa

with encryption

as

select * from test

create PROCEDURE [dbo].[sp_decrypt] 
(@procedure sysname = NULL)  
AS  
SET NOCOUNT ON  
BEGIN
DECLARE @intProcSpace bigint, @t bigint, @maxColID smallint,@intEncrypted  
tinyint,@procNameLength int  
select @maxColID = max(subobjid),@intEncrypted = imageval FROM  
sys.sysobjvalues WHERE objid = object_id(@procedure)  
GROUP BY imageval

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  
‘+REPLICATE(‘-‘, 40003 - @procNameLength)  
else if @objtype=‘FN‘  
SET @fake_01=‘ALTER FUNCTION ‘+ @procedure +‘() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1  
/*‘+REPLICATE(‘*‘, datalength(@real_01) /2 - @procNameLength)+‘*/ END‘  
else if @objtype=‘V‘  
SET @fake_01=‘ALTER view ‘+ @procedure +‘ WITH ENCRYPTION AS select 1 as col  
/*‘+REPLICATE(‘*‘, datalength(@real_01) /2 - @procNameLength)+‘*/‘  
else if @objtype=‘TR‘  
SET @fake_01=‘ALTER trigger ‘+ @procedure +‘ ON ‘[email protected]+‘WITH ENCRYPTION AFTER INSERT AS RAISERROR (‘‘N‘‘,16,10)  
/*‘+REPLICATE(‘*‘, 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  
‘+REPLICATE(‘-‘, 40003 - @procNameLength)  
else if @objtype=‘FN‘  
SET @fake_01=‘CREATE FUNCTION ‘+ @procedure +‘() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1  
/*‘+REPLICATE(‘*‘, datalength(@real_01) /2 - @procNameLength)+‘*/ END‘  
else if @objtype=‘V‘  
SET @fake_01=‘Create view ‘+ @procedure +‘ WITH ENCRYPTION AS select 1 as col  
/*‘+REPLICATE(‘*‘, datalength(@real_01) /2 - @procNameLength)+‘*/‘  
else if @objtype=‘TR‘  
SET @fake_01=‘Create trigger ‘+ @procedure +‘ ON ‘[email protected]+‘WITH ENCRYPTION AFTER INSERT AS RAISERROR (‘‘N‘‘,16,10)  
/*‘+REPLICATE(‘*‘, datalength(@real_01) /2 - @procNameLength)+‘*/‘  
--开始计数  
SET @intProcSpace=1  
--使用字符填充临时变量  
SET @real_decrypt_01 = replicate(N‘A‘, (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)) ^  
(UNICODE(substring(@fake_01, @intProcSpace, 1)) ^  
UNICODE(substring(@fake_encrypt_01, @intProcSpace, 1)))))  
SET @[email protected]+1  
END  
--通过sp_helptext逻辑向表#output里插入变量  
insert #output (real_decrypt) select @real_decrypt_01  
-- select real_decrypt AS ‘#output chek‘ from #output --测试  
-- -------------------------------------  
--开始从sp_helptext提取  
-- -------------------------------------  
declare @dbname sysname  
,@BlankSpaceAdded int  
,@BasePos int  
,@CurrentPos int  
,@TextLength int  
,@LineId int  
,@AddOnLen int  
,@LFCR int --回车换行的长度  
,@DefinedLength int  
,@SyscomText nvarchar(4000)  
,@Line nvarchar(255)  
Select @DefinedLength = 255  
SELECT @BlankSpaceAdded = 0 --跟踪行结束的空格。注意Len函数忽略了多余的空格  
CREATE TABLE #CommentText  
(LineId int  
,Text nvarchar(255) collate database_default)  
--使用#output代替sys.sysobjvalues  
DECLARE ms_crs_syscom CURSOR LOCAL  
FOR SELECT real_decrypt from #output  
ORDER BY ident  
FOR READ ONLY  
--获取文本  
SELECT @LFCR = 2  
SELECT @LineId = 1  
OPEN ms_crs_syscom  
FETCH NEXT FROM ms_crs_syscom into @SyscomText  
WHILE @@fetch_status >= 0  
BEGIN  
SELECT @BasePos = 1  
SELECT @CurrentPos = 1  
SELECT @TextLength = LEN(@SyscomText)  
WHILE @CurrentPos != 0  
BEGIN  
--通过回车查找行的结束  
SELECT @CurrentPos = CHARINDEX(char(13)+char(10), @SyscomText,  
@BasePos)  
--如果找到回车  
IF @CurrentPos != 0  
BEGIN  
--如果@Lines的长度的新值比设置的大就插入@Lines目前的内容并继续  
While (isnull(LEN(@Line),0) + @BlankSpaceAdded +  
@[email protected] + @LFCR) > @DefinedLength  
BEGIN  
SELECT @AddOnLen = @DefinedLength-(isnull(LEN(@Line),0) +  
@BlankSpaceAdded)  
INSERT #CommentText VALUES  
( @LineId,  
isnull(@Line, N‘‘) + isnull(SUBSTRING(@SyscomText,  
@BasePos, @AddOnLen), N‘‘))  
SELECT @Line = NULL, @LineId = @LineId + 1,  
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0  
END  
SELECT @Line = isnull(@Line, N‘‘) +  
isnull(SUBSTRING(@SyscomText, @BasePos, @[email protected] + @LFCR), N‘‘)  
SELECT @BasePos = @CurrentPos+2  
INSERT #CommentText VALUES( @LineId, @Line )  
SELECT @LineId = @LineId + 1  
SELECT @Line = NULL  
END  
ELSE  
--如果回车没找到  
BEGIN  
IF @BasePos <= @TextLength  
BEGIN  
--如果@Lines长度的新值大于定义的长度  
While (isnull(LEN(@Line),0) + @BlankSpaceAdded +  
@[email protected]+1 ) > @DefinedLength  
BEGIN  
SELECT @AddOnLen = @DefinedLength -  
(isnull(LEN(@Line),0) + @BlankSpaceAdded)  
INSERT #CommentText VALUES  
( @LineId,  
isnull(@Line, N‘‘) + isnull(SUBSTRING(@SyscomText,  
@BasePos, @AddOnLen), N‘‘))  
SELECT @Line = NULL, @LineId = @LineId + 1,  
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded =  
0  
END  
SELECT @Line = isnull(@Line, N‘‘) +  
isnull(SUBSTRING(@SyscomText, @BasePos, @[email protected]+1 ), N‘‘)  
if LEN(@Line) < @DefinedLength and charindex(‘ ‘,  
@SyscomText, @TextLength+1 ) > 0  
BEGIN  
SELECT @Line = @Line + ‘ ‘, @BlankSpaceAdded = 1  
END  
END  
END  
END  
FETCH NEXT FROM ms_crs_syscom into @SyscomText  
END  
IF @Line is NOT NULL  
INSERT #CommentText VALUES( @LineId, @Line )  
select Text from #CommentText order by LineId  
CLOSE ms_crs_syscom  
DEALLOCATE ms_crs_syscom  
DROP TABLE #CommentText  
-- -------------------------------------  
--结束从sp_helptext提取  
-- -------------------------------------  
--删除用短横线创建的存储过程并重建原始的存储过程  
ROLLBACK TRAN  
DROP TABLE #output

END

时间: 2024-08-19 00:19:58

解密SQL SERVER 2005加密存储过程,函数的相关文章

存储过程系列之调试存储过程 SQL Server 2005

在数据库中直接调试  在数据库中直接调试是调试SQL Server 2005的存储过程的最简单的方法. 在Visual Stuido的IDE中你可以选择单步执行存储过程,然后就可以一条语句一条语句地单步执行了,同时你也可以检查和修改存储过程内的T-SQL变量和参数.本文结尾处提供下载的压缩包中包括一个SQL Server 2005 Express版本的Northwind数据库.我在其中添加了一个名为“DoThings”的存储过程,它有一个参数@CategoryID.这是一个没什么实用价值的存储过

查看SQL SERVER 加密存储过程,函数,触发器,视图

原文:查看SQL SERVER 加密存储过程,函数,触发器,视图 create  PROCEDURE sp_decrypt(@objectname varchar(50))ASbeginset nocount on--CSDN:j9988 copyright:2004.07.15 --V3.2 --破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器--修正上一版"视图触发器"不能正确解密错误--发现有错,请E_MAIL:[email protected]be

Sql Server简单加密与解密 【转】

前言: 在SQL Server 2005和SQL Server 2008之前.如果希望加密敏感数据,如财务信息.工资或身份证号,必须借助外部应用程序或算法.SQL Server 2005引入内建数据加密的能力,使用证书.密钥和系统函数的组合来完成. 与数字证书类似.SQL Server 证书包括公钥和私钥这一对密钥,它们都用来加密和解密数据.SQL Server也拥有创建非对称密钥和对称密钥对象的能力.非对称密钥(asymmetric key)与证书相似,公钥用来加密数据库,私钥用来解密数据.非

SQL Server 2005 MD5函数

原文:SQL Server 2005 MD5函数 在SQL Server 2005下自带的函数HashBytes() ,此函数是微软在SQL Server 2005中提供的,可以用来计算一个字符串的MD5和SHA1值,使用方法如下: --获取123456的MD5加密串 select hashbytes('MD5', '123456') ; --获取123456的SHA1加密串 select hashbytes('SHA1', '123456') ; 有了这个函数可以在SQL Server中为字符

SQL Server 2005,2008 正则表达式 替换函数应用详解

CREATE function dbo.regexReplace ( @source ntext, --原字符串 @regexp varchar(1000), --正则表达式 @replace varchar(1000), --替换值 @globalReplace bit = 1, --是否是全局替换 @ignoreCase bit = 0 --是否忽略大小写 ) returnS varchar(1000) AS begin declare @hr integer declare @objReg

sql server 2005中的分区函数用法(partition by 字段)

分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单. create database StudentDBgo use StudentDBgo create table Student  --学生成绩表( id int,  --主键

深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数

原文:深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数 概述 COLUMNS_UPDATED函数能够出现在INSERT或UPDATE触发器中AS关键字后的任何位置,用来指示表或视图中有哪些列已被插入或者更新.它通常和IF语句一起使用,从而可以根据不同的结果,促使触发器执行不同的操作.因此在DML触发器中,COLUMNS_UPDATED函数是一个非常重要且有用的函数. 不同于UPDATE函数,COLUMNS_UPDATED函数可以工作在多个列中,它使用字节中的位(B

22. SQL -- SQL Server 2005 和SQL Server 2008新特性

SQL SERVER 2005 与SQL SERVER 2008 新特性   SQLSERVER 2005 新特性 Enhanced Data Types:存储最大8K-2G Partitioned Table(分区表):数据拆分管理 背景:一个公司,有目前现存数据以及历史数据,各在一台SER 上,服务器访问方式: SQL 2000 TABLE 1:在一张table 中,对数据进行分区 Enhanced Indexing Features SER 1 SER 2 现存数据 TABLE 1 TAB

Sql Server 常用系统存储过程大全

-- 来源于网络 -- 更详细的介结参考联机帮助文档 xp_cmdshell --*执行DOS各种命令,结果以文本行返回. xp_fixeddrives --*查询各磁盘/分区可用空间 xp_loginconfig --*报告SQL Server 实例在Windows 上运行时的登录安全配置 xp_logininfo --*返回有关Windows 认证登录的信息. xp_msver --*返回有关Microsoft SQL Server 的版本信息 xp_enumgroups    --返回Wi