[C#] Read to .NET Storage

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Banlı Üye
Katılım
12 Tem 2020
Mesajlar
196
Çözümler
1
Tepki puanı
33
Ödüller
3
5 HİZMET YILI
You can read data with this code.

- Image -
Ekran Alıntısı.PNG


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");
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Üst