0 sql-server encryption compression
我们正在尝试从其他人的 MS SQL 数据库导入(逆向工程)一些数据,而无需任何供应商支持。
\n过去,数据以纯文本或 RTF 格式存储,因此易于提取。但这个数据库有一些看起来“加密”的内容。如果数据采用这种格式,则另一列“zipped” = 1。我被告知他们正在压缩数据以使其低于 SQL Express 的 10GB 限制。
\n它看起来有点像这样:
\n-\xc3\x8bj\xe2\x80\x9e@D\xc3\xb7\n\xc3\xbeC}\xe2\x82\xac7!2\xe2\x80\xb9<P\xc3\x89\xc2\xbe\xc3\xad\xc2\xbe\xc3\xaa\xc3\x8d\xc3\xb4Cn\xc2\xb7\xc3\xbf~\xc2\xa66U\xc3\x85\xc2\xa9\xe2\x80\x93F\nRun Code Online (Sandbox Code Playgroud)\n关于如何解码它有什么想法吗?同一个表中还有其他行是纯文本或 RTF,但很多都是这种格式。
\n这是数据库导出的示例:
\nhttps://1drv.ms/u/s!Au6oldAhXo2M5Xt_bE9Q5iA0WdfF?e=IsuYdQ
\n其中包括它应该是什么样子的屏幕截图。
\n数据未加密;它只是使用Deflate进行压缩,这在 TSQL 中不能直接使用。TSQL COMPRESS使用 Gzip,它类似,但不严格兼容。所以在 C# 中类似:
using System.Data.SqlClient;
using System.IO;
using System.IO.Compression;
using var con = new SqlConnection("server=.;database=spmcopy;integrated security=true;multipleactiveresultsets=true");
con.Open();
var cmd = new SqlCommand("select counter, cast(cast([text] as varchar(max)) as varbinary(max)) ZippedText from notescopy where Zipped=1 ", con);
var cmdWrite = new SqlCommand("update notescopy set [text] = cast(cast(@t as varchar(max)) as text), Zipped = 0 where counter = @c",con);
var ptext = cmdWrite.Parameters.Add(new SqlParameter("@t", System.Data.SqlDbType.VarBinary, -1));
var pCounter = cmdWrite.Parameters.Add(new SqlParameter("@c", System.Data.SqlDbType.Int));
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
pCounter.Value = reader.GetInt32(0);
var compressedStream = reader.GetStream(1);
var dest = new MemoryStream();
var decompressedStream = new DeflateStream(compressedStream, CompressionMode.Decompress);
decompressedStream.CopyTo(dest);
dest.Position = 0;
ptext.Value = dest.ToArray();
cmdWrite.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)
另外,看起来您可以在 Deflate 流前面添加一个标准的 10 字节标头,以使其与 GZip 兼容,因此
select cast(decompress(cast(0x1F8B0800000000000400 as varbinary(max)) + cast(cast([text] as varchar(max)) as varbinary(max))) as varchar(max)) d
from notescopy
Run Code Online (Sandbox Code Playgroud)
看起来 DECOMPRESS 会忽略 CRC32 和 ISIZE 尾部字段(如果它们不存在),这是合规但不是强制的解压缩器行为。
| 归档时间: |
|
| 查看次数: |
761 次 |
| 最近记录: |