1. 程式人生 > >sql server 儲存過程解密

sql server 儲存過程解密

問題一: DAC連線問題

1 先用有sysadmin角色的使用者登陸SQL Server Management Studio;

2 在工具欄上選資料庫引擎查詢;伺服器名稱改為 ADMIN:伺服器名稱 ;選項>連線屬性>連線到資料庫 改為加密儲存過程所在的資料庫;連線

3 執行解密的儲存過程;

問題二: 可用的儲存過程解密程式碼

SQLServer2005、08 裡怎樣對使用with encryption選項建立的儲存過程解密

SQLServer2005 、08 裡使用with encryption選項建立的儲存過程仍然和sqlserver2000裡一樣,都是使用XOR進行了的加密。和2000不一樣的是,在2005的系統表syscomments裡已經查不到加密過的密文了。要查密文必須使用DAC(專用管理員連線)連線到資料庫後,在系統表sys.sysobjvalues查詢,該表的列imageval儲存了相應的密文。具體可以使用下面的查詢:

SELECT imageval FROM sys.sysobjvalues WHERE objid = object_id(@procedure) AND 
valclass = 1 AND subobjid = 1

下面是解密的儲存過程,具體程式碼如下(這是版本4.0,最新的,修正很長的儲存過程解密出來是空白的問題):

複製程式碼
Create PROCEDURE [dbo].[sp_decrypt]
(@procedure sysname 
= NULL, @revfl int=1
)
AS
/*

呼叫形式為:
exec dbo.sp_decrypt @procedure,0
如果第二個引數使用1的話,會給出該儲存過程的一些提示。
--版本4.0  修正儲存過程過長解密出來是空白的問題
*/

SET NOCOUNT ON
IF @revfl 
=1
BEGIN
PRINT 
'警告:該儲存過程會刪除並重建原始的儲存過程。'
PRINT 
' 在執行該儲存過程之前確保你的資料庫有一個備份。'
PRINT 
' 該儲存過程通常應該執行在產品環境的一個備份的非產品環境下。'
PRINT 
' 為了執行這個儲存過程,將引數@refl的值更改為0。'
RETURN 
0
END
DECLARE @intProcSpace bigint, @t bigint, @maxColID smallint,@procNameLength 
int
select @maxColID 
= max(subobjid) FROM
sys.sysobjvalues WHERE objid 
=
 object_id(@procedure)
--select @maxColID as'Rows in sys.sysobjvalues'

select @procNameLength 
= datalength(@procedure) +29
DECLARE @real_01 nvarchar(max)
DECLARE @fake_01 nvarchar(max)
DECLARE @fake_encrypt_01 nvarchar(max)
DECLARE @real_decrypt_01 nvarchar(max),@real_decrypt_01a nvarchar(max)
declare @objtype varchar(
2),@ParentName nvarchar(max)
select @real_decrypt_01a 
=''

--提取物件的型別如是儲存過程還是函式,如果是觸發器,還要得到其父物件的名稱
select @objtype
=type,@parentname=
object_name(parent_object_id)
from sys.objects 
where [object_id]=
object_id(@procedure)
--
 從sys.sysobjvalues裡提出加密的imageval記錄
SET @real_01
=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid =

object_id(@procedure) and valclass 
=1 order by subobjid)

--
建立一個臨時表
create table #output ( [ident] [
int] IDENTITY (11
) NOT NULL ,
[real_decrypt] NVARCHAR(MAX) )
--
開始一個事務,稍後回滾
BEGIN TRAN
--
更改原始的儲存過程,用短橫線替換
if @objtype='P'

  SET @fake_01
='ALTER PROCEDURE '+ @procedure +' WITH ENCRYPTION AS select 1
/*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
elseif @objtype='FN'

  SET @fake_01
='ALTER FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1
/*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/ END'
elseif @objtype='V'

  SET @fake_01
='ALTER view '+ @procedure +' WITH ENCRYPTION AS select 1 as col
/*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
elseif @objtype='TR'

  SET @fake_01
='ALTER trigger '+ @procedure +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)
/*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
EXECUTE (@fake_01)
--
從sys.sysobjvalues裡提出加密的假的
SET @fake_encrypt_01
=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid =

object_id(@procedure) and valclass 
=1 order by subobjid )
if @objtype='P'

  SET @fake_01
='Create PROCEDURE '+ @procedure +' WITH ENCRYPTION AS select 1
/*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
elseif @objtype='FN'

  SET @fake_01
='CREATE FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1
/*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/ END'
elseif @objtype='V'

  SET @fake_01
='Create view '+ @procedure +' WITH ENCRYPTION AS select 1 as col
/*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
elseif @objtype='TR'

  SET @fake_01
='Create trigger '+ @procedure +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)
/*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
--
開始計數
SET @intProcSpace
=1

--使用字元填充臨時變數
SET @real_decrypt_01 
= replicate(cast('A'as nvarchar(max)), (datalength(@real_01) /2
 ))
--
迴圈設定每一個變數,建立真正的變數
--
每次一個位元組
SET @intProcSpace
=1

--如有必要,遍歷每個@real_xx變數並解密
WHILE @intProcSpace
<=(datalength(@real_01)/2
)
BEGIN
--
真的和假的和加密的假的進行異或處理
SET @real_decrypt_01 
= stuff(@real_decrypt_01, @intProcSpace, 1
,
NCHAR(UNICODE(substring(@real_01, @intProcSpace, 
1)) ^

(UNICODE(substring(@fake_01, @intProcSpace, 
1)) ^
UNICODE(substring(@fake_encrypt_01, @intProcSpace, 
1)))))
SET @intProcSpace
=@intProcSpace+1

END


--通過sp_helptext邏輯向表#output裡插入變數
insert #output (real_decrypt) select @real_decrypt_01
--select real_decrypt AS '#output chek' from #output --
測試
---------------------------------------

--開始從sp_helptext提取
---------------------------------------

declare @dbname sysname
,@BlankSpaceAdded 
int
,@BasePos 
int
,@CurrentPos 
int
,@TextLength 
int
,@LineId 
int
,@AddOnLen 
int
,@LFCR 
int--回車換行的長度
,@DefinedLength 
int

,@SyscomText nvarchar(max)
,@Line nvarchar(
255)
Select @DefinedLength 
=255

SELECT @BlankSpaceAdded 
=0--跟蹤行結束的空格。注意Len函式忽略了多餘的空格
CREATE TABLE #CommentText
(LineId 
int

,Text nvarchar(
255) collate database_default)
--
使用#output代替sys.sysobjvalues
DECLARE ms_crs_syscom CURSOR LOCAL
FOR SELECT real_decrypt from #output
ORDER BY ident
FOR READ ONLY
--
獲取文字
SELECT @LFCR 
=2

SELECT @LineId 
=1
OPEN ms_crs_syscom
FETCH NEXT FROM ms_crs_syscom into @SyscomText
WHILE @@fetch_status 
>=0
BEGIN
SELECT @BasePos 
=1
SELECT @CurrentPos 
=1
SELECT @TextLength 
= LEN(@SyscomText)
WHILE @CurrentPos 
!=0

BEGIN
--通過回車查詢行的結束
SELECT @CurrentPos 
= CHARINDEX(char(13)+char(10
), @SyscomText,
@BasePos)

相關推薦

sql server 儲存過程解密

問題一: DAC連線問題 1 先用有sysadmin角色的使用者登陸SQL Server Management Studio; 2 在工具欄上選資料庫引擎查詢;伺服器名稱改為 ADMIN:伺服器名稱 ;選項>連線屬性>連線到資料庫 改為加密儲存過程所在的資

(收藏)SQL SERVER 儲存過程加密和解密

create PROCEDURE sp_decrypt(@objectname varchar(50))ASbeginset nocount on--CSDN:j9988 copyright:2004.07.15 --V3.2 --破解位元組不受限制,適用於SQLSERVER

SQL server 儲存過程的編寫

USE [資料庫名稱] GO /****** Object:  StoredProcedure [dbo].[insertbGait]    Script Date: 2018/7/17 15:51:22 ******/ SET ANSI_NULLS ON GO

SQL SERVER儲存過程加密和安全上下文

對SQL Server 2008的安全入門略作小結,以作備忘。本文涉及兩個應用:儲存過程加密和安全上下文。 <一>儲存過程加密 SQL server,我已經成了儲存過程的忠實擁躉。在直接使用SQL語句還是儲存過程來處理業務邏輯時,我基本會毫不猶豫地選擇後者。 理由如下:

SQL Server 儲存過程返回值的幾種方式

獲得儲存過程的返回值–通過查詢分析器獲得 (1)不帶任何引數的儲存過程(儲存過程語句中含有return) —建立儲存過程 CREATE PROCEDURE testReturn AS return 145 GO —執行儲存過程 DECLARE @RC int exec @RC=

Yii2.0呼叫sql server儲存過程並獲取返回值

1、首先展示建立sql server儲存過程的語句,建立一個簡單的儲存過程,測試用。 1 SET ANSI_NULLS ON 2 GO 3 SET QUOTED_IDENTIFIER ON 4 GO 5 6 CREATE PROCEDURE [dbo].[register_info]

SQL Server儲存過程的使用

   儲存過程概述   簡單來說,儲存過程就是一條或者多條sql語句的集合,可視為批處理檔案,但是其作用不僅限於批處理。  基本概念:   SQL Server中的儲存過程是使用T_SQL編寫的程式碼段。它的目的在於能夠方便的從系統表中查詢資訊,   或者完成與更新資料

SQL Server 儲存過程返回值彙總

獲得儲存過程的返回值–通過查詢分析器獲得 (1)不帶任何引數的儲存過程(儲存過程語句中含有return) —建立儲存過程 CREATE PROCEDURE testReturn AS return 145 GO —執行儲存過程 DECLARE @RC in

Sql Server 儲存過程 - 使用者操作例項

使用者的增刪改查 新增 --新增使用者 create procedure addDeviceUser @name nvarchar(36) , @phone nvarchar(36) , @password nvarchar(255) as begin if exists(

Sql server 儲存過程

-- ======================================= -- Author: <zengyongbin> -- Create date: <2018-11-11> -- Description: <新增> --

關於SQL SERVER 儲存過程使用(2)

  現在有一場景,需要調用出公司員工在本週的請假天數。程式碼如下(1),本人一開始寫的時候用遍歷裡面套著一個遍歷,發現效果出不來如下(2),求是否有什麼方法可以實現遍歷裡面還有個遍歷。 SQL程式碼(1): --建立儲存過程 create procedure LeaveT

SQL Server儲存過程中top後為變數時的處理

@pageRecordNum為每頁顯示的記錄數,@currentPageNum為當前的頁數 create proc pagination  @pageRecordNum int,@currentPageNum int as  declare @recNum varchar(

無意中發現的sql server 儲存過程加密破解方法

轉自:https://blog.csdn.net/gatr/article/details/51226122  儲存過程是資料庫中一個非常重要的該部分,很多業務邏輯都可能寫在儲存過程裡面,為了安全,部分儲存過程是加密存放的,如果我們想看到原始碼,就非常困難了,在sql  se

SQL SERVER儲存過程批量插入資料庫表資料

CREATEPROCEDURE add_UserInfoASDECLARE@userCodeVARCHAR(30)DECLARE@userNameVARCHAR(30)DECLARE@userCode_baseVARCHAR(30)DECLARE@countINTEGERDECLARE@indexINTEGE

SQL server 儲存過程的建立並使用

什麼是儲存過程呢? 儲存過程就是作為可執行物件存放在資料庫中的一個或多個SQL命令。  通俗來講:儲存過程其實就是能完成一定操作的一組SQL語句。 那為什麼要用儲存過程呢? 1.儲存過程只在創造時進行編譯,以後每次執行儲存過程都不需再重新編譯,而一般SQL語句每執行一

Sql Server儲存過程從一個表中抓取資料填充到另一張表中

  set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- ============================================= -- Author:  <alex,,Name> -- Create

SQL Server儲存過程Return、output引數及使用技巧

SQL Server目前正日益成為WindowNT作業系統上面最為重要的一種資料庫管理系統,隨著 SQL Server2000的推出,微軟的這種資料庫服務系統真正地實現了在WindowsNT/2000系列作業系統一統天下的局面,在微軟的作業系統上,沒有任何一種資料庫系統能

sql server儲存過程 以及幾個常用案例

Transact-SQL中的儲存過程,非常類似於Java語言中的方法,它可以重複呼叫。當儲存過程執行一次後,可以將語句快取中,這樣下次執行的時候直接使用快取中的語句。這樣就可以提高儲存過程的效能。 Ø 儲存過程的概念     儲存過程Procedure是一組為了完成特定功能的SQL語句集合,經編譯後儲存在資

SQL SERVER-儲存過程實現CRUD

CREATE PROCEDURE RegionUpdate (     @RegionID int,     @RegionDescription nvarchar(100) ) AS BEGIN     

Excel使用ADO呼叫SQL Server儲存過程

測試環境:SQL Server 2014,Excel 2013前期在做一個現場投票的小軟體,準備使用Excel實現,工作簿中包含有兩個工作表,各包含一個命令按鈕,分別用於提交和檢視投票結果。問題出在檢視投票按鈕上,起初只是使用SELECT語句查詢,一切正常;後期對於投票結果需