1、并未去除原存款和储蓄重新创设,仅仅在决定台做了一个输出,拷贝出来特不实惠。2、对于长度大点的加密数据会解密失利。带着那三个难点来更正此存款和储蓄进程。先做准备职业,首先要求精晓DAC这么个东西,
指的是数据库教程专用管理员连接,为总指挥提供的一种极度的确诊连接。知道了后得先展开它,以SQL2010为例:右击对象浏览器,找到Facets,点击,如图:找到Sruface
Area
Configuration,选用RemoteDacEnabled,设为True:然后开展DAC登陆,CMD形式下敲如下命令,不清楚原理的可以自动钻研:sqlcmd
-A -S 192.168.1.101 -U sa -P 123456命令提醒行下张开需管理的数据库:USE
TESTGO计划伏贴,复制搜索获得的储存进程,生成解密存款和储蓄程,然后大家计划四个加密后的积累进度,此中一个尺寸极大,验证得出结论,短小的存储进程异常快即解密成功,并出口,但长度超大的却解密失败。接下来看看其何等解密的:先看那句select
@maxColID = max(subobjid卡塔尔国,@intEncrypted = imageval FROM sys.sysobjvalues
WHERE objid =
object_id(@procedure卡塔尔国指的是加密后的数额存放在sys.sysobjvalues表中,其内容贮存于imageval字段。知道了加密后的多少,就得实行解密,它定义了4个举足轻重字段:DECLARE
@real_01 nvarchar(max)DECLARE @fake_01 nvarchar(max)DECLARE
@fake_encrypt_01 nvarchar(max)DECLARE @real_decrypt_01
nvarchar(maxState of Qatar分别指的固有加密数据内容、原始加密存款和储蓄进度的CREATE语句、本人组织的假的蕴藏进度加密后的数量、末领悟密后的储存进度。其方法是按位将@real_01、@fake_encrypt_01、@real_decrypt_01举行异或运算,此处为啥这么管理,原理不明!!!WHILE
@intProcSpace=(datalength(@real_01)/2)BEGIN –xor real fake fake
encrypted 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, 1State of Qatar卡塔尔(قطر‎卡塔尔(قطر‎卡塔尔(قطر‎State of Qatar SET
@intProcSpace=@intProcSpace+1END实际上到此甘休,加密后的仓库储存进程已解密出来了。其下部还应该有一大段语句未有留心钻探,但基本上是接收sp_helptext将内容输出,方法相比繁索,并且还未达到我们要的成效,大家将换一种艺术举行输出。基本上就这么简单,除了原理不知情外,基本兰月达标须要,接下去要消除起来提议的多少个难点。首先是长度难点,为啥长度一大就解密战败,来看看@real_decrypt_01的概念并扩充初阶化@real_decrypt_01的语句:DECLARE
@real_decrypt_01 nvarchar(max)SET @real_decrypt_01 = replicate(N’A’,
(datalength(@real_01卡塔尔(قطر‎ /2
卡塔尔卡塔尔乍一看没什么难题,但大家使用LEN(@real_decrypt_01State of Qatar输出看看,最大出口长度为4000,可能难点就现身NVARCHA奔驰M级的长度上了,理论上NVARCHAMurano(MAX卡塔尔国帮忙2G的大小。为啥会师世这种气象没有色金属钻探所究过,但有人给出了消除方式,举办展示调换:SET
@real_decrypt_01 = replicate(CONVERT(NVARCHAR(MAX), N’A’),
(datalength(@real_01State of Qatar /2
卡塔尔(قطر‎卡塔尔此外的几还应该有几处也是该原因,矫正后打开双重运维,难点解决,长度一点都不小的积攒进程也解密成功。第三个难点一蹴而就了,怎么样能低价的出口呢,试验了除去重新建立,但未中标,那么就用最不难易行的主意吗,利用xp_cmdshell将内容输出到文本。先创立多少个物理表,用于存款和储蓄解密后的多少:

建好sp后,在“连接到数据库引擎”对话框的“服务器名称”框中,键入
ADMIN:,并在其后继续键入服务器实例的称号。比方,若要连接到名字为ACCT\PAYABLE 的服务器实例,请键入
ADMIN:ACCT\PAYABLE。然后再调用此存款和储蓄进度来查阅。

SQLServer二零零五里使用with
encryption选项创造的储存进程如故和sqlserver二〇〇三里相近,都以接收XO普拉多实行了的加密。和2004不一样等的是,在二〇〇六的系统表syscomments里早就查不到加密过的密文了。要查密文必须接收DAC(专项使用管理员连接)连接到数据库后,在系统表
sys.sysobjvalues查询,该表的列imageval存款和储蓄了对应的密文。具体能够利用上边包车型大巴查询:
SELECT imageval FROM sys.sysobjvalues WHERE objid =
object_id(@procedure) AND valclass = 1 AND subobjid = 1

CREATE TABLE [dbo].[SQL_DECODE]( [ID] [int] IDENTITY(1,1) NOT NULL, [SQLTEXT] [nvarchar](max) NOT NULL, CONSTRAINT [ID] PRIMARY KEY CLUSTERED ( [ID] ASC)) ON [PRIMARY]GO

CREATE PROCEDURE dbo.sp__procedure$decrypt
(@procedure sysname = NULL, @revfl int = 1)
AS
SET NOCOUNT ON

 

下一场营造三个存款和储蓄进程,遍历全数加密过的积存进度,调用解密存款和储蓄进程进展解密,解密后输出:

IF @revfl = 1
BEGIN
PRINT ‘CAUTION: THIS PROCEDURE DELETES AND REBUILDS THE ORIGINAL STORED
PROCEDURE.’
PRINT ‘ MAKE A BACKUP OF YOUR DATABASE BEFORE RUNNING THIS PROCEDURE.’
PRINT ‘ IDEALLY, THIS PROCEDURE SHOULD BE RUN ON A NON-PRODUCTION COPY
OF THE PROCEDURE.’
PRINT ‘ To run the procedure, change the @revfl parameter to 0’
RETURN 0
END

运用DAC连接的注意事项:

CREATE PROCEDURE [dbo].[DECODE_DATABASE]ASSET NOCOUNT ONBEGIN DECLARE @PROC_NAME VARCHAR(256) SET @PROC_NAME = '' DECLARE @ROWS INT DECLARE @TEMP TABLE( NAME VARCHAR(256) ) INSERT INTO @TEMP SELECT NAME FROM sysobjects WHERE TYPE = 'P' AND NAME NOT IN ( 'DECODE_DATABASE', 'DECODE_PROC' ) SET @ROWS = @@ROWCOUNT WHILE @ROWS  0 BEGIN SELECT @PROC_NAME = NAME FROM ( SELECT ROW_NUMBER() OVER (ORDER by NAME) AS ROW, NAME FROM @TEMP ) T WHERE ROW = @ROWS EXEC [DECODE_PROC] @PROC_NAME PRINT @PROC_NAME SET @ROWS = @ROWS - 1 END RETURN EXEC master..xp_cmdshell 'bcp SELECT [SQLTEXT] FROM TEST.dbo.[SQL_DECODE] queryout C:decode.txt -c -T -S PC2011043012JUJ'ENDGO

DECLARE @intProcSpace bigint
   ,@t bigint
   ,@maxColID smallint
   ,@intEncrypted tinyint
   ,@procNameLength int

1、唯有系統管理員(sysadminState of Qatar剧中人物相關成員能够采纳DAC連接存取SQL
Server(LocalState of Qatar本地连接

最终是改建后的仓库储存进度:

select @maxColID = max(subobjid)
   –//,@intEncrypted = imageval
FROM sys.sysobjvalues
WHERE objid = object_id(@procedure)
GROUP BY imageval

2、一個執行個體只好存在一個DAC。  

CREATE PROCEDURE [dbo].[DECODE_PROC]( @PROC_NAME SYSNAME = NULL)ASSET NOCOUNT ONDECLARE @PROC_NAME_LEN INT --存储过程名长度DECLARE @MAX_COL_ID SMALLINT --最大列IDSELECT @MAX_COL_ID = MAX(subobjid) FROM sys.sysobjvalues WHERE objid = OBJECT_ID(@PROC_NAME) GROUP BY imagevalSELECT @PROC_NAME_LEN = DATALENGTH(@PROC_NAME) + 29DECLARE @REAL_01 NVARCHAR(MAX) --真实加密存储过程数据DECLARE @FACK_01 NVARCHAR(MAX) --修改为假的存储过程,长度,原理不明?DECLARE @FACK_ENCRYPT_01 NVARCHAR(MAX) --伪加密存储过街程数据DECLARE @REAL_DECRYPT_01 NVARCHAR(MAX) --最终解密后的数据,初始化为原始加密长度的一半的A,原理不明?SET @REAL_01 = ( SELECT imageval FROM sys.sysobjvalues WHERE objid = object_id(@PROC_NAME) AND valclass = 1 AND subobjid = 1)DECLARE @REAL_DATA_LEN BIGINTSET @REAL_DATA_LEN = DATALENGTH(@REAL_01)--PRINT @REAL_DATA_LENDECLARE @FACK_LEN BIGINTSET @FACK_LEN = @REAL_DATA_LEN * 10 --改造:假的长度在原真实数据长度上放大10倍--此处需将NVARCHAR显示转换成NVARCHAR(MAX),不然将只能产生4K长度SET @FACK_01 = 'ALTER PROCEDURE ' + @PROC_NAME + ' WITH ENCRYPTION AS ' + REPLICATE(CONVERT(NVARCHAR(MAX), '-'), @FACK_LEN - @PROC_NAME_LEN)--PRINT '@FACK_01 = ' + STR(LEN(@FACK_01))EXECUTE (@FACK_01)SET @FACK_ENCRYPT_01 = ( SELECT imageval FROM sys.sysobjvalues WHERE objid = object_id(@PROC_NAME) AND valclass = 1 AND subobjid = 1)SET @FACK_01 = 'CREATE PROCEDURE ' + @PROC_NAME + ' WITH ENCRYPTION AS ' + REPLICATE(CONVERT(VARCHAR(MAX), '-'), @FACK_LEN - @PROC_NAME_LEN)SET @REAL_DECRYPT_01 = REPLICATE(CONVERT(NVARCHAR(MAX), N'A'), (DATALENGTH(@REAL_01) /2))--PRINT 'LEN(@REAL_DECRYPT_01) = ' + STR(LEN(@REAL_DECRYPT_01))--按位对 @REAL_01、 @FACK_01、 @REAL_DECRYPT_01 进行异或操作。DECLARE @INT_PROC_SPACE BIGINTSET @INT_PROC_SPACE = 1WHILE @INT_PROC_SPACE = (DATALENGTH(@REAL_01) /2 )BEGIN SET @REAL_DECRYPT_01 = STUFF( @REAL_DECRYPT_01, @INT_PROC_SPACE, 1, NCHAR(UNICODE(SUBSTRING(@REAL_01, @INT_PROC_SPACE, 1)) ^ (UNICODE(SUBSTRING(@FACK_01, @INT_PROC_SPACE, 1)) ^ UNICODE(SUBSTRING(@FACK_ENCRYPT_01, @INT_PROC_SPACE, 1)))) ) SET @INT_PROC_SPACE = @INT_PROC_SPACE + 1END--移除WITH ENCRYPTIONSET @REAL_DECRYPT_01 = REPLACE(@REAL_DECRYPT_01, 'WITH ENCRYPTION', '')INSERT INTO [SQL_DECODE] VALUES (@REAL_DECRYPT_01)--PRINT '@REAL_DECRYPT_01 = ' + @REAL_DECRYPT_01--PRINT 'LEN(@REAL_DECRYPT_01) = ' + STR(LEN(@REAL_DECRYPT_01))--删除原存储过程SET @FACK_01 = 'DROP PROCEDURE ' + @PROC_NAMEEXEC(@FACK_01)GO

–select @maxColID as ‘Rows in sys.sysobjvalues’
select @procNameLength = datalength(@procedure) + 29

3、使用DAC经常是讓DBA查詢和消遣SQL Server問題(當無法平常連接執行個體卡塔尔(قطر‎,

从那之后,解密全经过大功告成,命令行形式下运作:EXEC
[DECODE_DATABASE]GO在C盘根目录下,解密后的仓库储存进度文本生成成功。运维前别忘记打开xp_cmdshell使用权力,同开垦DAC肖似:可能命令行方式下敲如下命令:sp_configure
‘show advanced options’,1reconfiguregosp_configure
‘xp_cmdshell’,1reconfigurego

DECLARE @real_01 nvarchar(max)
DECLARE @real_02 nvarchar(max)
DECLARE @real_03 nvarchar(max)
DECLARE @real_04 nvarchar(max)
DECLARE @real_05 nvarchar(max)

4、好比執行sp_who2、Kill SPID、DBCC SQLPE揽胜F、DBCC DROPCLEANBUFFE讴歌ZDXS
…等,使用DAC連接時,切勿執行需耗費一大波資源的命令,如DBCC CHECKDB、DBCC
SH讴歌MDXINKDATABASE..等

DECLARE @fake_01 nvarchar(max)
   ,@fake_02 nvarchar(max)
   ,@fake_03 nvarchar(max)
   ,@fake_04 nvarchar(max)
   ,@fake_05 nvarchar(max)

5、使用DAC登陆本领改改系统表或然查看系统表,从前SQL二〇〇〇的时候你能够随便修正系统表,到了SQL二〇〇五就从头限定您了

DECLARE @fake_encrypt_01 nvarchar(max)
DECLARE @fake_encrypt_02 nvarchar(max)
DECLARE @fake_encrypt_03 nvarchar(max)
DECLARE @fake_encrypt_04 nvarchar(max)
DECLARE @fake_encrypt_05 nvarchar(max)

6、sql server browse服必得需拉开

DECLARE @real_decrypt_01 nvarchar(max)
   ,@real_decrypt_01a nvarchar(max)
   ,@real_decrypt_02 nvarchar(max)
   ,@real_decrypt_02a nvarchar(max)
   ,@real_decrypt_03 nvarchar(max)
   ,@real_decrypt_03a nvarchar(max)
   ,@real_decrypt_04 nvarchar(max)
   ,@real_decrypt_04a nvarchar(max)  
   ,@real_decrypt_05 nvarchar(max)
   ,@real_decrypt_05a nvarchar(max)  

开启DAC的SQL

select @real_decrypt_01a = ”
   ,@real_decrypt_02a = ”
   ,@real_decrypt_03a = ”
   ,@real_decrypt_04a = ”
   ,@real_decrypt_05a = ”

 1 USE master        
 2 GO        
 3 sp_configure 'show advanced options', 1 
 4 GO    
 5 sp_configure 'remote admin connections', 1 
 6 GO        
 7 RECONFIGURE WITH OVERRIDE    
 8 GO
 9 
10 
11 SELECT *  FROM sys.configurations where name = 'remote admin connections'

— extract the encrypted imageval rows from sys.sysobjvalues
SELECT @real_01=substring(imageval,1,8000)
   ,@real_02=substring(imageval,8001,16000)
   ,@real_03=substring(imageval,16001,24000)
   ,@real_04=substring(imageval,24001,32000)
   ,@real_05=substring(imageval,32001,40000)
FROM sys.sysobjvalues
WHERE objid = object_id(@procedure) and valclass = 1 and subobjid = 1

也得以在外场应用配置器这里开启

— create this table for later use
create table #output ( [ident] [int] IDENTITY (1, 1) NOT NULL ,
[real_decrypt] NVARCHAR(MAX)
)

图片 1

— We’ll begin the transaction and roll it back later
BEGIN TRAN
— alter the original procedure, replacing with dashes
SET @fake_01=’ALTER PROCEDURE ‘+ @procedure +’ WITH ENCRYPTION AS
‘+REPLICATE(‘-‘, 40003 – @procNameLength)

 

EXECUTE (@fake_01)

命令行下使用DAC登陆
sqlcmd加上 /A 选项  专项使用途理总是
sqlcmd /S  JOE  /E  /A
1>DBCC DROPCLEANBUFFERS

相关文章