SQL2005 存储过程解密方法

2020-07-10 08:03:20易采站长站整理

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+1
END

–通过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 @SyscomText
WHILE @@fetch_status >= 0
BEGIN
SELECT @BasePos = 1
SELECT @CurrentPos = 1
SELECT @TextLength = LEN(@SyscomText)
WHILE @CurrentPos != 0
BEGIN
–通过回车查找行的结束
SELECT @CurrentPos = CHARINDEX(char(13)+char(10), @SyscomText,
@BasePos)
–如果找到回车
IF @CurrentPos != 0
BEGIN
–如果@Lines的长度的新值比设置的大就插入@Lines目前的内容并继续
相关文章 大家在看