none
解除存储过程加密,SQLSERVER2008 RRS feed

  • 问题

  • CREATE PROCEDURE [DBO].[spTableRowToCol](@TableName NVARCHAR(50),@ToColName NVARCHAR(50),  
                                             @MaxCol    NVARCHAR(50),@GroupCol  NVARCHAR(50),@Where NVARCHAR(500))     
     WITH ENCRYPTION
     AS
        DECLARE @tb TABLE(ColName NVARCHAR(50));
        DECLARE @sqlColName  NVARCHAR(2000);
        DECLARE @sql NVARCHAR(MAX);
       
    BEGIN    
        
        EXEC(@sql)
    END

    2011年8月2日 2:58

全部回复

  • 可以參考Rico的文章。

    http://www.dotblogs.com.tw/ricochen/archive/2011/07/13/31574.aspx


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年8月2日 3:28
  • There are freewares to decrypt sp, check this one: http://optillect.com/products/sqldecryptor/overview.html.
    2011年8月2日 3:29
  • There are two ways of doing it, the 'ALTER PROCEDURE to derive the key' kind of way, and the 'generate the key from the relevant parts of the database' kind of way. I would advise trying to use the latter, as that means you don't actually make any changes to the database in order to perform the decryption.

    Another thing, on SQL 2005+ you have to be connected to the DAC in order to be able to get to the encrypted text of the SQL module.

    2011年8月2日 5:26
  • 感谢各位高手,有没有用SQL文解密的!
    2011年8月3日 2:21
  • Not as I know of.
    • 已建议为答案 jzhu_2000 2011年8月8日 16:22
    • 取消建议作为答案 jzhu_2000 2011年8月8日 16:22
    2011年8月3日 2:44
  • 找到一个破解SQL2005的,我试过在SQl2008上也可以用

    /********************************************************************/ 

    /* 英文名称:sp__windbi$decrypt */ 

    /* 中文名称:解密SQLServer2005存储过程 */ 

    /* 功 能:解密SQLServer2005存储过程 */ 

    /* 维护历史:一个心眼儿 20071010 */ 

    /* 相关说明: 
    要用 管理员专用连接 DAC
    一、什么是DAC 
      SQL Server 2005 为管理员提供了一种特殊的诊断连接,以供在无法与服务器建立标准连接时使用。即使在 SQL Server 不响应标准连接请求时,管理员也可以使用这种连接访问 SQL Server,以便执行诊断查询并解决问题。命令行界面 (sqlcmd) 通过使用特殊的管理员开关 (-A),提供并支持这种专用管理员连接 (DAC)。 

    二、如何使用DAC登录到服务器 
    1 本机DAC登录 
    命令行方式下执行 sqlcmd -A -S sql服务器名 
    2 远程DAC登录 
    1)打开远程DAC选项 
      EXEC sp_configure 'remote admin connections', 1; 
      RECONFIGURE; 
    2)登录到远程服务器 
    sqlcmd -A -S 192.168.0.1 -U sa -P 123456 
    3 登录后, 可以通过查询动态管理视图来诊断问题 

    三、SQL Server Management Studio 与 DAC 配合使用 

    1、在 SQL Server Management Studio 中,不打开其他 DAC,单击工具栏上的“数据库引擎查询”。 

    2、在“连接到数据库引擎”对话框的“服务器名称”框中,键入 ADMIN:,并在其后继续键入服务器实例的名称。例如,若要连接到名为 ACCT\PAYABLE 的服务器实例,请键入 ADMIN:ACCT\PAYABLE。 

    3、完成“身份验证”部分(提供 sysadmin 组成员的凭据),然后单击“连接”。将建立连接。   

    如果已在使用 DAC,则连接将失败,并出现错误指示无法连接。 */ 

    /* 

      目前这个存储过程只能解密存储过程, 

      至于解密函数、触发器、视图的存储过程本网站会进一步关注,调用形式为: 

      exec dbo.sp__windbi$decrypt @procedure,0 

      如果第二个参数使用的话,会给出该存储过程的一些提示。 

      --版本.0 修正存储过程过长引起的问题 


      警告:该存储过程会删除并重建原始的存储过程。' 

      在运行该存储过程之前确保你的数据库有一个备份。' 

      该存储过程通常应该运行在产品环境的一个备份的非产品环境下。 

    */ 


    /**********************************************************************/ 

    print 'creating stored procedure sp__windbi$decrypt......' 
    go 
    if exists(select name from sysobjects where name = 'sp__windbi$decrypt' and type = 'P') 
      drop procedure sp__windbi$decrypt 
    go 

    create PROCEDURE [dbo].[sp__windbi$decrypt] 
    (@procedure  varchar(100)) 
    AS 
    SET NOCOUNT ON 
    DECLARE @intProcSpace bigint, @t bigint, @maxColID smallint,@procNameLength int 
    select @maxColID = max(subobjid) FROM 
    sys.sysobjvalues WHERE objid = object_id(@procedure) 
    --select @maxColID as 'Rows in sys.sysobjvalues' 
    select @procNameLength = datalength(@procedure) + 29 
    DECLARE @real_01 nvarchar(max) 
    DECLARE @fake_01 nvarchar(max) 
    DECLARE @fake_encrypt_01 nvarchar(max) 
    DECLARE @real_decrypt_01 nvarchar(max),@real_decrypt_01a nvarchar(max) 
    declare @objtype varchar(2),@parentname nvarchar(max) 
    select @real_decrypt_01a = '' 
    --提取对象的类型如是存储过程还是函数,如果是触发器,还要得到其父对象的名称 
    select @objtype=type,@parentname=object_name(parent_object_id) 
    from sys.objects where [object_id]=object_id(@procedure) 
    -- 从sys.sysobjvalues里提出加密的imageval记录 
    SET @real_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid = 
    object_id(@procedure) and valclass = 1 order by subobjid) 
    --创建一个临时表 
    create table #output ( [ident] [int] IDENTITY (1, 1) NOT NULL , 
    [real_decrypt] NVARCHAR(MAX) ) 
    --开始一个事务,稍后回滚 
    BEGIN TRAN 
    --更改原始的存储过程,用短横线替换 
    if @objtype='P' 
      SET @fake_01='ALTER PROCEDURE '+ @procedure +' WITH ENCRYPTION AS 
      '+REPLICATE(cast('-'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength) 
    else if @objtype='FN' 
      SET @fake_01='ALTER FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1 
      /*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/ END' 
    else if @objtype='V' 
      SET @fake_01='ALTER 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='ALTER trigger '+ @procedure +' ON '+@parentname+'WITHENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10) 
      /*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/' 
    EXECUTE (@fake_01) 
    --从sys.sysobjvalues里提出加密的假的 
    SET @fake_encrypt_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid = 
    object_id(@procedure) and valclass = 1 order by subobjid ) 
    if @objtype='P' 
      SET @fake_01='Create PROCEDURE '+ @procedure +' WITH ENCRYPTION AS 
      '+REPLICATE(cast('-'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength) 
    else if @objtype='FN' 
      SET @fake_01='CREATE FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1 
      /*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/ END' 
    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+'WITHENCRYPTION 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目前的内容并继续 
    While (isnull(LEN(@Line),0) + @BlankSpaceAdded + 
    @CurrentPos-@BasePos + @LFCR) > @DefinedLength 
    BEGIN 
    SELECT @AddOnLen = @DefinedLength-(isnull(LEN(@Line),0) + 
    @BlankSpaceAdded) 
    INSERT #CommentText VALUES 
    ( @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 #CommentText VALUES( @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 #CommentText VALUES 
    ( @LineId, 
    isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText, 
    @BasePos, @AddOnLen), N'')) 
    SELECT @Line = NULL, @LineId = @LineId + 1, 
    @BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 

    END 
    SELECT @Line = isnull(@Line, N'') + 
    isnull(SUBSTRING(@SyscomText, @BasePos, @TextLength-@BasePos+1 ), N'') 
    if LEN(@Line) < @DefinedLength and charindex(' ', 
    @SyscomText, @TextLength+1 ) > 0 
    BEGIN 
    SELECT @Line = @Line + ' ', @BlankSpaceAdded = 1 
    END 
    END 
    END 
    END 
    FETCH NEXT FROM ms_crs_syscom into @SyscomText 
    END 
    IF @Line is NOT NULL 
    INSERT #CommentText VALUES( @LineId, @Line ) 
    select Text from #CommentText order by LineId 
    CLOSE ms_crs_syscom 
    DEALLOCATE ms_crs_syscom 
    DROP TABLE #CommentText 
    -- ------------------------------------- 
    --结束从sp_helptext提取 
    -- ------------------------------------- 
    --删除用短横线创建的存储过程并重建原始的存储过程 
    ROLLBACK TRAN 
    DROP TABLE #output

     

    --------

     

    2008上也能用的

    2011年8月8日 16:23