百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

数据库中了勒索病毒怎么办?(数据库恢复的终极大招DUL)

moboyou 2025-03-06 13:07 14 浏览

接上文,如果数据库中了勒索病毒,并且备份也同样被攻陷,那该怎么办?以最为常见的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 
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类工具!

相关推荐

声学EI要完稿?十步速写法

【推荐会议】国际声学与振动会议(ICAV)会议号:CFP23112A截稿时间:2025年4月20日召开时间/地点:2025年8月15-17日·新加坡论文集上线:会后3个月提交EiComp...

结构力学!EI会议图表规范秘籍

推荐会议:国际结构与材料工程进展大会(ISME2026)会议编号:EI#73521截稿时间:2026年3月10日召开时间/地点:2026年8月15-17日·德国柏林论文集上线:会后4...

傅里叶级数物理意义的直观理解:利用傅里叶级数逼近方波信号

上篇文章将向大家介绍频谱的概念,对傅里叶级数、傅里叶积分、傅里叶变换进行了数学的推导,并解释了它们各自的物理意义。推导过程见我的上一篇文章:频谱分析——频谱概念(傅里叶变换、级数、积分及物理意义)如下...

通过对航空发动机整机振动进行分析,有何控制方法?

前言针对航空发动机整机振动问题的复杂性和多样性,以整机振动的振源分析为出发点,总结国内外关于转子系统故障、气流激振、轴承故障、齿轮故障和结构局部共振等引起的整机振动的研究情况。结合航空发动机整机结构动...

MATLIB中使用PCA

主成分分析PCA(PrincipalComponentsAnalysis),奇异值分解SVD(Singularvaluedecomposition)是两种常用的降维方法降维致力于解决三类问题:降维...

数据处理|软件:让科研更简单2

书接上回,继续介绍免费的数据处理软件。eGPS一款热图绘制专用软件,热图就是用颜色代表数字,让数据呈现更直观,对比更明显。优点:小巧方便,基本功能齐全,包括数据转换、聚类分析、颜色调整等等缺点:常见的...

电力系统常用的通讯协议及其在Speedgoat系统中的实现

在电力系统中,IEC61850协议、DNP3协议、ModbusTCP广泛应用于远程终端设备(RTU)、智能电子设备(IED)交互以及监控和数据采集(SCADA)系统。一、IEC61850协议IE...

电子工程师的常用仿真软件

不知道从事电子行业的工程师,有没有使用模拟仿真工具,仿真软件网上又有很多,初学者,可能只知道Multisim和Proteus。一般Multisim适合在学习模拟电路和电路分析原理课程时使用,便于理解电...

技术论文|异结构混沌系统的组合同步控制及电路实现

欢迎引用[1]李贤丽,马赛,樊争先,王壮,马文峥,于婷婷.异结构混沌系统的组合同步控制及电路实现[J].自动化与仪器仪表,2022,No.276(10):80-84.DOI:10.14016/j.cn...

现场︱某110KV主变事故过程仿真分析

三峡电力职业学院、河南省电力公司洛阳供电公司的研究人员李莉、任幼逢、徐金雄、王磊,在2016年第6期《电气技术》杂志上撰文,针对某110KV变电站主变差动保护跳闸事故,结合事故相关检测数据,通过MAT...

光伏发电系统篇:单级式并网系统实时仿真

在全球积极推动清洁能源转型的大背景下,光伏发电作为重要的可再生能源利用方式,得到了广泛关注和迅猛发展。目前常用的光伏并网及光伏电站主要拓扑结构有单级式和双级式。相较于传统的多级式系统,单级式光伏发电并...

光伏发电系统篇:三电平并网逆变器实时仿真

一、三电平并网逆变器在能源转型加速的当下,分布式能源接入电网需求大增。三电平并网逆变器凭借低谐波、高功率密度等优势,有效提升电能转换效率,于新能源并网发电中担当关键角色。常见的三电平电路拓扑结构包括二...

自制3.5KW大功率逆变器,很简单,看过这个电路原理就懂了

前言拿下8000元奖金的项目,是什么水平?本项目经过联合湖南科技大学光伏逆变以及电力电子研究生团队共同探讨方案。项目成本:1200元,获得奖金:8000元!参加赛事:立创开源硬件平台_星火计划·外包赛...

圈内分享:电容式加速度计接口电路非线性建模与仿真设计

摘要:非线性是Sigma-Delta(ΣΔ)加速度计系统的关键指标之一。基于一个五阶ΣΔ加速度计结构,分析了其主要的非线性模块,在MATLAB中建立了整体结构的行为级模型,并利用根轨迹法进行了稳...

基于Matlab/Simulink建立一种Thevenin/RC电池模块仿真模型

本文以锂电池数学模型为基础,在Matlab/Simulink的仿真系统中,建立了一种Thevenin/RC电池模块仿真模型,通过实际工况试验,测试精度在允许误差范围内,为电池SOC/SOH研究提供了极...