예제 #1
0
        /// <summary>
        /// Create a simulatd program to use in the code /data display.
        /// </summary>
        private void GenerateSimulatedProgram()
        {
            var row   = Enumerable.Range(0, 0x100).Select(b => (byte)b).ToArray();
            var image = new LoadedImage(
                Address.Ptr32(0x0010000),
                Enumerable.Repeat(
                    row,
                    40).SelectMany(r => r).ToArray());
            var imageMap = image.CreateImageMap();
            var addrCode = Address.Ptr32(0x0010008);
            var addrData = Address.Ptr32(0x001001A);

            imageMap.AddItemWithSize(addrCode, new ImageMapBlock {
                Address = addrCode, Size = 0x0E
            });
            imageMap.AddItemWithSize(addrData, new ImageMapItem {
                Address = addrData, DataType = PrimitiveType.Byte, Size = 0x0E
            });
            var arch = dlg.Services.RequireService <IConfigurationService>().GetArchitecture("x86-protected-32");

            this.program = new Program
            {
                Image        = image,
                ImageMap     = imageMap,
                Architecture = arch,
            };
        }
예제 #2
0
        public void Rotations()
        {
            X86TextAssembler asm = new X86TextAssembler(new X86ArchitectureReal());
            var lr = asm.AssembleFragment(
                Address.SegPtr(0xB96, 0),
                "foo	proc\r\n"+
                "rol	ax,cl\r\n"+
                "ror	word ptr [bx+2],cl\r\n"+
                "rcr	word ptr [bp+4],4\r\n"+
                "rcl	ax,1\r\n");

            LoadedImage img = lr.Image;

            CreateDisassembler16(img.CreateLeReader(img.BaseAddress));
            StringBuilder sb = new StringBuilder();

            foreach (var instr in dasm.Take(4))
            {
                sb.AppendFormat("{0}\r\n", instr.ToString());
            }
            string s = sb.ToString();

            Assert.AreEqual(
                "rol\tax,cl\r\n" +
                "ror\tword ptr [bx+02],cl\r\n" +
                "rcr\tword ptr [bp+04],04\r\n" +
                "rcl\tax,01\r\n", s);
        }
예제 #3
0
        public void Ose_FindReplace()
        {
            Given_Engine();
            Given_Image(0x001000, new byte[] { 0x2a, 0x2a, 0x2a, 0x21, 0x23, 0x21, 0x23 });
            host.Expect(h => h.WriteMemory(
                            Arg <ulong> .Is.Anything,
                            Arg <int> .Is.Equal(3),
                            Arg <byte[]> .Is.NotNull)).Do(new Func <ulong, int, byte[], bool>((a, l, b) =>
            {
                LoadedImage.WriteBytes(b, a - image.BaseAddress.ToLinear(), l, image.Bytes);
                return(true);
            }));

            Given_Script(
                "find 001000, #21??21#\r\n" +
                "test $RESULT,$RESULT\r\n" +
                "jz done\r\n" +
                "fill $RESULT,3,2d\r\n" +
                "done:\r\n"
                );
            mr.ReplayAll();

            engine.Run();

            Assert.AreEqual("***---#", Encoding.ASCII.GetString(image.Bytes));
        }
예제 #4
0
        private static SparcInstruction Disassemble(LoadedImage img)
        {
            var arch = new SparcArchitecture(PrimitiveType.Word32);
            var dasm = new SparcDisassembler(arch, img.CreateBeReader(0U));

            return(dasm.First());
        }
예제 #5
0
        public ExePackLoader(IServiceProvider services, string filename, byte[] imgRaw)
            : base(services, filename, imgRaw)
        {
            arch     = new IntelArchitecture(ProcessorMode.Real);
            platform = new MsdosPlatform(Services, arch);

            var exe = new ExeImageLoader(services, filename, imgRaw);

            this.exeHdrSize = (uint)(exe.e_cparHeader * 0x10U);
            this.hdrOffset  = (uint)(exe.e_cparHeader + exe.e_cs) * 0x10U;
            ImageReader rdr = new LeImageReader(RawImage, hdrOffset);

            this.ip = rdr.ReadLeUInt16();
            this.cs = rdr.ReadLeUInt16();
            rdr.ReadLeUInt16();
            this.cbExepackHeader = rdr.ReadLeUInt16();
            this.sp             = rdr.ReadLeUInt16();
            this.ss             = rdr.ReadLeUInt16();
            this.cpUncompressed = rdr.ReadLeUInt16();

            int offset = ExePackHeaderOffset(exe);

            if (LoadedImage.CompareArrays(imgRaw, offset, signature, signature.Length))
            {
                relocationsOffset = 0x012D;
            }
            else if (LoadedImage.CompareArrays(imgRaw, offset, signature2, signature2.Length))
            {
                relocationsOffset = 0x0125;
            }
            else
            {
                throw new ApplicationException("Not a recognized EXEPACK image.");
            }
        }
예제 #6
0
        static public bool IsCorrectUnpacker(ExeImageLoader exe, byte[] rawImg)
        {
            int offset = ExePackHeaderOffset(exe);

            return(LoadedImage.CompareArrays(rawImg, offset, signature, signature.Length) ||
                   LoadedImage.CompareArrays(rawImg, offset, signature2, signature2.Length));
        }
예제 #7
0
        public void LLI_ShowMemoryAtAddressShouldChangeMemoryControl()
        {
            var sc         = new ServiceContainer();
            var ctrl       = new LowLevelView();
            var interactor = mr.DynamicMock <LowLevelViewInteractor>();

            interactor.Expect(i => i.SelectedAddress).SetPropertyWithArgument(Address.Ptr32(0x4711));
            var uiSvc = AddStubService <IDecompilerShellUiService>(sc);

            AddStubService <IUiPreferencesService>(sc);
            Given_Program();
            uiSvc.Stub(x => x.FindDocumentWindow(null, null)).IgnoreArguments().Return(null);
            uiSvc.Stub(x => x.CreateDocumentWindow("", null, "", null))
            .IgnoreArguments()
            .Return(mr.Stub <IWindowFrame>());
            uiSvc.Stub(x => x.GetContextMenu(MenuIds.CtxMemoryControl)).Return(new ContextMenu());
            uiSvc.Stub(x => x.GetContextMenu(MenuIds.CtxDisassembler)).Return(new ContextMenu());

            var service = mr.Stub <LowLevelViewServiceImpl>(sc);

            service.Stub(x => x.CreateMemoryViewInteractor()).Return(interactor);
            var image = new LoadedImage(Address.Ptr32(0x1000), new byte[300]);

            mr.ReplayAll();

            interactor.SetSite(sc);
            interactor.CreateControl();
            service.ShowMemoryAtAddress(program, Address.Ptr32(0x4711));

            mr.VerifyAll();
        }
예제 #8
0
 public bool LoadTileSheetFromFile()
 {
     try {
         if (File.Exists(TileSheetUrl))
         {
             LoadedTileSheet = TileSheet.ReadFromFile(TileSheetUrl);
             if (LoadedImage != null)
             {
                 LoadedImage.Dispose();
             }
             Image newImage = null;
             if (File.Exists(ImageUrl))
             {
                 newImage = Image.FromFile(ImageUrl, true);
             }
             if (newImage != null)
             {
                 LoadedImage = newImage;
                 LoadedTileSheet.TextureKey = Path.GetFileNameWithoutExtension(ImageUrl);
             }
             else
             {
                 LoadedImage = null;
                 LoadedTileSheet.TextureKey = "";
             }
             UpdateSizeInFrames();
         }
     } catch (Exception e) {
         System.Console.WriteLine("Exception while reading file: " + e.Message);
         return(false);
     }
     return(true);
 }
예제 #9
0
 public BackwalkerHost(BlockWorkitem item)
 {
     this.scanner  = item.scanner;
     this.image    = item.program.Image;
     this.arch     = item.program.Architecture;
     this.platform = item.program.Platform;
 }
예제 #10
0
 public ResourceTypeCollection(byte [] bytes, uint offset, uint size)
 {
     this.bytes      = bytes;
     rsrcTypeListOff = offset + LoadedImage.ReadBeUInt16(bytes, offset + 0x18) + 2u;
     rsrcNameListOff = offset + LoadedImage.ReadBeUInt16(bytes, offset + 0x1A);
     crsrcTypes      = LoadedImage.ReadBeUInt16(bytes, offset + 0x1C) + 1;
 }
예제 #11
0
        private void Rewrite(Action <M68kAssembler> build)
        {
            var asm = new M68kAssembler(arch, addrBase, new List <EntryPoint>());

            build(asm);
            image = asm.GetImage().Image;
        }
예제 #12
0
        /// <summary>
        /// Load a Basic PRG.
        /// </summary>
        /// <param name="imageBytes"></param>
        /// <returns></returns>
        private Program LoadPrg(byte[] imageBytes)
        {
            var    stm = new MemoryStream();
            ushort preferredAddress = LoadedImage.ReadLeUInt16(imageBytes, 0);
            ushort alignedAddress   = (ushort)(preferredAddress & ~0xF);
            int    pad = preferredAddress - alignedAddress;

            while (pad-- > 0)
            {
                stm.WriteByte(0);
            }
            stm.Write(imageBytes, 2, imageBytes.Length - 2);
            var loadedBytes = stm.ToArray();
            var image       = new LoadedImage(
                Address.Ptr16(alignedAddress),
                loadedBytes);
            var rdr  = new C64BasicReader(image, 0x0801);
            var prog = rdr.ToSortedList(line => (ushort)line.Address.ToLinear(), line => line);
            var arch = new C64Basic(prog);

            image = new LoadedImage(
                Address.Ptr16(prog.Keys[0]),
                new byte[0xFFFF]);
            var program = new Program(
                image,
                image.CreateImageMap(),
                arch,
                new C64Platform(Services, null));

            program.EntryPoints.Add(new EntryPoint(image.BaseAddress, arch.CreateProcessorState()));
            return(program);
        }
예제 #13
0
 public ConstantPointerTraversal(IProcessorArchitecture arch, StructureType globalStr, LoadedImage image)
 {
     this.arch        = arch;
     this.globalStr   = globalStr;
     this.image       = image;
     this.Discoveries = new List <StructureField>();
 }
예제 #14
0
        protected static ArmInstruction Disassemble(byte[] bytes)
        {
            var image = new LoadedImage(Address.Ptr32(0x00100000), bytes);
            var dasm  = new ArmDisassembler2(new ArmProcessorArchitecture(), image.CreateLeReader(0));

            return(dasm.First());
        }
예제 #15
0
        private void Run32bitTest(Action <X86Assembler> fn)
        {
            var m = Create32bitAssembler();

            fn(m);
            image = m.GetImage().Image;
        }
예제 #16
0
        private void chkShowData_CheckedChanged(object sender, EventArgs e)
        {
            if (chkShowData.Checked)
            {
                var img    = new LoadedImage(Address.Ptr32(0x00100000), new byte[2560]);
                var imgMap = new ImageMap(img.BaseAddress, img.Length);
                imgMap.AddItemWithSize(Address.Ptr32(0x00100000), new ImageMapBlock {
                    Size = 30
                });
                imgMap.AddItemWithSize(Address.Ptr32(0x00100100), new ImageMapBlock {
                    Size = 300
                });
                imgMap.AddItemWithSize(Address.Ptr32(0x00100500), new ImageMapBlock {
                    Size = 600
                });
                memoryControl1.ProgramImage = img;
                memoryControl1.Architecture = new X86ArchitectureFlat32();

                imageMapView1.Image    = img;
                imageMapView1.ImageMap = imgMap;
            }
            else
            {
                memoryControl1.ProgramImage = null;
                memoryControl1.Architecture = null;
            }
        }
예제 #17
0
        public void DecSvc_DecompilerProjectName()
        {
            IDecompilerService svc = new DecompilerService();
            var loader             = mr.StrictMock <ILoader>();
            var host     = mr.StrictMock <DecompilerHost>();
            var arch     = mr.StrictMock <IProcessorArchitecture>();
            var platform = mr.StrictMock <Platform>(sc, arch);
            var fileName = "foo\\bar\\baz.exe";
            var bytes    = new byte[100];
            var image    = new LoadedImage(Address.Ptr32(0x1000), bytes);
            var imageMap = image.CreateImageMap();
            var prog     = new Program(image, imageMap, arch, platform);

            loader.Stub(l => l.LoadImageBytes(fileName, 0)).Return(bytes);
            loader.Stub(l => l.LoadExecutable(fileName, bytes, null)).Return(prog);
            loader.Replay();
            var dec = new DecompilerDriver(loader, host, sc);

            mr.ReplayAll();

            svc.Decompiler = dec;
            svc.Decompiler.Load(fileName);

            Assert.IsNotNull(svc.Decompiler.Project);
            Assert.AreEqual("baz.exe", svc.ProjectName, "Should have project name available.");
            mr.VerifyAll();
        }
예제 #18
0
        public override Program Load(Address addrLoad)
        {
            BinHexDecoder      dec = new BinHexDecoder(new StringReader(Encoding.ASCII.GetString(RawImage)));
            IEnumerator <byte> stm = dec.GetBytes().GetEnumerator();
            BinHexHeader       hdr = LoadBinHexHeader(stm);

            byte[] dataFork = LoadFork(hdr.DataForkLength, stm);
            byte[] rsrcFork = LoadFork(hdr.ResourceForkLength, stm);

            var arch     = new M68kArchitecture();
            var platform = new MacOSClassic(Services, arch);

            if (hdr.FileType == "PACT")
            {
                Cpt.CompactProArchive        archive = new Cpt.CompactProArchive();
                List <ArchiveDirectoryEntry> items   = archive.Load(new MemoryStream(dataFork));
                IArchiveBrowserService       abSvc   = Services.GetService <IArchiveBrowserService>();
                if (abSvc != null)
                {
                    var selectedFile = abSvc.UserSelectFileFromArchive(items);
                    if (selectedFile != null)
                    {
                        var image = selectedFile.GetBytes();
                        this.rsrcFork = new ResourceFork(image, arch);
                        this.image    = new LoadedImage(addrLoad, image);
                        this.imageMap = new ImageMap(addrLoad, image.Length);
                        return(new Program(this.image, this.imageMap, arch, platform));
                    }
                }
            }

            var li = new LoadedImage(addrLoad, dataFork);

            return(new Program(li, li.CreateImageMap(), arch, platform));
        }
예제 #19
0
        public TInstruction DisassembleWord(uint instr)
        {
            var img = new LoadedImage(LoadAddress, new byte[256]);

            CreateImageWriter(img.Bytes).WriteUInt32(0, instr);
            return(Disassemble(img));
        }
예제 #20
0
        // for LZEXE ver 0.90
        private ImageMap Relocate90(byte [] pgmImg, ushort segReloc, LoadedImage pgmImgNew, RelocationDictionary relocations)
        {
            int ifile = lzHdrOffset + 0x19D;

            // 0x19d=compressed relocation table address

            throw new NotImplementedException();

            /*
             * unsigned int c;
             *      ushort rel_count=0;
             *      ushort rel_seg,rel_off;
             *
             *      rel_seg=0;
             *      do
             *      {
             *              c=getw(ifile);
             *              for(;c>0;c--)
             *              {
             *                      rel_off=getw(ifile);
             *                      putw(rel_off,ofile);
             *                      putw(rel_seg,ofile);
             *                      rel_count++;
             *              }
             *              rel_seg += 0x1000;
             *      } while(rel_seg!=(0xf000+0x1000));
             *      ohead[3]=rel_count;
             *      return(SUCCESS);
             */
        }
예제 #21
0
        // Unpacks the relocation entries in a LzExe 0.91 binary

        private ImageMap Relocate91(byte [] abUncompressed, ushort segReloc, LoadedImage pgmImgNew, RelocationDictionary relocations)
        {
            const int CompressedRelocationTableAddress = 0x0158;
            int       ifile = lzHdrOffset + CompressedRelocationTableAddress;

            int rel_off = 0;

            for (;;)
            {
                ushort span = abUncompressed[ifile++];
                if (span == 0)
                {
                    span  = abUncompressed[ifile++];
                    span |= (ushort)(abUncompressed[ifile++] << 8);
                    if (span == 0)
                    {
                        rel_off += 0x0FFF0;
                        continue;
                    }
                    else if (span == 1)
                    {
                        break;
                    }
                }

                rel_off += span;
                ushort seg = (ushort)(pgmImgNew.ReadLeUInt16((uint)rel_off) + segReloc);
                pgmImgNew.WriteLeUInt16((uint)rel_off, seg);
                relocations.AddSegmentReference((uint)rel_off, seg);
                imageMap.AddSegment(Address.SegPtr(seg, 0), seg.ToString("X4"), AccessMode.ReadWriteExecute);
            }
            return(imageMap);
        }
예제 #22
0
        public void Setup()
        {
            var image   = new LoadedImage(Address.Ptr32(0x00100000), new byte[1024]);
            var arch    = new FakeArchitecture();
            var program = new Program
            {
                Image        = image,
                Architecture = arch,
                ImageMap     = image.CreateImageMap(),
                Platform     = new DefaultPlatform(null, arch),
            };

            store   = program.TypeStore;
            factory = program.TypeFactory;
            globals = program.Globals;
            store.EnsureExpressionTypeVariable(factory, globals);

            StructureType s = new StructureType(null, 0);

            s.Fields.Add(0x00100000, PrimitiveType.Word32, null);

            TypeVariable     tvGlobals = store.EnsureExpressionTypeVariable(factory, globals);
            EquivalenceClass eqGlobals = new EquivalenceClass(tvGlobals);

            eqGlobals.DataType            = s;
            globals.TypeVariable.DataType = new Pointer(eqGlobals, 4);
            globals.DataType = globals.TypeVariable.DataType;

            tcr = new TypedConstantRewriter(program);
        }
예제 #23
0
        private ImageWriter Memory(uint address)
        {
            image = new LoadedImage(Address.Ptr32(address), new byte[1024]);
            var mem = new LeImageWriter(image.Bytes);

            return(mem);
        }
예제 #24
0
 private void Given_Image(params byte[] bytes)
 {
     image              = new LoadedImage(addrBase, bytes);
     imageMap           = image.CreateImageMap();
     program            = new Program(image, imageMap, arch, null);
     interactor.Program = program;
 }
예제 #25
0
        public PkLiteUnpacker(IServiceProvider services, string filename, byte [] rawImg) : base(services, filename, rawImg)
        {
            var exe = new ExeImageLoader(services, filename, rawImg);

            arch     = new IntelArchitecture(ProcessorMode.Real);
            platform = services.RequireService <IConfigurationService>()
                       .GetEnvironment("ms-dos")
                       .Load(services, arch);

            uint pkLiteHdrOffset = (uint)(exe.e_cparHeader * 0x10);

            if (RawImage[pkLiteHdrOffset] != 0xB8)
            {
                throw new ApplicationException(string.Format("Expected MOV AX,XXXX at offset 0x{0:X4}.", pkLiteHdrOffset));
            }
            uint cparUncompressed = LoadedImage.ReadLeUInt16(RawImage, pkLiteHdrOffset + 1);

            abU = new byte[cparUncompressed * 0x10U];

            if (RawImage[pkLiteHdrOffset + 0x04C] != 0x83)
            {
                throw new ApplicationException(string.Format("Expected ADD BX,+XX at offset 0x{0:X4}.", pkLiteHdrOffset + 0x04C));
            }
            uint offCompressedData = pkLiteHdrOffset + RawImage[pkLiteHdrOffset + 0x04E] * 0x10u - PspSize;

            bitStm = new BitStream(RawImage, (int)offCompressedData);
        }
예제 #26
0
    protected void processImage()
    {
        using (LoadedImage sourceImage = ImageArchiver.LoadImage(this.imgSource.ImageUrl))
        {
            // Generate the image #1
            string outputImageFileName = "~/repository/output/Ex_A_105___1.jpg";
            new ScaledResizeConstraint(150, 250).SaveProcessedImageToFileSystem(sourceImage, outputImageFileName);
            this.imgOutput1.ImageUrl = outputImageFileName + "?timestamp=" + DateTime.UtcNow.Ticks.ToString();

            // Generate the image #2
            outputImageFileName = "~/repository/output/Ex_A_105___2.jpg";
            new FixedCropConstraint(150, 250).SaveProcessedImageToFileSystem(sourceImage, outputImageFileName);
            this.imgOutput2.ImageUrl = outputImageFileName + "?timestamp=" + DateTime.UtcNow.Ticks.ToString();

            // Generate the image #3
            outputImageFileName = "~/repository/output/Ex_A_105___3.jpg";
            new ImageProcessingJob(new ImageProcessingFilter[] {
                new FixedResizeConstraint(150, 250),
                DefaultColorFilters.Grayscale
            }).SaveProcessedImageToFileSystem(sourceImage, outputImageFileName);
            this.imgOutput3.ImageUrl = outputImageFileName + "?timestamp=" + DateTime.UtcNow.Ticks.ToString();
        }

        this.phOutputContainer.Visible = true;
        this.phCodeContainer.Visible   = true;
    }
예제 #27
0
        private IEnumerator <M68kInstruction> CreateDasm(byte[] bytes, uint address)
        {
            Address     addr = Address.Ptr32(address);
            LoadedImage img  = new LoadedImage(addr, bytes);

            return(M68kDisassembler.Create68020(img.CreateBeReader(addr)).GetEnumerator());
        }
예제 #28
0
    protected void CleanShutdown()
    {
        if (worldPixbuf != null)
        {
            worldPixbuf.Dispose();
        }

        if (worldImage.Pixbuf != null)
        {
            worldImage.Pixbuf.Dispose();
        }

        if (worldImage != null)
        {
            worldImage.Dispose();
        }

        if (LoadedImage.Pixbuf != null)
        {
            LoadedImage.Pixbuf.Dispose();
        }

        if (LoadedImage != null)
        {
            LoadedImage.Dispose();
        }

        Colonies.Clear();
    }
예제 #29
0
        private void Given_Program(byte[] bytes)
        {
            var addr  = Address.Ptr32(0x1000);
            var image = new LoadedImage(addr, bytes);

            this.imageMap = image.CreateImageMap();
            this.program  = new Program(image, imageMap, arch, new DefaultPlatform(null, arch));
        }
예제 #30
0
        public void ValidateImage()
        {
            Program        prog     = new Program();
            LoadedImage    rawImage = new LoadedImage(Address.SegPtr(0x0C00, 0), CreateMsdosHeader());
            ExeImageLoader exe      = new ExeImageLoader(null, "foo.exe", rawImage.Bytes);

            Assert.IsTrue(PkLiteUnpacker.IsCorrectUnpacker(exe, rawImage.Bytes));
        }
    /// <summary>
    /// Loads an image from an array of bytes and applies a specific PictureTrimmerValue.</summary>
    /// <param name="sourceImage">The source image to load.</param>
    /// <param name="value">The PictureTrimmerValue to apply.</param>
    public void LoadImage(LoadedImage sourceImage, PictureTrimmerValue value)
    {
        // Save the image - Use PNG as image format to preserve transparency
        ImageArchiver.SaveImageToFileSystem(sourceImage.Image, this.TemporarySourceImageFilePath, new PngFormatEncoderParams());

        // Load the image into the control
        this.LoadImageFromFileSystem_Internal(this.TemporarySourceImageFilePath, sourceImage.Image, sourceImage.Size, sourceImage.FormatId, sourceImage.Resolution, false, value);
    }
 /// <summary>
 /// Loads an image and auto-calculates the PictureTrimmerValue to use.</summary>
 /// <param name="sourceImage">The source image to load.</param>
 public void LoadImage(LoadedImage sourceImage)
 {
     this.LoadImage(sourceImage, null);
 }