解密存储过程:

USE [RYTreasureDB]
GO/****** Object:  StoredProcedure [dbo].[sp__windbi$decrypt]    Script Date: 2019/8/8 10:26:20 ******/
SET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ON
GOCREATE PROCEDURE [dbo].[sp__windbi$decrypt]
(@procedure SYSNAME = NULL ,@revfl INT = 1
)
AS /**//*
王成辉翻译整理,转贴请注明出自微软BI开拓者www.windbi.com
调用形式为:
exec dbo.sp__windbi$decrypt @procedure,0
如果第二个参数使用1的话,会给出该存储过程的一些提示。
--版本4.0  修正存储过程过长解密出来是空白的问题
*/
SET NOCOUNT ON
IF @revfl = 1 BEGINPRINT '警告:该存储过程会删除并重建原始的存储过程。'PRINT ' 在运行该存储过程之前确保你的数据库有一个备份。'PRINT ' 该存储过程通常应该运行在产品环境的一个备份的非产品环境下。'PRINT ' 为了运行这个存储过程,将参数@refl的值更改为0。'RETURN 0END
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 1imagevalFROM   sys.sysobjvaluesWHERE  objid = OBJECT_ID(@procedure) AND valclass = 1ORDER 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 1imagevalFROM   sys.sysobjvaluesWHERE  objid = OBJECT_ID(@procedure) AND valclass = 1ORDER 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)) ^ ( UNICODE(SUBSTRING(@fake_01,@intProcSpace, 1)) ^ UNICODE(SUBSTRING(@fake_encrypt_01,@intProcSpace, 1)) )))SET @intProcSpace = @intProcSpace + 1END
--通过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(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 @SyscomTextWHILE @@fetch_status >= 0 BEGINSELECT  @BasePos = 1SELECT  @CurrentPos = 1SELECT  @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 + @CurrentPos - @BasePos + @LFCR ) > @DefinedLength BEGINSELECT  @AddOnLen = @DefinedLength - ( ISNULL(LEN(@Line),0) + @BlankSpaceAdded )INSERT  #CommentTextVALUES  ( @LineId,ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText,@BasePos,@AddOnLen), N'') )SELECT  @Line = NULL, @LineId = @LineId + 1,@BasePos = @BasePos + @AddOnLen,@BlankSpaceAdded = 0ENDSELECT  @Line = ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText,@BasePos,@CurrentPos - @BasePos + @LFCR),N'')SELECT  @BasePos = @CurrentPos + 2INSERT  #CommentTextVALUES  ( @LineId, @Line )SELECT  @LineId = @LineId + 1SELECT  @Line = NULLENDELSE
--如果回车没找到BEGINIF @BasePos <= @TextLength BEGIN--如果@Lines长度的新值大于定义的长度WHILE ( ISNULL(LEN(@Line), 0) + @BlankSpaceAdded + @TextLength - @BasePos + 1 ) > @DefinedLength BEGINSELECT  @AddOnLen = @DefinedLength - ( ISNULL(LEN(@Line),0) + @BlankSpaceAdded )INSERT  #CommentTextVALUES  ( @LineId,ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText,@BasePos,@AddOnLen), N'') )SELECT  @Line = NULL,@LineId = @LineId + 1,@BasePos = @BasePos + @AddOnLen,@BlankSpaceAdded = 0ENDSELECT  @Line = ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText,@BasePos,@TextLength - @BasePos + 1),N'')IF LEN(@Line) < @DefinedLength AND CHARINDEX(' ',@SyscomText,@TextLength + 1) > 0 BEGINSELECT  @Line = @Line + ' ',@BlankSpaceAdded = 1ENDENDENDENDFETCH NEXT FROM ms_crs_syscom INTO @SyscomTextENDIF @Line IS NOT NULL INSERT  #CommentTextVALUES  ( @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 #outputGO

使用方法:exec dbo.sp__windbi$decrypt '存储过程名称',0

执行之后会报错:

解密过程,必须在DAC连接SQL Server,操作如下:

服务器名称格式:admin:+服务器名(可能会遇到各种问题,网上有解答)

登录成功之后就没错误了。直接执行解密的存储过程即可。

转载于:https://www.cnblogs.com/codeDevotee/p/11320005.html

sql server存储过程解密相关推荐

  1. SQL Server存储过程初学者

    In this article, we will learn how to create stored procedures in SQL Server with different examples ...

  2. SQL Server存储过程输入参数使用表值

    在2008之前如果我们想要将表作为输入参数传递给SQL Server存储过程使比较困难的,可能需要很多的逻辑处理将这些表数据作为字符串或者XML传入. 在2008中提供了表值参数.使用表值参数,可以不 ...

  3. SQL Server存储过程里全库查找引用的数据库对象(表、存储过程等)

    SQL Server存储过程全库匹配数据库对象(表.存储过程等) 简介 可以通过自定义存储过程sp_eachdb来遍历每个数据库然后结合sys.objects 关联sys.sql_modules后的d ...

  4. SQL server 存储过程的建立和调用

    SQL server 存储过程的建立和调用 存储过程的建立和调用 --1.1准备测试需要的数据库:test,数据表:物料表,采购表 if not exists (select * from maste ...

  5. java调用存储过程 sql server_Java中调用SQL Server存储过程示例

    Java中调用SQL Server存储过程示例2007-09-03 08:48来源:论坛整理作者:孟子E章责任编辑:方舟·yesky评论(3) 最近做了个Java的小项目(第一次写Java的项目哦), ...

  6. Microsoft SQL Server 存储过程

    Microsoft SQL Server 存储过程 TRIGGER DDL触发器:主要用于防止对数据库架构.视图.表.存储过程等进行的某些修改:DDL事件是指对数据库CREATE,ALTER,DROP ...

  7. db2 删除存储过程_数据库教程-SQL Server存储过程使用及异常处理

    SQL Server存储过程 存储过程(Procedure)是数据库重要对象之一,也是数据库学习的重点之一.本文,我们以SQL Server为例对存储过程的概念.定义.调用.删除及存储过程调用异常等通 ...

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

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

  9. oracle如何调试sql,调试oracle与调试sql server存储过程

    [IT168 技术]关于存储过程的调试,知道方法以后很简单,但在不知道的时候,为了测试一个存储过程的正性,print,插入临时表等可谓是使出了浑身解数,烦不胜烦.下面就把我工作中调试oracle存储过 ...

  10. SQL Server 存储过程中使用raiserror抛出异常

    转自(SQL Server 存储过程中使用raiserror抛出异常 ) 一 系统预定义错误代码 SQL Server 有3831个预定义错误代码,由master.dbo.sysmessages 表维 ...

最新文章

  1. ~/.fcitx/config
  2. 如果再写 for 循环,我就锤自己!
  3. 第六十七篇、OC_UITableView head下拉图片放大的效果
  4. 用SVR模型完成对Boston房价的回归预测
  5. redis desktop manager 连接外网redis服务器
  6. app store 服务器维护,AppStore无法连接怎么办?几个小方法教你解决问题
  7. jqgrid ajax加载数据,如何通过ajax在jqgrid中加载数据(json)?
  8. C# 控件BackColor = Color.Transparent没有透明的原因
  9. android解析html新闻的方法,Android使用Jsoup解析Html表格的方法
  10. Mac Apache php 配置域名
  11. Vue中金额、日期 格式化插件@formatjs/intl使用
  12. 什么是无线WIFI空口
  13. ArcEngine加载图层的五个步…
  14. 骞云科技SmartCMP v3.0正式发布!
  15. DIS和EIS(数码防抖和电子防抖)
  16. Maximal Information Coefficient (MIC)最大互信息系数
  17. 时间都去哪儿了? 番茄钟告诉你答案
  18. Android大作业:安卓开发图书管理系统APP
  19. 【目标检测】YOLOv5训练工具,简化训练准备过程
  20. 关于笔记本键盘进水,之后需注意的要点以及关闭win10内置键盘的步骤

热门文章

  1. StorAge存储库
  2. MySQL 执行计划说明
  3. 09年全年的case处理总量
  4. 《冷眼看IT》读书笔记--IT将成为服务行业
  5. 怎么引导2岁孩子洗手问题
  6. 【原创】C#实现视频远程监控(下载)
  7. Html+CSS基础之img标签
  8. Ubuntu 14.04 更换阿里云源
  9. iOS上线后程序崩溃日志处理-- Crashlytics
  10. linux搭建phantomjs+webdriver+testng+ant自动化工程