sql server存储过程解密
解密存储过程:
USE [RYTreasureDB]
GO /****** Object: StoredProcedure [dbo].[sp__windbi$decrypt] Script Date: 2019/8/8 10:26:20 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE PROCEDURE [dbo].[sp__windbi$decrypt]
(
@procedure SYSNAME = NULL ,
@revfl INT =
)
AS /**//*
王成辉翻译整理,转贴请注明出自微软BI开拓者www.windbi.com
调用形式为:
exec dbo.sp__windbi$decrypt @procedure,0
如果第二个参数使用1的话,会给出该存储过程的一些提示。
--版本4.0 修正存储过程过长解密出来是空白的问题
*/
SET NOCOUNT ON
IF @revfl =
BEGIN
PRINT '警告:该存储过程会删除并重建原始的存储过程。'
PRINT ' 在运行该存储过程之前确保你的数据库有一个备份。'
PRINT ' 该存储过程通常应该运行在产品环境的一个备份的非产品环境下。'
PRINT ' 为了运行这个存储过程,将参数@refl的值更改为0。'
RETURN
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) +
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() ,
@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
imageval
FROM sys.sysobjvalues
WHERE objid = OBJECT_ID(@procedure) AND valclass =
ORDER BY subobjid
)
--创建一个临时表
CREATE TABLE #output
(
[ident] [int] IDENTITY(, )
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
imageval
FROM sys.sysobjvalues
WHERE objid = OBJECT_ID(@procedure) AND valclass =
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 =
--使用字符填充临时变量
SET @real_decrypt_01 = REPLICATE(CAST('A' AS NVARCHAR(MAX)),
( DATALENGTH(@real_01) / ))
--循环设置每一个变量,创建真正的变量
--每次一个字节
SET @intProcSpace =
--如有必要,遍历每个@real_xx变量并解密
WHILE @intProcSpace <= ( DATALENGTH(@real_01) / )
BEGIN
--真的和假的和加密的假的进行异或处理
SET @real_decrypt_01 = STUFF(@real_decrypt_01, @intProcSpace, ,
NCHAR(UNICODE(SUBSTRING(@real_01,
@intProcSpace, )) ^ ( UNICODE(SUBSTRING(@fake_01,
@intProcSpace, )) ^ UNICODE(SUBSTRING(@fake_encrypt_01,
@intProcSpace, )) )))
SET @intProcSpace = @intProcSpace +
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(MAX) ,
@Line NVARCHAR()
SELECT @DefinedLength =
SELECT @BlankSpaceAdded = --跟踪行结束的空格。注意Len函数忽略了多余的空格
CREATE TABLE #CommentText
(
LineId INT ,
Text NVARCHAR() 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 =
SELECT @LineId =
OPEN ms_crs_syscom
FETCH NEXT FROM ms_crs_syscom INTO @SyscomText WHILE @@fetch_status >=
BEGIN
SELECT @BasePos =
SELECT @CurrentPos =
SELECT @TextLength = LEN(@SyscomText)
WHILE @CurrentPos !=
BEGIN
--通过回车查找行的结束
SELECT @CurrentPos = CHARINDEX(CHAR() + CHAR(),
@SyscomText, @BasePos)
--如果找到回车
IF @CurrentPos !=
BEGIN
--如果@Lines的长度的新值比设置的大就插入@Lines目前的内容并继续
WHILE ( ISNULL(LEN(@Line), ) + @BlankSpaceAdded + @CurrentPos - @BasePos + @LFCR ) > @DefinedLength
BEGIN
SELECT @AddOnLen = @DefinedLength - ( ISNULL(LEN(@Line),
) + @BlankSpaceAdded )
INSERT #CommentText
VALUES ( @LineId,
ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText,
@BasePos,
@AddOnLen), N'') )
SELECT @Line = NULL, @LineId = @LineId + ,
@BasePos = @BasePos + @AddOnLen,
@BlankSpaceAdded =
END
SELECT @Line = ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText,
@BasePos,
@CurrentPos - @BasePos + @LFCR),
N'')
SELECT @BasePos = @CurrentPos +
INSERT #CommentText
VALUES ( @LineId, @Line )
SELECT @LineId = @LineId +
SELECT @Line = NULL
END
ELSE
--如果回车没找到
BEGIN
IF @BasePos <= @TextLength
BEGIN
--如果@Lines长度的新值大于定义的长度
WHILE ( ISNULL(LEN(@Line), ) + @BlankSpaceAdded + @TextLength - @BasePos + ) > @DefinedLength
BEGIN
SELECT @AddOnLen = @DefinedLength - ( ISNULL(LEN(@Line),
) + @BlankSpaceAdded )
INSERT #CommentText
VALUES ( @LineId,
ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText,
@BasePos,
@AddOnLen), N'') )
SELECT @Line = NULL,
@LineId = @LineId + ,
@BasePos = @BasePos + @AddOnLen,
@BlankSpaceAdded =
END
SELECT @Line = ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText,
@BasePos,
@TextLength - @BasePos + ),
N'')
IF LEN(@Line) < @DefinedLength AND CHARINDEX(' ',
@SyscomText,
@TextLength + ) >
BEGIN
SELECT @Line = @Line + ' ',
@BlankSpaceAdded =
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 GO
使用方法:exec dbo.sp__windbi$decrypt '存储过程名称',0
执行之后会报错:

解密过程,必须在DAC连接SQL Server,操作如下:
服务器名称格式:admin:+服务器名(可能会遇到各种问题,网上有解答)

登录成功之后就没错误了。直接执行解密的存储过程即可。
sql server存储过程解密的更多相关文章
- sql server 存储过程解密
Create PROCEDURE [dbo].[sp_windbi$decrypt] () AS /**//* 王成辉翻译整理,转贴请注明出自微软BI开拓者www.windbi.com 调用形式为: ...
- SQL Server存储过程中使用表值作为输入参数示例
这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...
- SQL Server存储过程Return、output参数及使用技巧
SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...
- SQL Server 存储过程(转载)
SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...
- 14、SQL Server 存储过程
SQL Server 存储过程 存储过程类似函数,可以重复使用.相对于函数,存储过程拥有更强大的功能和更高的灵活性. 存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或 ...
- (摘录)SQL Server 存储过程
文章摘录:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-SQL中的存储过程 ...
- Sql Server 存储过程中查询数据无法使用 Union(All)
原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...
- Yii2.0调用sql server存储过程并获取返回值
1.首先展示创建sql server存储过程的语句,创建一个简单的存储过程,测试用. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE P ...
- C# 调用存储过程 Sql Server存储过程 存储过程报错,程序中的try
C#程序调用Sql Server存储过程,存储过程中报错情况,返回值... 0.SQL存储过程 USE [Opos] GO /****** Object: StoredProcedure [dbo]. ...
随机推荐
- Oracle索引 详解
作者:Dave 一.索引介绍 1.1 索引的创建语法: CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <sc ...
- 宣化上人:大佛顶首楞严经四种清净明诲浅释(2-3) -------------------------------------------------------------------------------- (转自学佛网:http://www.xuefo.net/nr/article23/230612.html)
大佛顶首楞严经四种清净明诲浅释(2-3) 唐天竺·沙门般剌密帝译 宣化上人主讲 一九八三年四月十七日晚讲于万佛圣城 欲摄其心入三摩地:这种邪师说法,在末法的时候像恒河沙这么多:可是我想在这时候,令一切 ...
- Django中models定义的choices字典使用get_FooName_display()在页面中显示值
问题 在django的models.py 中,我们定义了一些choices的元组,类似一些字典值,一般都是下拉框或者单多选框,例如 0对应男 1对应女等等 看下例子: class Area(model ...
- LeetCode_202. Happy Number
202. Happy Number Easy Write an algorithm to determine if a number is "happy". A happy num ...
- 关于css清除元素浮动的方法总结(overflow clear floatfix)
在前两天的一个面试中考官问我web中清除浮动的一些css常用方法,我很轻松的答出了: 1.overflow:hidden 2.clear:both 3.floatfix类 然后问题就来了,考官接着问' ...
- vuex中mutations数据响应
vuex中的mutation需遵守Vue的响应规则: 既然Vuex的store中的状态是响应式的,那么在我们变更状态时,监视状态的Vuex最好在state中初始化好所有的所需属性. 如果需要在对象上添 ...
- Cas(07)——建立使用Cas进行单点登录的应用
建立使用Cas进行单点登录的应用 目录 1.1加入cas-client-core-xxx.jar到classpath 1.2配置Filter 1.2.1AuthenticationFilter 1.2 ...
- 【sql server inject】使用动态查询执行sql语句实例
应某少年要求授权测试一个存在报错注入点的站点,可读取数据库名,但是sqlmap执行–os-shell选项就会莫名当掉: 分步骤测试了几次,发现xp_cmdshell是开启状态,但用sqlmap注入却无 ...
- windows下 使用ip地址反查主机名的命令
nbtstat -a [远端或局域网某计算机的IP地址] 可以查询返回远端或局域网某计算机的主机名 C:\Documents and Settings\z00121596>nbtstat -a ...
- bootstrap-switch:记一次很坑的问题(连续相同状态的多行数据只有第一个显示按钮,其他行没有开关初始化)
先上截图,第234行都是禁用状态,但是只有第2行显示了禁用开关,后面的都没有开关初始化 检查下代码: onLoadSuccess: function(data){ {#获取行数据的状态#} conso ...