【问题标题】:Reverse engineering a BerkeleyDB database对 BerkeleyDB 数据库进行逆向工程
【发布时间】:2011-08-10 14:09:23
【问题描述】:

我有一个正在尝试读取的 eBay Turbolister 数据库。通过 Perl 读取密钥给出:

ItemBLOBs
ItemBLOBs_BLOBIndex
ItemBLOBs_ItemId
Items
Items_FolderId
Items_Modified
Items_Status
ProductVariations
ProductVariations_ITEM_ID
ProductVariations_SYS_SKU
RawDescriptions
VariationPictureBLOBs
VariationPictureBLOBs_BLOBIndex
VariationPictureBLOBs_ItemId
VariationPictureBLOBs_VARIATION_VALUE
VariationPictures
VariationPictures_BLOBOrder
VariationPictures_ItemId
VariationPictures_VARIATION_VALUE
VariationSpecifics
__DATA
__SEQUENCE

读取值并不是那么成功。它给出二进制值,其添加的长度远小于数据库文件的长度。

我使用的 Perl 脚本是:

#!/usr/bin/perl
use strict;
use BerkeleyDB;

my $filename = 'database';
my %o;

tie %o, "BerkeleyDB::Btree", -Filename => $filename,
                             -Flags    => DB_RDONLY
or die "Cannot open database '$filename: $!\n";

foreach (keys %o)
      { print "$_\n" }

我的最终目标是使用 Java,但现在我什至无法使用 Java 读取密钥。

任何想法如何进行?

一个注释。为了使任何解决方案都能正常工作,我必须从 BDB Java 版切换到本机 Java 绑定。

【问题讨论】:

    标签: java perl berkeley-db


    【解决方案1】:

    我在 Java 中执行如下操作:

    public static void main(final String[] args) throws Exception
    {
        final EnvironmentConfig environmentConfig = new EnvironmentConfig();
        //setup EnvironmentConfig
    
        final DatabaseConfig primaryConfig = new DatabaseConfig();
        //setup DatabaseConfig
    
        final SecondaryConfig secondaryConfig = new SecondaryConfig();
        //setup SecondaryConfig if necessary
    
        final Database primary = environment.openDatabase(null,
                pathToDb, null, primaryConfig);
    
        final DatabaseEntry key = new DatabaseEntry(new byte[ONE_KIBIBYTE]);
        final DatabaseEntry value = new DatabaseEntry(new byte[ONE_MEBIBYTE]);
    
        final Cursor cursor = primary.openCursor(null, null);
    
        OperationStatus status = cursor.getFirst(key, value, null);
        int count = 0;
        while (status.equals(OperationStatus.SUCCESS))
        {
            ++count;
            int readId = -1;
            int size = -1;
            try
            {
                final TupleInput input = new TupleInput(value.getData(), value
                        .getOffset(), value.getSize());
                size = value.getSize();
                readId = input.readInt();
    
                //read other fields from 'input' local variable
    
                if (status.equals(OperationStatus.SUCCESS))
                {
                    status = cursor.getNext(key, value, null);
                }
            }
            catch (final Exception e)
            {
                throw new RuntimeException(e);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-09
      • 2022-01-20
      • 1970-01-01
      • 2014-09-30
      • 2014-02-22
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      相关资源
      最近更新 更多