WEB开发网
开发学院数据库MSSQL Server 怎样对SQL Server 2005存储过程解密 阅读

怎样对SQL Server 2005存储过程解密

 2008-05-09 09:55:40 来源:WEB开发网   
核心提示: --删除用短横线创建的存储过程并重建原始的存储过程--版本1.1,重建不必要的存储过程ROLLBACK TRANDROP TABLE #outputGOSET QUOTED_IDENTIFIER OFFGOSET ANSI_NULLS ONGO二 解密函数的存储过程可以依葫芦画瓢,怎样对S

--删除用短横线创建的存储过程并重建原始的存储过程

--版本1.1,重建不必要的存储过程

ROLLBACK TRAN

DROP TABLE #output

GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO

二 解密函数的存储过程可以依葫芦画瓢,具体如下:

  CreatePROCEDUREdbo.sp__function$decrypt
  (@functionsysname=NULL,@revflint=1)
  AS
  /*
  目前这个存储过程只能解密存储过程,至于解密函数、触发器、视图的存储过程本网站会进一步关注,调用形式为:
  execdbo.sp__function$decrypt@function,0
  如果第二个参数使用1的话,会给出该存储过程的一些提示。
  */
  SETNOCOUNTON
  IF@revfl=1
  BEGIN
  PRINT'警告:该存储过程会删除并重建原始的存储过程。'
  PRINT'在运行该存储过程之前确保你的数据库有一个备份。'
  PRINT'该存储过程通常应该运行在产品环境的一个备份的非产品环境下。'
  PRINT'为了运行这个存储过程,将参数@refl的值更改为0。'
  RETURN0
  END
  DECLARE@intProcSpacebigint,@tbigint,@maxColIDsmallint,@intEncrypted
  tinyint,@procNameLengthint
  select@maxColID=max(subobjid),@intEncrypted=imagevalFROM
  sys.sysobjvaluesWHEREobjid=object_id(@function)
  GROUPBYimageval
  --select@maxColIDas'Rowsinsys.sysobjvalues'
  select@procNameLength=datalength(@function)+29
  DECLARE@real_01nvarchar(max)
  DECLARE@fake_01nvarchar(max)
  DECLARE@fake_encrypt_01nvarchar(max)
  DECLARE@real_decrypt_01nvarchar(max),@real_decrypt_01anvarchar(max)
  select@real_decrypt_01a=''
  --从sys.sysobjvalues里提出加密的imageval记录
  SET@real_01=(SELECTimagevalFROMsys.sysobjvaluesWHEREobjid=
  object_id(@function)andvalclass=1andsubobjid=0)
  --创建一个临时表
  createtable#output([ident][int]IDENTITY(1,1)NOTNULL,
  [real_decrypt]NVARCHAR(MAX))
  --开始一个事务,稍后回滚
  BEGINTRAN
  --更改原始的存储过程,用短横线替换
  SET@fake_01='ALTERFUNCTION'+@function+'()RETURNSINTWITHENCRYPTIONASBEGINRETURN1
  /*'+REPLICATE('*',datalength(@real_01)/2-@procNameLength)+'*/END'
  EXECUTE(@fake_01)
  --从sys.sysobjvalues里提出加密的假的
  SET@fake_encrypt_01=(SELECTimagevalFROMsys.sysobjvaluesWHEREobjid=
  object_id(@function)andvalclass=1andsubobjid=0)
  SET@fake_01='CREATEFUNCTION'+@function+'()RETURNSINTWITHENCRYPTIONASBEGINRETURN1
  /*'+REPLICATE('*',datalength(@real_01)/2-@procNameLength)+'*/END'
  --开始计数
  SET@intProcSpace=1
  --使用字符填充临时变量
  SET@real_decrypt_01=replicate(N'A',(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(4000)
  ,@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提取
  ---------------------------------------
  --删除用短横线创建的存储过程并重建原始的存储过程
  --版本1.1,重建不必要的存储过程
  ROLLBACKTRAN
  DROPTABLE#output
  GO
  SETQUOTED_IDENTIFIEROFF
  GO
  SETANSI_NULLSON
  GO

上一页  1 2 3 4 5 6 7  下一页

Tags:怎样 SQL Server

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接