2.33GB的sql数据库被后缀.[[email protected]]加密
最近几天有一个一卡通综合管理平台的数据库被勒索病毒加密了,因为整个服务器只有sql数据库是重要的,而且客户拒绝向勒索病毒的***缴纳赎金,客户联系达思科技,希望达思科技能够帮助修复数据库。
由于中了勒索病毒的客户越来越多,达思科技数据库修复团队也希望用这个案例,把整个勒索病毒加密的sql数据库修复的过程展示出来,以便帮助更多的受到勒索病毒威胁的公司降低随时。
一、SQL数据库修复前的准备工作
1.1 环境准备:
1、操作系统:推荐使用windows server2016或2019
2、SQL数据库环境:从2000开始安装(如何安装,网上有相应的教程),按照版本依次安装,可以安装SQL Server2000、2005、2008、2008R2、2012、2014、2016、2017、2019等;
3、硬盘:修SQL数据库对硬盘读写要求较高,推荐使用m.2接口(NVMe协议)的SSD固态硬盘。
内存:建议64GB以上
1.2判断SQL Server数据库的版本?
如果客户可以准确提供SQL数据库版本,就不需要自己检测版本了,如果客户不确定,我们也可以自己判断,用winhex打开sql数据库的mdf文件,跳转到第144扇区,看看00012060X4和00012060X5两个字节,看看16BIT对应的数值,就可以准确判断SQL数据库的版本,准确判断SQL版本来确定我们修复数据库时需要选择的输出环境的版本。
请看下图,本案例库数值是661,说明版本是SQL SERVER 2008R2
图一:判断数据库版本
不同SQL数据库版本对应的内部数据库版本数字如下:
SQL Server数据库版本 | 对应的内部数据库版本(数字) |
SQL Server 2017 | 869 |
SQL Server 2016 | 852 |
SQL Server 2014 | 782 |
SQL Server 2012 | 706 |
SQL Server2012 CTP1 | 684 |
SQL Server 2008 R2 | 665 |
SQL Server 2008 | 661 |
SQL Server 2005 with vardecimal enabled | 612 |
SQL Server 2005 | 611 |
SQL Server 2000 | 539 |
SQL Server 7.0 | 515 |
注意:如果前512扇区或2048或4096扇区被病毒破坏,就需要客户提供具体的数据库版本了。
1.3检测SQL数据库文件,判断修复成功率
1、打开达思SQL数据库修复软件,点击“检查文件”,测试数据库损坏程度。
图二:检测数据库文件的损坏率
打开检测文件对话框后,点击“选择文件”选取相应目录后再点击“开始检测”。
图三:检测数据库文件的损坏率
扫描结束后,重点看一下错误页和空页的数量和比例,如果空页和坏页比例小于5%以下,则数据库修复成功率更高。
图四:检测数据库文件的损坏率
请看图,本案例的空页为4720,占比为1.5%,错误页(损坏的页)为142,占比几乎为零,因此可以判断,数据库修复的成功率很高!
二、SQL数据库修复过程
1、关于参考库(为什么需要参考库?):
由于SQL数据库的损坏的不确定性,很有可能系统表结构、存储过程等重要参数受损的情况下,我们如果有同结构的好的老备份,达思软件可以把好的表结构提取出来,再把数据库填进去。
2、关于内置的表结构(达思软件打开数据库文件时对话框可选):
达思软件内置了金蝶、用友、管家婆、浪潮、思迅等品牌的数十个版本的表结构,在没有同结构的参考库的情况下,可以选择内置表结构作为参考库,以提高数据库修复的准确率和成功率。
3、达思软件修复SQL数据库的过程
在达思软件界面中选择“打开文件”,选择需要修复的损坏的sql数据库以及和坏库同结构的好数据库作为参照库,开始修复损坏的SQL数据库。
图五:打开需要修复的数据库文件
图六:打开需要修复的数据库文件
选择好需要修复的损坏的SQL数据库文件后,再选择事先准备好的相同表结构的好库做参照。
图七:数据库修复的必要选项
如果客户可以提供老的备份作为参考,就优先选择老的备份作为参考。
如果客户无法提供老的备份作为参考,则可以选择达思软件内置的版本作为参考。
如果达思软件内置也没有,这可以在客户的数据库环境下新建同结构的空库作为参考。
因此,参考库的优先级为:同一个数据库的好的老备份>同结构的的好库>达思软件内置的相同版本>相同环境下新建的表结构一样的空库
图八:自动解析数据库文件
选择完成后,点击“开始恢复”!
达思软件将会自动修复,根据不同大小以及损坏程度的不同,一般在几分钟内就可以完成展开。
SQL数据库展开后,就可以在达思软件界面中查看数据库的修复结果和数据。如下图:左侧红框中显示的是所有表,右侧蓝框中是修复后的数据库文件的解析结果报告。
图九:数据库文件解析结果报告
从左侧栏中双击某个表,可以在右侧看到修复后该表里的数据,这个时候可以检查一下重要的表数据是否正确。
图十:核对表数据是否正确
打开SQL Server2008R2,登陆SQL SERVER,附加好的参照库(提前复制出一份),然后,清空参考库里面的表数据作为接收库。
图十一:在sql server里打开参考数据库
图十二:附加好的参考库(清空表数据作为接收库)
图十三:附加好的参考库(清空表数据作为接收库)
图十四:附加好的参考库(清空表数据作为接收库)
附加完成后,右键选择该库,选择“新建查询”输入指令完成清除表数据
图十五:新建查询(清空表数据作为接收库)
清空表数据:
清空表数据,保留视图,存储过程,函数,以及保留表约束、触发器等等,可以给故障数据库预留一个好的躯壳,把坏库数据导入此躯壳。对用友、金蝶等数据库恢复有时候能达到好的效果。
清除表数据有两种方法:
一种用delete from [表名] ,这种方法对于大数据库,速度慢,会产生很大的日志信息,对于小库,速度可以忽略;
另一种是truncate table [表名] ,这种方法速度快,但清除不了具有外键的表数据。
在清除表数据时,可以采用两种方法结合。
清除表数据时先禁用一切约束,清除完成以后再次启用约束就行了。
1、 采用truncate table [表名] 清除表数据,排除具有外键属性的表,清除语句获取如下:
Use [要操作的库名字]
-----------------------------------------------------------------------
select
'alter table [' +name+ '] nocheck constraint all; alter table [' +name + '] disable trigger all;
truncate table ['+name+'];'
+ ' alter table [' +name + '] enable trigger all; alter table [' +name + '] check constraint all;
go'
from sysobjects where id not in(select parent_object_id from sys.foreign_keys ) and id not in(select referenced_object_id from sys.foreign_keys ) and type='U'
-----------------------------------------------------------------------
上述SQL语句得到的结果,再次在SQL查询分析器里运行。
2、用 delete from [表名] 清除表数据语句获取如下
Use [要操作的库名字]
-----------------------------------------------------------------------
SELECT 'alter table [' +object_name (id) + '] nocheck constraint all; alter table [' +object_name (id) + '] disable trigger all;
delete from ['+object_name (id)+'];' + '
alter table [' +object_name (id) + '] enable trigger all; alter table [' +object_name (id) + '] check constraint all;
go'
TableName from sysobjects where type='U'
-----------------------------------------------------------------------
3、 有些MS SQL Server查询分析器,对于 上述语句后面的 go ,copy出来后不自动换行,可以把运行结果保存到文本文件中,查询分析器打开以后,会自动换行。如果不自动换行,sql语句执行报错。
4、 可能遇到清除不了的某些表,查看它和哪些表关联外键,先把两个表的约束同时禁用,再用delete from [表名],完了以后,两个表同时恢复约束使用。
5、 查看清除数据是否成功彻底,用下述语句查看记录数量:
Use [要操作的库名字]
-----------------------------------------------------------------------
SELECT object_name (i.id) TableName,
rows as RowCnt
FROM sysindexes i
INNER JOIN sysObjects o
ON (o.id = i.id AND o.xType = 'U ')
WHERE indid < 2 and RowCnt>0
ORDER BY RowCnt desc
图十六:清空参考库的表数据
再从下面蓝框中,单机“TableName”,选择所有表后,右键单击复制
图十七:清空参考库的表数据作为接收库
复制完后,在上面指令栏中粘贴所有复制内容
图十八:清空参考库的表数据作为接收库
将光标点到最开始的位置,然后选择执行
图十九:清空参考库的表数据作为接收库
等待指令执行完毕后,再用最上面的查询指令查询一下结果,一般执行2-3遍后,所有表数据都会被清空(个别清除不了的情况需要逐条去清除数据)
图二十:清空参考库的表数据作为接收库
图二十一:清空参考库的表数据作为接收库
表数据清空后,用软件把数据导入到目标库里,在软件界面选择“导出数据”
图二十二:导出数据库
弹出连接设置界面,服务器名默认为:127.0.0.1(若该机器SQL SERVER版本有很多,后面需要加上“\SQL版本号”,如127.0.0.1\SQL2000或127.0.0.1\SQL2008R2来指定输出环境),
数据库名则输入清除完表数据的目标库名称。
图二十三:数据库连接设置
点击确定,继续弹出选择界面,一般情况选择全部数据类型即可,数据开始导出
图二十四:导出数据库
导出过程中,先生成所有表,目标库中这些表已经存在
图二十五:自动创建表,导出数据库
创建完所有表后,开始自动导出数据。
图二十六:导出数据库
导出的时间根表的数量以及数据库大小有关,为了提升导出的效率,推荐您使用高速的SSD固态硬盘以及大容量内存。
导出完成后,会生成导出结果报告
图二十七:导出数据库完成后生成结果报告
自此,数据库修复导出完成
最后,我们来验证一下修复的数据库是否完整?经过验证,这个客户的一卡通综合管理系统完美恢复成功!
图二十八:在一卡通综合管理平台的应用系统里验证修复后的数据库是否成功
数据库修复完成后,会自动生成MDF文件和LDF文件,把数据库导入到应用中既可以完成验证工作。