亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

解剖SQLSERVER 第十五篇 SQLSERVER存儲過程的源文本存放在哪里?(譯)

2024-07-21 02:48:56
字體:
來源:轉載
供稿:網友
解剖SQLSERVER 第十五篇 SQLSERVER存儲過程的源文本存放在哪里?(譯)解剖SQLSERVER 第十五篇 SQLSERVER存儲過程的源文本存放在哪里?(譯)

http://imPRove.dk/where-does-sql-server-store-the-source-for-stored-procedures/

目前我正在擴展OrcaMDF Studio的功能 不單只支持系統表,DMVs 和用戶表 而且也要支持存儲過程。那很容易,我們只需要查詢sys.procedures --或者查詢sys.sysschobjs,

因為當SQLSERVER沒有在運行的時候我們是不能查詢sys.procedures 的

然而,我不想只是列出存儲過程名稱,我也需要顯示存儲過程里面的源代碼。這帶來了新的任務--檢索源代碼。源代碼存儲在哪里?

我在Google上找不到任何有用的資料,所以我們只能依靠自己觀察了!

我已經創建了一個新的空數據庫 這個數據庫有一個3MB的數據文件。在這個數據庫里面,我已經創建了一個單獨的存儲過程就像這樣:

SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:        -- Create date: -- Description:    -- =============================================CREATE PROCEDURE XYZ    ASBEGIN    -- SET NOCOUNT ON added to prevent extra result sets from    -- interfering with SELECT statements.    SET NOCOUNT ON;    -- Insert statements for procedure here    SELECT 'AABBCC' AS OutputEND

現在,當我select * from sys.procedures的時候,我們可以看到存儲過程的object ID 是2105058535

select * from sys.procedures

到目前為止一切順利。然后我們可以檢索存儲過程的定義 使用查詢sys.sql_modules 視圖返回nvarchar(MAX)類型的定義文本

select * from sys.sql_modules where object_id = 2105058535

上面就是XYZ存儲過程的源代碼!等下,我可以從sys.sysschobjs表里獲取存儲過程的object ID,我不需要訪問sys.sql_modules ,sys.sql_modules 只是一個視圖而不是系統表。我們看一下sys.sql_modules 視圖是如何獲取定義的:

select object_definition(object_id('sys.sql_modules'))
SELECT    object_id = o.id,    definition = Object_definition(o.id),    uses_ansi_nulls = Sysconv(bit, o.status & 0x40000), -- OBJMOD_ANSINULLS    uses_quoted_identifier = sysconv(bit, o.status & 0x80000),   -- OBJMOD_QUOTEDIDENT    is_schema_bound = sysconv(bit, o.status & 0x20000),    -- OBJMOD_SCHEMABOUND    uses_database_collation = sysconv(bit, o.status & 0x100000),  -- OBJMOD_USESDBCOLL    is_recompiled = sysconv(bit, o.status & 0x400000),     -- OBJMOD_NOCACHE    null_on_null_input = sysconv(bit, o.status & 0x200000),   -- OBJMOD_NULLONNULL    execute_as_principal_id = x.indepidFROM    sys.sysschobjs oLEFT JOIN    sys.syssingleobjrefs x ON x.depid = o.id AND x.class = 22 AND x.depsubid = 0 -- SRC_OBJEXECASOWNERWHERE    o.pclass <> 100 AND    (        (o.type = 'TR' AND has_access('TR', o.id, o.pid, o.nsclass) = 1) OR        (type IN ('P','V','FN','IF','TF','RF','IS') AND has_access('CO', o.id) = 1) OR        (type IN ('R','D') AND o.pid = 0)    )

大家如果使用sqlprompt的話也可以直接顯示定義而不需要執行object_definition函數

可以看到sys.sql_modules 視圖也是使用系統函數object_definition 來獲取代碼不幸的是,下面的代碼無法工作

select object_definition(object_id('object_definition'))

我碰巧記得有一個廢棄的視圖可以代替sys.sql_modules,sys.syscomments 視圖我們看一下獲取到的代碼

select object_definition(object_id('sys.syscomments'))
SELECT    o.id AS id,      convert(smallint, case when o.type in ('P', 'RF') then 1 else 0 end) AS number,      s.colid,    s.status,      convert(varbinary(8000), s.text) AS ctext,      convert(smallint, 2 + 4 * (s.status & 1)) AS texttype,      convert(smallint, 0) AS language,      sysconv(bit, s.status & 1) AS encrypted,      sysconv(bit, 0) AS compressed,      s.text  FROM    sys.sysschobjs oCROSS APPLY    OpenRowset(TABLE SQLSRC, o.id, 0) s  WHERE    o.nsclass = 0 AND    o.pclass = 1 AND    o.type IN ('C','D','P','R','V','X','FN','IF','TF','RF','IS','TR') AND    has_access('CO', o.id) = 1  UNION ALL  SELECT    c.object_id AS id,      convert(smallint, c.column_id) AS number,      s.colid,    s.status,      convert(varbinary(8000), s.text) AS ctext,      convert(smallint, 2 + 4 * (s.status & 1)) AS texttype,      convert(smallint, 0) AS language,      sysconv(bit, s.status & 1) AS encrypted,      sysconv(bit, 0) AS compressed,      s.text  FROM    sys.computed_columns cCROSS APPLY    OpenRowset(TABLE SQLSRC, c.object_id, c.column_id) s  UNION ALL  SELECT    p.object_id AS id,      convert(smallint, p.procedure_number) AS number,      s.colid,    s.status,      convert(varbinary(8000), s.text) AS ctext,      convert(smallint, 2 + 4 * (s.status & 1)) AS texttype,      convert(smallint, 0) AS language,      sysconv(bit, s.status & 1) AS encrypted,      sysconv(bit, 0) AS compressed,      s.text  FROM    sys.numbered_procedures pCROSS APPLY    OpenRowset(TABLE SQLSRC, p.object_id, p.procedure_number) s  UNION ALL  SELECT    o.id AS id,      convert(smallint, case when o.type in ('P', 'RF') then 1 else 0 end) AS number,      s.colid,    s.status,      convert(varbinary(8000), s.text) AS ctext,      convert(smallint, 2) AS texttype,      convert(smallint, 0) AS language,      sysconv(bit, 0) AS encrypted,      sysconv(bit, 0) AS compressed,      s.text  FROM    sys.sysobjrdb oCROSS APPLY    OpenRowset(TABLE SQLSRC, o.id, 0) s  WHERE    db_id() = 1 AND     o.type IN ('P','V','X','FN','IF','TF')

很令人失望,他不使用object_definition, 而是使用另一個內部函數格式是OpenRowset(TABLE SQLSRC, o.id, 0)。我不會輕易放棄 --我對 OpenRowset(TABLE RSCPROP)函數進行逆向

讓我們使用不同的方法去解決這個問題。在SQLSERVER里面任何東西的存儲都使用8KB頁面的固定格式。當存儲過程不是加密的,他們一定以明文存儲在數據庫的某個地方--只是我們不知道在哪個地方。

我們分離數據庫并使用hex編輯器進行破解(我推薦使用HxD這個hex編輯器)

HxD hex編輯器下載:

http://files.cnblogs.com/lyhabc/HxDhex%E7%BC%96%E8%BE%91%E5%99%A8.rar

我們為了要找到存儲過程的位置,我在存儲過程里故意使用“SELECT ‘AABBCC’ 這個字符串以便于我們能夠容易的找到存儲過程的所在位置:

我們找到了:

好了,我們現在代碼是存儲在數據庫里面。數據存儲在偏移位置為0x00101AF0 的數據文件里。十進制值是01055472。我們知道數據頁面是8KB,我們可以計算代碼所在的頁面編號

01055472 / 8192 = 128

現在我們知道代碼存儲在頁面號128頁上 --我們重新附加數據庫,使用DBCC PAGE看一下頁面內容:

--只顯示數據頁面頭DBCC TRACEON (3604)GODBCC PAGE(Test2, 1, 128, 0)GO

注意,對于DBCC PAGE 命令我使用了頁面樣式0作為執行。在這里我只想查看數據頁面頭--那里會有一些有趣的東西

正如所料,這是一個正常的數據頁面,m_type 字段顯示的值為1(type id為1表示這是數據庫內部的數據頁面)更有趣的是,我們可以看到頁面屬于object ID 60!我們看一下object ID 60是什么對象:

select * from sys.sysobjects where id = 60

讓我們看看sys.sysobjvalues的內容。注意,當你查詢sys.sysobjvalues視圖的時候,需要使用DAC連接,可以看到他實際上是一個內部的系統表:

select * from sys.sysobjvalues

這里顯示的很多內容我們都不需要關心,不過我們需要嘗試過濾出我們的存儲過程object ID為2105058535的信息:

select * from sys.sysobjvalues where objid = 2105058535

我想知道imageval 列包含了什么內容,如果我沒有記錯 0x2D2D 在ASCII里面應該是“-”這提醒了我 XYZ這個存儲過程剛開始的時候 ,我們嘗試將這列的值轉換為我們可讀的形式

select convert(varchar(max), imageval) from sys.sysobjvalues where objid = 2105058535

親愛的讀者,這就是XYZ存儲過程的源代碼,他存儲在sys.sysobjvalues系統表中。作為最后一個例子,下面是不依靠object_definition()函數和sys.sql_modules視圖從而檢索出用戶存儲過程的源代碼列表

select    p.name,    cast(v.imageval as varchar(MAX))from    sys.procedures pinner join    sys.sysobjvalues v on p.object_id = v.objid

第十五篇完


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕在线观看亚洲| 欧美丝袜一区二区三区| 国产精品久久久久福利| 精品国产一区二区三区在线观看| 欧美日韩国产色| 欧美巨乳美女视频| 久久精品视频播放| 狠狠综合久久av一区二区小说| 久久这里只有精品视频首页| 俺去啦;欧美日韩| 欧美午夜久久久| 情事1991在线| 正在播放国产一区| 在线成人激情黄色| 亚洲国产成人av在线| 国产精品日韩专区| 91久久综合亚洲鲁鲁五月天| 在线播放国产精品| 国产视频丨精品|在线观看| 神马久久桃色视频| 国产精品久久婷婷六月丁香| 国产精品白丝jk喷水视频一区| 92看片淫黄大片欧美看国产片| 国产日产亚洲精品| 国产在线拍偷自揄拍精品| 国产aaa精品| 欧美电影免费播放| 日本午夜人人精品| 久久久噜噜噜久久| 欧美日韩成人在线视频| 国产精品xxx视频| 色偷偷综合社区| 亚洲综合成人婷婷小说| 国产99久久精品一区二区 夜夜躁日日躁| 精品久久香蕉国产线看观看gif| 久久99久久久久久久噜噜| 91精品久久久久久久久久久久久久| 国产精品偷伦一区二区| 亚洲日本欧美日韩高观看| 亚洲国产精品电影在线观看| 国产日韩欧美夫妻视频在线观看| 在线成人激情黄色| 亚洲激情免费观看| 51视频国产精品一区二区| 精品精品国产国产自在线| 亚洲综合小说区| 国产999精品久久久| 91wwwcom在线观看| 欧美日韩中国免费专区在线看| 视频在线一区二区| 麻豆一区二区在线观看| 91沈先生在线观看| 日韩男女性生活视频| 国产精品h在线观看| 亚洲热线99精品视频| 91国内在线视频| 亚洲精品久久久久久久久久久久| 国产欧美一区二区三区久久人妖| 日韩一级裸体免费视频| 亚洲国产日韩欧美在线图片| 亚洲自拍偷拍第一页| 亚洲一区二区少妇| 亚洲成人久久一区| 日韩精品视频在线| 久久亚洲精品国产亚洲老地址| 91人人爽人人爽人人精88v| 国产女人18毛片水18精品| 国产精品情侣自拍| 成人午夜激情免费视频| 精品国产乱码久久久久久天美| 激情久久av一区av二区av三区| 欧美香蕉大胸在线视频观看| 丝袜美腿精品国产二区| 日韩av不卡电影| 国产成人在线一区二区| 懂色av一区二区三区| 日韩天堂在线视频| 欧美丝袜一区二区| 国产精品美女久久| 成人午夜黄色影院| 日韩在线观看视频免费| 一本色道久久综合狠狠躁篇的优点| 久久精品在线视频| 中文字幕日韩欧美在线视频| 亚洲性生活视频| 国产成人精品电影久久久| 91亚洲精品一区| 中文字幕av日韩| 狠狠躁夜夜躁人人爽超碰91| 国内精品小视频在线观看| 欧美黄色性视频| 欧美大码xxxx| 性色av香蕉一区二区| 亚洲二区在线播放视频| 亚洲精品一区久久久久久| 国产精品91在线| 久久精品电影网| 成人黄色av网| 97热在线精品视频在线观看| 久久九九亚洲综合| 亚洲电影免费观看高清完整版| 国产精品久久久久久婷婷天堂| 久久久www成人免费精品| 欧美性xxxx极品高清hd直播| 久久久久久香蕉网| 亲子乱一区二区三区电影| 久久人人爽亚洲精品天堂| 中文字幕无线精品亚洲乱码一区| 欧美疯狂性受xxxxx另类| 欧美日韩中文在线观看| 欧美国产视频一区二区| 欧美怡红院视频一区二区三区| 国产精品爱啪在线线免费观看| 日韩电视剧在线观看免费网站| 国产成人精品免高潮费视频| 欧美日韩中国免费专区在线看| 亚洲精美色品网站| 欧美日韩国产专区| 深夜福利日韩在线看| 午夜精品国产精品大乳美女| 91久久国产精品| 国产精品久久久| 日韩国产欧美区| 91精品国产综合久久香蕉922| 欧美激情精品久久久久久变态| 伊人久久免费视频| 欧美亚洲成人精品| 国产69精品99久久久久久宅男| 久久精品中文字幕一区| 亚洲va国产va天堂va久久| 91久久精品美女| 亚洲第一级黄色片| 欧美激情xxxxx| 亚洲成人激情图| 欧美日韩亚洲视频| 亚洲欧美日本伦理| 亚洲欧洲国产一区| 亚洲xxx视频| 国产精品第8页| 亚洲精品国产综合久久| 国产日韩欧美在线观看| 国产午夜精品一区理论片飘花| 性欧美xxxx视频在线观看| 欧美激情手机在线视频| 国产91成人在在线播放| 成人亚洲欧美一区二区三区| 狠狠色噜噜狠狠狠狠97| 亚洲精品乱码久久久久久金桔影视| 久久久这里只有精品视频| 日韩在线观看高清| 亚洲国产精久久久久久| 久久久久久国产精品三级玉女聊斋| 久久久久久国产免费| 久久影院模特热| 91高清视频免费| 欧美最猛性xxxx| 亚洲精品欧美极品| 在线观看久久av| 97国产成人精品视频| 国产精品免费网站| 欧美成人手机在线| 欧美日韩国产精品一区二区不卡中文| 成人午夜黄色影院| 午夜精品久久久久久久男人的天堂|