سؤال

أحتاج إلى رؤية محتويات حالة العرض لصفحة asp.net.لقد بحثت عن وحدة فك التشفير، وجدت وحدة فك ترميز ViewState الخاصة بـ Fridz Onion لكنه يطلب عنوان url للصفحة للحصول على حالة العرض الخاصة به.نظرًا لأن حالة العرض الخاصة بي تتشكل بعد إعادة النشر وتأتي كنتيجة لعملية في لوحة التحديث، فلا يمكنني تقديم عنوان url.أحتاج إلى نسخ ولصق سلسلة حالة العرض ومعرفة ما بداخلها.هل توجد أداة أو موقع ويب يمكنه المساعدة في عرض محتويات حالة العرض؟

هل كانت مفيدة؟

المحلول

يستخدم العابث واحصل على حالة العرض في الرد وألصقها في مربع النص السفلي الأيسر ثم فك التشفير.

نصائح أخرى

إليك وحدة فك ترميز ViewState عبر الإنترنت:

http://ignatu.co.uk/ViewStateDecoder.aspx

يحرر: لسوء الحظ، الرابط أعلاه ميت - إليك وحدة فك ترميز ViewState أخرى (من التعليقات):

http://viewstatedecoder.azurewebsites.net/

إليك الكود المصدري لمتخيل ViewState من مقال سكوت ميتشل على ViewState (25 صفحة)

using System;
using System.Collections;
using System.Text;
using System.IO;
using System.Web.UI;


namespace ViewStateArticle.ExtendedPageClasses
{
    /// <summary>
    /// Parses the view state, constructing a viaully-accessible object graph.
    /// </summary>
    public class ViewStateParser
    {
        // private member variables
        private TextWriter tw;
        private string indentString = "   ";

        #region Constructor
        /// <summary>
        /// Creates a new ViewStateParser instance, specifying the TextWriter to emit the output to.
        /// </summary>
        public ViewStateParser(TextWriter writer)
        {
            tw = writer;
        }
        #endregion

        #region Methods
        #region ParseViewStateGraph Methods
        /// <summary>
        /// Emits a readable version of the view state to the TextWriter passed into the object's constructor.
        /// </summary>
        /// <param name="viewState">The view state object to start parsing at.</param>
        public virtual void ParseViewStateGraph(object viewState)
        {
            ParseViewStateGraph(viewState, 0, string.Empty);    
        }

        /// <summary>
        /// Emits a readable version of the view state to the TextWriter passed into the object's constructor.
        /// </summary>
        /// <param name="viewStateAsString">A base-64 encoded representation of the view state to parse.</param>
        public virtual void ParseViewStateGraph(string viewStateAsString)
        {
            // First, deserialize the string into a Triplet
            LosFormatter los = new LosFormatter();
            object viewState = los.Deserialize(viewStateAsString);

            ParseViewStateGraph(viewState, 0, string.Empty);    
        }

        /// <summary>
        /// Recursively parses the view state.
        /// </summary>
        /// <param name="node">The current view state node.</param>
        /// <param name="depth">The "depth" of the view state tree.</param>
        /// <param name="label">A label to display in the emitted output next to the current node.</param>
        protected virtual void ParseViewStateGraph(object node, int depth, string label)
        {
            tw.Write(System.Environment.NewLine);

            if (node == null)
            {
                tw.Write(String.Concat(Indent(depth), label, "NODE IS NULL"));
            } 
            else if (node is Triplet)
            {
                tw.Write(String.Concat(Indent(depth), label, "TRIPLET"));
                ParseViewStateGraph(((Triplet) node).First, depth+1, "First: ");
                ParseViewStateGraph(((Triplet) node).Second, depth+1, "Second: ");
                ParseViewStateGraph(((Triplet) node).Third, depth+1, "Third: ");
            }
            else if (node is Pair)
            {
                tw.Write(String.Concat(Indent(depth), label, "PAIR"));
                ParseViewStateGraph(((Pair) node).First, depth+1, "First: ");
                ParseViewStateGraph(((Pair) node).Second, depth+1, "Second: ");
            }
            else if (node is ArrayList)
            {
                tw.Write(String.Concat(Indent(depth), label, "ARRAYLIST"));

                // display array values
                for (int i = 0; i < ((ArrayList) node).Count; i++)
                    ParseViewStateGraph(((ArrayList) node)[i], depth+1, String.Format("({0}) ", i));
            }
            else if (node.GetType().IsArray)
            {
                tw.Write(String.Concat(Indent(depth), label, "ARRAY "));
                tw.Write(String.Concat("(", node.GetType().ToString(), ")"));
                IEnumerator e = ((Array) node).GetEnumerator();
                int count = 0;
                while (e.MoveNext())
                    ParseViewStateGraph(e.Current, depth+1, String.Format("({0}) ", count++));
            }
            else if (node.GetType().IsPrimitive || node is string)
            {
                tw.Write(String.Concat(Indent(depth), label));
                tw.Write(node.ToString() + " (" + node.GetType().ToString() + ")");
            }
            else
            {
                tw.Write(String.Concat(Indent(depth), label, "OTHER - "));
                tw.Write(node.GetType().ToString());
            }
        }
        #endregion

        /// <summary>
        /// Returns a string containing the <see cref="IndentString"/> property value a specified number of times.
        /// </summary>
        /// <param name="depth">The number of times to repeat the <see cref="IndentString"/> property.</param>
        /// <returns>A string containing the <see cref="IndentString"/> property value a specified number of times.</returns>
        protected virtual string Indent(int depth)
        {
            StringBuilder sb = new StringBuilder(IndentString.Length * depth);
            for (int i = 0; i < depth; i++)
                sb.Append(IndentString);

            return sb.ToString();
        }
        #endregion

        #region Properties
        /// <summary>
        /// Specifies the indentation to use for each level when displaying the object graph.
        /// </summary>
        /// <value>A string value; the default is three blank spaces.</value>
        public string IndentString
        {
            get
            {
                return indentString;
            }
            set
            {
                indentString = value;
            }
        }
        #endregion
    }
}

وإليك صفحة بسيطة لقراءة حالة العرض من مربع نص ورسمها بيانيًا باستخدام الكود أعلاه

private void btnParse_Click(object sender, System.EventArgs e)
        {
            // parse the viewState
            StringWriter writer = new StringWriter();
            ViewStateParser p = new ViewStateParser(writer);

            p.ParseViewStateGraph(txtViewState.Text);
            ltlViewState.Text = writer.ToString();
        }

كما ذكر شخص آخر للتو، إنها سلسلة مشفرة باستخدام Base64.لقد استخدمت هذا الموقع في الماضي لفك تشفيره:

http://www.motobit.com/util/base64-decoder-encoder.asp

إليك وحدة فك ترميز أخرى تعمل بشكل جيد اعتبارًا من عام 2014: http://viewstatedecoder.azurewebsites.net/

نجح هذا مع المدخلات التي فشل فيها جهاز فك ترميز Ignatu مع ظهور "البيانات المتسلسلة غير صالحة" (على الرغم من أنها تترك البيانات المتسلسلة BinaryFormatter غير مشفرة، ولا تظهر سوى طولها).

جافا سكريبت-ViewState-محلل:

يجب أن يعمل المحلل اللغوي مع معظم حالات العرض غير المشفرة.لا يتعامل مع تنسيق التسلسل المستخدم بواسطة .NET الإصدار 1 لأن هذا الإصدار قديم للغاية وبالتالي من غير المحتمل مواجهته في أي موقف حقيقي.

http://deadliestwebattacks.com/2011/05/29/javascript-viewstate-parser/


تحليل .NET ViewState


يمكنك تجاهل حقل عنوان URL ولصق حالة العرض ببساطة في مربع سلسلة حالة العرض.

يبدو أن لديك نسخة قديمة؛لقد تغيرت أساليب التسلسل في ASP.NET 2.0، لذا احصل على ملف الإصدار 2.0

هذه طريقة "أصلية" .NET لتحويل ViewState من سلسلة إلى رمز حقيبة الحالة أدناه:

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;
    }

عارض حالة العرض عبر الإنترنت بواسطة Lachlan Keown:

http://lachlankeown.blogspot.com/2008/05/online-viewstate-viewer-decoder.html

عادةً، يجب أن يكون ViewState قابلاً لفك التشفير إذا كان لديك مفتاح الجهاز، أليس كذلك؟بعد كل شيء، يحتاج ASP.net إلى فك تشفيره، وهذا بالتأكيد ليس صندوقًا أسود.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top