goofyui Asked: 2014-03-05 12:08:19 +0800 CST2014-03-05 12:08:19 +0800 CST 2014-03-05 12:08:19 +0800 CST 如何查看加密视图或存储过程 772 我正在研究第三方数据库。 当我尝试通过右键单击查看视图的定义,CREATE TO然后单击 ,NEW QUERY EDIT WINDOW我收到一个错误: 此对象可能不存在此属性,或者由于访问权限不足而无法检索。文本已加密。 sql-server sql-server-2008 6 个回答 Voted Sebastian Meine 2014-03-05T16:04:29+08:002014-03-05T16:04:29+08:00 我在这里有一个关于这个问题的相当详细的描述。 简而言之,对象并没有真正加密,而是被混淆了。因此我们可以找回原来的回来。该方法有点复杂,但它由以下步骤组成: 使用专用管理员连接连接到实例 选择这样的混淆代码: SELECT @secret = imageval FROM sys.sysobjvalues WHERE objid = OBJECT_ID(@object_name); 将对象替换为另一个具有相同名称、相同 object_id 和相同长度(以字节为单位)的对象(例如使用ALTER PROCEDURE) 以与上面相同的方式获取新混淆的代码 将三个值异或在一起(混淆原始、替换和混淆替换) 这将为您提供原始代码。但是,正如 Kin 所提到的,这样做可能会产生支持甚至法律影响,因此请务必先咨询您的律师。 Paul White 2016-05-22T22:19:30+08:002016-05-22T22:19:30+08:00 模块文本使用RC4流密码进行加密。 RC4 初始化密钥是根据以下的SHA-1哈希计算的: 数据库系列 GUID(来自sys.database_recovery_status )从 uniqueidentifier 转换为binary (16) 模块的对象 ID(来自目录视图) 从整数转换为小端二进制 (4) 模块的对象子 ID 从smallint转换为 little-endian binary(2)。 模块的对象子 ID 为: 1 用于未编号的存储过程;或者 (已弃用)编号存储过程的过程号;或者 否则为 0。 然后,具有适当特权的用户可以通过以下方式解密模块: 从sys.sysobjvalues获取加密的二进制文件(使用 DAC) 如上所述计算 RC4 密钥 在二进制文件上运行众所周知的标准 RC4 算法 将结果从二进制转换为nvarchar(max) 我的文章中有更多细节和完整的代码实现: 的内部结构WITH ENCRYPTION Best Answer michristofides 2014-03-07T02:51:55+08:002014-03-07T02:51:55+08:00 您可以用来即时解密加密对象的另一个第三方工具是 Red Gate 的 SQL 提示: http ://www.red-gate.com/products/sql-development/sql-prompt/features 将鼠标悬停在存储过程上将允许您查看解密的创建脚本。 免责声明:此工具是商业工具(提供 14 天免费试用),我为 Red Gate 工作。 Kin Shah 2014-03-05T12:16:13+08:002014-03-05T12:16:13+08:00 您可以使用专用管理员连接 (DAC)连接到 SQL Server,然后查看存储过程的 sql 文本。使用以下方式连接到 DAC: admin:Your_Servername 您可以在Martin Smith的 Stack Overflow上找到此答案所需的完整步骤。 另一种选择是使用一些第三方脚本,如解密 SQL Server 2005、2008 和 R2 中的加密存储过程、视图、函数中所述 作为旁注- 如果它是第三方数据库并且如果您在 prod 上进行操作,供应商会支持它吗?加密 SP 或视图可能有充分的理由。最好先备份,然后再摆弄它。 McRobert 2017-10-16T22:46:45+08:002017-10-16T22:46:45+08:00 如果要预览原始 DDL 脚本或解密加密对象,可以查看ApexSQL Decrypt 它是一个免费的独立工具,可以选择将其集成到 SSMS 中,预览原始 DDL 脚本。此外,您可以一次解密位于多个服务器上的对象。另一种可以帮助您的工具是dbForge SQL Decryptor Aaron Hurst 2019-04-26T09:53:53+08:002019-04-26T09:53:53+08:00 我经常用于一次解密多个存储过程的方法...... 使用 RedGate 的 SQL 比较并将您的数据库与空数据库(或您知道的任何数据库都没有存储过程)进行比较。创建部署脚本并复制到 SSMS。查找并用空白替换WITH ENCRYPTION 。然后将 CREATE PROCEDURE 更改为 ALTER PROCEDURE。对原始数据库运行 RedGate 脚本,您已删除所有存储过程加密。 我有一个包含 400 多个存储过程的数据库,虽然 SQL Prompt 很方便,但我不值得花时间右键单击、复制、粘贴 400 多个存储过程。使用 RedGate SQL Compare,我能够在大约 10 分钟内从我的 400 多个存储过程中删除加密。
我在这里有一个关于这个问题的相当详细的描述。
简而言之,对象并没有真正加密,而是被混淆了。因此我们可以找回原来的回来。该方法有点复杂,但它由以下步骤组成:
选择这样的混淆代码:
将对象替换为另一个具有相同名称、相同 object_id 和相同长度(以字节为单位)的对象(例如使用
ALTER PROCEDURE
)这将为您提供原始代码。但是,正如 Kin 所提到的,这样做可能会产生支持甚至法律影响,因此请务必先咨询您的律师。
模块文本使用RC4流密码进行加密。
RC4 初始化密钥是根据以下的SHA-1哈希计算的:
uniqueidentifier 转换为binary (16)
从整数转换为小端二进制 (4)
从smallint转换为 little-endian binary(2)。
模块的对象子 ID 为:
然后,具有适当特权的用户可以通过以下方式解密模块:
我的文章中有更多细节和完整的代码实现:
的内部结构
WITH ENCRYPTION
您可以用来即时解密加密对象的另一个第三方工具是 Red Gate 的 SQL 提示: http ://www.red-gate.com/products/sql-development/sql-prompt/features
将鼠标悬停在存储过程上将允许您查看解密的创建脚本。
免责声明:此工具是商业工具(提供 14 天免费试用),我为 Red Gate 工作。
您可以使用专用管理员连接 (DAC)连接到 SQL Server,然后查看存储过程的 sql 文本。使用以下方式连接到 DAC:
您可以在Martin Smith的 Stack Overflow上找到此答案所需的完整步骤。
另一种选择是使用一些第三方脚本,如解密 SQL Server 2005、2008 和 R2 中的加密存储过程、视图、函数中所述
作为旁注- 如果它是第三方数据库并且如果您在 prod 上进行操作,供应商会支持它吗?加密 SP 或视图可能有充分的理由。最好先备份,然后再摆弄它。
如果要预览原始 DDL 脚本或解密加密对象,可以查看ApexSQL Decrypt
它是一个免费的独立工具,可以选择将其集成到 SSMS 中,预览原始 DDL 脚本。此外,您可以一次解密位于多个服务器上的对象。另一种可以帮助您的工具是dbForge SQL Decryptor
我经常用于一次解密多个存储过程的方法......
使用 RedGate 的 SQL 比较并将您的数据库与空数据库(或您知道的任何数据库都没有存储过程)进行比较。创建部署脚本并复制到 SSMS。查找并用空白替换WITH ENCRYPTION 。然后将 CREATE PROCEDURE 更改为 ALTER PROCEDURE。对原始数据库运行 RedGate 脚本,您已删除所有存储过程加密。
我有一个包含 400 多个存储过程的数据库,虽然 SQL Prompt 很方便,但我不值得花时间右键单击、复制、粘贴 400 多个存储过程。使用 RedGate SQL Compare,我能够在大约 10 分钟内从我的 400 多个存储过程中删除加密。