这里我们简单介绍下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,这样会覆盖已有数据毁坏,出现类似下面的情况