今天有一个同事在做一个项目的时候,因为现在公司不跟某一家公司合作。有一些sql的存储过程是加密,现在想打开那些存储过程来解密。故查看了一些资料终于解密成功。步骤如下:

1.需要开始DAC连接。

1.1使用只有系統管理員(sysadmin)角色相關成員登陆sql service management studio.

1.2.右击“对象浏览器”,找到“方面”,点击。如下图:

1.3.找到“Sruface Area Configuration”(外围应用配置器),选择“RemoteDacEnabled”,设为True:

 2.登陆到DAC

2.1在 SQL Server Management Studio 中,不打开其他 DAC,单击工具栏上的“数据库引擎查询”。

2.2在“连接到数据库引擎”对话框中的“服务器名称”框中,键入 ADMIN: 及服务器实例的名称。例如,若要连接到名为 ACCT\PAYABLE 的服务器实例,请键入 ADMIN:ACCT\PAYABLE。

2.3完成“身份验证”部分(提供 sysadmin 组成员的凭据),然后单击“连接”。将建立连接。

注意的是:一次只能打开一个DAC连接。

3.创建解密存储过程:

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

4.调用存储过程。exec sp__windbi$decrypt 'ScanOrData_encryption',0//第一个参数为要解密的存储过程。第二个参数有0跟1,0是输出密文。

sql2008存储过程解密。的更多相关文章

  1. Sql存储过程解密方法

    在网上查到这样一个存储过程解密的方法,用起来简单,收藏到这里: )) AS ------------------------sql2000大于40000的----------------- --原作: ...

  2. SQL存储过程解密

    首先要建立一张表和一个存储过程: SQL_DECODE表: CREATE TABLE [dbo].[SQL_DECODE]( ,) NOT NULL, [SQLTEXT] [nvarchar](max ...

  3. sql server 存储过程解密

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

  4. sql server存储过程解密

    解密存储过程: USE [RYTreasureDB] GO /****** Object: StoredProcedure [dbo].[sp__windbi$decrypt] Script Date ...

  5. vs2010调试sql2008存储过程

      1.安装vs2010sp1补丁 2.vs中打开服务器资源管理器,并进行数据库连接,连接时要注意 3. 4.可以打开数据库中的存储过程进行调试了

  6. SQL2008 存储过程参数相关

      使用inputparame时,使用的是 varchar(20),和数据库中的DEPARTNAME完全匹配,可以查出值: USE [test] GO SET ANSI_NULLS OFF GO SE ...

  7. 014.存储过程(sql实例)

    --存储过程--GO--先编译,再执行 --1.GO:批处理语句,GO之前作为一个批次发送服务器编译执行 USE master GO CREATE DATABASE TEST_DB GO USE TE ...

  8. sql2008破解加密存储过程

    网上的很多不能正确解密,出现空白,还好有这个,mark下了. Create PROCEDURE [dbo].[sp_windbidecrypt] (@procedure sysname = NULL, ...

  9. SQL2005解密已经被加密的存储过程

    SQL2005解密已经被加密的存储过程 第一步:打开DAC连接功能 第二步:在MASTER数据库创建一个解密存储过程 USE master GO CREATE PROCEDURE [dbo].[sp_ ...

随机推荐

  1. angular ui-route

    http://www.cnblogs.com/freeliver54/p/4488141.html

  2. Linux时间同步方式记录

    Linux时间同步 部署Hadoop集群,遇到各个linux服务器的时间不同步的问题,于是研究了一下linux的时间同步方式,特将同步方式,总结如下: A. 前提条件 a)         网络是连通 ...

  3. cocos2d_随手篇1_关于ccTouchBegan的调用

    在新的cocos框架里,旧的调用ccTouchBegan方法被和谐掉了!so! 直接来代码 1 -(void)doSometing{ 2   [[[CCDirector sharedDirector] ...

  4. 放弃移动版Flash而非AIR

    之前看到标题为"Adobe放弃移动版flash"的新闻,我很震惊,为何Adobe会放弃这么一个大市场呢? 这样无疑打击原来在flash的开发上的应用,我想很多人和我想的一样,fla ...

  5. 创建性能监视器(logman)

    在本地计算机上抓取性能信息 Logman.exe create counter Perf-1Second -f bincirc -max 500 -c "\Processor(*)\% Pr ...

  6. Android AndroidManifest 清单文件以及权限具体解释

    每一个Android应用都须要一个名为AndroidManifest.xml的程序清单文件,这个清单文件名称是固定的而且放在每一个Android应用的根文件夹下.它定义了该应用对于Android系统来 ...

  7. xps13 关机充电 右边的usb口

    bios里设置了 usb powershare但关机的时候还是不能充电 度娘了一下,发现不解决问题,只能放狗了.果然谷歌里搜到答案,是windows的电源策略. I figured it out. A ...

  8. sql server char nchar nvarchar varchar之間的區別

    char存储固定长度的字符串,最大长度为8000个字节. varchar存储可变长度的字符串.最大长度为8000个字节. nchar存储固定长度的Unicode字符串,最大长度为4000个字符. nv ...

  9. (function(){}).call(window) 严格模式匿名函数的this指向undefined

    上次在群里,看到有人发出 (function(){}).call(window) 这么一段代码,问这有什么意义,匿名函数中的this不是始终都指向window的么,为什么还要call,我当时也很疑惑. ...

  10. 文件和目录之link、unlink、remove和rename函数

    任何一个文件可以有多个目录项指向其i节点.创建一个指向现有文件的链接的方法是使用link函数. #include <unistd.h> int link( const char *exis ...