Académique Documents
Professionnel Documents
Culture Documents
com/bbed/
FORUMS TUTORIELS MAGAZINE FAQ BLOGS CHAT NEWSLETTER ÉTUDES EMPLOI CLUB
ALM Java .NET Dév. Web EDI Programmation SGBD Office Solutions d'entreprise Applications Mobiles Systèmes
SGBD 4D Access Big Data DB2 Firebird InterBase MySQL NoSQL PostgreSQL Oracle Sybase SQL-Server
ACCUEIL ORACLE FORUM ORACLE F.A.Q ORACLE TUTORIELS ORACLE TUTORIELS SQL SCRIPTS SQL LIVRES ORACLE QUIZ
L'utilisation de BBED est strictement déconseillée dans une base de production, il ne doit être utilisé que par un expert Oracle.
I. Introduction
II. Installation de bbed
III. Paramétrage de BBED
V. Les commandes de bbed
A. HELP
B. SHOW
C. SET
D. (I)NFO
E. MAP
F. (D)UMP
G. (P)RINT
H. E(X)AMINE
I. (F)IND
J. COPY
K. (M)ODIFY
L. ASSIGN
M. SUM
N. PUSH/POP
O. REVERT
P. UNDO
Q. VERIFY
R. CORRUPT
VI. Quelques Exemples
A. Modification des données
B. Récupération d'une ligne supprimée
VII. Remerciements
I. Introduction
Cet article concerne un outil utilisé par le support oracle : BBED. Son rôle est d'éditer les blocs de données oracle et de comprendre
leurs structures. Son utilisation est strictement déconseillée pour un non expert oracle car il peut corrompre votre base de données.
De plus, il est protégé par un mot de passe.
Sous Unix et linux le code objet de bbed est déjà installé mais non compilé, pour cela, il faut lancer :
Pour utiliser bbed, il faudrait saisir le mot de passe. Pour le trouver, il suffit d'éditer le fichier bbed.exe par un éditeur hexadécimal et
En utilisant ce site, vous acceptez l'utilisation de cookies permettant de vous proposer des contenus et des services adaptés à vos centres d'intérêts -
J'accepte
Pour accéder à bbed, il faut lancer bbed en renseignant le paramètre parfile, puis saisir le mot de passe.
(Je pense que vous l'aviez trouvé, sinon, bbed n'est pas pour vous)
C:\bbed>bbed parfile=bbed.par
Mot de passe :
MODE : définit le mode à utiliser, edit pour le mode d'édition et browse pour le mode de visualisation.
FILE#||''||NAME||''||BYTES
-----------------------------------------------------------------
1 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\SYSTEM01.DBF 534773760
2 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\UNDOTBS01.DBF 36700160
3 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\SYSAUX01.DBF 272629760
4 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\USERS01.DBF 5242880
5 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\EXAMPLE01.DBF 104857600
6 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF 31457280
6 ligne(s) sélectionnée(s).
blocksize = 8192
listfile=c:\bbed\files.log
mode=browse
A. HELP
La première commande que vous pouvez lancer est : HELP ALL.
En utilisant ce site, vous acceptez l'utilisation de cookies permettant de vous proposer des contenus et des services adaptés à vos centres d'intérêts -
J'accepte
B. SHOW
La commande SHOW, affiche les paramètres de bbed.
BBED> show
FILE# 1
BLOCK# 1
OFFSET 0
DBA 0x00400001 (4194305 1,1)
FILENAME E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\SYSTEM01.DBF
BIFILE bifile.bbd
LISTFILE c:/bbed/files.log
BLOCKSIZE 512
MODE Edit
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 80
COUNT 512
LOGFILE log.bbd
SPOOL No
C. SET
SET DBA assigne l'adresse du bloc de données.
En utilisant ce site, vous acceptez l'utilisation de cookies permettant de vous proposer des contenus et des services adaptés à vos centres d'intérêts -
J'accepte
SET BLOCKSIZE assigne la taille du bloc. La taille du bloc doit être la même taille utilisée pendant la création du fichier de données.
SET COUNT fixe le nombre d'octets à afficher dans l'écran par la commande DUMP.
SET MODE fixe le mode de bbed. BROWSE pour la consultation et EDIT pour l'édition.
D. (I)NFO
La commande INFO, affiche les fichiers de données qui se trouvent dans files.log.
BBED> INFO
File# Name Size(blks)
----- ---- ----------
1 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\SYSTEM01.DBF 1024000
2 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\UNDOTBS01.DBF 71680
3 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\SYSAUX01.DBF 491520
4 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\USERS01.DBF 10240
5 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\EXAMPLE01.DBF 204800
6 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF 204800
E. MAP
La commande map affiche la carte du bloc en cours. Elle peut être combinée avec l'option /v pour avoir plus d'information.
Si la taille du bloc n'est pas bien définie pour le fichier de données en cours, vous aurez le message suivant :
BBED> map
File: E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF (6)
Block: 3 Dba:0x01800003
------------------------------------------------------------
BBED-00400: invalid blocktype (00)
On aura le même message si c'est le premier bloc, car il contient des informations OS et non pas Oracle.
BBED> map
File: E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF (6)
Block: 2 Dba:0x01800002
------------------------------------------------------------
Data File Header
BBED> map /v
File: E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF (6)
Block: 2 Dba:0x0180000
-----------------------------------------------------------
Data File Header
On peut faire un MAP en mentionnant le dba, le nom du fichier de données, le numéro de fichier de données ou le numéro de bloc.
F. (D)UMP
La commande DUMP décharge le bloc en cours sur votre écran.
BBED> dump
File: E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF (6)
Block: 29 Offsets: 0 to 511 Dba:0x0180001d
------------------------------------------------------------------------
06a20000 1c008001 cd670d00 00000104 96370000 01000000 eacf0000 cd670d00
00000000 02003200 19008001 09001600 6d010000 b6008000 20013600 00a00000
42630d00 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00010100 ffff1400 901f7b1f 7b1f0000 0100901f 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
(32 bytes per line)
En utilisant ce site, vous acceptez l'utilisation de cookies permettant de vous proposer des contenus et des services adaptés à vos centres d'intérêts -
J'accepte
G. (P)RINT
C'est la plus utilisées, elle consiste à afficher la structure de données dans une format brute ou dans une format bien structurée. On
peut mentionner les options DBA, Filename, File, Block et/ou Offset.
Comme la commande MAP nous montrent les structures des blocs, la commande PRINT nous donne en détail la structure de ces
blocs.
BBED> p
kcbh.type_kcbh
--------------
ub1 type_kcbh @0 0x06
Il est possible d'utilise la commande PRINT pour afficher les structures de données individuellement en spécifiant le nom de la
structure. Par exemple, pour afficher la structure de l'entête du bloc :
BBED> p kcbh
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06
ub1 frmt_kcbh @1 0xa2
ub1 spare1_kcbh @2 0x00
ub1 spare2_kcbh @3 0x00
ub4 rdba_kcbh @4 0x0180001c
ub4 bas_kcbh @8 0x000d67cd
ub2 wrp_kcbh @12 0x0000
ub1 seq_kcbh @14 0x01
ub1 flg_kcbh @15 0x04 (KCBHFCKV)
ub2 chkval_kcbh @16 0x3796
ub2 spare3_kcbh @18 0x0000
BBED> p kdbh
struct kdbh, 14 bytes @92
ub1 kdbhflag @92 0x00 (NONE)
b1 kdbhntab @93 0
b2 kdbhnrow @94 0
sb2 kdbhfrre @96 0
sb2 kdbhfsbo @98 0
sb2 kdbhfseo @100 256
b2 kdbhavsp @102 1
b2 kdbhtosp @104 -1
On peut être plus précis en affichant qu'un seul élément de la structure de données.
BBED> p kdbhnrow
b2 kdbhnrow @94 0
BBED> p *kdbr[0]
rowdata[0]
----------
ub1 rowdata[0] @106 0x0e
En utilisant ce site, vous acceptez l'utilisation de cookies permettant de vous proposer des contenus et des services adaptés à vos centres d'intérêts -
J'accepte
freespace[22]
-------------
ub1 freespace[22] @128 0x5d
H. E(X)AMINE
La commande EXAMINE affiche les données d'un bloc depuis une format brute. Comme la commande PRINT, elle ne peut pas
interpréter les structures de données, par contre, elle peut être utilisées pour afficher l'information d'une ligne. Si on connaît le type
de données de la ligne, on peut facilement retrouver complètement la ligne depuis un bloc.
Switch Format
/b b1, ub1 (byte)
/h b2, ub2 (half-word)
/w b4, ub4 (word)
/l b8, ub8 (long)
/r Oracle table/index row
Pour afficher la ligne d'une table
BBED> p *kdbr[3]
rowdata[36]
-----------
ub1 rowdata[36] @4044 0x2c
BBED> x /rcnn
rowdata[36] @4044
-----------
flag@4044: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@4045: 0x01
cols@4046: 1
Pour afficher plusieurs lignes d'une table, on utilise la commande (ici 3 lignes):
BBED> x /3rcnn
I. (F)IND
La commande FIND est utilisées pour trouver une donnée dans un bloc. On peut chercher une valeur hexadécimal, chaîne de
caractères ou numérique. On peut chercher depuis le début du bloc (offset 0) en utilisant le directive TOP, ou depuis la position en
cours en utilisant CURR.
En utilisant ce site, vous acceptez l'utilisation de cookies permettant de vous proposer des contenus et des services adaptés à vos centres d'intérêts -
J'accepte
BBED à trouver la chaîne de caractères dans l'offset 4060. On peut le vérifier par la commande DUMP :
J. COPY
La commande COPY est utilisée pour copier un bloc d'un emplacement à un autre. Par exemple, pour copier le bloc 20 du fichier 5
vers le fichier 4 :
K. (M)ODIFY
La commande MODIFY est utilisée pour modifier une donnée dans un bloc. On peut utiliser les mêmes switches que la commande
FIND.
L. ASSIGN
La commande ASSIGN, effectue un assignement symbolique. Par exemple la commande suivante, assigne une structure depuis
l'offset courant au fichier 9, bloc 2, première entrée ITL.
M. SUM
La commande SUM est utilisée pour vérifier est appliquer le checksum d'un bloc. On peut toujours spécifier dans la commande les
options DBA, Filename, File, Block et/ou Offset. S'ils ne sont pas spécifiés, le fichier, le bloc et l'offset en cours qui sont pris en
comptes.
N. PUSH/POP
En utilisant ce site, vous acceptez l'utilisation de cookies permettant de vous proposer des contenus et des services adaptés à vos centres d'intérêts -
J'accepte
BBED> pop
DBA 0x02400004 (37748740 9,4)
OFFSET 4060
On utilise la commande POP ALL pour supprimer toutes les entrées effectués par PUSH.
O. REVERT
La commande REVERT est utilisé pour restaurer un numéro de fichier, un nom de fichier, un bloc ou le DBA dans leurs états d'origine,
c'est à dire, au démarrage de bbed.
P. UNDO
La commande UNDO annule la dernière modification. Ici un exemple d'utilisation de la commande UNDO :
BBED> undo
BBED> modify /x 41323653 filename 'E:\oracle\product\10.2.0\ORADATA\B10R2\REF.DB
F' block 4. offset 4060.
File: E:\oracle\product\10.2.0\ORADATA\B10R2\REF.DBF (9)
Block: 4 Offsets: 4060 to 4095 Dba:0x02400004
------------------------------------------------------------------------
41323653 20202020 2c010108 41342020 20202020 2c010108 41323920 20202020
01063b99
Q. VERIFY
La commande VERIFY est utilisé pour vérifier l'intégrité du bloc de données. Elle effectue la même fonction que l'utilitaire DBVERIFY.
En utilisant ce site, vous acceptez l'utilisation de cookies permettant de vous proposer des contenus et des services adaptés à vos centres d'intérêts -
J'accepte
FILE = E:\oracle\product\10.2.0\ORADATA\B10R2\DVP.DBF
BLOCK = 28
R. CORRUPT
La commande CORRUPT est utilisé pour marquer un bloc comme corrompu. Par exemple :
idea La commande UNDO n'annule pas une bloc marqué corrompu. C'est la commande REVERT qui le fait.
NOM
--------------------
Developpez
ROWID
------------------
AAANQYAAGAAAAjGAAA
Pour trouver le numéro de fichier de données et le numéro de bloc contenant la valeur Developpez, on utilise le paquetage
DBMS_ROWID.
DBMS_ROWID.ROWID_RELATIVE_FNO('AAANQYAAGAAAAJGAAA')
---------------------------------------------------
6
Le numéro de bloc est 2246 + 1 = 2247 , car dans BBED il faut toujours ajouter le premier bloc contenant les informations OS
DBMS_ROWID.ROWID_BLOCK_NUMBER('AAANQYAAGAAAAJGAAA')
---------------------------------------------------
2246
On utilise la commande dump pour vérifier le mot recherché, et repérer l'offset exacte des données à modifier.
Ici, on va modifier le mot Developpez par le mot MarcLussac, le commutateur /c indique une modification d'une chaîne de caractères.
Avant qu'Oracle puisse lire le bloc, le checksum du bloc doit être mis à jours. La commande SUM est utilisée pour vérifier et initialiser
le checksum du bloc.
NOM
--------------------
Developpez
Système modifié.
NOM
--------------------
MarcLussac
Ce qui montre qu'on peut modifier des données dans une base fermé et sans avoir un compte Oracle. Il faut donc toujours protéger
En utilisant ce site, vous acceptez l'utilisation de cookies permettant de vous proposer des contenus et des services adaptés à vos centres d'intérêts -
J'accepte
Quand une ligne est supprimée, les données de la ligne ne sont pas écrasées tout de suite. La ligne est simplement marquée comme
supprimée et son statut est stocké dans l'entête de ligne (Row Header) qui occupe les premiers octets de chaque ligne.
L'entête de ligne est constitué d'un Indicateur de Ligne (Row Flag), d'un Octet de Verrous (Lock Byte) (entrée ITL) et d'un Compteur
de Ligne (Column Count). Le premier octet de l'entête de ligne détient un masque de bit (bitmask) qui contient le statut de la ligne.
Ce masque est décodé comme il suit :
Dans ce cas l'Idicateur de Ligne est 32 + 8 + 4 = 44 = 0x2c. On peut voir un échantillon d'une décharge de bloc en lançant la
commande :
SystÞme modifié.
1 ligne créée.
SQL> commit;
Validation effectuée.
Système modifié.
On cherche le rowid de la ligne ajoutée, son numéro de fichier et son numéro de bloc.
ROWID NOM
------------------ --------------------
AAANQYAAGAAAAjHAAA SheikYerbouti
DBMS_ROWID.ROWID_RELATIVE_FNO('AAANQYAAGAAAAJHAAA')
---------------------------------------------------
6
DBMS_ROWID.ROWID_BLOCK_NUMBER('AAANQYAAGAAAAJHAAA')
---------------------------------------------------
2247
Donc la ligne ajoutée se trouve dans le fichier de données 6 et dans le bloc 2247+1=2248. On fait une recherche avec la commande
FIND pour trouver l'offset exacte et on vérifie le contenu du bloc avec la commande DUMP.
En utilisant ce site, vous acceptez l'utilisation de cookies permettant de vous proposer des contenus et des services adaptés à vos centres d'intérêts -
J'accepte
-------------------------------------------------------
53686569 6b596572 626f7574 69010641 l SheikYerbouti..A
b3 l ?
On supprime la ligne contenant le mot SheikYerbouti et on lance une décharge du bloc contenant cette ligne.
1 ligne supprimée.
SQL> commit;
Validation effectuée.
Système modifié.
Maintenant, on va trouver l'offset contenant le mot SheikYerbouti et par la commande DUMP on décharge le bloc.
Normalement, notre ligne commence depuis l'offset 8171 = 8175 - 4 (4 octet contient l'entête de ligne).
Dans ce qui suit, on modifie l'offset 8171 par la valeur 0x2c et on applique le checksum.
SystÞme modifiÚ.
NOM
--------------------
MarcLussac
SheikYerbouti
En utilisant ce site, vous acceptez l'utilisation de cookies permettant de vous proposer des contenus et des services adaptés à vos centres d'intérêts -
J'accepte
VII. Remerciements
Je tiens à remercier toute l'équipe de Developpez.com pour son aide dans la relecture et l'amélioration du présent tutoriel, en
particulier Xo pour la correction de l'orthographe.
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou
distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
En utilisant ce site, vous acceptez l'utilisation de cookies permettant de vous proposer des contenus et des services adaptés à vos centres d'intérêts -
J'accepte