Skip to content

Commit ee22d99

Browse files
committed
Add procs de decrypt
1 parent 15d64b2 commit ee22d99

3 files changed

Lines changed: 248 additions & 0 deletions

File tree

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*#info
2+
3+
# Author
4+
Rodrigo Ribeiro Gomes (adaptado de Paul White https://sqlperformance.com/2016/05/sql-performance/the-internals-of-with-encryption)
5+
6+
7+
# Descrição
8+
Descriptografa todas as procedures criptografadas no banco atual
9+
O post do Paul White fornece todos os detalhes!
10+
Antes de usar esse script, crie as funções do arquivo fn.Rc4.sql!
11+
12+
13+
ATENÇÃO: VOCÊ DEVE ESTAR CONECTADO COMO DAC! Esse procedimento não é oficial Microsoft, use-o por sua própria conta e risco.
14+
15+
Formas de conectar como dac:
16+
- Logue na máquina onde o sql está instalado
17+
- no ssms, coloque admin:. ou admin:.\noneinstancia
18+
- o sqlbrowser deve estar ativo
19+
- em instancia clusterizadas, o remote admin deve estar habilitado e você deve conectar usando o nome virtual
20+
21+
Mais info sobre o DAC: https://learn.microsoft.com/en-us/sql/database-engine/configure-windows/diagnostic-connection-for-database-administrators?view=sql-server-ver17
22+
Lembre-se que o DAC é uma conexão especial de emergência, então, não ocupe-a por muito tempo.
23+
*/
24+
25+
SELECT
26+
*
27+
28+
-- Aqui fica clicável e fácil de copiar. Mas se a proc tiver alguns caraceres especiais, pode dar erro de conversao xml
29+
-- Se der, comenta esse trecho e copia o "text" (se for maior que o limtie do ssms, pode vir cortado. habilite a quebra de linha nas options também)
30+
,ProcXML = (
31+
select
32+
[processing-instruction(q)] = P.text
33+
-- Se tiver caracteres especiais no XML, usar replace, ou comentar isso aqui!
34+
for xml path(''),type
35+
)
36+
FROM
37+
(
38+
SELECT
39+
*
40+
,RC4K = CONVERT(binary(20),HASHBYTES('SHA1', DBGuid + ObjectID + SubID))
41+
FROM
42+
(
43+
SELECT
44+
DBGuid = convert(binary(16),convert(uniqueidentifier,DRS.family_guid))
45+
,ObjectID = convert(binary(4),reverse(convert(binary(4),convert(int,OV.objid))))
46+
,SubID = convert(binary(2),reverse(convert(binary(2),convert(smallint,OV.subobjid))))
47+
,OV.imageval
48+
FROM
49+
sys.database_recovery_status DRS
50+
CROSS JOIN
51+
sys.sysobjvalues OV
52+
WHERE
53+
DRS.database_id = DB_ID()
54+
AND
55+
OV.valclass = 1
56+
AND
57+
58+
-- aqui voce pode filtrar procs especifica se preferir!
59+
OV.objid in (
60+
select id From sys.syscomments where encrypted = 1
61+
)
62+
) O
63+
) K
64+
CROSS APPLY (
65+
SELECT
66+
text = CONVERT(nvarchar(max),master.dbo.sp_fnEncDecRc4(RC4K,imageval))
67+
) P(text)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Como descriptografar procedures
2+
3+
Os scripts desse diretório contém procedures que ajudam a descriptografar as procedures criptografadas com o WITH ENCRYPTION.
4+
Para conseguir descriptografar, você deve ter acesso de sysadmin na instância e conseguir conectar como DAC.
5+
Ou seja, esse procedimento é so para quem tem nível muito alto de acesso ao SQL.
6+
7+
Os scripts aqui foram adaptados com base no blog: https://sqlperformance.com/2016/05/sql-performance/the-internals-of-with-encryption, que aliás, é um excelente post explicando como o WITH ENCRYPTION funciona.
8+
9+
> [!WARNING]
10+
> Esse procedimento não é oficial Microsoft e você deve usar por sua própria e risco
11+
> Apesar disso, eu nunca vi nenhum efeito colateral, visto que você só faz mais consulta e cria funçoes t-sql escalares simples.
12+
> Porém, lembre-se que o DAC é uma conexão especial, para resolver emergências, e não deve ser mantido aberta sem necessidade.
13+
> Outro ponto importante é que os scripts vão consultar DMVs e metadados com informações sensíveis da instância, como keys, então, não compartilhe isso.
14+
> Por isso, tenha em mente que é de seu inteira responsabilidade seguir com o uso e os procedimentos descritos aqui.
15+
16+
Procedimentos:
17+
18+
- Cria [esta função](fn.Rc4.sql).
19+
- Conecte-se como dac e [rode este script](DecryptSelectProcs.sql) no banco desejado para trazer as procs descriptogradas.
20+
- Se der erro de conversão de XML, siga as orientações no comentário no início do SELECT
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
/*#info
2+
3+
# Author
4+
Paul White (https://sqlperformance.com/2016/05/sql-performance/the-internals-of-with-encryption)
5+
6+
# Descrição
7+
Criar as funções no banco master para auxiliar no processo de decrypt de procs.
8+
O blog acima explica muito bem como funciona esse processo.
9+
Você deve criar esse script antes de usar o DecryptProcs.sql
10+
*/
11+
12+
USE master
13+
GO
14+
15+
-- thanks to:
16+
IF OBJECT_ID(N'dbo.sp_fnEncDecRc4', N'FN') IS NOT NULL
17+
DROP FUNCTION dbo.sp_fnEncDecRc4;
18+
GO
19+
IF OBJECT_ID(N'dbo.sp_fnInitRc4', N'TF') IS NOT NULL
20+
DROP FUNCTION dbo.sp_fnInitRc4;
21+
GO
22+
CREATE FUNCTION dbo.sp_fnInitRc4
23+
(@Pwd varbinary(256))
24+
RETURNS @Box table
25+
(
26+
i tinyint PRIMARY KEY,
27+
v tinyint NOT NULL
28+
)
29+
WITH SCHEMABINDING
30+
AS
31+
BEGIN
32+
DECLARE @Key table
33+
(
34+
i tinyint PRIMARY KEY,
35+
v tinyint NOT NULL
36+
);
37+
38+
DECLARE
39+
@Index smallint = 0,
40+
@PwdLen tinyint = DATALENGTH(@Pwd);
41+
42+
WHILE @Index <= 255
43+
BEGIN
44+
INSERT @Key
45+
(i, v)
46+
VALUES
47+
(@Index, CONVERT(tinyint, SUBSTRING(@Pwd, @Index % @PwdLen + 1, 1)));
48+
49+
INSERT @Box (i, v)
50+
VALUES (@Index, @Index);
51+
52+
SET @Index += 1;
53+
END;
54+
55+
DECLARE
56+
@t tinyint = NULL,
57+
@b smallint = 0;
58+
59+
SET @Index = 0;
60+
61+
WHILE @Index <= 255
62+
BEGIN
63+
SELECT @b = (@b + b.v + k.v) % 256
64+
FROM @Box AS b
65+
JOIN @Key AS k
66+
ON k.i = b.i
67+
WHERE b.i = @Index;
68+
69+
SELECT @t = b.v
70+
FROM @Box AS b
71+
WHERE b.i = @Index;
72+
73+
UPDATE b1
74+
SET b1.v = (SELECT b2.v FROM @Box AS b2 WHERE b2.i = @b)
75+
FROM @Box AS b1
76+
WHERE b1.i = @Index;
77+
78+
UPDATE @Box
79+
SET v = @t
80+
WHERE i = @b;
81+
82+
SET @Index += 1;
83+
END;
84+
85+
RETURN;
86+
END;
87+
GO
88+
CREATE FUNCTION dbo.sp_fnEncDecRc4
89+
(
90+
@Pwd varbinary(256),
91+
@Text varbinary(MAX)
92+
)
93+
RETURNS varbinary(MAX)
94+
WITH
95+
SCHEMABINDING,
96+
RETURNS NULL ON NULL INPUT
97+
AS
98+
BEGIN
99+
DECLARE @Box AS table
100+
(
101+
i tinyint PRIMARY KEY,
102+
v tinyint NOT NULL
103+
);
104+
105+
INSERT @Box
106+
(i, v)
107+
SELECT
108+
FIR.i, FIR.v
109+
FROM dbo.sp_fnInitRc4(@Pwd) AS FIR;
110+
111+
DECLARE
112+
@Index integer = 1,
113+
@i smallint = 0,
114+
@j smallint = 0,
115+
@t tinyint = NULL,
116+
@k smallint = NULL,
117+
@CipherBy tinyint = NULL,
118+
@Cipher varbinary(MAX) = 0x;
119+
120+
WHILE @Index <= DATALENGTH(@Text)
121+
BEGIN
122+
SET @i = (@i + 1) % 256;
123+
124+
SELECT
125+
@j = (@j + b.v) % 256,
126+
@t = b.v
127+
FROM @Box AS b
128+
WHERE b.i = @i;
129+
130+
UPDATE b
131+
SET b.v = (SELECT w.v FROM @Box AS w WHERE w.i = @j)
132+
FROM @Box AS b
133+
WHERE b.i = @i;
134+
135+
UPDATE @Box
136+
SET v = @t
137+
WHERE i = @j;
138+
139+
SELECT @k = b.v
140+
FROM @Box AS b
141+
WHERE b.i = @i;
142+
143+
SELECT @k = (@k + b.v) % 256
144+
FROM @Box AS b
145+
WHERE b.i = @j;
146+
147+
SELECT @k = b.v
148+
FROM @Box AS b
149+
WHERE b.i = @k;
150+
151+
SELECT
152+
@CipherBy = CONVERT(tinyint, SUBSTRING(@Text, @Index, 1)) ^ @k,
153+
@Cipher = @Cipher + CONVERT(binary(1), @CipherBy);
154+
155+
SET @Index += 1;
156+
END;
157+
158+
RETURN @Cipher;
159+
END;
160+
GO
161+

0 commit comments

Comments
 (0)