解密存储过程:

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存储过程解密的更多相关文章

  1. sql server 存储过程解密

    Create PROCEDURE [dbo].[sp_windbi$decrypt] () AS /**//* 王成辉翻译整理,转贴请注明出自微软BI开拓者www.windbi.com 调用形式为: ...

  2. SQL Server存储过程中使用表值作为输入参数示例

    这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...

  3. SQL Server存储过程Return、output参数及使用技巧

    SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...

  4. SQL Server 存储过程(转载)

    SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...

  5. 14、SQL Server 存储过程

    SQL Server 存储过程 存储过程类似函数,可以重复使用.相对于函数,存储过程拥有更强大的功能和更高的灵活性. 存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或 ...

  6. (摘录)SQL Server 存储过程

    文章摘录:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-SQL中的存储过程 ...

  7. Sql Server 存储过程中查询数据无法使用 Union(All)

    原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...

  8. Yii2.0调用sql server存储过程并获取返回值

    1.首先展示创建sql server存储过程的语句,创建一个简单的存储过程,测试用. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE P ...

  9. C# 调用存储过程 Sql Server存储过程 存储过程报错,程序中的try

    C#程序调用Sql Server存储过程,存储过程中报错情况,返回值... 0.SQL存储过程 USE [Opos] GO /****** Object: StoredProcedure [dbo]. ...

随机推荐

  1. AndroidKiller简单使用:修改应用名称

    修改apk名称 软件清晰地展示了美柚的信息.(是反编译的不错选择) 切换到工程管理器,可以查看反编译的资源和smail代码等. 接下来,查看smali代码,找到你需要查看的文件,点击下图的这个图标 看 ...

  2. 【html】window.open()被部分浏览器拦截问题

    一.原因:1.因为在chrome的安全机制里面,非用户触发的window.open方法,是会被拦截的: 二.什么情况下不会被拦截或会被拦截? 1. $('#btn').click(function ( ...

  3. Linux下手动查杀木马

    (1).模拟木马程序病原体并让其自动运行 黑客让脚本自动执行的3种方法:1.计划任务:2.开机启动:3.系统命令被人替换,定一个触发事件. 1)生成木马程序病原体 [root@youxi1 ~]# v ...

  4. SAP 增强篇 Method1 BADI增强的查找方法

    查找BADI的方法:(1)通过SE24,输入CL_EXITHANDLER,然后在方法GET_INSTANCE中设置断点,然后运行事务代码判断 exit_name的值,操作过程如下:输入se24,然后输 ...

  5. Python中random模块生成随机数详解

    Python中random模块生成随机数详解 本文给大家汇总了一下在Python中random模块中最常用的生成随机数的方法,有需要的小伙伴可以参考下 Python中的random模块用于生成随机数. ...

  6. LeetCode_383. Ransom Note

    383. Ransom Note Easy Given an arbitrary ransom note string and another string containing letters fr ...

  7. git 打tag(版本)、推送代码

    服务端:192.168.0.96 gitlab 客户端:192.168.0.97 git 服务端gitlab安装请参照: https://www.cnblogs.com/effortsing/p/10 ...

  8. C# 利用bat文件轻松创建windos 服务

    最近,一个项目需要一个后台服务,定时去读取数据,这是直接创建一个bat文件,双击执行就可以了,为了省事哦 主要分两个步奏 1.创建windows服务的应用程序.这一点不做过多讲解.网上有太多的例子 2 ...

  9. 【ARTS】01_42_左耳听风-201900826~201900901

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  10. 【GStreamer开发】GStreamer基础教程04——时间管理

    目标 本教程主要讲述一些和时间相关的内容.主要包括: 1. 如何问pipeline查询到流的总时间和当前播放的时间 2. 如何在流内部实现跳转功能 介绍 GstQuery是向一个element或者pa ...