Расшифровка объектов MS SQL Server (предложение WIHT ENCRYPTION)

by Admin 26. марта 2009 17:10

Как известно, в SQL Server можно скрыть исходный текст таких объектов, как Процедуры, Функции, Представления и Триггеры. Но так ли надёжна эта защита?

Ответ: конечно же, нет(!), расшифровать эти объекты проще простого.

Для демонстрации создадим тестовую процедуру:

CREATE PROCEDURE TestProc 
WITH ENCRYPTION 
AS 
BEGIN SELECT @@VERSION 
END

Просмотреть её код обычным образом не выдет, так как текст скрыт и она помечена, как Encrypted.

Для получения исходного кода объектов в SQL Server 2000, необходимо создать процедуру procDecryptObject2000.

Здесь всё вообще не вызывает вопросов, так как зашифрованный текст объектов храниться в системной таблице syscomments в поле ctext.

Запускаем процедуру

EXECUTE dbo.procDecryptObject2000 'TestProc'

И вуаля… получаем текст нашей процедуры в открытом виде.

 

Как же дела обстоят в SQL Server 2005/2008? Скажем так: ни чуть не лучше! =)))

Всё отличие в том, что даже зашифрованный код не виден непосредственно ни в одном представлении каталога SQL Server. Пользователи, не имеющие доступа к системным таблицам или файлам баз данных, не смогут получить этот текст. Однако этот текст будет доступен привилегированным пользователям, которые смогут обращаться к системным таблицам либо через порт выделенного административного соединения, либо будут иметь непосредственный доступ к файлам баз данных.

Создадим процедуру procDecryptObject2005, в которой два входных параметра: схема объекта и само наименование объекта. Если запустить её в обычном режиме:

EXECUTE dbo.procDecryptObject2005 'dbo', 'TestProc'

То мы получим ошибку:

Msg 208, Level 16, State 1, Procedure procDecryptObject2005, Line 51 Invalid object name 'sys.sysobjvalues'.

 

Как было сказано выше, для расшифровки необходимо использовать выделенное административное соединение (DAC). Запускаем из командной строки (cmd):

  • SQLCMD –A

 

А дальше вызываем нашу процедуру и получаем текст в открытом виде. ;)

Tags: , , ,

SQL Server

Комментарии (11) -

Andrei
Andrei Russia
20.09.2012 16:37:02 #

Что-то под SQL 2000 не пашет - расшифровывает только первую строчку, остальное в квадратиках.
И ошибка в 3 строке хоть и мелочная, надо "Drop Procedure procDecryptObject2000".

Reply

Дмитрий
Дмитрий Russia
28.03.2013 12:56:42 #

База SQL Server 2000
Пытаюсь этим способом расшифровать функцию - получаю ошибку "Cannot perform alter on dbo.function1 because it is an incompatible object type"

Расшифровка процедур работает нормально, функций - нет

Reply

Alexey Knyazev
Alexey Knyazev Russia
02.04.2013 11:21:56 #

ошибка "Cannot perform alter on dbo.function1 because it is an incompatible object type", говорит о том, что с таким именем уже есть объект другого типа (функции бывают разного типа)

Например:

use tempdb
go

create function my_fn()
returns datetime
as
begin
declare @dt datetime
set @dt = '20130401'
return @dt
end
go

alter function my_fn()
returns table
as
return
(select convert( datetime, '20120401' ) as dt)
go

drop function my_fn
go

Reply

Павел
Павел Russia
15.05.2013 22:40:03 #

Подскажите пожалуйста, на 2005 SQL расшифровывается только часть процедуры ... как побороть?

Заранее благодарен.

Reply

Alexey Knyazev
Alexey Knyazev Russia
29.05.2013 15:14:04 #

>>Подскажите пожалуйста, на 2005 SQL расшифровывается только часть процедуры ... как побороть?

Часть - это сколько символов? 4000?

Reply

Владимир
Владимир Russia
05.06.2013 14:17:31 #

Если больше 4000 символов, пробывал изменить 4000 на 8000 все равно выдала 4000. В чем ошибка?

Reply

Владимир
Владимир Russia
03.06.2013 22:11:11 #

У меня то же не до конца , расшифровывается вот  окончание
        BEGIN TRY SET @CheckDBRun                       = [Service].[fnGetManage
mentParam]('CheckDBRun','1',1) END TRY                          BEGIN CATCH SET
@CheckDBRun=1 END CATCH
        BEGIN TRY SET @CheckDBNoIndex           = [Service].[f
Хотя  начинается нормально
AS
BEGIN
        SET NOCOUNT ON

Строк примерно 50

Reply

Владимир
Владимир Russia
04.06.2013 21:31:17 #

Если файл больше 4 096 байт. То как остальное расшифровать?

Reply

Алекс
Алекс Ukraine
23.06.2013 18:58:56 #

у меня тоже самое
>> на 2005 SQL расшифровывается только часть процедуры
>> Часть - это сколько символов? 4000?
именно. подскажите, куда нужно смотреть?

Reply

Alexey Knyazev
Alexey Knyazev Russia
24.06.2013 15:26:20 #

4000 - это ограничение команды PRINT через которую выводим результат на экран (msdn.microsoft.com/ru-ru/library/ms176047.aspx).


Строка сообщения может иметь длину до 8 000 символов для строки, отличной от Юникода, и 4 000 символов для строки в Юникоде. Более длинные строки усекаются. Типы данных varchar(max) и nvarchar(max) подвергаются усечению до типов данных, размер которых не превышает varchar(8000) и nvarchar(4000).



Поэтому можно просто заменить вывод результата

-- PRINT the content of the decrypted object
PRINT(@ContentOfDecryptedObject)


на

print ( substring( @ContentOfDecryptedObject, 0, 4000 ) )
print ( substring( @ContentOfDecryptedObject, 4000, 4000 ) )


Тем самым вы с помощью 2-х команд PRINT получите 8000 юникод символов

Reply

sergey1407
sergey1407 Russia
12.12.2013 17:08:34 #

Я доработал функцию следующим образом:

SET @i = 1
WHILE @i <= len(@ContentOfDecryptedObject)
BEGIN

  print ( substring( @ContentOfDecryptedObject, @i, @i + 4000 ) )  
  SET @i = @i + 4000
END

Reply

Добавить комментарий

  Country flag

biuquote
  • Комментарий
  • Предпросмотр
Loading