设为首页 收藏本站
查看: 687|回复: 0

[经验分享] 解密SQL SERVER 2005加密存储过程,函数

[复制链接]

尚未签到

发表于 2016-11-5 08:54:03 | 显示全部楼层 |阅读模式
www.diy567.com累了,去上面休息一下下,QQ空间,美文,非主流,网络日记,搞笑短信,祝福短信,热门短信,有意思啊
在SQL SERVER 2005中必须用专用管理连接才可以查看过程过程中用到的表
EG:sqlcmd -A
1>use test
2>go
1>sp_decrypt 'p_testa'
2>go
Text
----------------------
Create procedure P_testa
with encryption
as
select * from test
DSC0000.gif createPROCEDURE[dbo].[sp_decrypt]
(
@proceduresysname=NULL)
AS
SETNOCOUNTON
BEGIN
DECLARE@intProcSpacebigint,@tbigint,@maxColIDsmallint,@intEncrypted
tinyint,@procNameLengthint
select@maxColID=max(subobjid),@intEncrypted=imagevalFROM
sys.sysobjvalues
WHEREobjid=object_id(@procedure)
GROUPBYimageval

select@procNameLength=datalength(@procedure)+29
DECLARE@real_01nvarchar(max)
DECLARE@fake_01nvarchar(max)
DECLARE@fake_encrypt_01nvarchar(max)
DECLARE@real_decrypt_01nvarchar(max),@real_decrypt_01anvarchar(max)
declare@objtypevarchar(2),@ParentNamenvarchar(max)
select@real_decrypt_01a=''
--提取对象的类型如是存储过程还是函数,如果是触发器,还要得到其父对象的名称
select@objtype=type,@parentname=object_name(parent_object_id)
fromsys.objectswhere[object_id]=object_id(@procedure)
--从sys.sysobjvalues里提出加密的imageval记录
SET@real_01=(SELECTtop1imagevalFROMsys.sysobjvaluesWHEREobjid=
object_id(@procedure)andvalclass=1orderbysubobjid)
--创建一个临时表
createtable#output([ident][int]IDENTITY(1,1)NOTNULL,
[real_decrypt]NVARCHAR(MAX))
--开始一个事务,稍后回滚
BEGINTRAN
--更改原始的存储过程,用短横线替换
if@objtype='P'
SET@fake_01='ALTERPROCEDURE'+@procedure+'WITHENCRYPTIONAS
'+REPLICATE('-',40003-@procNameLength)
elseif@objtype='FN'
SET@fake_01='ALTERFUNCTION'+@procedure+'()RETURNSINTWITHENCRYPTIONASBEGINRETURN1
/*
'+REPLICATE('*',datalength(@real_01)/2-@procNameLength)+'*/END'
elseif@objtype='V'
SET@fake_01='ALTERview'+@procedure+'WITHENCRYPTIONASselect1ascol
/*
'+REPLICATE('*',datalength(@real_01)/2-@procNameLength)+'*/'
elseif@objtype='TR'
SET@fake_01='ALTERtrigger'+@procedure+'ON'+@parentname+'WITHENCRYPTIONAFTERINSERTASRAISERROR(''N'',16,10)
/*
'+REPLICATE('*',datalength(@real_01)/2-@procNameLength)+'*/'
EXECUTE(@fake_01)
--从sys.sysobjvalues里提出加密的假的
SET@fake_encrypt_01=(SELECTtop1imagevalFROMsys.sysobjvaluesWHEREobjid=
object_id(@procedure)andvalclass=1orderbysubobjid)
if@objtype='P'
SET@fake_01='CreatePROCEDURE'+@procedure+'WITHENCRYPTIONAS
'+REPLICATE('-',40003-@procNameLength)
elseif@objtype='FN'
SET@fake_01='CREATEFUNCTION'+@procedure+'()RETURNSINTWITHENCRYPTIONASBEGINRETURN1
/*
'+REPLICATE('*',datalength(@real_01)/2-@procNameLength)+'*/END'
elseif@objtype='V'
SET@fake_01='Createview'+@procedure+'WITHENCRYPTIONASselect1ascol
/*
'+REPLICATE('*',datalength(@real_01)/2-@procNameLength)+'*/'
elseif@objtype='TR'
SET@fake_01='Createtrigger'+@procedure+'ON'+@parentname+'WITHENCRYPTIONAFTERINSERTASRAISERROR(''N'',16,10)
/*
'+REPLICATE('*',datalength(@real_01)/2-@procNameLength)+'*/'
--开始计数
SET@intProcSpace=1
--使用字符填充临时变量
SET@real_decrypt_01=replicate(N'A',(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
--selectreal_decryptAS'#outputchek'from#output--测试
--
-------------------------------------
--
开始从sp_helptext提取
--
-------------------------------------
declare@dbnamesysname
,
@BlankSpaceAddedint
,
@BasePosint
,
@CurrentPosint
,
@TextLengthint
,
@LineIdint
,
@AddOnLenint
,
@LFCRint--回车换行的长度
,@DefinedLengthint
,
@SyscomTextnvarchar(4000)
,
@Linenvarchar(255)
Select@DefinedLength=255
SELECT@BlankSpaceAdded=0--跟踪行结束的空格。注意Len函数忽略了多余的空格
CREATETABLE#CommentText
(LineId
int
,
Textnvarchar(255)collatedatabase_default)
--使用#output代替sys.sysobjvalues
DECLAREms_crs_syscomCURSORLOCAL
FORSELECTreal_decryptfrom#output
ORDERBYident
FORREADONLY
--获取文本
SELECT@LFCR=2
SELECT@LineId=1
OPENms_crs_syscom
FETCHNEXTFROMms_crs_syscominto@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)
--如果找到回车
IF@CurrentPos!=0
BEGIN
--如果@Lines的长度的新值比设置的大就插入@Lines目前的内容并继续
While(isnull(LEN(@Line),0)+@BlankSpaceAdded+
@CurrentPos-@BasePos+@LFCR)>@DefinedLength
BEGIN
SELECT@AddOnLen=@DefinedLength-(isnull(LEN(@Line),0)+
@BlankSpaceAdded)
INSERT#CommentTextVALUES
(
@LineId,
isnull(@Line,N'')+isnull(SUBSTRING(@SyscomText,
@BasePos,@AddOnLen),N''))
SELECT@Line=NULL,@LineId=@LineId+1,
@BasePos=@BasePos+@AddOnLen,@BlankSpaceAdded=0
END
SELECT@Line=isnull(@Line,N'')+
isnull(SUBSTRING(@SyscomText,@BasePos,@CurrentPos-@BasePos+@LFCR),N'')
SELECT@BasePos=@CurrentPos+2
INSERT#CommentTextVALUES(@LineId,@Line)
SELECT

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-295986-1-1.html 上篇帖子: 生成索引信息及自动创建脚本(Sql Server 2000) 下篇帖子: Sql Server 2005 row_number()分页性能测试
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表