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]. ...
随机推荐
- 使用 evo 工具评测 VI ORB SLAM2 在 EuRoC 上的结果
http://www.liuxiao.org/2017/11/%E4%BD%BF%E7%94%A8-evo-%E5%B7%A5%E5%85%B7%E8%AF%84%E6%B5%8B-vi-orb-sl ...
- Python3实战——爬虫入门
一.安装库 使用conda安装: conda install requests 如果出现解析环境问题,需要激活conda环境: https://www.cnblogs.com/jdemarryme/p ...
- Notepad++新建文件设置默认的换行符
选择[Settings]-[Preferences]-[New Documnet]
- k8s记录-ntpd时间同步配置(五)
1)服务端配置 在192.168.0.1 root用户下操作 yum install -y ntp ntpdate 修改etc/ntp.conf 注释所有的server和restrict 加入: se ...
- 123457123456#1#----com.MC.EnglishGame98--前拼后广--jp英语-mc
com.MC.EnglishGame98--前拼后广--jp英语-mc
- Django之密码加密
通过django自带的类库,来加密解密很方便,下面来简单介绍下: 导入包: from django.contrib.auth.hashers import make_password, check_p ...
- Python动态构造类:借助强悍的内建 type()
内建的 type() 函数带三个参数时, 将作为强悍的动态类构造器. 如下: type(name, bases, dict) 返回一个新的type对象. 基本上是 class 语句的动态形式. 参数: ...
- box-sizing:border-box 将元素的内边距和边框都设定在宽高内计算
http://www.w3school.com.cn/cssref/pr_box-sizing.asp box-sizing: content-box|border-box|inherit; 值 描述 ...
- CentOS7为docker-ce配置阿里云镜像加速器
一.找加速地址 https://promotion.aliyun.com/ntms/act/kubernetes.html 控制台 二.添加daemon.json 文件 vim /etc/docker ...
- IDEA 创建JAVA Maven Web 工程 不能建Sevlet文件
JAVA目录下建包而不是文件夹 需要添加依赖 <dependency> <groupId>javax.servlet</groupId> <artifactI ...