LevelDB:如何从其leveldb中读取Skype8的会话

问题描述 投票:0回答:2

Skype 8有leveldb,位于文件夹内

C:\ Users \ machine-user-name \ AppData \ Roaming \ Microsoft \ Skype for Desktop \ IndexedDB \ file__0.indexeddb.leveldb

我正在研究c#来阅读skype 8 leveldb的内容。这是我打开并迭代leveldb的所有键和值的代码。

void IteratorSkypeDb()
{
    var path = @"C:\Users\ptandukar\AppData\Roaming\Microsoft\Skype for Desktop\IndexedDB\file__0.indexeddb.leveldb";
    Options options = new Options();
    using (var db = new DB(options, path))
    {
        using (var iterator = db.CreateIterator(new ReadOptions()))
        {
            iterator.SeekToFirst();
            while (iterator.IsValid())
            {
                var key = iterator.KeyAsString();
                var value = iterator.ValueAsString();
                Console.WriteLine($"{key}-{value}");
                iterator.Next();
                }
            }
        }
    }
}

但是,我在初始化数据库时遇到了以下异常:

System.UnauthorizedAccessException:'无效参数:idb_cmp1与现有比较器不匹配:leveldb.BytewiseComparator'

任何人都可以对此有所了解吗?

仅供参考:我使用了https://github.com/Reactive-Extensions/LevelDB中的示例代码它有一个未在我的VS2017中加载的本机项目但我设法从其他链接下载leveldb.dll并将其复制到bin \ debug文件夹以运行该程序。

c# skype leveldb
2个回答
1
投票

我尝试过使用https://github.com/tg123/IronLeveldb取得了一些成功。唯一的问题是编码看起来很奇怪,我找不到使用这个库来读出整个数据库的方法。我将整个LevelDb文件夹复制到测试文件夹并运行以下代码:

var db = IronLeveldbBuilder.BuildFromPath(@"C:\test\leveldb");
        IEnumerable<IByteArrayKeyValuePair> data = db.SeekFirst();
        foreach (IByteArrayKeyValuePair pair in data)
        {
            Console.BackgroundColor = ConsoleColor.Blue;
            Console.WriteLine($"****{Encoding.Default.GetString(pair.Key.ToArray(), 0, pair.Key.Length)}****");
            Console.ResetColor();
            Console.WriteLine(Encoding.Default.GetString(pair.Value.ToArray(), 0, pair.Value.Length));
        }

我刚刚添加了***以使键从值中脱颖而出。结果非常有趣,我似乎还有Skype阻止(垃圾邮件)的消息。

前几个值(键值对)似乎是“列名”

C 0ÑV IðC R E中的T E d T I M E C 0ÑvËř个T I O 4 N I D C R E中的T E d T I M E C 0ÑV I D CÒùN t个小号C R E中的T E d T I M E C 0ÑvËř个T I O 4 N I D _ C 0加利吨式TýpËC R E中的T E d T I M E C 0ÑV I D M Y M(E S)个克ëC R E中的T E d T I M E C 0ÑvËř个T I O 4 N I D _ I S M Y M Ešš一克ëC R E中的T E d T I M E一L E [R吨小号C 0ÑV I D M(E S)个克即我可以通过电子邮件获取电子邮件

然后进一步谈谈一些对话数据:

**** 0 1 9:1 3 4 1 9 5 1 e a a 3 8 4 7 e 5 a 3 8 4 a f 9 5 2 a a f 0 0 d 9 @ t h r e a d。 skype 1 7 4 3 5 8 1 1 3 8 5 3 9 3 0 3 4 0 9 3 **** 1535543604069“composetime”2018-08-29T11:53:23.825Z“clientmessageid”17435811385393034093“conversationLink”zhttps:// db5-client-s.gateway.messenger.live.com/v1/users/ME/conversations/19:[email protected]"content"-我已经完成了DNS健康检查,仍有一些事情在警告或错误状态,可能是由于传播,所以将继续检查我的身边。“键入”消息“conversationid”019:[email protected]“来自”Ohttps://db5-client-s.gateway.messenger.live .com / v1 / users / ME / contacts / 8:evn26041 {$“cuid”17435811385393034093“conversationId”019:[email protected]“createdTimeN P6XXvB”creator“8:evn26041”content“ - 我做过DNS健康检查并且仍有一些事情处于警告或错误状态,可能是由于传播,所以将继续从我这边检查。“messagetypeRichText”contenttype_“properties _”_ isEphe meralF“fileEncryptionKeys”_countsTypeI“_isMyMessageI {


1
投票

您需要定义一个名为idb_cmp1的比较器。请参阅github上的文档。不清楚它是否与谷歌使用的LevelDB / IndexDB的实现有关(参见这个引用同名的so问题/答案,比较器的实现是here但似乎很复杂到重新实现太多的痛苦)

如果您只需要读取数据,并且想要读取所有数据,并且数据无序是一个问题,则可以创建名为idb_cmp1的任何比较器。未经测试的二进制比较器代码:

// Simple binary comparer
var comparator = Comparator.Create("idb_cmp1", (x, y) =>
{
    NativeArray<byte> nx = (NativeArray<byte>)x;
    NativeArray<byte> ny = (NativeArray<byte>)y;

    long count = Math.Min((long)nx.count, (long)ny.count);

    for (int i = 0; i < count; i++)
    {
        int cmp = nx[i].CompareTo(ny[i]);

        if (cmp != 0)
        {
            return cmp;
        }
    }

    return 0;
});
© www.soinside.com 2019 - 2024. All rights reserved.