存储过程解密(破解函数,过程,触发器,视图.仅限于SQLSERVER2000)
/*
--调用示例:
--解密指定存储过程
exec sp_decrypt '存储过程名'
--
*/
create
PROCEDURE
sp_decrypt(
@objectName
varchar
(
50
))
AS
begin
begin
tran
declare
@objectname1
varchar
(
100
),
@orgvarbin
varbinary
(
8000
)
declare
@sql1
nvarchar
(
4000
),
@sql2
nvarchar
(
4000
),
@sql3
nvarchar
(
4000
),
@sql4
nvarchar
(
4000
),
@sql5
nvarchar
(
4000
),
@sql6
nvarchar
(
4000
),
@sql7
nvarchar
(
4000
),
@sql8
nvarchar
(
4000
),
@sql9
nvarchar
(
4000
),
@sql10
nvarchar
(
4000
)
DECLARE
@OrigSpText1
nvarchar
(
4000
),
@OrigSpText2
nvarchar
(
4000
) ,
@OrigSpText3
nvarchar
(
4000
),
@resultsp
nvarchar
(
4000
)
declare
@i
int
,
@status
int
,
@type
varchar
(
10
),
@parentid
int
declare
@colid
int
,
@n
int
,
@q
int
,
@j
int
,
@k
int
,
@encrypted
int
,
@number
int
select
@type
=
xtype,
@parentid
=
parent_obj
from
sysobjects
where
id
=
object_id
(
@ObjectName
)
create
table
#
temp
(
number
int
,colid
int
,ctext
varbinary
(
8000
),encrypted
int
,status
int
)
insert
#
temp
SELECT
number
,colid,ctext,encrypted,status
FROM
syscomments
WHERE
id
=
object_id
(
@objectName
)
select
@number
=
max
(
number
)
from
#
temp
set
@k
=
0
while
@k
<=
@number
begin
if
exists
(
select
1
from
syscomments
where
id
=
object_id
(
@objectname
)
and
number
=
@k
)
begin
if
@type
=
'
P
'
set
@sql1
=
(
case
when
@number
>
1
then
'
ALTER PROCEDURE
'
+
@objectName
+
'
;
'
+
rtrim
(
@k
)
+
'
WITH ENCRYPTION AS
'
else
'
ALTER PROCEDURE
'
+
@objectName
+
'
WITH ENCRYPTION AS
'
end
)
if
@type
=
'
TR
'
set
@sql1
=
'
ALTER TRIGGER
'
+
@objectname
+
'
ON
'
+
OBJECT_NAME
(
@parentid
)
+
'
WITH ENCRYPTION FOR INSERT AS PRINT 1
'
if
@type
=
'
FN
'
or
@type
=
'
TF
'
or
@type
=
'
IF
'
set
@sql1
=
(
case
@type
when
'
TF
'
then
'
ALTER FUNCTION
'
+
@objectName
+
'
(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end
'
when
'
FN
'
then
'
ALTER FUNCTION
'
+
@objectName
+
'
(@a char(1)) returns char(1) with encryption as begin return @a end
'
when
'
IF
'
then
'
ALTER FUNCTION
'
+
@objectName
+
'
(@a char(1)) returns table with encryption as return select @a as a
'
end
)
if
@type
=
'
V
'
set
@sql1
=
'
ALTER VIEW
'
+
@objectname
+
'
WITH ENCRYPTION AS SELECT 1
'
set
@q
=
len
(
@sql1
)
set
@sql1
=
@sql1
+
REPLICATE
(
'
-
'
,
4000
-
@q
)
select
@sql2
=
REPLICATE
(
'
-
'
,
4000
),
@sql3
=
REPLICATE
(
'
-
'
,
4000
),
@sql4
=
REPLICATE
(
'
-
'
,
4000
),
@sql5
=
REPLICATE
(
'
-
'
,
4000
),
@sql6
=
REPLICATE
(
'
-
'
,
4000
),
@sql7
=
REPLICATE
(
'
-
'
,
4000
),
@sql8
=
REPLICATE
(
'
-
'
,
4000
),
@sql9
=
REPLICATE
(
'
-
'
,
4000
),
@sql10
=
REPLICATE
(
'
-
'
,
4000
)
exec
(
@sql1
+
@sql2
+
@sql3
+
@sql4
+
@sql5
+
@sql6
+
@sql7
+
@sql8
+
@sql9
+
@sql10
)
end
set
@k
=
@k
+
1
end
set
@k
=
0
while
@k
<=
@number
begin
if
exists
(
select
1
from
syscomments
where
id
=
object_id
(
@objectname
)
and
number
=
@k
)
begin
select
@colid
=
max
(colid)
from
#
temp
where
number
=
@k
set
@n
=
1
while
@n
<=
@colid
begin
select
@OrigSpText1
=
ctext,
@encrypted
=
encrypted,
@status
=
status
FROM
#
temp
WHERE
colid
=
@n
and
number
=
@k
SET
@OrigSpText3
=
(
SELECT
ctext
FROM
syscomments
WHERE
id
=
object_id
(
@objectName
)
and
colid
=
@n
and
number
=
@k
)
if
@n
=
1
begin
if
@type
=
'
P
'
SET
@OrigSpText2
=
(
case
when
@number
>
1
then
'
CREATE PROCEDURE
'
+
@objectName
+
'
;
'
+
rtrim
(
@k
)
+
'
WITH ENCRYPTION AS
'
else
'
CREATE PROCEDURE
'
+
@objectName
+
'
WITH ENCRYPTION AS
'
end
)
if
@type
=
'
FN
'
or
@type
=
'
TF
'
or
@type
=
'
IF
'
--
刚才有错改一下
SET
@OrigSpText2
=
(
case
@type
when
'
TF
'
then
'
CREATE FUNCTION
'
+
@objectName
+
'
(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end
'
when
'
FN
'
then
'
CREATE FUNCTION
'
+
@objectName
+
'
(@a char(1)) returns char(1) with encryption as begin return @a end
'
when
'
IF
'
then
'
CREATE FUNCTION
'
+
@objectName
+
'
(@a char(1)) returns table with encryption as return select @a as a
'
end
)
if
@type
=
'
TR
'
set
@OrigSpText2
=
'
CREATE TRIGGER
'
+
@objectname
+
'
ON
'
+
OBJECT_NAME
(
@parentid
)
+
'
WITH ENCRYPTION FOR INSERT AS PRINT 1
'
if
@type
=
'
V
'
set
@OrigSpText2
=
'
CREATE VIEW
'
+
@objectname
+
'
WITH ENCRYPTION AS SELECT 1
'
set
@q
=
4000
-
len
(
@OrigSpText2
)
set
@OrigSpText2
=
@OrigSpText2
+
REPLICATE
(
'
-
'
,
@q
)
end
else
begin
SET
@OrigSpText2
=
REPLICATE
(
'
-
'
,
4000
)
end
--
start counter
SET
@i
=
1
--
fill temporary variable
SET
@resultsp
=
replicate
(N
'
A
'
, (
datalength
(
@OrigSpText1
)
/
2
))
--
loop
WHILE
@i
<=
datalength
(
@OrigSpText1
)
/
2
BEGIN
SET
@resultsp
=
stuff
(
@resultsp
,
@i
,
1
,
NCHAR
(
UNICODE
(
substring
(
@OrigSpText1
,
@i
,
1
))
^
(
UNICODE
(
substring
(
@OrigSpText2
,
@i
,
1
))
^
UNICODE
(
substring
(
@OrigSpText3
,
@i
,
1
)))))
SET
@i
=
@i
+
1
END
set
@orgvarbin
=
cast
(
@OrigSpText1
as
varbinary
(
8000
))
set
@resultsp
=
(
case
when
@encrypted
=
1
then
@resultsp
else
convert
(
nvarchar
(
4000
),
case
when
@status
&
2
=
2
then
uncompress(
@orgvarbin
)
else
@orgvarbin
end
)
end
)
print
@resultsp
--
execute( @resultsp)
set
@n
=
@n
+
1
end
end
set
@k
=
@k
+
1
end
drop
table
#
temp
rollback
tran
end
GO