La Red de Conocimientos Pedagógicos - Currículum vitae - Cómo descifrar procedimientos almacenados en SQL Server 2008

Cómo descifrar procedimientos almacenados en SQL Server 2008

Los procedimientos almacenados creados con la opción de cifrado en SQLServer2005 todavía usan cifrado XOR como en sqlserver2000. A diferencia de 2000, el texto cifrado cifrado no se puede encontrar en la tabla del sistema syscomments en 2005. Para verificar el texto cifrado, debe usar DAC (Conexión de administrador dedicada) para conectarse a la base de datos y luego consultar la tabla del sistema sys.sysobjvalues. La columna imageval de la tabla almacena el texto cifrado correspondiente. En concreto, puedes utilizar la siguiente consulta:

Selecciona imageval de sys.sysobjvalues ​​donde objid = object_id (@procedure) y

valclass = 1, subobjid = 1

p>

Procedimiento almacenado de descifrado de SQL Server 2005

Crear procedimiento [dbo]. [sp__windbi$decrypt]

(@procedure sysname = NULL, @revfl int = 1)

Como

/*

Por Traducido por Wang, indique que la reimpresión es del pionero de Microsoft BI.

Actualmente este procedimiento almacenado sólo puede descifrar procedimientos almacenados. En cuanto a los procedimientos almacenados de funciones, activadores y vistas de descifrado, este sitio web les prestará más atención. El formulario de llamada es:

exec dbo .sp _ _ windbi$decrypt @procedure, 0

Si el segundo parámetro usa 1, dará algunas pistas sobre el procedimiento almacenado.

-Versión 2.0

*/

ESTABLECER NO CUENTA EN

SI @revfl = 1

INICIAR

Advertencia: Este procedimiento almacenado eliminará y regenerará el procedimiento almacenado original.

Asegúrese de tener una copia de seguridad de la base de datos antes de ejecutar este procedimiento almacenado.

PRINT 'Este procedimiento almacenado normalmente debe ejecutarse en un entorno de respaldo que no sea de producción dentro de un entorno de producción.

Para ejecutar este procedimiento almacenado, cambie el valor del parámetro @refl a 0.

Retorno 0

Fin

Declarar @intProcSpace bigint, @t bigint, @maxColID smallint, @intEncrypted

tinyint, @procNameLength int

select @maxColID = max(subobjid), @intEncrypted = imageval FROM

sys.sysobjvalues ​​​​donde objid = object_id(@procedure)

Grupo por imageval

- seleccione @maxColID como "fila en sys.sysobjvalues"

seleccione @procNameLength = datalength(@procedure) 29

DECLARAR @real_01 nvarchar ( max)

DECLARAR @ fake _ 01 nvarchar(max)

DECLARAR @ fake _ encrypt _ 01 nvarchar(max)

DECLARAR @ real _ decrypt _ 01 nvarchar(max), @real_decrypt_01a nvarchar(max)

Declarar @objtype varchar(2), @ParentName nvarchar(max)

seleccionar @real_decrypt_01a = ' '

-Extrae el tipo de objeto, como un procedimiento almacenado o una función, y en el caso de un disparador, el nombre de su objeto principal.

seleccione @objtype=tipo,@ nombre principal = nombre_objeto(parent_object_id)

de sys.objects donde [identificador de objeto] = identificador de objeto (@proceso)

-Enviar registros de imageval cifrados desde sys.sysobjvalues

SET @ real _ 01 = (SELECCIONE el 1 imageval superior FROM sys . sysobjvalues ​​​​donde objid =

object_id (@procedure) y val class = 1 ordenar por subobjid)

-Crear una tabla temporal

crear tabla # salida([ident][int]IDENTITY(1, 1) no se vacía,

[real_decrypt] NVARCHAR(MAX))

: inicia una transacción y la revierte más tarde.

Iniciar TRAN

-Cambie el procedimiento almacenado original y reemplácelo con un guión.

if @objtype='P '

SET @ fake _ 01 = ' ALTER PROCEDURE ' @ PROCEDURE 'Cifrado como

REPLICATE('-', 40003 - @procNameLength)

de lo contrario, si @objtype='FN '

SET @ fake _ 01 = ' ALTER FUNCTION ' @ procedimiento '() devuelve INT cifrado mientras BEGIN devuelve 1

/* " REPLICATE(' * ", datalength(@ real _ 01)/2-@ procNameLength) ' */END '

else if @objtype='V '

SET @ fake _ 01 = ' ALTER view ' @ procedimiento 'Cifrado como select 1 as col

/* " REPLICATE(' * ", datalength(@ real _ 01)/2 -@ procNameLength) ' */'

else if @objtype='TR '

SET @ fake _ 01 = ' ALTER trigger ' @ procedimiento ' ON ' @ nombre principal ' en Cifrar después INSERT AS RAISERROR(' N ', 16, 10)

/* " REPLICATE(' * ", datalength(@ real _ 01)/2-@ procNameLength) ' */'

Ejecutar (@fake_01)

: recupera el falso cifrado de sys.sysobjvalues.

SET @ fake _ encrypt _ 01 =(SELECCIONE 1 imageval superior FROM sys . sysobjvalues ​​​​DONDE objid =

object_id(@procedure) y val class = 1 orden por subobjid)

if @objtype='P '

SET @ fake _ 01 = ' Crear PROCEDIMIENTO ' @ PROCEDIMIENTO 'Cifrado como

REPLICATE('-', 40003 - @ procNameLength)

de lo contrario, si @objtype='FN '

SET @ fake _ 01 = 'CREAR FUNCIÓN' @ procedimiento '() devuelve INT cifrado mientras BEGIN devuelve 1

/* " REPLICATE(' * ", datalength(@ real _ 01)/2-@ procNameLength) ' */END '

si no, @objtype='V '

SET @ fake _ 01 = ' Crear vista ' @ procedimiento 'Cifrado como seleccionar 1 como col

/* " REPLICATE(' * ", datalength(@ real _ 01)/2-@ procNameLength) ' */'

else if @objtype='TR '

SET @ fake _ 01 = ' Crear disparador ' @ procedimiento ' ON ' @ nombre principal ' en INSERTAR COMO Cifrar después de RAISERROR(' N ', 16, 10)

/* " REPLICATE(' * ", datalength(@ real _ 01)/2-@ procNameLength) ' */'

-Empezar a contar

SET @intProcSpace=1

-Rellenar la variable temporal con caracteres

SET @real_decrypt_01 = replicar(N' a ', (datalength(@real_01) /2))

- Establece cada variable en el bucle para crear una variable real.

- Un byte a la vez

SET @intProcSpace=1

- Recorre cada variable @real_xx y descifra si es necesario.

WHILE @ intProcSpace lt=(datalength(@real_01)/2)

Inicio

-Procesamiento XOR verdadero, falso y falso cifrado.

SET @real_decrypt_01 = cosas(@real_decrypt_01,@intProcSpace,1,

nchar(unicode(substring(@real_01,@intProcSpace, 1)) ^

(UNICODE(subcadena(@fake_01,@intProcSpace,1)) ^

UNICODE(subcadena(@fake_encrypt_01,@intProcSpace,1))) )

SET @ intProcSpace = @ intProcSpace 1

Fin

-Insertar variables en la tabla #salida mediante la lógica sp_helptext

insertar salida(real_decrypt)select @real_decrypt_01

- seleccione real_decrypt de # salida-prueba como ' #outputchek '

- -

- Comience a extraer desde sp_helptext

- -

Declare @dbname nombre del sistema

, @BlankSpaceAdded int

, @BasePos int

, @CurrentPos int

, @TextLength int.

, @LineId int

, @AddOnLen int

, @LFC rint - la longitud de la línea de retorno de carro

, @DefinedLength int

, @SyscomText nvarchar(4000)

, @Line nvarchar( 255)

Seleccione @DefinedLength = 255

SELECT @BlankSpaceAdded = 0: tenga en cuenta que la función Len ignora los espacios adicionales

Crear una tabla #Comment text

(LineId int

, Text nvarchar( 255) tidy Database_default)

-Utilice #output en lugar de sys.sysobjvalues

Declare el cursor ms_crs_syscom como cursor local

Para SELECCIONAR real_decrypt desde #output

Ordenar por ID

Solo lectura

- Recibir SMS

SELECT @LFCR = 2

SELECT @LineId = 1

Abrir ms_crs_syscom

Extraer NEXT de ms_crs_syscom a @SyscomText

WHILE @ @ fetch _ status gt= 0

Iniciar

SELECCIONAR @BasePos = 1

SELECCIONAR @CurrentPos = 1

SELECCIONAR @TextLength = LEN(@SyscomText)

MIENTRAS @CurrentPos! = 0

Inicio

- Encuentra el final de la línea presionando enter.

SELECT @current pos = char index(char(13) char(10), @SyscomText,

@BasePos)

- si encuentra retorno de carro ,

¡SI @CurrentPos! = 0

Inicio

: si el nuevo valor de longitud de @Lines es mayor que el valor establecido, inserte el contenido actual de @Lines y continúe.

Mientras (isnull(LEN(@Line), 0) @BlankSpaceAdded

@ pos actual-@ pos base @ LFCR) gt @DefinedLength

Inicio;

SELECT @AddOnLen = @longitud definida-(es nulo(LEN(@ Line), 0)

@BlankSpaceAdded)

Inserte el valor #CommentText

p>

(@LineId,

isnull(@Line, N'') isnull(substring(@SyscomText,

@BasePos, @AddOnLen) , N ' ' ))

SELECT @Line = NULL, @LineId = @LineId 1,

@BasePos = @BasePos @AddOnLen, @BlankSpaceAdded = 0

Fin

SELECT @Line = isnull(@Line, N'')

isnull(substring(@SyscomText, @BasePos, @CurrentPos-@BasePos @LFCR), N ' ' )

SELECT @BasePos = @CurrentPos 2

INSERTAR el valor de #CommentText (@LineId, @Line)

SELECT @LineId = @LineId 1

SELECT @Line = NULL

End

Otro

-Si no encuentras el retorno de carro,

Inicio

IF @BasePos lt= @TextLength

Inicio

- Si el nuevo valor de longitud de @Lines es mayor que la longitud definida.

Mientras (isnull(LEN(@Line), 0) @BlankSpaceAdded

@ TextLength-@ base pos 1) gt @DefinedLength

Inicio

p>

SELECT @AddOnLen = @longitud definida-

(isnull(LEN(@Line), 0) @BlankSpaceAdded)

Inserte el valor #CommentText

(@LineId,

isnull(@Line, N'') isnull(substring(@SyscomText,

@BasePos, @AddOnLen), N ' '))

SELECT @Line = NULL, @LineId = @LineId 1,

@BasePos = @BasePos @AddOnLen, @BlankSpaceAdded =

Fin

SELECT @Line = isnull(@Line, N'')

isnull(substring(@SyscomText, @BasePos, @TextLength-@BasePos 1), N ' ')

if LEN(@Line) lt; @DefinedLength y charindex(',

@SyscomText, @TextLength 1) > 0

Inicio

SELECCIONAR @Line = @Line ' ', @BlankSpaceAdded = 1

Fin

Fin

Fin

Fin

Extraiga NEXT de ms_crs_syscom a @SyscomText

Fin

Si @Line no está vacío

Inserte el valor #CommentText (@LineId, @Line)

Seleccionar texto de #CommentText ordenar por LineId

Cerrar ms_crs_syscom

Desasignar ms_crs_syscom

Eliminar tabla #CommentText

- -

-Finaliza la extracción de sp_helptext.

- -

-Eliminar el procedimiento almacenado creado con el guión y regenerar el procedimiento almacenado original.

Revertir TRAN

Eliminar tabla #salida