예제 #1
0
		/// <inheritdoc />
		void IModuleWriterListener.OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt) {
			if (evt == ModuleWriterEvent.PESectionsCreated)
				NativeEraser.Erase(writer as NativeModuleWriter, writer.Module as ModuleDefMD);
			if (OnWriterEvent != null) {
				OnWriterEvent(writer, new ModuleWriterListenerEventArgs(evt));
			}
		}
예제 #2
0
 void IModuleWriterListener.OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
 {
     ThrowIfCanceled();
     ((ModuleFileProgress)fileProgress).CurrentEventIndex = evt - ModuleWriterEvent.Begin;
     Debug.Assert(((ModuleFileProgress)fileProgress).CurrentEventIndex >= 0);
     NotifyProgressUpdated();
 }
예제 #3
0
 void IModuleWriterListener.OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
 {
     if (OnWriterEvent != null)
     {
         OnWriterEvent(writer, new ModuleWriterListenerEventArgs(evt));
     }
 }
예제 #4
0
 void IModuleWriterListener.OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
 {
     ThrowIfCanceled();
     currentEventIndex = evt - ModuleWriterEvent.Begin;
     Debug.Assert(currentEventIndex >= 0);
     if (OnProgressUpdated != null)
     {
         OnProgressUpdated(this, EventArgs.Empty);
     }
 }
예제 #5
0
 /// <inheritdoc />
 // Token: 0x060001A5 RID: 421 RVA: 0x0000D5F2 File Offset: 0x0000B7F2
 void IModuleWriterListener.OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
 {
     if (evt == ModuleWriterEvent.PESectionsCreated)
     {
         NativeEraser.Erase(writer as NativeModuleWriter, writer.Module as ModuleDefMD);
     }
     if (this.OnWriterEvent != null)
     {
         this.OnWriterEvent(writer, new ModuleWriterListenerEventArgs(evt));
     }
 }
예제 #6
0
 public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
 {
     if (otherListener != null)
     {
         otherListener.OnWriterEvent(writer, evt);
     }
     if (evt == ModuleWriterEvent.End)
     {
         PrintTokens(writer);
     }
 }
예제 #7
0
 public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
 {
     if (evt == ModuleWriterEvent.MDEndWriteMethodBodies)
     {
         byte[] native_ = Encode_();
         codeChunk = writer.MethodBodies.Add(new dnlib.DotNet.Writer.MethodBody(native_));
     }
     else if (evt == ModuleWriterEvent.EndCalculateRvasAndFileOffsets)
     {
         uint rid = writer.MetaData.GetRid(Protections.Constants.ConstantsProtection.native_);
         writer.MetaData.TablesHeap.MethodTable[rid].RVA = (uint)codeChunk.RVA;
     }
 }
예제 #8
0
        void IModuleWriterListener.OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
        {
            this.rtWriter = writer;
            this.rtMD     = writer.MetaData;
            if (evt == ModuleWriterEvent.MDEndCreateTables)
            {
                this.MutateMetadata();
                var request = new RequestKoiEventArgs();
                RequestKoi(this, request);
                writer.TheOptions.MetaDataOptions.OtherHeaps.Add(request.Heap);

                this.rt.ResetData();
            }
        }
        void IModuleWriterListener.OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
        {
            //bool flag = evt == ModuleWriterEvent.PESectionsCreated;
            //if (flag)
            //{
            //    //  NativeEraserNew.Erase(writer as NativeModuleWriter, writer.Module as ModuleDefMD); // Don't use
            //    NativeEraser.Erase(writer as NativeModuleWriter, writer.Module as ModuleDefMD);
            //}
            bool flag2 = this.OnWriterEvent != null;

            if (flag2)
            {
                this.OnWriterEvent(writer, new ModuleWriterListenerEventArgs(evt));
            }
        }
예제 #10
0
            public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
            {
                if (evt == ModuleWriterEvent.MDBeginCreateTables)
                {
                    // Add key signature
                    var sigBlob = writer.MetaData.BlobHeap.Add(ctx.KeySig);
                    var sigRid  = writer.MetaData.TablesHeap.StandAloneSigTable.Add(new RawStandAloneSigRow(sigBlob));
                    Debug.Assert(sigRid == 1);
                    var sigToken = 0x11000000 | sigRid;
                    ctx.KeyToken = sigToken;
                    MutationHelper.InjectKey(writer.Module.EntryPoint, 2, (int)sigToken);
                }
                else if (evt == ModuleWriterEvent.MDBeginAddResources && !ctx.CompatMode)
                {
                    // Compute hash
                    var hash     = SHA1.Create().ComputeHash(ctx.OriginModule);
                    var hashBlob = writer.MetaData.BlobHeap.Add(hash);

                    var fileTbl = writer.MetaData.TablesHeap.FileTable;
                    var fileRid = fileTbl.Add(new RawFileRow(
                                                  (uint)FileAttributes.ContainsMetaData,
                                                  writer.MetaData.StringsHeap.Add("koi"),
                                                  hashBlob));
                    var impl = CodedToken.Implementation.Encode(new MDToken(Table.File, fileRid));

                    // Add resources
                    var resTbl = writer.MetaData.TablesHeap.ManifestResourceTable;
                    foreach (var resource in ctx.ManifestResources)
                    {
                        resTbl.Add(new RawManifestResourceRow(resource.Item1, resource.Item2, writer.MetaData.StringsHeap.Add(resource.Item3), impl));
                    }

                    // Add exported types
                    var exTbl = writer.MetaData.TablesHeap.ExportedTypeTable;
                    foreach (var type in ctx.OriginModuleDef.GetTypes())
                    {
                        if (!type.IsVisibleOutside())
                        {
                            continue;
                        }

                        exTbl.Add(new RawExportedTypeRow((uint)type.Attributes, 0,
                                                         writer.MetaData.StringsHeap.Add(type.Name),
                                                         writer.MetaData.StringsHeap.Add(type.Namespace), impl));
                    }
                }
            }
예제 #11
0
        void InjectNativeCode(object sender, ModuleWriterEvent e)
        {
            var writer = (ModuleWriterBase)sender;

            if (e == ModuleWriterEvent.MDBeginWriteMethodBodies)
            {
                for (var v = 0; v < code.Keys.Count; v++)
                {
                    code[code.Keys.ElementAt(v)] = writer.MethodBodies.Add(code[code.Keys.ElementAt(v)]);
                }
            }
            else if (e == ModuleWriterEvent.EndCalculateRvasAndFileOffsets)
            {
                for (var v = 0; v < code.Keys.Count; v++)
                {
                    uint rid = writer.MetaData.GetRid(code.Keys.ElementAt(v));
                    writer.MetaData.TablesHeap.MethodTable[rid].RVA = (uint)code[code.Keys.ElementAt(v)].RVA;
                }
            }
        }
예제 #12
0
        public override void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
        {
            if (!options.DecryptMethods || !methodsDecrypter.HasNativeMethods)
            {
                return;
            }
            switch (evt)
            {
            case ModuleWriterEvent.Begin:
                // The decrypter assumes RVAs are unique so don't share any method bodies
                writer.TheOptions.ShareMethodBodies = false;
                break;

            case ModuleWriterEvent.MDBeginAddResources:
                methodsDecrypter.PrepareEncryptNativeMethods(writer);
                break;

            case ModuleWriterEvent.BeginWriteChunks:
                methodsDecrypter.EncryptNativeMethods(writer);
                break;
            }
        }
예제 #13
0
파일: Example6.cs 프로젝트: zsolti111/dnlib
        // Gets notified during module writing
        public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
        {
            switch (evt)
            {
            case ModuleWriterEvent.PESectionsCreated:
                // Add a PE section
                var sect1 = new PESection(".dummy", 0x40000040);
                writer.Sections.Add(sect1);
                // Let's add data
                sect1.Add(new ByteArrayChunk(new byte[123]), 4);
                sect1.Add(new ByteArrayChunk(new byte[10]), 4);
                break;

            case ModuleWriterEvent.MDEndCreateTables:
                // All types, methods etc have gotten their new RIDs. Let's print the new values
                Console.WriteLine("Old -> new type and method tokens");
                foreach (var type in writer.Module.GetTypes())
                {
                    Console.WriteLine("TYPE: {0:X8} -> {1:X8} {2}",
                                      type.MDToken.Raw,
                                      new MDToken(Table.TypeDef, writer.MetaData.GetRid(type)).Raw,
                                      type.FullName);
                    foreach (var method in type.Methods)
                    {
                        Console.WriteLine("  METH: {0:X8} -> {1:X8} {2}",
                                          method.MDToken.Raw,
                                          new MDToken(Table.Method, writer.MetaData.GetRid(method)).Raw,
                                          method.FullName);
                    }
                }
                break;

            default:
                break;
            }
        }
예제 #14
0
 void IModuleWriterListener.OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
 {
     OnWriterEvent?.Invoke(writer, new ModuleWriterListenerEventArgs(evt));
 }
예제 #15
0
		/// <inheritdoc/>
		public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt) {
		}
예제 #16
0
		public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt) {
			if (otherListener != null)
				otherListener.OnWriterEvent(writer, evt);
			if (evt == ModuleWriterEvent.End)
				PrintTokens(writer);
		}
예제 #17
0
파일: Example6.cs 프로젝트: EmilZhou/dnlib
		// Gets notified during module writing
		public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt) {
			switch (evt) {
			case ModuleWriterEvent.PESectionsCreated:
				// Add a PE section
				var sect1 = new PESection(".dummy", 0x40000040);
				writer.Sections.Add(sect1);
				// Let's add data
				sect1.Add(new ByteArrayChunk(new byte[123]), 4);
				sect1.Add(new ByteArrayChunk(new byte[10]), 4);
				break;

			case ModuleWriterEvent.MDEndCreateTables:
				// All types, methods etc have gotten their new RIDs. Let's print the new values
				Console.WriteLine("Old -> new type and method tokens");
				foreach (var type in writer.Module.GetTypes()) {
					Console.WriteLine("TYPE: {0:X8} -> {1:X8} {2}",
						type.MDToken.Raw,
						new MDToken(Table.TypeDef, writer.MetaData.GetRid(type)).Raw,
						type.FullName);
					foreach (var method in type.Methods)
						Console.WriteLine("  METH: {0:X8} -> {1:X8} {2}",
							method.MDToken.Raw,
							new MDToken(Table.Method, writer.MetaData.GetRid(method)).Raw,
							method.FullName);
				}
				break;

			default:
				break;
			}
		}
예제 #18
0
 public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
 {
     OnWriter?.Invoke(writer, evt);
 }
예제 #19
0
 /// <inheritdoc />
 void IModuleWriterListener.OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
 {
     if (OnWriterEvent != null) {
         OnWriterEvent(writer, new ModuleWriterListenerEventArgs(evt));
     }
 }
예제 #20
0
		void IModuleWriterListener.OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt) {
			ThrowIfCanceled();
			((ModuleFileProgress)fileProgress).CurrentEventIndex = evt - ModuleWriterEvent.Begin;
			Debug.Assert(((ModuleFileProgress)fileProgress).CurrentEventIndex >= 0);
			NotifyProgressUpdated();
		}
예제 #21
0
            public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
            {
                if (evt == ModuleWriterEvent.MDBeginCreateTables) {
                    // Add key signature
                    uint sigBlob = writer.MetaData.BlobHeap.Add(ctx.KeySig);
                    uint sigRid = writer.MetaData.TablesHeap.StandAloneSigTable.Add(new RawStandAloneSigRow(sigBlob));
                    Debug.Assert(sigRid == 1);
                    uint sigToken = 0x11000000 | sigRid;
                    ctx.KeyToken = sigToken;
                    MutationHelper.InjectKey(writer.Module.EntryPoint, 2, (int)sigToken);
                }
                else if (evt == ModuleWriterEvent.MDBeginAddResources) {
                    // Compute hash
                    byte[] hash = SHA1.Create().ComputeHash(ctx.OriginModule);
                    uint hashBlob = writer.MetaData.BlobHeap.Add(hash);

                    MDTable<RawFileRow> fileTbl = writer.MetaData.TablesHeap.FileTable;
                    uint fileRid = fileTbl.Add(new RawFileRow(
                                                   (uint)FileAttributes.ContainsMetaData,
                                                   writer.MetaData.StringsHeap.Add("koi"),
                                                   hashBlob));
                    uint impl = CodedToken.Implementation.Encode(new MDToken(Table.File, fileRid));

                    // Add resources
                    MDTable<RawManifestResourceRow> resTbl = writer.MetaData.TablesHeap.ManifestResourceTable;
                    foreach (var resource in ctx.ManifestResources)
                        resTbl.Add(new RawManifestResourceRow(resource.Item1, resource.Item2, writer.MetaData.StringsHeap.Add(resource.Item3), impl));

                    // Add exported types
                    var exTbl = writer.MetaData.TablesHeap.ExportedTypeTable;
                    foreach (var type in ctx.OriginModuleDef.GetTypes()) {
                        if (!type.IsVisibleOutside())
                            continue;
                        exTbl.Add(new RawExportedTypeRow((uint)type.Attributes, 0,
                                                         writer.MetaData.StringsHeap.Add(type.Name),
                                                         writer.MetaData.StringsHeap.Add(type.Namespace), impl));
                    }
                }
            }
예제 #22
0
 /// <summary>
 ///     Initializes a new instance of the <see cref="ModuleWriterListenerEventArgs" /> class.
 /// </summary>
 /// <param name="evt">The triggered writer event.</param>
 public ModuleWriterListenerEventArgs(ModuleWriterEvent evt)
 {
     WriterEvent = evt;
 }
예제 #23
0
		/// <summary>
		///     Initializes a new instance of the <see cref="ModuleWriterListenerEventArgs" /> class.
		/// </summary>
		/// <param name="evt">The triggered writer event.</param>
		public ModuleWriterListenerEventArgs(ModuleWriterEvent evt) {
			WriterEvent = evt;
		}
예제 #24
0
 void IModuleWriterListener.OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
 {
     ThrowIfCanceled();
     currentEventIndex = evt - ModuleWriterEvent.Begin;
     Debug.Assert(currentEventIndex >= 0);
     if (OnProgressUpdated != null)
         OnProgressUpdated(this, EventArgs.Empty);
 }
예제 #25
0
 /// <inheritdoc/>
 public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
 {
 }
예제 #26
0
		public override void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt) {
			if (!options.DecryptMethods || !methodsDecrypter.HasNativeMethods)
				return;
			switch (evt) {
			case ModuleWriterEvent.Begin:
				// The decrypter assumes RVAs are unique so don't share any method bodies
				writer.TheOptions.ShareMethodBodies = false;
				break;

			case ModuleWriterEvent.MDBeginAddResources:
				methodsDecrypter.PrepareEncryptNativeMethods(writer);
				break;

			case ModuleWriterEvent.BeginWriteChunks:
				methodsDecrypter.EncryptNativeMethods(writer);
				break;
			}
		}