一、工具简介

这里我们简单介绍下Oracle bbed工具。bbed是Block Browser and Editor(块浏览编辑器)的缩写,它是Oracle数据库在安装时一起附带的工具。一般此工具倾向于仅作为Oracle内部使用,且Oracle公司并不公开此工具使用细节。由于bbed可以对Oracle数据库中的数据块进行内容修改和破坏,因此此工具功能强大同时伴有很高的使用风险。

如果你需要使用此工具,你需要自己为此所带来的风险负责。通过此工具进行的任何修改都不会受到Oracle的官方支持。

二、bbed库连接

在bbed使用前,它需要进行编译连接。其相关代码已经在Oracle数据库安装时一起部署好了,不过它并未和安装执行文件进行关联。在进行Link操作时,你需要转到rdbms/install目录下并执行以下命令:

[oracle@service1 ~]$ cd $ORACLE_HOME/rdbms/lib

[oracle@service1 lib]$ export LANG=en

[oracle@service1 lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

Linking BBED utility (bbed)

rm -f /oracle/product/11g/db_1/rdbms/lib/bbed

gcc -o /oracle/product/11g/db_1/rdbms/lib/bbed -m64 -z noexecstack -L/oracle/product/11g/db_1/rdbms/lib/ -L/oracle/product/11g/db_1/lib/ -L/oracle/product/11g/db_1/lib/stubs/  /oracle/product

/11g/db_1/lib/s0main.o /oracle/product/11g/db_1/rdbms/lib/ssbbded.o /oracle/product/11g/db_1/rdbms/lib/sbbdpt.o `cat /oracle/product/11g/db_1/lib/ldflags`    -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -ldbtools11 -lclntsh  `cat /oracle/product/11g/db_1/lib/ldflags`    -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /oracle/product/11g/db_1/lib/ldflags`    -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnnz11 -lzt11 -lztkg11 -lclient11 -lnnetd11  -lvsn11 -lcommon11 -lgeneric11 -lmm -lsnls11 -lnls11  -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11 `cat /oracle/product/11g/db_1/lib/ldflags`    -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /oracle/product/11g/db_1/lib/ldflags`    -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lclient11 -lnnetd11  -lvsn11 -lcommon11 -lgeneric11   -lsnls11 -lnls11  -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11 -lclient11 -lnnetd11  -lvsn11 -lcommon11 -lgeneric11 -lsnls11 -lnls11  -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11   `cat /oracle/product/11g/db_1/lib/sysliblist` -Wl,-rpath,/oracle/product/11g/db_1/lib -lm    `cat /oracle/product/11g/db_1/lib/sysliblist` -ldl -lm   -L/oracle/product/11g/db_1/lib[oracle@service1 lib]$ ls -al $ORACLE_HOME/rdbms/lib/bbed

-rwxr-xr-x 1 oracle oinstall 255078 Sep  7 11:22 /oracle/product/11g/db_1/rdbms/lib/bbed

[oracle@service1 lib]$ ls -al $ORACLE_HOME/rdbms/lib/bbed

-rwxr-xr-x 1 oracle oinstall 255078 Sep  7 11:22 /oracle/product/11g/db_1/rdbms/lib/bbed

注意,11g中缺失几个相关文件,但我们实际可以从10g拷贝相关文件到11g对应目录下:

$ORACLE_HOME/rdbms/lib/sbbdpt.o

$ORACLE_HOME/rdbms/lib/ssbbded.o

$ORACLE_HOME/rdbms/mesg/bbedus.msb

你可以通过使用ls命令来查看bbed是否已经连接上了。

[oracle@service1 lib]$ ls -al $ORACLE_HOME/rdbms/lib/bbed

-rwxr-xr-x 1 oracle oinstall 255078 Sep  7 11:22 /oracle/product/11g/db_1/rdbms/lib/bbed

三、启动bbed

默认,bbed工具是被编译连接到rdbms/lib目录下的。因此并不是在通常的$ORACLE_HOME/bin目录。你可以将被连接的可执行文件移到bin目录下,或者直接在rdbms/lib目录中启动它。

[oracle@service1 lib]$ bbed

-bash: bbed: command not found

[oracle@service1 lib]$ ./bbed

Password: blockedit

 

BBED: Release 2.0.0.0.0 - Limited Production on Fri Sep 7 11:23:51 2018

 

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

 

************* !!! For Oracle Internal Use only !!! ***************

 

BBED>

  • 请注意,bbed需要提供密码才能通过使用(密码默认是blockedit)。密码保护其免于未被授权使用。这个密码是被硬编码在代码所指向的第一个dump文件中的,其实也算是个小考验,如果你找不到的话,说明你的反编译能力和底层hex的阅读能力有待提高。更需要对这个工具的使用小心谨慎。
  • 在命令行中,你可以使用一些命令项。这些命令项可以帮助你执行相关操作。其也可以允许的浏览模式下而不是在编辑模式下使用,这样也保证了你不会无意中破坏了数据文件。

下表中显示了可用的命令项:

 

命令项 描述

BLOCKSIZE 可编辑的数据文件标准块大小。

MODE bbed可运行模式(browser或edit)

SILENT 不将输出打印到标准输出上(Y或N)

SPOOL 操作记录写出到bbed.log文件 (Y或N)

LISTFILE 列出可编辑的文件

CMDFILE 可执行命令的文件名清单

BIFILE undo文件文件名。默认为bifile.bbd

LOGFILE 用户日志文件文件名。默认为log.bbd

PARFILE 列有命令项的参数文件

由于一些命令项经常执行时用到,因此建议可以使用parfile来将一般使用的命令项都存放在参数文件中。

四、带参数启动bbed

 

下面是一个bbed parfile的命令项设置(针对的是8Kbk块的小数据库)

 

目录:/oracle/product/11g/db_1/rdbms/lib

[oracle@pd bbed]$ vi bbed.par

blocksize=8192

listfile=/oracle/product/11g/db_1/rdbms/lib/fileunix.log

mode=edit

 

vi /oracle/product/11g/db_1/rdbms/lib/fileunix.log

1 /oracle/oradata/orcl/system01.dbf 786432000

2 /oracle/oradata/orcl/sysaux01.dbf 566231040

3 /oracle/oradata/orcl/undotbs01.dbf 110100480

4 /oracle/oradata/orcl/users01.dbf 5242880

5 /oracle/oradata/orcl/example01.dbf 328335360

其中上述语句可以通过以下语句实现:

SQL> select file#||' '||name||' '||bytes from v$datafile;

--------------------------------------------------------------------------------

cd /oracle/product/11g/db_1/rdbms/lib/

[oracle@service1 lib]$ ./bbed parfile=/oracle/product/11g/db_1/rdbms/lib/bbed.par

Password: blockedit

 

BBED: Release 2.0.0.0.0 - Limited Production on Fri Sep 7 14:29:22 2018

 

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

 

************* !!! For Oracle Internal Use only !!! ***************

 

BBED>

五、修改数据块小例子

 

 

 

1. 下面我们来修改数据

本例子基于11g

先声明,笔者做实验之前已经有了全集备份,也希望大家在做实验的时候做好备份。

首先补充一下基本知识,假设块大小为

8kb=8192byte

1byte=8bit

dump文件使用16进制编码

所以可以使用2个16进制编码代表1byte

因此一个块中总共有8192*2=16384个0到F的代码构成,每2位代表一个字节。

 

就来修改一下emp 表中 的 7839 这条记录修改sal为4000

[oracle@service1 ~]$ sqlplus sys/WXHWXH AS SYSDBA

SQL> select t.*,dbms_rowid.rowid_relative_fno(t.rowid) as "FNO#",dbms_rowid.rowid_block_number(t.rowid) as "BLK#",dbms_rowid.rowid_row_number(t.rowid) as "ROW#" from scott.emp t where t.empno = 7839;  2  

 

     EMPNO ENAME      JOB        MGR HIREDATE        SAL  COMM

---------- ---------- --------- ---------- ------------ ---------- ----------

    DEPTNO  FNO#     BLK#       ROW#

---------- ---------- ---------- ----------

      7839 KING       PRESIDENT       7566 17-NOV-81       5000  8888

10     4      151   8

 

先来看一下5000的十六制码是多少

SQL> select dump(5000,1016) from dual;

 

DUMP(5000,1016)

------------------

Typ=2 Len=2: c2,33

 

查看一下4000的十六进制码

SQL> select dump(4000,1016) from dual;

 

DUMP(4000,1016)

------------------

Typ=2 Len=2: c2,29

 

使用十六进制码查找一下

设置当前编辑/浏览的数据块地址

BBED> set dba 4,151

DBA             0x01000097 (16777367 4,151)

备注:set dba:

设置当前编辑/浏览的数据块地址,dba的格式:file_id,block_id,如选择4号数据文件的16号数据块:set dba 4,151

 

BBED> find /x c233

 File: /oracle/oradata/orcl/users01.dbf (4)

 Block: 151              Offsets: 7571 to 8082           Dba:0x01000097

------------------------------------------------------------------------

 c23303c2 595902c1 0b2c0108 03c24f28 044b494e 47095052 45534944 454e5403

 c24c4307 77b50b11 01010102 c233ff02 c10b2c00 0803c250 23064d49 4c4c4552

 05434c45 524b03c2 4e530777 b6011701 010102c2 0eff02c1 0b2c0008 03c25003

 04464f52 4407414e 414c5953 5403c24c 430777b5 0c030101 0102c21f ff02c115

 2c000802 c250054a 414d4553 05434c45 524b03c2 4d630777 b50c0301 010103c2

 0a33ff02 c11f2c00 0803c24f 4d054144 414d5305 434c4552 4b03c24e 590777bb

 05170101 0102c20c ff02c115 2c000803 c24f2d06 5455524e 45520853 414c4553

 4d414e03 c24d6307 77b50908 01010102 c2100180 02c11f2c 020803c2 4f28044b

 494e4709 50524553 4944454e 54ff0777 b50b1101 010102c2 29ff02c1 0b2c0008

 03c24e59 0553434f 54540741 4e414c59 535403c2 4c430777 bb041301 010102c2

 1fff02c1 152c0008 03c24e53 05434c41 524b074d 414e4147 455203c2 4f280777

 b5060901 010103c2 1933ff02 c10b2c00 0803c24d 6305424c 414b4507 4d414e41

 47455203 c24f2807 77b50501 01010103 c21d33ff 02c11f2c 000803c2 4d37064d

 41525449 4e085341 4c45534d 414e03c2 4d630777 b5091c01 010103c2 0d3302c2

 0f02c11f 2c000803 c24c4305 4a4f4e45 53074d41 4e414745 5203c24f 280777b5

 04020101 0103c21e 4cff02c1 152c0008 03c24c16 04574152 44085341 4c45534d

 

 <32 bytes per line>

 

 

BBED> set offset 7571

OFFSET          7571

 

modify

以指定的数据格式修改数据块内容

modify命令指定的数据格式同find命令

/x 十六进制

/d 十进制

/u 无符号十进制

/o 八进制

/c 字符

 

BBED> m /x c229

Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) Y

 File: /oracle/oradata/orcl/users01.dbf (4)

 Block: 151              Offsets: 7571 to 8082           Dba:0x01000097

------------------------------------------------------------------------

 c22903c2 595902c1 0b2c0108 03c24f28 044b494e 47095052 45534944 454e5403

 c24c4307 77b50b11 01010102 c233ff02 c10b2c00 0803c250 23064d49 4c4c4552

 05434c45 524b03c2 4e530777 b6011701 010102c2 0eff02c1 0b2c0008 03c25003

 04464f52 4407414e 414c5953 5403c24c 430777b5 0c030101 0102c21f ff02c115

 2c000802 c250054a 414d4553 05434c45 524b03c2 4d630777 b50c0301 010103c2

 0a33ff02 c11f2c00 0803c24f 4d054144 414d5305 434c4552 4b03c24e 590777bb

 05170101 0102c20c ff02c115 2c000803 c24f2d06 5455524e 45520853 414c4553

 4d414e03 c24d6307 77b50908 01010102 c2100180 02c11f2c 020803c2 4f28044b

 494e4709 50524553 4944454e 54ff0777 b50b1101 010102c2 29ff02c1 0b2c0008

 03c24e59 0553434f 54540741 4e414c59 535403c2 4c430777 bb041301 010102c2

 1fff02c1 152c0008 03c24e53 05434c41 524b074d 414e4147 455203c2 4f280777

 b5060901 010103c2 1933ff02 c10b2c00 0803c24d 6305424c 414b4507 4d414e41

 47455203 c24f2807 77b50501 01010103 c21d33ff 02c11f2c 000803c2 4d37064d

 41525449 4e085341 4c45534d 414e03c2 4d630777 b5091c01 010103c2 0d3302c2

 0f02c11f 2c000803 c24c4305 4a4f4e45 53074d41 4e414745 5203c24f 280777b5

 04020101 0103c21e 4cff02c1 152c0008 03c24c16 04574152 44085341 4c45534d

 

 <32 bytes per line>

 

显示或更新checksum校验值

BBED> sum dba 4,151

Check value for File 4, Block 151:

current = 0x8372, required = 0x8368

 

BBED> sum dba 4,151 apply

Check value for File 4, Block 151:

current = 0x8368, required = 0x8368

 

调用dbverify的一个函数校验block的完整性

BBED> Verify

DBVERIFY - Verification starting

FILE = /oracle/oradata/orcl/users01.dbf

BLOCK = 151

 

 

DBVERIFY - Verification complete

 

Total Blocks Examined         : 1

Total Blocks Processed (Data) : 1

Total Blocks Failing   (Data) : 0

Total Blocks Processed (Index): 0

Total Blocks Failing   (Index): 0

Total Blocks Empty            : 0

Total Blocks Marked Corrupt   : 0

Total Blocks Influx           : 0

Message 531 not found;  product=RDBMS; facility=BBED

 

 

刷新到硬盘

SQL> alter system flush buffer_cache;

 

System altered.

再次查询,数据改变

 

注意:这里修改的字节数必须和原来相同。
比如5000十六进制为c233
你不能直接修改为c21f33,这样会覆盖已有数据毁坏,出现类似下面的情况