Giải Mã Store Procedure Bị Mã Hóa Trong Sql Server

Khi bảo trì một dự án phần mềm, Nếu bạn gặp phải trường hợp phải sửa một store procedure, function, trigger, view mà bị mã hóa thì có vẻ hơn ngán vì rất khó để lấy được code nguyên bản để sửa. Bài viết hôm nay mình sẽ giới thiệu cách để giải mã ra code.

1. Làm Sao Để Mã Hóa Một Store Procedure.

Để tạo một store procedure được mã hóa ta dùng thêm lệnh “with encryption” như trong hình dưới.

Store procedure khi đã mã hóa khi view bằng ssms trên object explorer sẽ thấy có thêm hình ổ khóa đã khóa, các store không bị mã hóa sẽ không có ổ khóa này.

2. Cấu Trúc Store Procedure Bị Mã Hóa Khác Không Mã Hóa Ở Đâu.

Khi ta modify những store này sẽ báo lỗi và không cho sửa, không cho thấy code.
Khi kiểm tra định nghĩa thì những sp mã hóa được thay thế bằng NULL

Xem nội dung sp thì chỉ có một message thông báo đã bị mã hóa

Đối với sp không mã hóa thì ta có thể thấy nội dung ngon lành

3. Giải Mã Hóa Thủ Công.

Việc giải mã hóa thủ công đòi hỏi phải có quyền truy cập cao nhất vào SQL server bằng mode DAC tối thiểu bạn phải có quyền SYSADMIN trên máy chạy SQL server.
Bạn vào SQL server bằng mode DAC như sau:
Nếu không vào được Bạn xem đã bật service sql browser chưa nhé.
Khi vào được trong Bạn chạy lệnh như sau sẽ thấy được nội dung của sp bị mã hóa
Bạn dùng đoạn lệnh sau để giải mã thành dạng text:
Create PROCEDURE [dbo].[sp_decrypt_sp] (@objectName varchar(50))
AS
DECLARE @OrigSpText1 nvarchar(4000), @OrigSpText2 nvarchar(4000) , @OrigSpText3 nvarchar(4000), @resultsp nvarchar(4000)
declare @i int , @t bigint , @ct nvarchar(max)
–get encrypted data
SET @OrigSpText1= (SELECT top 1 ctext FROM syscomments WHERE id = object_id(@objectName) order by colid)
SET @OrigSpText2=ALTER PROCEDURE + @objectName + WITH ENCRYPTION AS +REPLICATE(, 3938)
EXECUTE (@OrigSpText2)
print @OrigSpText1
SET @OrigSpText3=(SELECT top 1 ctext FROM syscomments WHERE id = object_id(@objectName) order by colid)
SET @OrigSpText2=CREATE PROCEDURE + @objectName + WITH ENCRYPTION AS +REPLICATE(, 400062)
–start counter
SET @i=1
–fill temporary variable
SET @resultsp = replicate(NA, (datalength(@OrigSpText1) / 2))
–loop
WHILE @i<=datalength(@OrigSpText1)/2
BEGIN
–reverse encryption (XOR original+bogus+bogus encrypted)
SET @resultsp = stuff(@resultsp, @i, 1, NCHAR(UNICODE(substring(@OrigSpText1, @i, 1)) ^
(UNICODE(substring(@OrigSpText2, @i, 1)) ^
UNICODE(substring(@OrigSpText3, @i, 1)))))
print @resultsp
SET @i=@i+1
END
–drop original SP
–EXECUTE (‘drop PROCEDURE ‘+ @objectName)
–remove encryption
–preserve case
SET @resultsp=REPLACE((@resultsp),WITH ENCRYPTION, )
SET @resultsp=REPLACE((@resultsp),With Encryption, )
SET @resultsp=REPLACE((@resultsp),with encryption, )
IF CHARINDEX(WITH ENCRYPTION,UPPER(@resultsp) )>0
SET @resultsp=REPLACE(UPPER(@resultsp),WITH ENCRYPTION, )
–replace Stored procedure without enryption
set @ct = (SELECT ctext FROM syscomments WHERE id = object_id(@objectName))
print @ct
execute( @resultsp)
Advertisements

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s