VMProtect/utils/ipn_sqlclr/XmlReaderSpy.cs

281 lines
5.9 KiB
C#

using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Web.Services.Protocols;
using System.Xml;
using System.IO;
namespace ipn_sqlclr
{
public class XmlReaderSpy : StreamReader
{
private readonly StringBuilder _sb = new StringBuilder();
public XmlReaderSpy(Stream stream, Encoding encoding, bool p, int bufferSize) : base(stream, encoding, p, bufferSize)
{
}
public override int Read(char[] buffer, int index, int count)
{
var ret = base.Read(buffer, index, count);
if(ret > 0)
_sb.Append(buffer, index, ret);
return ret;
}
public override string ReadToEnd()
{
var ret = base.ReadToEnd();
_sb.Append(ret);
return ret;
}
public override string ReadLine()
{
var ret = base.ReadLine();
_sb.Append(ret);
return ret;
}
public override int ReadBlock(char[] buffer, int index, int count)
{
return Read(buffer, index, count);
}
public string Xml
{
get { return _sb.ToString().Replace("<?xml version='1.0' encoding='UTF-8'?>", ""); }
}
}
public class XmlWriterSpy : XmlWriter
{
private readonly XmlWriter _base;
private readonly XmlTextWriter _xtw;
private readonly StringWriter _sw;
/// <summary>
/// Extracted XML.
/// </summary>
public string Xml
{
get
{
return (_sw != null) ? _sw.ToString() : string.Empty;
}
}
public XmlWriterSpy(XmlWriter parent)
{
_base = parent;
_sw = new StringWriter();
_xtw = new XmlTextWriter(_sw);
}
#region Abstract properties and methods that must be implemented
public override WriteState WriteState
{
get
{
return _base.WriteState;
}
}
public override void Close()
{
_base.Close();
_xtw.Close();
_sw.Close();
}
public override void Flush()
{
_base.Flush();
_xtw.Flush();
_sw.Flush();
}
public override string LookupPrefix(string ns)
{
return _base.LookupPrefix(ns);
}
public override void WriteBase64(byte[] buffer, int index, int count)
{
_base.WriteBase64(buffer, index, count);
_xtw.WriteBase64(buffer, index, count);
}
public override void WriteCData(string text)
{
_base.WriteCData(text);
_xtw.WriteCData(text);
}
public override void WriteCharEntity(char ch)
{
_base.WriteCharEntity(ch);
_xtw.WriteCharEntity(ch);
}
public override void WriteChars(char[] buffer, int index, int count)
{
_base.WriteChars(buffer, index, count);
_xtw.WriteChars(buffer, index, count);
}
public override void WriteComment(string text)
{
_base.WriteComment(text);
_xtw.WriteComment(text);
}
public override void WriteDocType(string name, string pubid, string sysid, string subset)
{
_base.WriteDocType(name, pubid, sysid, subset);
_xtw.WriteDocType(name, pubid, sysid, subset);
}
public override void WriteEndAttribute()
{
_base.WriteEndAttribute();
_xtw.WriteEndAttribute();
}
public override void WriteEndDocument()
{
_base.WriteEndDocument();
_xtw.WriteEndDocument();
}
public override void WriteEndElement()
{
_base.WriteEndElement();
_xtw.WriteEndElement();
}
public override void WriteEntityRef(string name)
{
_base.WriteEntityRef(name);
_xtw.WriteEntityRef(name);
}
public override void WriteFullEndElement()
{
_base.WriteFullEndElement();
_xtw.WriteFullEndElement();
}
public override void WriteProcessingInstruction(string name, string text)
{
_base.WriteProcessingInstruction(name, text);
_xtw.WriteProcessingInstruction(name, text);
}
public override void WriteRaw(string data)
{
_base.WriteRaw(data);
_xtw.WriteRaw(data);
}
public override void WriteRaw(char[] buffer, int index, int count)
{
_base.WriteRaw(buffer, index, count);
_xtw.WriteRaw(buffer, index, count);
}
public override void WriteStartAttribute(string prefix, string localName, string ns)
{
_base.WriteStartAttribute(prefix, localName, ns);
_xtw.WriteStartAttribute(prefix, localName, ns);
}
public override void WriteStartDocument(bool standalone)
{
_base.WriteStartDocument(standalone);
_xtw.WriteStartDocument(standalone);
}
public override void WriteStartDocument()
{
_base.WriteStartDocument();
_xtw.WriteStartDocument();
}
public override void WriteStartElement(string prefix, string localName, string ns)
{
_base.WriteStartElement(prefix, localName, ns);
_xtw.WriteStartElement(prefix, localName, ns);
}
public override void WriteString(string text)
{
_base.WriteString(text);
_xtw.WriteString(text);
}
public override void WriteSurrogateCharEntity(char lowChar, char highChar)
{
_base.WriteSurrogateCharEntity(lowChar, highChar);
_xtw.WriteSurrogateCharEntity(lowChar, highChar);
}
public override void WriteWhitespace(string ws)
{
_base.WriteWhitespace(ws);
_xtw.WriteWhitespace(ws);
}
#endregion
}
public class XmlReaderSpyService : SoapHttpClientProtocol
{
protected XmlReaderSpyService(X509Certificate clientCert, string url)
{
Url = url;
ClientCertificates.Add(clientCert);
}
private XmlReaderSpy _xmlReaderSpy;
private XmlWriterSpy _xmlWriterSpy;
public string GetRequestXml()
{
if (_xmlWriterSpy != null)
return _xmlWriterSpy.Xml;
return string.Empty;
}
public string GetResponseXml()
{
if (_xmlReaderSpy != null)
{
return _xmlReaderSpy.Xml;
}
return string.Empty;
}
protected override XmlReader GetReaderForMessage(SoapClientMessage message, int bufferSize)
{
Encoding encoding = Encoding.UTF8;
if (bufferSize < 0x200)
{
bufferSize = 0x200;
}
var reader = new XmlTextReader(_xmlReaderSpy = new XmlReaderSpy(message.Stream, encoding, true, bufferSize))
{
DtdProcessing = DtdProcessing.Prohibit,
Normalization = true,
XmlResolver = null
};
return reader;
}
protected override XmlWriter GetWriterForMessage(SoapClientMessage message, int bufferSize)
{
_xmlWriterSpy = new XmlWriterSpy(base.GetWriterForMessage(message, bufferSize));
return _xmlWriterSpy;
}
}
}