-- 使用WITH ENCRYPTION选项可用于加密SQL存储过程或者触发器(SQLServer本身提供的加密算法). -- WITH ENCRYPTION子句对用户隐藏存储过程的文本。
-- 加密存储过程 Create procname WITH ENCRYPTION as begin --语句 end
-- 加密触发器 Create TRIGGER trigger_name ON { table | view} WITH ENCRYPTION FOR Update AS begin --语句 end
?
-- 未加密的存储过程可以用sp_helptext来获取其文本命令源码 -- 示例: exec sp_helptext [sp_addapprole]
?
-----------------------------------------------------------------------------------
IF EXISTS(Select name FROM sysobjects Where name='getOperationUser' AND type='P') Drop procedure getOperationUser GO
USE MyHouseDB?? GO -- 创建存储过程 Create procedure getOperationUser WITH ENCRYPTION AS Select* FROM dbo.操作用户 GO
-- 示例 EXEC sp_helptext getOperationUser
-- 下面是结果集: -- 对象 'getOperationUser' 的文本已加密。
-- 使用存储过程 -- exec getOperationUser -- 跟没加密一样可以返回结果集
--?? 选择加密存储过程内容的标识号和文本。
Select c.id,c.text FROM syscomments c INNER JOIN sysobjects o ON c.id=o.id Where o.name='getOperationUser'
-- 下面是结果集: -- 说明text列的输出显示在单独一行中。执行时,该信息将与id列信息出现在同一行中。 -- Id???????????? text -- 1413580074???? NULL
-- (1 行受影响)
?
-- Sql存储过程解密算法破解微软的加密算法.网上同样有很多的Sql存储过程的解密软件,但大都是收费的。 -- 下边是网上流传的Sql存储过程解密算法,虽非官方,但绝对可行!同样可用于解密SQL存储过程或者触发器。 exec sp_decrypt [getOperationUser] EXEC sp_helptext getOperationUser
?
-- 程序代码 create PROCEDURE sp_decrypt(@objectname varchar(50)) AS begin set nocount on --CSDN:j9988 copyright:2004.07.15 --V3.2 --破解字节不受限制,适用于SQL SERVER 2000存储过程,函数,视图,触发器 --发现有错,请E_MAIL:CSDNj9988@tom.com begin tran
declare @objectname1 varchar(100),@orgvarbin varbinary(8000) declare @sql1 nvarchar(4000),@sql2 varchar(8000),@sql3 nvarchar(4000),@sql4 nvarchar(4000) DECLARE @OrigSpText1 nvarchar(4000),@OrigSpText2 nvarchar(4000),@OrigSpText3 nvarchar(4000),@resultsp nvarchar(4000) declare @i int,@status int,@type varchar(10),@parentid int declare @colid int,@n int,@q int,@j int,@k int,@encrypted int,@number int select @type=xtype,@parentid=parent_obj from sysobjects where id=object_id(@objectname)
create table #temp(number int,colid int,ctext varbinary(8000),encrypted int,status int) insert #temp Select number,colid,ctext,encrypted,status FROM syscomments Where id = object_id(@objectname) select @number=max(number) from #temp set @k=0
while @k<=@number ?? begin ?? if exists(select 1 from syscomments where id=object_id(@objectname) and number=@k) ??? begin ??? if @type='P' ??? set @sql1=(case when @number>1 then 'Alter PROCEDURE '+ @objectname +';'+rtrim(@k)+' WITH ENCRYPTION AS ' ??? else 'Alter PROCEDURE '+ @objectname+' WITH ENCRYPTION AS ' ??? end)
??? if @type='TR' ???? begin ????? declare @parent_obj varchar(255),@tr_parent_xtype varchar(10) ????? select @parent_obj=parent_obj from sysobjects where id=object_id(@objectname) ????? select @tr_parent_xtype=xtype from sysobjects where id=@parent_obj ????? if @tr_parent_xtype='V' ?????? begin ??????? set @sql1='Alter TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTERD OF Insert AS PRINT 1 ' ?????? end ????? else ?????? begin ??????? set @sql1='Alter TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR Insert AS PRINT 1 ' ?????? end ???? end ??? if @type='FN' or @type='TF' or @type='IF' ???? set @sql1=(case @type when 'TF' then ???? 'Alter FUNCTION '+ @objectname+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end ' ???? when 'FN' then ???? 'Alter FUNCTION '+ @objectname+'(@a char(1)) returns char(1) with encryption as begin return @a end' ???? when 'IF' then ???? 'Alter FUNCTION '+ @objectname+'(@a char(1)) returns table with encryption as return select @a as a' ???? end)
??? if @type='V' ???? set @sql1='Alter VIEW '+@objectname+' WITH ENCRYPTION AS Select 1 as f'
??? set @q=len(@sql1) ??? set @sql1=@sql1+REPLICATE('-',4000-@q) ??? select @sql2=REPLICATE('-',8000) ??? set @sql3='exec(@sql1' ??? select @colid=max(colid) from #temp where number=@k ??? set @n=1
??? while @n<=CEILING(1.0*(@colid-1)/2) and len(@sql3)<=3996 ??? begin ???? set @sql3=@sql3+'+@' ???? set @n=@n+1 ??? end ??? set @sql3=@sql3+')' ??? exec sp_executesql @sql3,N'@sql1 nvarchar(4000),@ varchar(8000)',@sql1=@sql1,@=@sql2 ?? end ?? set @k=@k+1 end --对应while
set @k=0 while @k<=@number begin ?? if exists(select 1 from syscomments where id=object_id(@objectname) and number=@k) ??? begin ???? select @colid=max(colid) from #temp where number=@k ???? set @n=1 ???? while @n<=@colid ????? begin ?????? select @OrigSpText1=ctext,@encrypted=encrypted,@status=status FROM #temp Where colid=@n and number=@k ?????? SET @OrigSpText3=(Select ctext FROM syscomments Where id=object_id(@objectname) and colid=@n and number=@k) ?????? if @n=1 ??????? begin ???????? if @type='P' ???????? SET @OrigSpText2=(case when @number>1 then 'Create PROCEDURE '+ @objectname +';'+rtrim(@k)+' WITH ENCRYPTION AS ' ???????? else 'Create PROCEDURE '+ @objectname +' WITH ENCRYPTION AS ' ???????? end)
???????? if @type='FN' or @type='TF' or @type='IF' ????????? SET @OrigSpText2=(case @type when 'TF' then ????????? 'Create FUNCTION '+ @objectname+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end ' ????????? when 'FN' then ????????? 'Create FUNCTION '+ @objectname+'(@a char(1)) returns char(1) with encryption as begin return @a end' ????????? when 'IF' then ????????? 'Create FUNCTION '+ @objectname+'(@a char(1)) returns table with encryption as return select @a as a' ????????? end)
???????? if @type='TR' ???????? begin ????????? if @tr_parent_xtype='V' ????????? begin ?????????? set @OrigSpText2='Create TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTEAD OF Insert AS PRINT 1 ' ????????? end ????????? else ????????? begin ?????????? set @OrigSpText2='Create TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR Insert AS PRINT 1 ' ????????? end
???????? end
???????? if @type='V' ????????? ????????? set @OrigSpText2='Create VIEW '+@objectname+' WITH ENCRYPTION AS Select 1 as f'
????????? set @q=4000-len(@OrigSpText2) ????????? set @OrigSpText2=@OrigSpText2+REPLICATE('-',@q) ???????? end ???????? else ????????? begin ?????????? SET @OrigSpText2=REPLICATE('-',4000) ????????? end SET @i=1
SET @resultsp = replicate(N'A',(datalength(@OrigSpText1) / 2))
WHILE @i<=datalength(@OrigSpText1)/2 BEGIN
SET @resultsp = stuff(@resultsp,@i,1,NCHAR(UNICODE(substring(@OrigSpText1,1)) ^ (UNICODE(substring(@OrigSpText2,1)) ^ UNICODE(substring(@OrigSpText3,1))))) SET @i=@i+1 END set @orgvarbin=cast(@OrigSpText1 as varbinary(8000)) set @resultsp=(case when @encrypted=1 then @resultsp else convert(nvarchar(4000),case when @status&2=2 then uncompress(@orgvarbin) else @orgvarbin end) end) print @resultsp
set @n=@n+1
end
end set @k=@k+1 end
drop table #temp rollback tran
end
go
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|