You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用dnSpy逆向.NET DLL中DataZipCompression.LoadString算法

逆向分析.NET DLL中的DataZipCompression.LoadString方法

场景描述

我正在使用dnSpy逆向分析一个.NET DLL文件,遇到一个可将文件解压缩并解密为XML字符串的方法,核心代码片段如下:

<Module>.DataZipCompression.LoadString(
    <Module>.?A0xdbfabc02.g_pDataZipCompression, 
    ref basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>, 
    ref basic_string<char, std::char_traits<char>, std::allocator<char>>, 
    true
);

完整代码片段:

basic_string<char,std::char_traits<char>,std::allocator<char> > basic_string<char,std::char_traits<char>,std::allocator<char>_u0020>;
                        <Module>.std.basic_string<char,std::char_traits<char>,std::allocator<char> >.{ctor}(ref basic_string<char,std::char_traits<char>,std::allocator<char>_u0020>);
                        try
                        {
                            <Module>.DataZipCompression.LoadString(<Module>.?A0xdbfabc02.g_pDataZipCompression, ref basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>_u0020>4, ref basic_string<char,std::char_traits<char>,std::allocator<char>_u0020>, true);
                            byte[] array3 = new byte[<Module>.std.basic_string<char,std::char_traits<char>,std::allocator<char> >.length(ref basic_string<char,std::char_traits<char>,std::allocator<char>_u0020>)];
                            for (int i = 0; i < array3.Length; i++)
                            {
                                sbyte* ptr3 = <Module>.std.basic_string<char,std::char_traits<char>,std::allocator<char> >.[](ref basic_string<char,std::char_traits<char>,std::allocator<char>_u0020>, (uint)i);
                                array3[i] = (byte)(*ptr3);
                            }
                            UTF8Encoding utf8Encoding = new UTF8Encoding();
                            string @string = utf8Encoding.GetString(array3);
                            XmlDocument xmlDocument = new XmlDocument();
                            xmlDocument.LoadXml(@string);
                            dataContainerProperties = genericSerializer.FromXmlStringIgnoreParentName(xmlDocument.OuterXml);
                        }
                        catch
                        {
                            <Module>.___CxxCallUnwindDtor(ldftn(std.basic_string<char,std::char_traits<char>,std::allocator<char> >.{dtor}), (void*)(&basic_string<char,std::char_traits<char>,std::allocator<char>_u0020>));
                            throw;
                        }
                        <Module>.std.basic_string<char,std::char_traits<char>,std::allocator<char> >.{dtor}(ref basic_string<char,std::char_traits<char>,std::allocator<char>_u0020>);

该方法执行后,内存中会生成解压缩并解密后的XML字符串。我的目标是理解DataZipCompression.LoadString所使用的算法,从而在DLL外部复现其解压缩与解密流程。

已尝试操作

  • 使用dnSpy反编译DLL,定位到DataZipCompression类及LoadString方法
  • 分析该方法的参数与返回值
  • 尝试追踪数据在方法中的流转过程

内容的提问来源于stack exchange,提问作者Kirill Shchitaev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:40:04