tempad
ReadyGo!技术成就梦想 >>数据库技术 >> 关于存储过程解密的!

关于存储过程解密的!

ReadyGo!技术成就梦想 网络搜索 efish 2008-1-13 8:41:27

关于存储过程解密的!

楼主jyhczg()2003-12-30 20:45:53 在 MS-SQL Server / 基础类 提问

关于存储过程解密的!  
  1:不知那位大虾有SQLexplorer2000这个解密存储过程及触发器的注册码,  
  我由于没有注册码只可以看到,没有办法导出为*.sql!  
  2:在这里找到j9988老师的一个不破坏原加密存储过程的前提下,解密存储过程的数据,便要解密的过程实在太多,不知有没有那位大虾可以改成,一次执行,将当前数据库所有加密的存储过程全部用解密的取代,谢谢大家!  
  问题点数:50、回复次数:7Top

1 楼zjcxc(邹建)回复于 2003-12-30 20:52:18 得分 0

1.专门工具SQLExplorer  
  http://61.185.208.28/shxhark/SQLExplorer.exeTop

2 楼zjcxc(邹建)回复于 2003-12-30 21:03:14 得分 0

/*--解密存储过程  
   
  在不破坏原加密存储过程的前提下,解密存储过程!(补充j9988)  
   
  --*/  
   
  /*--调用示例:  
   
  --解密指定存储过程  
  exec   sp_decrypt   "AppSP_test"  
   
  --*/  
  if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N".")   and   OBJECTPROPERTY(id,   N"IsProcedure")   =   1)  
  drop   procedure   .  
  GO  
   
  CREATE   PROCEDURE   SP_DECRYPT  
  @objectName   sysname --要解密的存储过程  
  AS  
  begin   transaction  
  declare   @objectname1   varchar(100)  
  declare   @sql1   nvarchar(4000),@sql2   nvarchar(4000),@sql3   nvarchar(4000),@sql4   nvarchar(4000),@sql5   nvarchar(4000),@sql6   nvarchar(4000),@sql7   nvarchar(4000),@sql8   nvarchar(4000),@sql9   nvarchar(4000),@sql10   nvarchar(4000)      
  DECLARE     @OrigSpText1   nvarchar(4000),     @OrigSpText2   nvarchar(4000)   ,   @OrigSpText3   nvarchar(4000),   @resultsp   nvarchar(4000)  
  declare     @i   int   ,   @t   bigint  
  declare   @m   int,@n   int,@q   int  
  set   @m=(SELECT   max(colid)   FROM   syscomments     WHERE   id   =   object_id(@objectName))  
  set   @n=1  
  --get   encrypted   data  
  create   table     #temp(colid   int,ctext   varbinary(8000))  
  insert   #temp   SELECT   colid,ctext   FROM   syscomments     WHERE   id   =   object_id(@objectName)  
  set   @sql1="ALTER   PROCEDURE   "+   @objectName   +"   WITH   ENCRYPTION   AS   "  
  --set   @sql1="ALTER   PROCEDURE   "+   @objectName   +"   WITH   ENCRYPTION   AS   "  
  set   @q=len(@sql1)  
  set   @sql1=@sql1+REPLICATE("-",4000-@q)  
  select   @sql2=REPLICATE("-",4000),@sql3=REPLICATE("-",4000),@sql4=REPLICATE("-",4000),@sql5=REPLICATE("-",4000),@sql6=REPLICATE("-",4000),@sql7=REPLICATE("-",4000),@sql8=REPLICATE("-",4000),@sql9=REPLICATE("-",4000),@sql10=REPLICATE("-",4000)  
   
  exec(@sql1+@sql2+@sql3+@sql4+@sql5+@sql6+@sql7+@sql8+@sql9+@sql10)  
  while   @n<=@m  
  begin  
  SET   @OrigSpText1=(SELECT   ctext   FROM   #temp     WHERE   colid=@n)  
  set   @objectname1=@objectname+"_t"  
  SET   @OrigSpText3=(SELECT   ctext   FROM   syscomments   WHERE   id=object_id(@objectName)   and   colid=@n)  
  if   @n=1  
  begin  
  SET   @OrigSpText2="CREATE   PROCEDURE   "+   @objectName   +"   WITH   ENCRYPTION   AS   "--  
  set   @q=4000-len(@OrigSpText2)  
  set   @OrigSpText2=@OrigSpText2+REPLICATE("-",@q)  
  end  
  else  
  begin  
  SET   @OrigSpText2=REPLICATE("-",   4000)  
  end  
  --start   counter  
  SET   @i=1  
  --fill   temporary   variable  
  SET   @resultsp   =   replicate(N"A",   (datalength(@OrigSpText1)   /   2))  
   
  --loop  
  WHILE   @i<=datalength(@OrigSpText1)/2  
  BEGIN  
  --reverse   encryption   (XOR   original+bogus+bogus   encrypted)  
  SET   @resultsp   =   stuff(@resultsp,   @i,   1,   NCHAR(UNICODE(substring(@OrigSpText1,   @i,   1))   ^  
                                                                  (UNICODE(substring(@OrigSpText2,   @i,   1))   ^  
                                                                  UNICODE(substring(@OrigSpText3,   @i,   1)))))  
          SET   @i=@i+1  
  END  
  --drop   original   SP  
  --EXECUTE   ("drop   PROCEDURE   "+   @objectName)  
  --remove   encryption  
  --preserve   case  
  SET   @resultsp=REPLACE((@resultsp),"WITH   ENCRYPTION",   "")  
  SET   @resultsp=REPLACE((@resultsp),"With   Encryption",   "")  
  SET   @resultsp=REPLACE((@resultsp),"with   encryption",   "")  
  IF   CHARINDEX("WITH   ENCRYPTION",UPPER(@resultsp)   )>0    
      SET   @resultsp=REPLACE(UPPER(@resultsp),"WITH   ENCRYPTION",   "")  
  --replace   Stored   procedure   without   enryption  
  print   @resultsp  
  --execute(   @resultsp)  
  set   @n=@n+1  
  end  
         
  drop   table   #temp  
  rollback   transaction  
  go  
   
  Top

3 楼zjcxc(邹建)回复于 2003-12-30 21:03:58 得分 0

--利用J9988的存储过程,对所有的存储过程解密(注意,没加密的会解密成乱码)  
   
  declare   tb   cursor   for  
  select   name   from   sysobjects   where   xtype="P"   and   status>0  
   
  declare   @name   sysname  
  open   tb  
  fetch   next   from   tb   into   @name  
  while   @@fetch_status=0  
  begin  
  exec   sp_decrypt   @name  
  fetch   next   from   tb   into   @name  
  end  
  close   tb  
  deallocate   tb  
   
  Top

4 楼Jianli2004(健力)(星是UP来的)回复于 2003-12-30 21:33:57 得分 0

http://www.csdn.net/develop/Read_Article.asp?Id=22824Top

5 楼sunrisehy2003(黎明)回复于 2003-12-31 08:47:55 得分 0

學習Top

6 楼zjcxc(邹建)回复于 2003-12-31 08:48:56 得分 50

--下面这个才是最终版.  
   
  --破解函数,过程,触发器,视图.仅限于SQLSERVER2000  
   
  create     PROCEDURE   sp_decrypt(@objectName   varchar(50))  
  AS  
  begin  
  begin   tran  
  declare   @objectname1   varchar(100),@orgvarbin   varbinary(8000)  
  declare   @sql1   nvarchar(4000),@sql2   nvarchar(4000),@sql3   nvarchar(4000),@sql4   nvarchar(4000),@sql5   nvarchar(4000),@sql6   nvarchar(4000),@sql7   nvarchar(4000),@sql8   nvarchar(4000),@sql9   nvarchar(4000),@sql10   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"  
  set   @sql1="ALTER   TRIGGER   "+@objectname+"   ON   "+OBJECT_NAME(@parentid)+"   WITH   ENCRYPTION   FOR   INSERT   AS   PRINT   1   "  
   
  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   "  
   
  set   @q=len(@sql1)  
  set   @sql1=@sql1+REPLICATE("-",4000-@q)  
  select   @sql2=REPLICATE("-",4000),@sql3=REPLICATE("-",4000),@sql4=REPLICATE("-",4000),@sql5=REPLICATE("-",4000),@sql6=REPLICATE("-",4000),@sql7=REPLICATE("-",4000),@sql8=REPLICATE("-",4000),@sql9=REPLICATE("-",4000),@sql10=REPLICATE("-",4000)  
  exec(@sql1+@sql2+@sql3+@sql4+@sql5+@sql6+@sql7+@sql8+@sql9+@sql10)  
  end  
  set   @k=@k+1  
  end  
   
  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"  
  set   @OrigSpText2="CREATE   TRIGGER   "+@objectname+"   ON   "+OBJECT_NAME(@parentid)+"   WITH   ENCRYPTION   FOR   INSERT   AS   PRINT   1   "  
   
  if   @type="V"  
  set   @OrigSpText2="CREATE   VIEW   "+@objectname+"   WITH   ENCRYPTION   AS   SELECT   1   "  
   
  set   @q=4000-len(@OrigSpText2)  
  set   @OrigSpText2=@OrigSpText2+REPLICATE("-",@q)  
  end  
  else  
  begin  
  SET   @OrigSpText2=REPLICATE("-",   4000)  
  end  
  --start   counter  
  SET   @i=1  
  --fill   temporary   variable  
  SET   @resultsp   =   replicate(N"A",   (datalength(@OrigSpText1)   /   2))  
   
  --loop  
  WHILE   @i<=datalength(@OrigSpText1)/2  
  BEGIN  
   
  SET   @resultsp   =   stuff(@resultsp,   @i,   1,   NCHAR(UNICODE(substring(@OrigSpText1,   @i,   1))   ^  
                                                                  (UNICODE(substring(@OrigSpText2,   @i,   1))   ^  
                                                                  UNICODE(substring(@OrigSpText3,   @i,   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  
  --execute(   @resultsp)  
  set   @n=@n+1  
   
  end  
   
  end  
  set   @k=@k+1  
  end  
   
  drop   table   #temp  
  rollback   tran  
  end  
   
  Top

7 楼st_2000(破猫)回复于 2004-02-13 11:01:03 得分 0

呵榀  
  Top

责任编辑: efish 参与评论 查找更多:
相关文章
函数返回值是指针的问题,牵涉到生存期问题! 函数返回值是指针的问题,牵涉到生存期问题!
关闭浏览器的问题?急!!!! 关闭浏览器的问题?急!!!!
XviD解码时,遇到“整型被零除”的问题,求救

XviD解码时,遇到“整型被零除”的问题,求救

楼主cxf1976()2003-12-30 21:26:49 在 专题开发/技术/项目 / 多媒体/流媒体开发 提问

我现在使…

请问这求最大值的函数有什么错? 请问这求最大值的函数有什么错?
richTextBox选中的字体更改后出现的问题 richTextBox选中的字体更改后出现的问题
关于可连续重用程序包和非连续重用程序包的区别

关于可连续重用程序包和非连续重用程序包的区别

楼主zhanggok()2003-12-30 21:24:03 在 Oracle / 开发 提问

1可连续重用包     …

2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn

分类导航
ReadyGo!技术成就梦想