- Yasaklandı
- #1
Banlı Üye
You can read data with this code.
- Image -
Code (Code belongs to me [Thnx by Kİ]):
Example Usage:
- Image -
Code (Code belongs to me [Thnx by Kİ]):
C#:
public static class READ_NET_STORAGE
{
public static unsafe byte[] GetData(byte[] rawAssembly, string storageName) // kullanılacak kısım
{
var module = System.Reflection.Assembly.Load(rawAssembly).ManifestModule;
var moduleBase = (byte*)System.Runtime.InteropServices.Marshal.GetHINSTANCE(module);
string fqn = module.FullyQualifiedName;
bool isFlat = fqn.Length > 0 && fqn[0] == '<';
if (isFlat)
{
ulong len;
void* ptrdata = GetKoiStreamFlat(moduleBase, out len, storageName);
var intPtrMem = System.Runtime.InteropServices.Marshal.AllocHGlobal(unchecked((int)len));
CopyMemory((void*)intPtrMem, ptrdata, len);
byte[] buff = new byte[len];
System.Runtime.InteropServices.Marshal.Copy(intPtrMem, buff, 0, unchecked((int)len));
return buff;
}
else
{
ulong len;
void* ptrdata = GetKoiStreamMapped(moduleBase, out len, storageName);
var intPtrMem = System.Runtime.InteropServices.Marshal.AllocHGlobal(unchecked((int)len));
CopyMemory((void*)intPtrMem, ptrdata, len);
byte[] buff = new byte[len];
System.Runtime.InteropServices.Marshal.Copy(intPtrMem, buff, 0, unchecked((int)len));
return buff;
}
}
public static unsafe void* GetKoiStreamMapped(byte* moduleBase, out ulong len, string storageName)
{
byte* ptr = moduleBase + 0x3c;
byte* ptr2;
ptr = ptr2 = moduleBase + *(uint*)ptr;
ptr += 0x6;
ushort sectNum = *(ushort*)ptr;
ptr += 14;
ushort optSize = *(ushort*)ptr;
ptr = ptr2 = ptr + 0x4 + optSize;
byte* mdDir = moduleBase + *(uint*)(ptr - 16);
byte* mdHdr = moduleBase + *(uint*)(mdDir + 8);
mdHdr += 12;
mdHdr += *(uint*)mdHdr;
mdHdr = (byte*)(((ulong)mdHdr + 7) & ~3UL);
mdHdr += 2;
ushort numOfStream = *mdHdr;
mdHdr += 2;
var streamName = new System.Text.StringBuilder();
for (int i = 0; i < numOfStream; i++)
{
uint offset = *(uint*)mdHdr;
len = *(uint*)(mdHdr + 4);
mdHdr += 8;
streamName.Length = 0;
for (int ii = 0; ii < 8; ii++)
{
streamName.Append((char)*mdHdr++);
if (*mdHdr == 0)
{
mdHdr += 3;
break;
}
streamName.Append((char)*mdHdr++);
if (*mdHdr == 0)
{
mdHdr += 2;
break;
}
streamName.Append((char)*mdHdr++);
if (*mdHdr == 0)
{
mdHdr += 1;
break;
}
streamName.Append((char)*mdHdr++);
if (*mdHdr == 0)
{
break;
}
}
if (streamName.ToString() == storageName)
{
var koi = (void*)System.Runtime.InteropServices.Marshal.AllocHGlobal((int)len);
CopyMemory(koi, moduleBase + *(uint*)(mdDir + 8) + offset, len);
return koi;
}
}
len = 0;
return null;
}
public static unsafe void* GetKoiStreamFlat(byte* moduleBase, out ulong len, string storageName)
{
byte* ptr = moduleBase + 0x3c;
byte* ptr2;
ptr = ptr2 = moduleBase + *(uint*)ptr;
ptr += 0x6;
ushort sectNum = *(ushort*)ptr;
ptr += 14;
ushort optSize = *(ushort*)ptr;
ptr = ptr2 = ptr + 0x4 + optSize;
uint mdDir = *(uint*)(ptr - 16);
var vAdrs = new uint[sectNum];
var vSizes = new uint[sectNum];
var rAdrs = new uint[sectNum];
for (int i = 0; i < sectNum; i++)
{
vAdrs[i] = *(uint*)(ptr + 12);
vSizes[i] = *(uint*)(ptr + 8);
rAdrs[i] = *(uint*)(ptr + 20);
ptr += 0x28;
}
for (int i = 0; i < sectNum; i++)
if (vAdrs[i] <= mdDir && mdDir < vAdrs[i] + vSizes[i])
{
mdDir = mdDir - vAdrs[i] + rAdrs[i];
break;
}
byte* mdDirPtr = moduleBase + mdDir;
uint mdHdr = *(uint*)(mdDirPtr + 8);
for (int i = 0; i < sectNum; i++)
if (vAdrs[i] <= mdHdr && mdHdr < vAdrs[i] + vSizes[i])
{
mdHdr = mdHdr - vAdrs[i] + rAdrs[i];
break;
}
byte* mdHdrPtr = moduleBase + mdHdr;
mdHdrPtr += 12;
mdHdrPtr += *(uint*)mdHdrPtr;
mdHdrPtr = (byte*)(((ulong)mdHdrPtr + 7) & ~3UL);
mdHdrPtr += 2;
ushort numOfStream = *mdHdrPtr;
mdHdrPtr += 2;
var streamName = new System.Text.StringBuilder();
for (int i = 0; i < numOfStream; i++)
{
uint offset = *(uint*)mdHdrPtr;
len = *(uint*)(mdHdrPtr + 4);
streamName.Length = 0;
mdHdrPtr += 8;
for (int ii = 0; ii < 8; ii++)
{
streamName.Append((char)*mdHdrPtr++);
if (*mdHdrPtr == 0)
{
mdHdrPtr += 3;
break;
}
streamName.Append((char)*mdHdrPtr++);
if (*mdHdrPtr == 0)
{
mdHdrPtr += 2;
break;
}
streamName.Append((char)*mdHdrPtr++);
if (*mdHdrPtr == 0)
{
mdHdrPtr += 1;
break;
}
streamName.Append((char)*mdHdrPtr++);
if (*mdHdrPtr == 0)
{
break;
}
}
if (streamName.ToString() == storageName)
{
var koi = (void*)System.Runtime.InteropServices.Marshal.AllocHGlobal((int)len);
CopyMemory(koi, moduleBase + mdHdr + offset, len);
return koi;
}
}
len = 0;
return null;
}
public static unsafe void CopyMemory(void* dest, void* src, ulong count)
{
ulong block;
block = count >> 3;
long* pDest = (long*)dest;
long* pSrc = (long*)src;
for (ulong i = 0; i < block; i++)
{
*pDest = *pSrc; pDest++; pSrc++;
}
dest = pDest;
src = pSrc;
count = count - (block << 3);
if (count > 0)
{
byte* pDestB = (byte*)dest;
byte* pSrcB = (byte*)src;
for (ulong i = 0; i < count; i++)
{
*pDestB = *pSrcB; pDestB++; pSrcB++;
}
}
}
}
Example Usage:
C#:
var array = File.ReadAllBytes("file")
byte[] data = READ_NET_STORAGE.GetData(array, "#Storage");