SQLSERVER对加密的存储过程、视图、触发器进行解密(推荐)
加密测试的存储过程
IFEXISTS(SELECT1FROMSYSOBJECTSWHERETYPE='P'ANDNAME='P_TEST') DROPPROCEDUREP_TEST GO CREATEPROCEDUREP_TEST(@USERNAMEVARCHAR(20),@MSGVARCHAR(20)OUTPUT) WITHENCRYPTION AS BEGIN IF(SELECTCOUNT(1)FROMCustsWHERENAME=@USERNAME)>0 SET@MSG='此用户名存在' ELSE SET@MSG='此用户名不存在' END
解密的存储过程
CreatePROCEDUREDecryption(@proceduresysname=NULL) AS SETNOCOUNTON DECLARE@intProcSpacebigint,@tbigint,@maxColIDsmallint,@procNameLengthint select@maxColID=max(subobjid)FROM sys.sysobjvaluesWHEREobjid=object_id(@procedure) --select@maxColIDas'Rowsinsys.sysobjvalues' select@procNameLength=datalength(@procedure)+29 DECLARE@real_01nvarchar(max) DECLARE@fake_01nvarchar(max) DECLARE@fake_encrypt_01nvarchar(max) DECLARE@real_decrypt_01nvarchar(max),@real_decrypt_01anvarchar(max) declare@objtypevarchar(2),@ParentNamenvarchar(max) select@real_decrypt_01a='' --提取对象的类型如是存储过程还是函数,如果是触发器,还要得到其父对象的名称 select@objtype=type,@parentname=object_name(parent_object_id) fromsys.objectswhere[object_id]=object_id(@procedure) --从sys.sysobjvalues里提出加密的imageval记录 SET@real_01=(SELECTtop1imagevalFROMsys.sysobjvaluesWHEREobjid= object_id(@procedure)andvalclass=1orderbysubobjid) --创建一个临时表 createtable#output([ident][int]IDENTITY(1,1)NOTNULL, [real_decrypt]NVARCHAR(MAX)) --开始一个事务,稍后回滚 BEGINTRAN --更改原始的存储过程,用短横线替换 if@objtype='P' SET@fake_01='ALTERPROCEDURE'+@procedure+'WITHENCRYPTIONASselect1 /**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/' elseif@objtype='FN' SET@fake_01='ALTERFUNCTION'+@procedure+'()RETURNSINTWITHENCRYPTIONASBEGINRETURN1 /**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/END' elseif@objtype='V' SET@fake_01='ALTERview'+@procedure+'WITHENCRYPTIONASselect1ascol /**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/' elseif@objtype='TR' SET@fake_01='ALTERtrigger'+@procedure+'ON'+@parentname+'WITHENCRYPTIONAFTERINSERTASRAISERROR(''N'',16,10) /**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/' EXECUTE(@fake_01) --从sys.sysobjvalues里提出加密的假的 SET@fake_encrypt_01=(SELECTtop1imagevalFROMsys.sysobjvaluesWHEREobjid= object_id(@procedure)andvalclass=1orderbysubobjid) if@objtype='P' SET@fake_01='CreatePROCEDURE'+@procedure+'WITHENCRYPTIONASselect1 /**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/' elseif@objtype='FN' SET@fake_01='CREATEFUNCTION'+@procedure+'()RETURNSINTWITHENCRYPTIONASBEGINRETURN1 /**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/END' elseif@objtype='V' SET@fake_01='Createview'+@procedure+'WITHENCRYPTIONASselect1ascol /**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/' elseif@objtype='TR' SET@fake_01='Createtrigger'+@procedure+'ON'+@parentname+'WITHENCRYPTIONAFTERINSERTASRAISERROR(''N'',16,10) /**//*'+REPLICATE(cast('*'asnvarchar(max)),datalength(@real_01)/2-@procNameLength)+'*/' --开始计数 SET@intProcSpace=1 --使用字符填充临时变量 SET@real_decrypt_01=replicate(cast('A'asnvarchar(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 --selectreal_decryptAS'#outputchek'from#output--测试 --------------------------------------- --开始从sp_helptext提取 --------------------------------------- declare@dbnamesysname ,@BlankSpaceAddedint ,@BasePosint ,@CurrentPosint ,@TextLengthint ,@LineIdint ,@AddOnLenint ,@LFCRint--回车换行的长度 ,@DefinedLengthint ,@SyscomTextnvarchar(max) ,@Linenvarchar(255) Select@DefinedLength=255 SELECT@BlankSpaceAdded=0--跟踪行结束的空格。注意Len函数忽略了多余的空格 CREATETABLE#CommentText (LineIdint ,Textnvarchar(255)collatedatabase_default) --使用#output代替sys.sysobjvalues DECLAREms_crs_syscomCURSORLOCAL FORSELECTreal_decryptfrom#output ORDERBYident FORREADONLY --获取文本 SELECT@LFCR=2 SELECT@LineId=1 OPENms_crs_syscom FETCHNEXTFROMms_crs_syscominto@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目前的内容并继续 While(isnull(LEN(@Line),0)+@BlankSpaceAdded+ @CurrentPos-@BasePos+@LFCR)>@DefinedLength BEGIN SELECT@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=0 END SELECT@Line=isnull(@Line,N'')+ isnull(SUBSTRING(@SyscomText,@BasePos,@CurrentPos-@BasePos+@LFCR),N'') SELECT@BasePos=@CurrentPos+2 INSERT#CommentTextVALUES(@LineId,@Line) SELECT@LineId=@LineId+1 SELECT@Line=NULL END ELSE --如果回车没找到 BEGIN IF@BasePos<=@TextLength BEGIN --如果@Lines长度的新值大于定义的长度 While(isnull(LEN(@Line),0)+@BlankSpaceAdded+ @TextLength-@BasePos+1)>@DefinedLength BEGIN SELECT@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= 0 END SELECT@Line=isnull(@Line,N'')+ isnull(SUBSTRING(@SyscomText,@BasePos,@TextLength-@BasePos+1),N'') ifLEN(@Line)<@DefinedLengthandcharindex('', @SyscomText,@TextLength+1)>0 BEGIN SELECT@Line=@Line+'',@BlankSpaceAdded=1 END END END END FETCHNEXTFROMms_crs_syscominto@SyscomText END IF@LineisNOTNULL INSERT#CommentTextVALUES(@LineId,@Line) selectTextfrom#CommentTextorderbyLineId CLOSEms_crs_syscom DEALLOCATEms_crs_syscom DROPTABLE#CommentText --------------------------------------- --结束从sp_helptext提取 --------------------------------------- --删除用短横线创建的存储过程并重建原始的存储过程 ROLLBACKTRAN DROPTABLE#output GO 启用DAC SP_CONFIGURE'remoteadminconnections'; GO ----0:仅允许本地连接使用DAC,1:允许远程连接使用DAC SP_CONFIGURE'remoteadminconnections',0; GO RECONFIGUREWITHOVERRIDE; GO
文件——>新建——>数据库引擎查询
服务器名称:admin:.或者admin:服务器名称
登录进去执行解密操作
USETEST EXECDecryptionP_TEST GO
为了安全起见,不要在正式环境进行解密,避免在解密过程中将原存储过程损坏!
总结
以上所述是小编给大家介绍的SQLSERVER对加密的存储过程、视图、触发器进行解密,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。