Cómo descifrar procedimientos almacenados en SQL Server 2008
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, p>
[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 p>
/* " 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) p>
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 p>
/* " 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>
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>
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 ' ') p>
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