U890帐套引入提示:“无法装载 DLL Microsoft提示您请误随意操作SQL数据库 以免对起  数据库造成不必要的麻烦 或该 DLL 所引用的某一 DLL。原因: 126(找不到指定的模块。)。”


由于SQL2000的SA密码过于简单导致,被病毒恶意修改系统存储过程。
需要以下系统存储过程恢复。
注意:该方案只支持SQL2000

use master

go


--
检查 xp_cmdshell 是否被篡改

select * from master..syscomments where object_name(id)='xp_cmdshell' and text<>'xplog70.dll'


go


--
检查其他存储过程是否被篡改

select object_name(id), * from master..syscomments where object_name(id) in



('xp_getfiledetails','xp_availablemedia','xp_dirtree','xp_fixeddrives','xp_s
ubdirs',
'xp_fileexist','xp_get_tape_devices','sp_MSgetversion','xp_enumdsn','xp_regr
ead','xp_regwrite','xp_regdeletevalue',
'xp_regaddmultistring','xp_regremovemultistring','xp_regenumkeys','xp_regenu
mvalues','xp_regdeletekey','xp_instance_regread',
'xp_instance_regwrite','xp_instance_regdeletevalue','xp_instance_regaddmulti
string','xp_instance_regremovemultistring',
'xp_instance_regenumkeys','xp_instance_regenumvalues') and text <>N'xpstar.dll'
go
-- 发现 xp_cmdshell 被篡改,执行下面语句改回来
--drop procedure xp_cmdshell
--go
--exec sp_addextendedproc N'xp_cmdshell', N'xplog70.dll'
--go
-- 然后执行下面语句验证 xp_cmdshell 是否正确
--xp_cmdshell 'dir c:\'
-- 如果该语句异常,还有可能 sql server 服务的启用账户(一般情况下是 system )没有
访问 system32\cmd.exe 文件的权限,加上权限即可


-- 发现其他存储过程被篡改,执行下面语句
--drop procedure 存储过程名称
--go
--exec sp_addextendedproc N' 存储过程名称 ', N'xpstar.dll'
 

sql server 2000 删除xp cmdshell存储过程

 存储过程是存储在 SQLServer中的预先写好的SQL语句集合,其中危险性最高的扩展存储过程就是xp_cmdshell了,它可以执行操作系统的任何指令,而SA是 Microsoft SQLServer的管理员帐号,拥有最高权限,它可以执行扩展存储过程,并获得返回值,比如执行:

exec master..xp_cmdshell 'net user test 1234 /add'和exec master..xp_cmdshell 'net localgroup administrators test /add'

这样对方的系统就被添加了一个用户名为test,密码为1234,有管理员权限的用户,如图一所示。

删除方法为:

到sql server的查询分析器中,试用存储过程sp_dropextendedproc就可删除xp_cmdshell这个存储过程。

格式为:EXEC sp_dropextendedproc 'xp_cmdshell'

需要时可使用sp_addextendedproc恢复

格式为:EXEC sp_addextendedproc xp_cmdshell,'xplog70.dll'。

彻底删除SQL Server2000的xp_cmdShell扩展存贮过程

一、xp_cmdshell的删除及恢复

1、判断xp_cmdshell是否存在

(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = 'X' AND name ='xp_cmdshell')

返回结果为1就ok

2、恢复xp_cmdshell的方法

删除扩展存储过过程xp_cmdshell的语句

exec sp_dropextendedproc 'xp_cmdshell'

恢复cmdshell的sql语句

exec sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'
exec master.dbo.addextendedproc 'xp_cmdshell','xplog70.dll';select count(*) from master.dbo.sysobjects where xtype='x' and

返回结果为1就ok

否则需上传c:\inetput\web\xplog70.dll后

exec master.dbo.sp_addextendedproc 'xp_cmdshell',’c:\inetput\web\xplog70.dll’;--

注:这个方式适用于在webshell中上传。。。。。

如果是用以下方法删除

drop procedure sp_addextendedproc
drop procedure sp_oacreate
exec sp_dropextendedproc 'xp_cmdshell'

则可以用以下语句恢复

dbcc addextendedproc ("sp_oacreate","odsole70.dll")
dbcc addextendedproc ("xp_cmdshell","xplog70.dll")

这样可以直接恢复,不用去管sp_addextendedproc是不是存在

3.彻底删除xp_cmdshell扩展存储过程

使用上面介绍的删除语句后,在磁盘上找到xplog70.dll这个文件。改名或者删除这个文件。

 

未能找到存储过程 master.dbo.sp_addextendedproc 解决办法

 (注: 打开 开始-------程序-----Microsoft SQL Server----查询分析器-----输入用户户和密码,确定)
use master
go
create procedure sp_addextendedproc
@functname nvarchar(517),
@dllname varchar(255)
as
set implicit_transactions off
if @@trancount > 0
begin
raiserror(15002,-1,-1,'sp_addextendedproc')
return (1)
end
dbcc addextendedproc( @functname, @dllname)
return (0)