sql server存储过程解密
解密存储过程:
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存储过程解密相关推荐
- SQL Server存储过程初学者
In this article, we will learn how to create stored procedures in SQL Server with different examples ...
- SQL Server存储过程输入参数使用表值
在2008之前如果我们想要将表作为输入参数传递给SQL Server存储过程使比较困难的,可能需要很多的逻辑处理将这些表数据作为字符串或者XML传入. 在2008中提供了表值参数.使用表值参数,可以不 ...
- SQL Server存储过程里全库查找引用的数据库对象(表、存储过程等)
SQL Server存储过程全库匹配数据库对象(表.存储过程等) 简介 可以通过自定义存储过程sp_eachdb来遍历每个数据库然后结合sys.objects 关联sys.sql_modules后的d ...
- SQL server 存储过程的建立和调用
SQL server 存储过程的建立和调用 存储过程的建立和调用 --1.1准备测试需要的数据库:test,数据表:物料表,采购表 if not exists (select * from maste ...
- java调用存储过程 sql server_Java中调用SQL Server存储过程示例
Java中调用SQL Server存储过程示例2007-09-03 08:48来源:论坛整理作者:孟子E章责任编辑:方舟·yesky评论(3) 最近做了个Java的小项目(第一次写Java的项目哦), ...
- Microsoft SQL Server 存储过程
Microsoft SQL Server 存储过程 TRIGGER DDL触发器:主要用于防止对数据库架构.视图.表.存储过程等进行的某些修改:DDL事件是指对数据库CREATE,ALTER,DROP ...
- db2 删除存储过程_数据库教程-SQL Server存储过程使用及异常处理
SQL Server存储过程 存储过程(Procedure)是数据库重要对象之一,也是数据库学习的重点之一.本文,我们以SQL Server为例对存储过程的概念.定义.调用.删除及存储过程调用异常等通 ...
- SQL Server存储过程中使用表值作为输入参数示例
这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...
- oracle如何调试sql,调试oracle与调试sql server存储过程
[IT168 技术]关于存储过程的调试,知道方法以后很简单,但在不知道的时候,为了测试一个存储过程的正性,print,插入临时表等可谓是使出了浑身解数,烦不胜烦.下面就把我工作中调试oracle存储过 ...
- SQL Server 存储过程中使用raiserror抛出异常
转自(SQL Server 存储过程中使用raiserror抛出异常 ) 一 系统预定义错误代码 SQL Server 有3831个预定义错误代码,由master.dbo.sysmessages 表维 ...
最新文章
- ~/.fcitx/config
- 如果再写 for 循环,我就锤自己!
- 第六十七篇、OC_UITableView head下拉图片放大的效果
- 用SVR模型完成对Boston房价的回归预测
- redis desktop manager 连接外网redis服务器
- app store 服务器维护,AppStore无法连接怎么办?几个小方法教你解决问题
- jqgrid ajax加载数据,如何通过ajax在jqgrid中加载数据(json)?
- C# 控件BackColor = Color.Transparent没有透明的原因
- android解析html新闻的方法,Android使用Jsoup解析Html表格的方法
- Mac Apache php 配置域名
- Vue中金额、日期 格式化插件@formatjs/intl使用
- 什么是无线WIFI空口
- ArcEngine加载图层的五个步…
- 骞云科技SmartCMP v3.0正式发布!
- DIS和EIS(数码防抖和电子防抖)
- Maximal Information Coefficient (MIC)最大互信息系数
- 时间都去哪儿了? 番茄钟告诉你答案
- Android大作业:安卓开发图书管理系统APP
- 【目标检测】YOLOv5训练工具,简化训练准备过程
- 关于笔记本键盘进水,之后需注意的要点以及关闭win10内置键盘的步骤