private static void performDiskPatch(PEFile file, MethodDef def, int patternIndex, int fileAddress)
        {
            CopyIfNecessary();

            // read the int, shift off the table number
            int fieldNum =
                BitConverter.ToInt32(def.Method.Code, patternIndex + 6)
                    << 8 >> 8;

            using (FileStream sw = new FileStream(LOADED_FILE, FileMode.Open, FileAccess.Write, FileShare.Read))
            {
                // change the push 1 to a push 0
                int    RVA  = def.GetByteOffset(file, patternIndex) + 10;
                byte[] data = new byte[] { 0x16 };
                sw.Position = file.FindSectionForRVA(RVA).CalculateFileOffset(RVA);
                sw.Write(data, 0, data.Length);


                // write the new location to the metadata folder
                data = new byte[] { getByte(fileAddress, 0), getByte(fileAddress, 1), getByte(fileAddress, 2), getByte(fileAddress, 3) };
                FieldDef fd = file.GetField(fieldNum);
                RVA =
                    file.FindSectionForFileOffset((int)fd.MetaDataFileLocation)
                    .CalculateRVA((int)fd.MetaDataFileLocation);
                sw.Position = file.FindSectionForRVA(RVA).CalculateFileOffset(RVA);
                sw.Write(data, 0, data.Length);

                // write the string to an empty file location
                RVA         = fileAddress;
                data        = Encoding.Unicode.GetBytes(FileManager.MergedPath);
                sw.Position = file.FindSectionForRVA(RVA).CalculateFileOffset(RVA);
                sw.Write(data, 0, data.Length);
            }
        }
        private static void performMemoryPatch(PEFile file, MethodDef def, int patternIndex, ProcessMemoryReader pmr, DllBaseNativeEvent ev)
        {
            IntPtr address =
                Utils.VirtualAllocEx(ev.Process.UnsafeHandle, IntPtr.Zero,
                                     (uint)Encoding.Unicode.GetBytes(FileManager.MergedPath).Length,
                                     AllocationType.Reserve | AllocationType.Commit | AllocationType.TopDown, MemoryProtection.ReadWrite);
            int fileAddress = address.ToInt32();
            // set the location for our new filename string
            int offset = ev.Module.BaseAddress.ToInt32() + def.GetByteOffset(file, patternIndex);

            newCode[2] = getByte(fileAddress, 0);
            newCode[3] = getByte(fileAddress, 1);
            newCode[4] = getByte(fileAddress, 2);
            newCode[5] = getByte(fileAddress, 3);
            int writtenBytes;

            pmr.WriteProcessMemory(new IntPtr(offset), newCode, out writtenBytes);
            // write the new filename string
            pmr.WriteProcessMemory(new IntPtr(fileAddress), Encoding.Unicode.GetBytes(FileManager.MergedPath), out writtenBytes);
        }
示例#3
0
 private static void performMemoryPatch(PEFile file, MethodDef def, int patternIndex, ProcessMemoryReader pmr,DllBaseNativeEvent ev)
 {
     IntPtr address =
         Utils.VirtualAllocEx(ev.Process.UnsafeHandle, IntPtr.Zero,
         (uint)Encoding.Unicode.GetBytes(FileManager.MergedPath).Length,
          AllocationType.Reserve | AllocationType.Commit | AllocationType.TopDown, MemoryProtection.ReadWrite);
     int fileAddress = address.ToInt32();
     // set the location for our new filename string
     int offset = ev.Module.BaseAddress.ToInt32() + def.GetByteOffset(file, patternIndex);
     newCode[2] = getByte(fileAddress, 0);
     newCode[3] = getByte(fileAddress, 1);
     newCode[4] = getByte(fileAddress, 2);
     newCode[5] = getByte(fileAddress, 3);
     int writtenBytes;
     pmr.WriteProcessMemory(new IntPtr(offset), newCode, out writtenBytes);
     // write the new filename string
     pmr.WriteProcessMemory(new IntPtr(fileAddress),  Encoding.Unicode.GetBytes(FileManager.MergedPath), out writtenBytes);
 }
示例#4
0
        private static void performDiskPatch(PEFile file, MethodDef def, int patternIndex, int fileAddress)
        {
            CopyIfNecessary();

            // read the int, shift off the table number
            int fieldNum =
                  BitConverter.ToInt32(def.Method.Code, patternIndex + 6)
                  << 8 >> 8;
            using (FileStream sw = new FileStream(LOADED_FILE, FileMode.Open, FileAccess.Write, FileShare.Read))
            {
                // change the push 1 to a push 0
                int RVA = def.GetByteOffset(file, patternIndex) + 10;
                byte[] data = new byte[] { 0x16 };
                sw.Position = file.FindSectionForRVA(RVA).CalculateFileOffset(RVA);
                sw.Write(data, 0, data.Length);


                // write the new location to the metadata folder
                data = new byte[] { getByte(fileAddress, 0), getByte(fileAddress, 1), getByte(fileAddress, 2), getByte(fileAddress, 3) };
                FieldDef fd = file.GetField(fieldNum);
                RVA =
                    file.FindSectionForFileOffset((int)fd.MetaDataFileLocation)
                        .CalculateRVA((int)fd.MetaDataFileLocation);
                sw.Position = file.FindSectionForRVA(RVA).CalculateFileOffset(RVA);
                sw.Write(data, 0, data.Length);

                // write the string to an empty file location
                RVA = fileAddress;
                data = Encoding.Unicode.GetBytes(FileManager.MergedPath);
                sw.Position = file.FindSectionForRVA(RVA).CalculateFileOffset(RVA);
                sw.Write(data, 0, data.Length);
            }
        }