解密存储过程:

  1. USE [RYTreasureDB]
  2. GO
  3.  
  4. /****** Object: StoredProcedure [dbo].[sp__windbi$decrypt] Script Date: 2019/8/8 10:26:20 ******/
  5. SET ANSI_NULLS ON
  6. GO
  7.  
  8. SET QUOTED_IDENTIFIER ON
  9. GO
  10.  
  11. CREATE PROCEDURE [dbo].[sp__windbi$decrypt]
  12. (
  13. @procedure SYSNAME = NULL ,
  14. @revfl INT =
  15. )
  16. AS /**//*
  17. 王成辉翻译整理,转贴请注明出自微软BI开拓者www.windbi.com
  18. 调用形式为:
  19. exec dbo.sp__windbi$decrypt @procedure,0
  20. 如果第二个参数使用1的话,会给出该存储过程的一些提示。
  21. --版本4.0 修正存储过程过长解密出来是空白的问题
  22. */
  23. SET NOCOUNT ON
  24. IF @revfl =
  25. BEGIN
  26. PRINT '警告:该存储过程会删除并重建原始的存储过程。'
  27. PRINT ' 在运行该存储过程之前确保你的数据库有一个备份。'
  28. PRINT ' 该存储过程通常应该运行在产品环境的一个备份的非产品环境下。'
  29. PRINT ' 为了运行这个存储过程,将参数@refl的值更改为0。'
  30. RETURN
  31. END
  32. DECLARE @intProcSpace BIGINT ,
  33. @t BIGINT ,
  34. @maxColID SMALLINT ,
  35. @procNameLength INT
  36. SELECT @maxColID = MAX(subobjid)
  37. FROM sys.sysobjvalues
  38. WHERE objid = OBJECT_ID(@procedure)
  39. --select @maxColID as 'Rows in sys.sysobjvalues'
  40. SELECT @procNameLength = DATALENGTH(@procedure) +
  41. DECLARE @real_01 NVARCHAR(MAX)
  42. DECLARE @fake_01 NVARCHAR(MAX)
  43. DECLARE @fake_encrypt_01 NVARCHAR(MAX)
  44. DECLARE @real_decrypt_01 NVARCHAR(MAX) ,
  45. @real_decrypt_01a NVARCHAR(MAX)
  46. DECLARE @objtype VARCHAR() ,
  47. @ParentName NVARCHAR(MAX)
  48. SELECT @real_decrypt_01a = ''
  49. --提取对象的类型如是存储过程还是函数,如果是触发器,还要得到其父对象的名称
  50. SELECT @objtype = type, @parentname = OBJECT_NAME(parent_object_id)
  51. FROM sys.objects
  52. WHERE [object_id] = OBJECT_ID(@procedure)
  53. -- sys.sysobjvalues里提出加密的imageval记录
  54. SET @real_01 = ( SELECT TOP
  55. imageval
  56. FROM sys.sysobjvalues
  57. WHERE objid = OBJECT_ID(@procedure) AND valclass =
  58. ORDER BY subobjid
  59. )
  60. --创建一个临时表
  61. CREATE TABLE #output
  62. (
  63. [ident] [int] IDENTITY(, )
  64. NOT NULL ,
  65. [real_decrypt] NVARCHAR(MAX)
  66. )
  67. ------------------------------------------------------------
  68.  
  69. --开始一个事务,稍后回滚
  70. BEGIN TRAN
  71.  
  72. --更改原始的存储过程,用短横线替换
  73. IF @objtype = 'P'
  74. SET @fake_01 = 'ALTER PROCEDURE ' + @procedure + ' WITH ENCRYPTION AS select 1
  75. /**//*' + REPLICATE(CAST('*' AS NVARCHAR(MAX)),
  76. DATALENGTH(@real_01) / 2 - @procNameLength) + '*/'
  77. ELSE
  78. IF @objtype = 'FN'
  79. SET @fake_01 = 'ALTER FUNCTION ' + @procedure + '() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1
  80. /**//*' + REPLICATE(CAST('*' AS NVARCHAR(MAX)),
  81. DATALENGTH(@real_01) / 2 - @procNameLength) + '*/ END'
  82. ELSE
  83. IF @objtype = 'V'
  84. SET @fake_01 = 'ALTER view ' + @procedure + ' WITH ENCRYPTION AS select 1 as col
  85. /**//*' + REPLICATE(CAST('*' AS NVARCHAR(MAX)),
  86. DATALENGTH(@real_01) / 2 - @procNameLength) + '*/'
  87. ELSE
  88. IF @objtype = 'TR'
  89. SET @fake_01 = 'ALTER trigger ' + @procedure + ' ON ' + @parentname + 'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)
  90. /**//*' + REPLICATE(CAST('*' AS NVARCHAR(MAX)),
  91. DATALENGTH(@real_01) / 2 - @procNameLength) + '*/'
  92. EXECUTE (@fake_01)
  93. --从sys.sysobjvalues里提出加密的假的
  94. SET @fake_encrypt_01 = ( SELECT TOP
  95. imageval
  96. FROM sys.sysobjvalues
  97. WHERE objid = OBJECT_ID(@procedure) AND valclass =
  98. ORDER BY subobjid
  99. )
  100. IF @objtype = 'P'
  101. SET @fake_01 = 'Create PROCEDURE ' + @procedure + ' WITH ENCRYPTION AS select 1
  102. /**//*' + REPLICATE(CAST('*' AS NVARCHAR(MAX)),
  103. DATALENGTH(@real_01) / 2 - @procNameLength) + '*/'
  104. ELSE
  105. IF @objtype = 'FN'
  106. SET @fake_01 = 'CREATE FUNCTION ' + @procedure + '() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1
  107. /**//*' + REPLICATE(CAST('*' AS NVARCHAR(MAX)),
  108. DATALENGTH(@real_01) / 2 - @procNameLength) + '*/ END'
  109. ELSE
  110. IF @objtype = 'V'
  111. SET @fake_01 = 'Create view ' + @procedure + ' WITH ENCRYPTION AS select 1 as col
  112. /**//*' + REPLICATE(CAST('*' AS NVARCHAR(MAX)),
  113. DATALENGTH(@real_01) / 2 - @procNameLength) + '*/'
  114. ELSE
  115. IF @objtype = 'TR'
  116. SET @fake_01 = 'Create trigger ' + @procedure + ' ON ' + @parentname + 'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)
  117. /**//*' + REPLICATE(CAST('*' AS NVARCHAR(MAX)),
  118. DATALENGTH(@real_01) / 2 - @procNameLength) + '*/'
  119. --开始计数
  120. SET @intProcSpace =
  121. --使用字符填充临时变量
  122. SET @real_decrypt_01 = REPLICATE(CAST('A' AS NVARCHAR(MAX)),
  123. ( DATALENGTH(@real_01) / ))
  124. --循环设置每一个变量,创建真正的变量
  125. --每次一个字节
  126. SET @intProcSpace =
  127. --如有必要,遍历每个@real_xx变量并解密
  128. WHILE @intProcSpace <= ( DATALENGTH(@real_01) / )
  129. BEGIN
  130. --真的和假的和加密的假的进行异或处理
  131. SET @real_decrypt_01 = STUFF(@real_decrypt_01, @intProcSpace, ,
  132. NCHAR(UNICODE(SUBSTRING(@real_01,
  133. @intProcSpace, )) ^ ( UNICODE(SUBSTRING(@fake_01,
  134. @intProcSpace, )) ^ UNICODE(SUBSTRING(@fake_encrypt_01,
  135. @intProcSpace, )) )))
  136. SET @intProcSpace = @intProcSpace +
  137. END
  138. --通过sp_helptext逻辑向表#output里插入变量
  139. INSERT #output ( real_decrypt )
  140. SELECT @real_decrypt_01
  141. --select real_decrypt AS '#output chek' from #output --测试
  142. -- -------------------------------------
  143. --开始从sp_helptext提取
  144. -- -------------------------------------
  145. DECLARE @dbname SYSNAME ,
  146. @BlankSpaceAdded INT ,
  147. @BasePos INT ,
  148. @CurrentPos INT ,
  149. @TextLength INT ,
  150. @LineId INT ,
  151. @AddOnLen INT ,
  152. @LFCR INT --回车换行的长度
  153. ,
  154. @DefinedLength INT ,
  155. @SyscomText NVARCHAR(MAX) ,
  156. @Line NVARCHAR()
  157. SELECT @DefinedLength =
  158. SELECT @BlankSpaceAdded = --跟踪行结束的空格。注意Len函数忽略了多余的空格
  159. CREATE TABLE #CommentText
  160. (
  161. LineId INT ,
  162. Text NVARCHAR() COLLATE database_default
  163. )
  164. --使用#output代替sys.sysobjvalues
  165. DECLARE ms_crs_syscom CURSOR LOCAL
  166. FOR
  167. SELECT real_decrypt
  168. FROM #output
  169. ORDER BY ident FOR READ ONLY
  170. --获取文本
  171. SELECT @LFCR =
  172. SELECT @LineId =
  173. OPEN ms_crs_syscom
  174. FETCH NEXT FROM ms_crs_syscom INTO @SyscomText
  175.  
  176. WHILE @@fetch_status >=
  177. BEGIN
  178. SELECT @BasePos =
  179. SELECT @CurrentPos =
  180. SELECT @TextLength = LEN(@SyscomText)
  181. WHILE @CurrentPos !=
  182. BEGIN
  183. --通过回车查找行的结束
  184. SELECT @CurrentPos = CHARINDEX(CHAR() + CHAR(),
  185. @SyscomText, @BasePos)
  186. --如果找到回车
  187. IF @CurrentPos !=
  188. BEGIN
  189. --如果@Lines的长度的新值比设置的大就插入@Lines目前的内容并继续
  190. WHILE ( ISNULL(LEN(@Line), ) + @BlankSpaceAdded + @CurrentPos - @BasePos + @LFCR ) > @DefinedLength
  191. BEGIN
  192. SELECT @AddOnLen = @DefinedLength - ( ISNULL(LEN(@Line),
  193. ) + @BlankSpaceAdded )
  194. INSERT #CommentText
  195. VALUES ( @LineId,
  196. ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText,
  197. @BasePos,
  198. @AddOnLen), N'') )
  199. SELECT @Line = NULL, @LineId = @LineId + ,
  200. @BasePos = @BasePos + @AddOnLen,
  201. @BlankSpaceAdded =
  202. END
  203. SELECT @Line = ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText,
  204. @BasePos,
  205. @CurrentPos - @BasePos + @LFCR),
  206. N'')
  207. SELECT @BasePos = @CurrentPos +
  208. INSERT #CommentText
  209. VALUES ( @LineId, @Line )
  210. SELECT @LineId = @LineId +
  211. SELECT @Line = NULL
  212. END
  213. ELSE
  214. --如果回车没找到
  215. BEGIN
  216. IF @BasePos <= @TextLength
  217. BEGIN
  218. --如果@Lines长度的新值大于定义的长度
  219. WHILE ( ISNULL(LEN(@Line), ) + @BlankSpaceAdded + @TextLength - @BasePos + ) > @DefinedLength
  220. BEGIN
  221. SELECT @AddOnLen = @DefinedLength - ( ISNULL(LEN(@Line),
  222. ) + @BlankSpaceAdded )
  223. INSERT #CommentText
  224. VALUES ( @LineId,
  225. ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText,
  226. @BasePos,
  227. @AddOnLen), N'') )
  228. SELECT @Line = NULL,
  229. @LineId = @LineId + ,
  230. @BasePos = @BasePos + @AddOnLen,
  231. @BlankSpaceAdded =
  232. END
  233. SELECT @Line = ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText,
  234. @BasePos,
  235. @TextLength - @BasePos + ),
  236. N'')
  237. IF LEN(@Line) < @DefinedLength AND CHARINDEX(' ',
  238. @SyscomText,
  239. @TextLength + ) >
  240. BEGIN
  241. SELECT @Line = @Line + ' ',
  242. @BlankSpaceAdded =
  243. END
  244. END
  245. END
  246. END
  247. FETCH NEXT FROM ms_crs_syscom INTO @SyscomText
  248. END
  249.  
  250. IF @Line IS NOT NULL
  251. INSERT #CommentText
  252. VALUES ( @LineId, @Line )
  253. SELECT Text
  254. FROM #CommentText
  255. ORDER BY LineId
  256. CLOSE ms_crs_syscom
  257. DEALLOCATE ms_crs_syscom
  258. DROP TABLE #CommentText
  259.  
  260. -- -------------------------------------
  261. --结束从sp_helptext提取
  262. -- -------------------------------------
  263. --删除用短横线创建的存储过程并重建原始的存储过程
  264. ROLLBACK TRAN
  265. DROP TABLE #output
  266.  
  267. 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. 使用 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 ...

  2. Python3实战——爬虫入门

    一.安装库 使用conda安装: conda install requests 如果出现解析环境问题,需要激活conda环境: https://www.cnblogs.com/jdemarryme/p ...

  3. Notepad++新建文件设置默认的换行符

    选择[Settings]-[Preferences]-[New Documnet]

  4. k8s记录-ntpd时间同步配置(五)

    1)服务端配置 在192.168.0.1 root用户下操作 yum install -y ntp ntpdate 修改etc/ntp.conf 注释所有的server和restrict 加入: se ...

  5. 123457123456#1#----com.MC.EnglishGame98--前拼后广--jp英语-mc

    com.MC.EnglishGame98--前拼后广--jp英语-mc

  6. Django之密码加密

    通过django自带的类库,来加密解密很方便,下面来简单介绍下: 导入包: from django.contrib.auth.hashers import make_password, check_p ...

  7. Python动态构造类:借助强悍的内建 type()

    内建的 type() 函数带三个参数时, 将作为强悍的动态类构造器. 如下: type(name, bases, dict) 返回一个新的type对象. 基本上是 class 语句的动态形式. 参数: ...

  8. box-sizing:border-box 将元素的内边距和边框都设定在宽高内计算

    http://www.w3school.com.cn/cssref/pr_box-sizing.asp box-sizing: content-box|border-box|inherit; 值 描述 ...

  9. CentOS7为docker-ce配置阿里云镜像加速器

    一.找加速地址 https://promotion.aliyun.com/ntms/act/kubernetes.html 控制台 二.添加daemon.json 文件 vim /etc/docker ...

  10. IDEA 创建JAVA Maven Web 工程 不能建Sevlet文件

    JAVA目录下建包而不是文件夹 需要添加依赖 <dependency> <groupId>javax.servlet</groupId> <artifactI ...