Как отменить команду sp_hidetext? - PullRequest
2 голосов
/ 27 января 2010

Похоже, что это невозможно, но я действительно не знаю почему. Когда Sql Server выполняет хранимую процедуру, ему нужен код для ее запуска, поэтому я уверен, что код хранимой процедуры должен существовать в каком-то месте, но я также не знаю, где.

Возможно, этот код зашифрован, но его можно расшифровать с помощью какого-либо инструмента, поскольку СУБД должна делать это при его выполнении.

Итак, я хочу знать, есть ли хорошо известное место, где программное обеспечение хранит этот код (тем или иным образом), и есть ли инструмент для извлечения и получения исходного кода, скрытого командой sp_hidetext.

Ответы [ 5 ]

1 голос
/ 27 января 2010

Из онлайнового руководства по sybase :

Внимание!

Перед выполнением sp_hidetext, сделайте уверен, что у вас есть резервная копия источника текст. Результаты выполнения sp_hidetext необратим.

1 голос
/ 27 января 2010

Нет. Это проблема безопасности. Он хранится внутри секретным способом, к которому вы не можете получить доступ. Только СУБД знает, как это сделать, точно так же, как учетные данные имеют пароль, который зашифрован, но может быть расшифрован, чтобы его можно было использовать при необходимости.

0 голосов
/ 04 апреля 2016

Это возможно, и не очень сложно.

Вариант 1: диагностический сервер

(Адаптировано из этой ветки форума . Я не проверял это. Я точно знаю, что он не будет работать для SQL Anywhere, поскольку у него нет режима диагностики, но предположительно он работает для ASE.)

Запустить сервер в режиме диагностики с помощью программы diagsrvr.exe. Затем подключитесь к нему с помощью какого-либо инструмента SQL и выполните следующие команды (где SECRETPROC - имя интересующей вас скрытой процедуры):

create table #x (id int)
insert into #x values (object_id ('SECRETPROC'))
dbcc _unhide_text ('#x')
go

sp_helptext будет работать на нем как обычно.

Вариант 2: проверка памяти

(Первоначально опубликовано в моем блоге . Я проверил это на SQL Anywhere 11. Думаю, он работает и на аналогичных продуктах.)

Чтобы сервер загрузил его в память, вам нужно вызвать его. Некоторые установки SQL Anywhere поставляются с инструментом, помеченным dbisql.exe, который можно использовать в качестве интерактивной среды SQL. Вызовите процедуру - она ​​не должна запускаться; Я бы посоветовал назвать это фиктивным числом аргументов, чтобы случайно не запустить что-то плохое Затем быстро откройте диспетчер задач, найдите процесс сервера (для меня он называется dbsrv11.exe, потому что я использую SQL Anywhere 11), щелкните его правой кнопкой мыши и выберите Создать файл дампа .

.

Как только это закончится, откройте полученный файл в шестнадцатеричном редакторе (хотя Блокнот тоже может работать). Мне нравятся XVI32 для таких вещей. Поиск по названию процедуры - например, SECRETPROC - с правильной прописной буквой. Там будет несколько упоминаний об этом (и обфусцированная версия этого тоже), продолжайте, пока не увидите тот, который начинается с create function и имеет кучу кода SQL после него. Все от этой ключевой фразы до следующего нулевого байта является кодом хранимой процедуры.

Если вы используете XVI32, щелкните начало интересующей части на правой панели и удерживайте Shift, используя клавиши со стрелками, чтобы перейти к концу нужной части. Текст станет красным. Затем вы можете использовать Ctrl + C, чтобы скопировать данные, Ctrl + N, чтобы создать новый файл, Ctrl + V, чтобы вставить данные, и File → Save, чтобы записать их в новый файл.

0 голосов
/ 23 февраля 2010

Роб прав. Даже sybase говорит, что они не могут перевернуть код (но я думаю, что они могут;).

Чек

$SYBASE/$SYBASE_ASE/scripts/installmaster

там вы найдете исходный код всех проков, установленных в sybsystemprocs

если вы следуете по цепочке, вы получите следующее:

    /* Do hidetext stuff */
    /* ISSUE, get return value of dbcc */
    dbcc hidetext("#proc_objid_t_tab", 16)

.. которая в основном является внутренней функцией без доступного источника (по крайней мере для вас .. и меня :)

0 голосов
/ 27 января 2010

Вы должны взглянуть на фактический источник sp_hidetext (под этим я подразумеваю абсолютный низкоуровневый код, созданный sp_hidetext), чтобы узнать алгоритм скрытия текста. Лучший вариант - всегда сохранять копию ваших оригинальных хранимых процедур в качестве резервной копии. Я уверен, что это сделано как часть вашего SDLC?

...