Asp.net 如何解码viewstate

Asp.net 如何解码viewstate,asp.net,viewstate,Asp.net,Viewstate,我需要查看asp.net页面的viewstate的内容。我寻找了一个viewstate解码器,找到了,但它要求一个页面的url来获取它的viewstate。由于我的viewstate是在回发后形成的,并且是更新面板中操作的结果,因此我无法提供url。我需要复制并粘贴viewstate字符串,看看里面有什么。是否有工具或网站可以帮助查看viewstate的内容?使用并获取响应中的视图状态,将其粘贴到左下角的文本框中,然后解码。正如另一个人刚才提到的,这是一个base64编码的字符串。过去,我曾使用

我需要查看asp.net页面的viewstate的内容。我寻找了一个viewstate解码器,找到了,但它要求一个页面的url来获取它的viewstate。由于我的viewstate是在回发后形成的,并且是更新面板中操作的结果,因此我无法提供url。我需要复制并粘贴viewstate字符串,看看里面有什么。是否有工具或网站可以帮助查看viewstate的内容?

使用并获取响应中的视图状态,将其粘贴到左下角的文本框中,然后解码。

正如另一个人刚才提到的,这是一个base64编码的字符串。过去,我曾使用此网站对其进行解码:


您可以忽略URL字段,只需将viewstate粘贴到viewstate字符串框中即可


看起来你有一个旧版本;ASP.NET 2.0中的序列化方法发生了变化,因此请抓取

通常,如果您有机器密钥,ViewState应该是可解密的,对吗?毕竟,ASP.net需要对其进行解密,这肯定不是一个黑匣子。

这是一个在线ViewState解码器:

编辑:不幸的是,上面的链接无效-下面是另一个ViewState解码器(来自评论):


以下是ViewState可视化工具的源代码(25页)


JavaScript ViewState解析器:

解析器应该使用大多数未加密的ViewState。没有 处理.NET版本1使用的序列化格式,因为 这个版本已经非常过时,因此不太可能更新 在任何真实情况下遇到的


解析.NET ViewState

  • 对ViewState的精采一瞥,第一部分:

  • 对ViewState的精采一瞥,第二部分:


Lachlan Keown制作的在线Viewstate查看器:

这是一种将ViewState从字符串转换为状态包的“原生”.NET方式 代码如下:

public static StateBag LoadViewState(string viewState)
    {
        System.Web.UI.Page converterPage = new System.Web.UI.Page();
        HiddenFieldPageStatePersister persister = new HiddenFieldPageStatePersister(new Page());
        Type utilClass = typeof(System.Web.UI.BaseParser).Assembly.GetType("System.Web.UI.Util");
        if (utilClass != null && persister != null)
        {
            MethodInfo method = utilClass.GetMethod("DeserializeWithAssert", BindingFlags.NonPublic | BindingFlags.Static);
            if (method != null)
            {
                PropertyInfo formatterProperty = persister.GetType().GetProperty("StateFormatter", BindingFlags.NonPublic | BindingFlags.Instance);
                if (formatterProperty != null)
                {
                    IStateFormatter formatter = (IStateFormatter)formatterProperty.GetValue(persister, null);
                    if (formatter != null)
                    {
                        FieldInfo pageField = formatter.GetType().GetField("_page", BindingFlags.NonPublic | BindingFlags.Instance);
                        if (pageField != null)
                        {
                            pageField.SetValue(formatter, null);
                            try
                            {
                                Pair pair = (Pair)method.Invoke(null, new object[] { formatter, viewState });
                                if (pair != null)
                                {
                                    MethodInfo loadViewState = converterPage.GetType().GetMethod("LoadViewStateRecursive", BindingFlags.Instance | BindingFlags.NonPublic);
                                    if (loadViewState != null)
                                    {
                                        FieldInfo postback = converterPage.GetType().GetField("_isCrossPagePostBack", BindingFlags.NonPublic | BindingFlags.Instance);
                                        if (postback != null)
                                        {
                                            postback.SetValue(converterPage, true);
                                        }
                                        FieldInfo namevalue = converterPage.GetType().GetField("_requestValueCollection", BindingFlags.NonPublic | BindingFlags.Instance);
                                        if (namevalue != null)
                                        {
                                            namevalue.SetValue(converterPage, new NameValueCollection());
                                        }
                                        loadViewState.Invoke(converterPage, new object[] { ((Pair)((Pair)pair.First).Second) });
                                        FieldInfo viewStateField = typeof(Control).GetField("_viewState", BindingFlags.NonPublic | BindingFlags.Instance);
                                        if (viewStateField != null)
                                        {
                                            return (StateBag)viewStateField.GetValue(converterPage);
                                        }
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                if (ex != null)
                                {

                                }
                            }
                        }
                    }
                }
            }
        }
        return null;
    }

这是另一款2014年至今仍能正常工作的解码器:


这适用于Ignatu解码器失败的输入,“序列化数据无效”(尽管它使BinaryFormatter序列化数据未编码,只显示其长度)。

python中的最佳方法是使用此选项

用于解码ASP.NET viewstate的小型Python 3.5+库

首先安装:
pip install viewstate

>>> from viewstate import ViewState
>>> base64_encoded_viewstate = '/wEPBQVhYmNkZQ9nAgE='
>>> vs = ViewState(base64_encoded_viewstate)
>>> vs.decode()
('abcde', (True, 1))


如果你不想安装Fiddler,你也可以使用Firefox的HttpFox插件:我猜有些事情已经改变了——左下角的文本框是某种命令提示符,在viewstate中粘贴没有任何用处。我看不出这已经到哪里去了-它仍然在当前版本中吗?对于使用当前版本的Fiddler(2.5.1)的用户,现在可以通过单击顶部菜单中的TextWizard选项(或工具>TextWizard或Ctrl+E)找到此答案中描述的文本框。将ViewState粘贴到顶部框中,然后将转换更改为“从Base64”。@Chris HttpFox插件与Firefox Quantum不兼容。您知道其他附加组件吗?它是一个base64编码的序列化对象,因此解码的数据不是特别有用。最好使用一个合适的视图状态解码器。对于其他解码器,我经常会遇到解码错误。这是第一种对我有效的方法。当然,这只是一个直接的字符串解码而不是viewstate解码器,但它比目前为止的任何其他方法都让我走得更远+1非常感谢!!当然,你是对的。我的意思是,如果它是加密的,你将无法轻松解码它,以防有人偶然发现这个答案。。。ViewState从不加密。它仅仅是base64编码的。不需要密钥。@Rap在.NET 4.5中,我不能简单地对其进行base64解码。不止这些。在线工具只返回一个空字符串,而ViewState解码器会抛出某种错误。这导致人们相信,即使它本身没有加密,它的编码也不仅仅是base64。@ahwm True story。Net 4.5正在加密ViewState。16个月前我写评论时不是这样,但现在是这样了。你说得对。@Rap感谢你的澄清。这就是为什么它对我不起作用的原因,但是有很多关于如何解码它的帖子。我觉得我疯了,或者我们的内部CMS做了一些奇怪的事情。这不只是序列化数据的Base64编码版本吗?很晚了,但很好奇这是否有帮助
string str=System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(txtViewState.Text))确保您的ViewState设置为,否则这些工具(答案)都无法使用。将其添加到web.config:
以根据@David Rogers注释禁用ViewState加密。+1指向联机视图状态解码器的良好链接,使用简单且有效。感谢您的回答如果这告诉您序列化数据无效,请尝试:处理此解码器出错的部分。
格式标记:C9
未知格式标记,退出给了我一个YSOD。格式标记:9E未知格式标记,正在退出!这是我在回答问题时使用的ViewState值,在这里包括答案的基本部分,并提供链接供参考。@bluefeet还有什么要添加的?唯一重要的部分是解码器本身。另外两个回答者做了同样的事情,只发布了链接。这一个在Firefox中对我有效,即使其他viewstate解析器没有。这篇文章的链接也很受欢迎。代码对我来说很有用,但我必须添加对生成视图状态时实际涉及的程序集之一的引用。如果将其粘贴到控制台应用程序中,则需要在项目中包含对“System.Web”的引用。否则它将无法建立。。。
public static StateBag LoadViewState(string viewState)
    {
        System.Web.UI.Page converterPage = new System.Web.UI.Page();
        HiddenFieldPageStatePersister persister = new HiddenFieldPageStatePersister(new Page());
        Type utilClass = typeof(System.Web.UI.BaseParser).Assembly.GetType("System.Web.UI.Util");
        if (utilClass != null && persister != null)
        {
            MethodInfo method = utilClass.GetMethod("DeserializeWithAssert", BindingFlags.NonPublic | BindingFlags.Static);
            if (method != null)
            {
                PropertyInfo formatterProperty = persister.GetType().GetProperty("StateFormatter", BindingFlags.NonPublic | BindingFlags.Instance);
                if (formatterProperty != null)
                {
                    IStateFormatter formatter = (IStateFormatter)formatterProperty.GetValue(persister, null);
                    if (formatter != null)
                    {
                        FieldInfo pageField = formatter.GetType().GetField("_page", BindingFlags.NonPublic | BindingFlags.Instance);
                        if (pageField != null)
                        {
                            pageField.SetValue(formatter, null);
                            try
                            {
                                Pair pair = (Pair)method.Invoke(null, new object[] { formatter, viewState });
                                if (pair != null)
                                {
                                    MethodInfo loadViewState = converterPage.GetType().GetMethod("LoadViewStateRecursive", BindingFlags.Instance | BindingFlags.NonPublic);
                                    if (loadViewState != null)
                                    {
                                        FieldInfo postback = converterPage.GetType().GetField("_isCrossPagePostBack", BindingFlags.NonPublic | BindingFlags.Instance);
                                        if (postback != null)
                                        {
                                            postback.SetValue(converterPage, true);
                                        }
                                        FieldInfo namevalue = converterPage.GetType().GetField("_requestValueCollection", BindingFlags.NonPublic | BindingFlags.Instance);
                                        if (namevalue != null)
                                        {
                                            namevalue.SetValue(converterPage, new NameValueCollection());
                                        }
                                        loadViewState.Invoke(converterPage, new object[] { ((Pair)((Pair)pair.First).Second) });
                                        FieldInfo viewStateField = typeof(Control).GetField("_viewState", BindingFlags.NonPublic | BindingFlags.Instance);
                                        if (viewStateField != null)
                                        {
                                            return (StateBag)viewStateField.GetValue(converterPage);
                                        }
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                if (ex != null)
                                {

                                }
                            }
                        }
                    }
                }
            }
        }
        return null;
    }
>>> from viewstate import ViewState
>>> base64_encoded_viewstate = '/wEPBQVhYmNkZQ9nAgE='
>>> vs = ViewState(base64_encoded_viewstate)
>>> vs.decode()
('abcde', (True, 1))