数据库中了勒索病毒怎么办?(数据库恢复的终极大招DUL)
wptr33 2024-12-26 17:07 24 浏览
接上文,如果数据库中了勒索病毒,并且备份也同样被攻陷,那该怎么办?以最为常见的Lockbit3.0为例,LockBit采用先进的加密算法,通常是对称密钥加密和非对称密钥加密的组合。这使得被感染的系统中的文件无法被正常访问,想破解几乎是不可能的。只能支付赎金来获取解密工具来解密!如果你的数据库被勒索病毒加密,又不想缴纳昂贵的赎金?如何最大限度的恢复数据呢?这里就会使用到oracle数据恢复的最终大招了DUL(Data Unloader)!
1.DUL介绍
DUL是Data Unloader的缩写,Oracle内部恢复工具,为Oracle公司工程师Bernard van Duijnen 开发(带van 估计德国裔),以标准C写成,在不同平台上会使用不同的binary文件,可以直接从Oracle的数据文件中读取数据,转换为DMP或文本格式输出,在特殊情况下可以用来进行数据恢复,而且即使数据文件有坏块或者加密块,DUL也不会中断导出,只是会记录下来,并继续下个block的数据导出。由于bernard van duijnen 开发DUL的时候使用了一些Oracle数据库的内核头文件(主要是一些.h)文件,所以在Oracle来说DUL是需要被严格控制的,因为DUL直接用了Oracle数据库的源代码,属于Oracle知识产权的一部分。 起初这个工具仅在Oracle内部流通,但是逐渐的,DUL也开始流入民间,被一些资深Oracle工程师所使用。随着数据库版本的变化,DUL工具也在逐渐升级之中,对应Oracle8 / Oracle8i / Oracle9i / Oracle10g都有其相应版本;在oracle内网有专门的网站,but现在该网站已经不可访问。
早期DUL是不加锁的,后来变成加日期锁,就是说 好比bernard.van.duijnen 在10月1日发布了一个版本,日期锁是30天,那么这个版本到11月1日基本就失效了, DUL不是简单的读OS时间,所以改OS时间是没用的。 因为Oracle的datafile里也记录了一个当前时间,所以DUL读的是datafile里的时间。 一般用户不可能为了用DUL去改那个时间。
如果超过了时间dul则无法运行,有如下报错
Ps :看了这位老哥的LinkedIn 目前是Oracle的Senior Principal Software Engineer,已经在O记工作了30多年了!
2.DUL抽数范例
具体操作步骤如下:
2.1 下载并解压dul脚本
--创建一个目录存放脚本及执行过程中生成的文件
[testdb]$mkdir dul
[testdb]$mv dul4x86_64-linux.ol4.tar ./dul/
[testdb]$cd dul
[testdb]$tar -xvf dul4x86_64-linux.ol4.tar
dul
dul.sql
[testdb]$ls
dul dul4x86_64-linux.ol4.tar dul.sql
[testdb]$
2.2 试运行dul
--需要手动创建一个parameter file(名字为init.dul,与dul执行文件同目录)
[testdb]$./dul
Data UnLoader: 12.0.0.0.5 - Internal Only - on Tue Jun 30 14:28:10 2020
with 64-bit io functions and the decompression option
Copyright (c) 1994 2019 Bernard van Duijnen All rights reserved.
Strictly Oracle Internal Use Only
DUL: Warning: Could not open parameter file <init.dul>
DUL: Warning: Compatible is set to 11 Values can be 6|7|8|9|10|11|12|17|18
DUL: Warning: no parameter file means no logfile
DUL: Warning: ulimit process stack size is only 20971520
DUL>
2.3 创建parameter file,名字为init.dul,与dul执行文件同目录
[testdb]$pwd
/data2/dul
[testdb]$cat init.dul
control_file=/data2/dul/control.txt <<<<<<指定dul使用的controlfile
export_mode=true <<<<<<指定dul抽取的数据保存为dmp格式(exp/imp)
2.4 创建dul使用的controlfile
1)数据库启动到mount状态
2)查询所有的数据文件信息
select TS#,file#,name from v$datafile;
3)创建空的control.txt控制文件,目录与参数文件中设定的相对应
4)将上面查出的数据文件信息保存在将上面查出的数据文件信息保存在control.txt控制文件中
[testdb]$cat control.txt
0 1 /oradata/testdb/data/SYSTEM.datafile1.dbf
1 2 /oradata/testdb/data/SYSAUX.datafile2.dbf
2 3 /oradata/testdb/data/UNDOTBS1.datafile3.dbf
4 4 /oradata/testdb/data/USERS.datafile4.dbf
5 5 /oradata/testdb/data/PERFSTAT.datafile5.dbf
6 6 /oradata/testdb/data/TIVOLIORTS.datafile6.dbf
2.5 执行dul
---确认db_id和db_name无误,链接到了正确的库
[testdb]$./dul
Data UnLoader: 12.0.0.0.5 - Internal Only - on Tue Jun 30 14:46:42 2020
with 64-bit io functions and the decompression option
Copyright (c) 1994 2019 Bernard van Duijnen All rights reserved.
Strictly Oracle Internal Use Only
DUL: Warning: Compatible is set to 11 Values can be 6|7|8|9|10|11|12|17|18
DUL: Warning: ulimit process stack size is only 20971520
Found db_id = 3036208025
Found db_name = testdb
DUL>
2.6 生成dul数据字典信息(执行bootstrap)
DUL> bootstrap;
Probing file = 1, block = 520
. unloading table BOOTSTRAP$
DUL: Warning: block number is non zero but marked deferred trying to process it anyhow
60 rows unloaded
Reading BOOTSTRAP.dat 60 entries loaded
Parsing Bootstrap$ contents
Generating dict.ddl for version 12
OBJ$: segobjno 18, file 1 block 240
TAB$: segobjno 2, tabno 1, file 1 block 144
COL$: segobjno 2, tabno 5, file 1 block 144
USER$: segobjno 10, tabno 1, file 1 block 208
Running generated file "@dict.ddl" to unload the dictionary tables
. unloading table OBJ$ 29335 rows unloaded
. unloading table TAB$ 4969 rows unloaded
. unloading table COL$ 116725 rows unloaded
. unloading table USER$ 47 rows unloaded
Reading USER.dat 47 entries loaded
Reading OBJ.dat 29335 entries loaded and sorted 29335 entries
Reading TAB.dat 4969 entries loaded
Reading COL.dat
DUL: Notice: Increased the size of DC_COLUMNS from 100000 to 132768 entries
116725 entries loaded and sorted 116725 entries
Reading BOOTSTRAP.dat 60 entries loaded
DUL: Warning: Recreating file "dict.ddl"
Generating dict.ddl for version 12
OBJ$: segobjno 18, file 1 block 240
TAB$: segobjno 2, tabno 1, file 1 block 144
COL$: segobjno 2, tabno 5, file 1 block 144
USER$: segobjno 10, tabno 1, file 1 block 208
TABPART$: segobjno 568, file 1 block 3872
INDPART$: segobjno 573, file 1 block 3912
TABCOMPART$: segobjno 590, file 1 block 4056
INDCOMPART$: segobjno 595, file 1 block 4096
TABSUBPART$: segobjno 580, file 1 block 3976
INDSUBPART$: segobjno 585, file 1 block 4016
IND$: segobjno 2, tabno 3, file 1 block 144
ICOL$: segobjno 2, tabno 4, file 1 block 144
LOB$: segobjno 2, tabno 6, file 1 block 144
COLTYPE$: segobjno 2, tabno 7, file 1 block 144
TYPE$: segobjno 495, tabno 1, file 1 block 3344
COLLECTION$: segobjno 495, tabno 2, file 1 block 3344
ATTRIBUTE$: segobjno 495, tabno 3, file 1 block 3344
LOBFRAG$: segobjno 601, file 1 block 4144
LOBCOMPPART$: segobjno 604, file 1 block 4168
UNDO$: segobjno 15, file 1 block 224
TS$: segobjno 6, tabno 2, file 1 block 176
PROPS$: segobjno 98, file 1 block 800
Running generated file "@dict.ddl" to unload the dictionary tables
. unloading table OBJ$
DUL: Warning: Recreating file "OBJ.ctl"
29335 rows unloaded
. unloading table TAB$
DUL: Warning: Recreating file "TAB.ctl"
4969 rows unloaded
. unloading table COL$
DUL: Warning: Recreating file "COL.ctl"
116725 rows unloaded
. unloading table USER$
DUL: Warning: Recreating file "USER.ctl"
47 rows unloaded
. unloading table TABPART$ 2385 rows unloaded
. unloading table INDPART$ 1180 rows unloaded
. unloading table TABCOMPART$ 112 rows unloaded
. unloading table INDCOMPART$ 0 rows unloaded
. unloading table TABSUBPART$ 4139 rows unloaded
. unloading table INDSUBPART$ 0 rows unloaded
. unloading table IND$ 4040 rows unloaded
. unloading table ICOL$ 9213 rows unloaded
. unloading table LOB$ 310 rows unloaded
. unloading table COLTYPE$ 1608 rows unloaded
. unloading table TYPE$ 1407 rows unloaded
. unloading table COLLECTION$ 385 rows unloaded
. unloading table ATTRIBUTE$ 5989 rows unloaded
. unloading table LOBFRAG$ 1 row unloaded
. unloading table LOBCOMPPART$ 0 rows unloaded
. unloading table UNDO$
DUL: Error: Trailer byte missing in negative number
DUL: Error: Column conversion failed! (type# = 2,(NUMBER))
0000000000 0203 ..
DUL: Error: Col# 11:Column Conversion driver failed
DUL: Error: while processing row 25
DUL: Error: While processing ts# 0 file# 1 block# 225
1160 rows unloaded
. unloading table TS$ 59 rows unloaded
. unloading table PROPS$ 36 rows unloaded
Reading USER.dat 47 entries loaded
Reading OBJ.dat 29335 entries loaded and sorted 29335 entries
Reading TAB.dat 4969 entries loaded
Reading COL.dat 116725 entries loaded and sorted 116725 entries
Reading TABPART.dat 2385 entries loaded and sorted 2385 entries
Reading TABCOMPART.dat 112 entries loaded and sorted 112 entries
Reading TABSUBPART.dat 4139 entries loaded and sorted 4139 entries
Reading INDPART.dat 1180 entries loaded and sorted 1180 entries
Reading INDCOMPART.dat 0 entries loaded and sorted 0 entries
Reading INDSUBPART.dat 0 entries loaded and sorted 0 entries
Reading IND.dat 4040 entries loaded
Reading LOB.dat 310 entries loaded
Reading ICOL.dat 9213 entries loaded
Reading COLTYPE.dat 1608 entries loaded
Reading TYPE.dat 1407 entries loaded
Reading ATTRIBUTE.dat 5989 entries loaded
Reading COLLECTION.dat 385 entries loaded
Reading BOOTSTRAP.dat 60 entries loaded
Reading LOBFRAG.dat 1 entries loaded and sorted 1 entries
Reading LOBCOMPPART.dat 0 entries loaded and sorted 0 entries
Reading UNDO.dat
DUL: Notice: Increased the size of DC_UNDO_SEGMENTS from 256 to 1024 entries
DUL: Notice: Increased the size of DC_UNDO_SEGMENTS from 1024 to 8192 entries
1160 entries loaded
Reading TS.dat 59 entries loaded
Reading PROPS.dat 36 entries loaded
Database character set is ZHS16GBK
Database national character set is AL16UTF16
---desc查看一下已经可以查到需要的表了
DUL> desc testdb.T_testdb_test_LOG;
Table testdb.T_testdb_test_LOG
obj#= 927171, dataobj#= 927171, ts#= 9, file#= 179, block#=1314181
tab#= 0, segcols= 9, clucols= 0
Column information:
icol# 01 segcol# 01 QRYDATE len 10 type 1 VARCHAR2 cs 852(ZHS16GBK)
icol# 02 segcol# 02 USER_ID len 10 type 1 VARCHAR2 cs 852(ZHS16GBK)
icol# 03 segcol# 03 SERIALNO len 30 type 1 VARCHAR2 cs 852(ZHS16GBK)
icol# 04 segcol# 04 QRYTIME len 8 type 1 VARCHAR2 cs 852(ZHS16GBK)
icol# 05 segcol# 05 BRANCH_ID len 10 type 1 VARCHAR2 cs 852(ZHS16GBK)
icol# 06 segcol# 06 ZONENO len 22 type 2 NUMBER(5,0)
icol# 07 segcol# 07 BRNO len 22 type 2 NUMBER(5,0)
icol# 08 segcol# 08 DSRNAME len 10 type 1 VARCHAR2 cs 852(ZHS16GBK)
icol# 09 segcol# 09 MEDIUMID len 100 type 1 VARCHAR2 cs 852(ZHS16GBK)
DUL>
2.7 抽取数据,抽出的数据文件与dul可执行文件同目录
---因为参数文件中指定了export_mode=true,所以抽取出的数据为dmp格式(exp/imp),否则抽出的数据为.dat结尾(sqlload)
DUL> unload table testdb.T_testdb_test_LOG;
. unloading table T_testdb_test_LOG 106939 rows unloaded
DUL>
---查看抽出的数据文件(本案例分别用export_mode为false和true各生成了一个文件,正常情况下选择一种就可以了)
[testdb]$pwd
/data2/dul
[testdb]$ll
-rw-r--r-- 1 oracle dba 785 6?? 30 14:57 testdb_T_testdb_test_LOG.ctl
-rw-r--r-- 1 oracle dba 12909961 6?? 30 14:57 testdb_T_testdb_test_LOG.dat <<<export_mode=false下生成的格式
-rw-r--r-- 1 oracle dba 11804793 6?? 30 15:12 testdb_T_testdb_test_LOG.dmp <<<export_mode=true下生成的格式
2.8将抽出的.dmp文件使用imp导入到一个其它正常开启的库
[testdb]$export ORACLE_SID=CBST
[testdb]$imp maintain_user/abcd1234 file=testdb_T_testdb_test_LOG.dmp log=imp_1.log full=y
Import: Release 11.2.0.3.0 - Production on Tue Jun 30 15:15:44 2020
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing option
Export file created by EXPORT:V07.00.07 via conventional path
Warning: the objects were exported by Bernard's DUL, not by you
. importing Bernard's DUL's objects into MAINTAIN_USER
. importing Bernard's DUL's objects into MAINTAIN_USER
. . importing table "T_testdb_test_LOG" 106939 rows imported
Import terminated successfully without warnings.
[testdb]$
---数据恢复成功,可以查看到数据了
[testdb]$sqlplus user/password
SQL> select count(*) from T_testdb_test_LOG;
COUNT(*)
----------
106939
SQL>
3.类似DUL的商业恢复软件
前面已经介绍DUL作为oracle内部的数据恢复工具,使用是受到严格控制的,询问过几位oracle原厂朋友,确认现在oracle内部也无法下载到最新的DUL工具,但是在早些年DUL可以使用的时候,国内一些oracle大佬或以DUL为底座或基于DUL抽数原理,做了优化和本地化适配,开发出一些类似DUL的数据抽取工具,这里列举几个:
云和恩墨老熊(熊军)的ODU
原支付宝DBA(Anysql)楼方鑫的AUL
诗檀软件刘相兵的PRM-DUL
当然如果你的数据库需要使用这些工具来恢复了,那大概率多少都是需要花点钱了,试用版本基本都有数据量,文件个数等限制。曾经使用AUL恢复被Lockbit3.0加密的数据库,基本上可以恢复95%以上的数据(毕竟还是有部分加密block无法抽取),对于已经成死马的企业来说 也是莫大的欣慰了!
最后的叮嘱:请一定做好备份!这非常重要!希望大家都不会用到DUL类工具!
相关推荐
- 开发者必看的八大Material Design开源项目
-
MaterialDesign是介于拟物和扁平之间的一种设计风格,自从它发布以来,便引起了很多开发者的关注,在这里小编介绍在Android开发者当中里最受青睐的八个MaterialDesign开源项...
- 另类插这么可爱,一定是…(另类t恤)
-
IT之家(www.ithome.com):另类插图:这么可爱,一定是…OSXMavericks和Yosemite打破了苹果对Mac操作系统传统的命名方式,使用加州的某些标志性景点来替换猫...
- Android常用ADB命令(安卓adb工具是什么)
-
杀死应用①根据包名获取APP的PIDadbshellps|grep应用包名②执行kill命令...
- 微软Mac版PowerPoint测试Reading Order Pane功能
-
IT之家5月20日消息,微软公司昨日(5月19日)发布博文,邀请Microsoft365Insiders成员,测试macOS新版PowerPoint演示文稿应用,重点引入...
- Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍
-
前言不同于iOS,Xamarin在VisualStudio中针对Android,可以直接设计使用者界面.在本篇教学文章中,笔者会针对Android的专案目录结构以及基本控制项进行介绍,包...
- 用云存储30分钟快速搭建APP,你信吗?
-
背景不管你承认与否,移动互联的时代已经到来,这是一个移动互联的时代,手机已经是当今世界上引领潮流的趋势,大型的全球化企业和中小企业都把APP程序开发纳入到他们的企业发展策略当中。但随着手机APP上传的...
- 谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果
-
Pine发自凹非寺量子位|公众号QbitAI当你拍照片时,“模特不好好配合”怎么办?...
- iOS文本编辑控件UITextField和UITextVie
-
记录一个菜鸟的IOS学习之旅,如能帮助正在学习的你,亦枫不胜荣幸;如路过的大神如指教几句,亦枫感激涕淋!细心的朋友可能已经注意到了,IOS学习之旅系列教程在本篇公众号的文章中,封面已经换成美女图片了,...
- Android入门图文教程集锦(android 入门教程)
-
Android入门视频教程集锦AndroidStudio错误gradientandroid:endXattributenotfound...
- 如何使用Android自定义复合视图(如何使用android自定义复合视图)
-
在最近的一个客户应用中,我遇到了一个需求,根据选定的值来生成指定数量的编辑框字段,这样用户可以输入人物信息。最初我的想法是把这些逻辑放到Fragment中,只是根据选中值的变化来向线性布局容器中增加编...
- 原生安卓开发app的框架frida常用关键代码定位
-
前言有时候可能会对APP进行字符串加密等操作,这样的话你的变量名等一些都被混淆了,看代码就可能无从下手...
- 教程10 | 三分钟搞定一个智能输入法程序
-
一案例描述1、考核知识点网格布局线性布局样式和主题Toast2、练习目标掌握网格布局的使用掌握Toast的使用掌握线性布局的使用...
- (Android 8.1) 功能与新特性(android的功能)
-
和你一起终身学习,这里是程序员AndroidAndroid8.1(API级别27)为用户和开发人员引入了各种新特性和功能。本文档重点介绍了开发人员的新功能。通过本章阅读,您将获取到以下内容:Andr...
- 怎样设置EditText内部文字被锁定不可删除和修改
-
在做项目的时候,我曾经遇到过这样的要求,就是跟百度贴吧客户端上的一样,在回复帖子的时候,在EditText中显示回复人的名字,而且这个名字不可以修改和删除,说白了就是不可操作,只能在后面输入内容。在E...
- 如何阻止 Android 活动启动时 EditText 获得焦点
-
技术背景在Android开发中,当活动启动时,EditText有时会自动获得焦点并弹出虚拟键盘,这可能不是用户期望的行为。为了提升用户体验,我们需要阻止...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
-
- 开发者必看的八大Material Design开源项目
- 另类插这么可爱,一定是…(另类t恤)
- Android常用ADB命令(安卓adb工具是什么)
- 微软Mac版PowerPoint测试Reading Order Pane功能
- Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍
- 用云存储30分钟快速搭建APP,你信吗?
- 谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果
- iOS文本编辑控件UITextField和UITextVie
- Android入门图文教程集锦(android 入门教程)
- 如何使用Android自定义复合视图(如何使用android自定义复合视图)
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)