如何查看加密视图或存储过程

goo*_*yui 27 sql-server-2008 sql-server sql-server-2012

我正在开发第三方数据库。

当我尝试通过右键单击查看视图的定义时,CREATE TO然后单击 ,NEW QUERY EDIT WINDOW出现错误:

此对象可能不存在此属性,或者可能由于访问权限不足而无法检索。文本已加密。

Seb*_*ine 19

在这里有关于这个问题的相当详细的描述。

简而言之,对象并没有真正加密,而是被混淆了。因此我们可以找回原来的回来。该方法有点复杂,但它由以下步骤组成:

  1. 使用专用管理连接连接到实例
  2. 像这样选择混淆代码:

    SELECT @secret = imageval
    FROM   sys.sysobjvalues
    WHERE  objid = OBJECT_ID(@object_name);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 用另一个具有相同名称、相同 object_id 和相同字节长度的对象替换该对象(例如使用ALTER PROCEDURE

  4. 获取新混淆的代码,方法同上
  5. 将三个值一起异或(混淆原始值、替换和混淆替换)

这会给你原始代码。但是,正如 Kin 所提到的,这样做可能会产生支持甚至法律影响,因此请务必先咨询您的律师。


Pau*_*ite 15

模块文本使用RC4流密码进行加密。

RC4 初始化密钥是根据以下SHA-1哈希计算得出的:

  • 数据库系列GUID(从sys.database_recovery_status
    从转换的唯一标识符,以二进制(16)
  • 模块的对象 ID(来自目录视图)
    整数转换为小端二进制 (4)
  • 模块的对象子 ID
    smallint转换为 little-endian binary(2)

模块的对象子 ID 是:

  • 1 表示未编号的存储过程;或者
  • (不推荐使用的)编号存储过程的过程编号;或者
  • 0 否则。

然后,具有适当特权的用户可以通过以下方式解密模块:

  1. sys.sysobjvalues获取加密的二进制文件(使用 DAC)
  2. 如上所述计算 RC4 密钥
  3. 在二进制上运行众所周知的标准 RC4 算法
  4. 将结果从二进制转换为nvarchar(max)

我的文章中有更多细节和完整的代码实现:

的内部结构 WITH ENCRYPTION


mic*_*des 14

另一个可以用来即时解密加密对象的第三方工具是 Red Gate 的 SQL Prompt:http : //www.red-gate.com/products/sql-development/sql-prompt/features

将鼠标悬停在存储过程上将允许您查看解密的创建脚本。

免责声明:这个工具是商业的(有 14 天的免费试用期),我为 Red Gate 工作。


Kin*_*hah 11

您可以使用专用管理员连接 (DAC)连接到 SQL Server,然后查看存储过程的 sql 文本。使用以下方法连接到 DAC:

admin:Your_Servername
Run Code Online (Sandbox Code Playgroud)

您可以在所需要的完整步骤,这个答案对堆栈溢出马丁·史密斯

另一种替代方法是使用一些第三方脚本,如解密 SQL Server 2005、2008 和 R2 中的加密存储过程、视图、函数中所述

附带说明- 如果它是第三方数据库,并且您是在产品上进行的,供应商会支持它吗?可能有充分的理由加密 SP 或视图。最好先备份一下,然后再摆弄它。


小智 9

如果要预览原始 DDL 脚本或解密加密对象,可以查看ApexSQL Decrypt

它是一个免费的独立工具,可选择将其集成到 SSMS 中,预览原始 DDL 脚本。此外,您可以一次解密位于多台服务器上的对象。一种可以帮助您的工具是dbForge SQL Decryptor