Beispiel #1
0
        public static void Parse(RhydonContext ctx)
        {
            var heapname = ctx.Parameters["heap", "Koi"];

            ctx.Logger.Debug($"Looking for #{heapname} stream...");
            var heap = ctx.Module.Metadata.AllStreams.SingleOrDefault(s => s.Name == $"#{heapname}");

            if (heap == null)
            {
                ctx.Logger.Error($"#{heapname} stream not found...");
                return;
            }

            ctx.Logger.Info("Parsing KoiVM header");
            var dnlibreader = heap.CreateReader();

            ctx.StartOffset = dnlibreader.StartOffset;
            ctx.Reader      = new BinaryReader(dnlibreader.AsStream());

            var magic = ctx.ReadUInt32();

            if (magic != 0x68736966)
            {
                ctx.Logger.Warning($"Magic wasn't 'fish' (0x68736966), instead: 0x{magic:X}");
            }

            var refCount = (int)ctx.ReadUInt32();
            var strCount = (int)ctx.ReadUInt32();
            var metCount = (int)ctx.ReadUInt32();

            var hdr = new KoiHeader();

            hdr.ReadReferences(ctx, refCount);
            ctx.Logger.Success($"Parsed {refCount} references");

            hdr.ReadStrings(ctx, strCount);
            ctx.Logger.Success($"Parsed {strCount} strings");

            hdr.ReadMethods(ctx, metCount);
            ctx.Logger.Success($"Parsed {metCount} exports");

            ctx.Header = hdr;
        }
Beispiel #2
0
        public static MethodExport Create(RhydonContext ctx)
        {
            var obj = new MethodExport {
                Offset = ctx.Reader.ReadUInt32()
            };

            if (obj.Offset != 0)
            {
                obj.Key = ctx.Reader.ReadUInt32();
            }

            obj.Flags = ctx.Reader.ReadByte();

            obj.ArgumentTypes = new ITypeDefOrRef[ctx.Reader.ReadCompressedUint()];
            for (var i = 0; i < obj.ArgumentTypes.Length; i++)
            {
                obj.ArgumentTypes[i] = (ITypeDefOrRef)ctx.Module.ResolveToken(KoiHeader.FromCodedToken(ctx.Reader.ReadCompressedUint()));
            }

            obj.ReturnType = (ITypeDefOrRef)ctx.Module.ResolveToken(KoiHeader.FromCodedToken(ctx.Reader.ReadCompressedUint()));
            return(obj);
        }