Example #1
0
        public Maki(byte[] exe)
        {
            using (var ms = new MemoryStream(exe))
                using (var mr = new MakiReader(ms))
                {
                    var header  = mr.ReadUInt16();
                    var version = mr.ReadBytes(6);
                    Guids   = mr.ReadSectionOf(m => m.ReadGuid()).ToList();
                    Imports = mr.ReadSectionOf(ReadImport).ToList();

                    var objects = mr.ReadSectionOf(ReadObject).ToList();
                    var strings = mr.ReadSectionOf(ReadString).ToList();
                    Objects = (
                        from obj in objects.Select(Tuple.Create <object, int>)
                        join str in strings on obj.Item2 equals str.Item1 into pre
                        from p in pre.DefaultIfEmpty()
                        select obj.Item1 ?? p?.Item2).ToList();

                    Listeners = mr.ReadSectionOf(ReadListener).ToList();
                    Code      = mr.ReadBytes(mr.ReadInt32());
                }
        }
Example #2
0
        object ReadObject(MakiReader mr)
        {
            var typeIdx     = mr.ReadByte();
            var isPrimitive = !mr.ReadBoolean();
            var sub         = mr.ReadInt16();
            var data        = mr.ReadBytes(8);
            var isGlobal    = mr.ReadBoolean();
            var isStatic    = mr.ReadBoolean();

            if (isPrimitive)
            {
                switch (typeIdx)
                {
                case 2:
                    var result = nullRead ?
                                 BitConverter.ToInt32(data, 0) :
                                 default(object);
                    nullRead = true;
                    return(result);

                case 3:
                    return(BitConverter.ToSingle(data, 0));

                case 4:
                    return(BitConverter.ToDouble(data, 0));

                case 5:
                    return(BitConverter.ToBoolean(data, 0));

                default:
                    return(null);
                }
            }
            else
            {
                return(isStatic ? Guids[typeIdx] : default(object));
            }
        }