Changeset 70802 in vbox for trunk/src/bldprogs
- Timestamp:
- Jan 30, 2018 4:53:42 AM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 120589
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/bldprogs/VBoxPeSetVersion.cpp
r70403 r70802 74 74 /* 75 75 * Locate and read the PE header. 76 * 77 * Note! We'll be reading the 64-bit size even for 32-bit since the difference 78 * is 16 bytes, which is less than a section header, so it won't be a problem. 76 79 */ 77 80 unsigned long offNtHdrs; … … 87 90 if (fseek(pFile, offNtHdrs, SEEK_SET) != 0) 88 91 return Error("Failed to seek to PE header at %#lx: %s", offNtHdrs, strerror(errno)); 89 IMAGE_NT_HEADERS32 NtHdrs; 92 union 93 { 94 IMAGE_NT_HEADERS32 x32; 95 IMAGE_NT_HEADERS64 x64; 96 } NtHdrs, 97 NtHdrsNew; 90 98 if (fread(&NtHdrs, sizeof(NtHdrs), 1, pFile) != 1) 91 99 return Error("Failed to read PE header at %#lx: %s", offNtHdrs, strerror(errno)); … … 94 102 * Validate it a little bit. 95 103 */ 96 if (NtHdrs.Signature != IMAGE_NT_SIGNATURE) 97 return Error("Invalid PE signature: %#x", NtHdrs.Signature); 98 if (NtHdrs.FileHeader.Machine != IMAGE_FILE_MACHINE_I386) 99 return Error("Not I386 machine: %#x", NtHdrs.FileHeader.Machine); 100 if (NtHdrs.FileHeader.SizeOfOptionalHeader != sizeof(NtHdrs.OptionalHeader)) 101 return Error("Invalid optional header size: %#x", NtHdrs.FileHeader.SizeOfOptionalHeader); 102 if (NtHdrs.OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC) 103 return Error("Invalid optional header magic: %#x", NtHdrs.OptionalHeader.Magic); 104 if (NtHdrs.x32.Signature != IMAGE_NT_SIGNATURE) 105 return Error("Invalid PE signature: %#x", NtHdrs.x32.Signature); 106 uint32_t cbNewHdrs; 107 if (NtHdrs.x32.FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64) 108 { 109 if (NtHdrs.x64.FileHeader.SizeOfOptionalHeader != sizeof(NtHdrs.x64.OptionalHeader)) 110 return Error("Invalid optional header size: %#x", NtHdrs.x64.FileHeader.SizeOfOptionalHeader); 111 if (NtHdrs.x64.OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR64_MAGIC) 112 return Error("Invalid optional header magic: %#x", NtHdrs.x64.OptionalHeader.Magic); 113 if (!uNtVersion) 114 uNtVersion = MK_VER(5, 2); 115 else if (uNtVersion < MK_VER(5, 2)) 116 return Error("Selected version is too old for AMD64: %u.%u", uNtVersion >> 8, uNtVersion & 0xff); 117 cbNewHdrs = sizeof(NtHdrsNew.x64); 118 } 119 else if (NtHdrs.x32.FileHeader.Machine != IMAGE_FILE_MACHINE_I386) 120 return Error("Not I386 or AMD64 machine: %#x", NtHdrs.x32.FileHeader.Machine); 121 else 122 { 123 if (NtHdrs.x32.FileHeader.SizeOfOptionalHeader != sizeof(NtHdrs.x32.OptionalHeader)) 124 return Error("Invalid optional header size: %#x", NtHdrs.x32.FileHeader.SizeOfOptionalHeader); 125 if (NtHdrs.x32.OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC) 126 return Error("Invalid optional header magic: %#x", NtHdrs.x32.OptionalHeader.Magic); 127 if (!uNtVersion) 128 uNtVersion = MK_VER(3, 10); 129 cbNewHdrs = sizeof(NtHdrsNew.x32); 130 } 104 131 105 132 /* 106 133 * Do the header modifications. 107 134 */ 108 IMAGE_NT_HEADERS32 NtHdrsNew = NtHdrs; 109 NtHdrsNew.OptionalHeader.MajorOperatingSystemVersion = uNtVersion >> 8; 110 NtHdrsNew.OptionalHeader.MinorOperatingSystemVersion = uNtVersion & 0xff; 111 NtHdrsNew.OptionalHeader.MajorSubsystemVersion = uNtVersion >> 8; 112 NtHdrsNew.OptionalHeader.MinorSubsystemVersion = uNtVersion & 0xff; 135 memcpy(&NtHdrsNew, &NtHdrs, sizeof(NtHdrsNew)); 136 NtHdrsNew.x32.OptionalHeader.MajorOperatingSystemVersion = uNtVersion >> 8; 137 NtHdrsNew.x32.OptionalHeader.MinorOperatingSystemVersion = uNtVersion & 0xff; 138 NtHdrsNew.x32.OptionalHeader.MajorSubsystemVersion = uNtVersion >> 8; 139 NtHdrsNew.x32.OptionalHeader.MinorSubsystemVersion = uNtVersion & 0xff; 140 AssertCompileMembersAtSameOffset(IMAGE_NT_HEADERS32, OptionalHeader.MajorOperatingSystemVersion, IMAGE_NT_HEADERS64, OptionalHeader.MajorOperatingSystemVersion); 141 AssertCompileMembersAtSameOffset(IMAGE_NT_HEADERS32, OptionalHeader.MinorOperatingSystemVersion, IMAGE_NT_HEADERS64, OptionalHeader.MinorOperatingSystemVersion); 142 AssertCompileMembersAtSameOffset(IMAGE_NT_HEADERS32, OptionalHeader.MajorSubsystemVersion, IMAGE_NT_HEADERS64, OptionalHeader.MajorSubsystemVersion); 143 AssertCompileMembersAtSameOffset(IMAGE_NT_HEADERS32, OptionalHeader.MinorSubsystemVersion, IMAGE_NT_HEADERS64, OptionalHeader.MinorSubsystemVersion); 113 144 114 145 if (uNtVersion <= MK_VER(3, 50)) 115 146 { 116 NtHdrsNew.OptionalHeader.MajorOperatingSystemVersion = 1; 117 NtHdrsNew.OptionalHeader.MinorOperatingSystemVersion = 0; 147 NtHdrsNew.x32.OptionalHeader.MajorOperatingSystemVersion = 1; 148 NtHdrsNew.x32.OptionalHeader.MinorOperatingSystemVersion = 0; 149 AssertCompileMembersAtSameOffset(IMAGE_NT_HEADERS32, OptionalHeader.MajorOperatingSystemVersion, IMAGE_NT_HEADERS64, OptionalHeader.MajorOperatingSystemVersion); 150 AssertCompileMembersAtSameOffset(IMAGE_NT_HEADERS32, OptionalHeader.MinorOperatingSystemVersion, IMAGE_NT_HEADERS64, OptionalHeader.MinorOperatingSystemVersion); 118 151 } 119 152 … … 121 154 { 122 155 /** @todo calc checksum. */ 123 NtHdrsNew.OptionalHeader.CheckSum = 0; 124 125 if ( NtHdrsNew.OptionalHeader.MajorOperatingSystemVersion != NtHdrs.OptionalHeader.MajorOperatingSystemVersion 126 || NtHdrsNew.OptionalHeader.MinorOperatingSystemVersion != NtHdrs.OptionalHeader.MinorOperatingSystemVersion) 156 NtHdrsNew.x32.OptionalHeader.CheckSum = 0; 157 AssertCompileMembersAtSameOffset(IMAGE_NT_HEADERS32, OptionalHeader.MinorOperatingSystemVersion, IMAGE_NT_HEADERS64, OptionalHeader.MinorOperatingSystemVersion); 158 159 if ( NtHdrsNew.x32.OptionalHeader.MajorOperatingSystemVersion != NtHdrs.x32.OptionalHeader.MajorOperatingSystemVersion 160 || NtHdrsNew.x32.OptionalHeader.MinorOperatingSystemVersion != NtHdrs.x32.OptionalHeader.MinorOperatingSystemVersion) 127 161 Info(1,"OperatingSystemVersion %u.%u -> %u.%u", 128 NtHdrs. OptionalHeader.MajorOperatingSystemVersion, NtHdrs.OptionalHeader.MinorOperatingSystemVersion,129 NtHdrsNew. OptionalHeader.MajorOperatingSystemVersion, NtHdrsNew.OptionalHeader.MinorOperatingSystemVersion);130 if ( NtHdrsNew. OptionalHeader.MajorSubsystemVersion != NtHdrs.OptionalHeader.MajorSubsystemVersion131 || NtHdrsNew. OptionalHeader.MinorSubsystemVersion != NtHdrs.OptionalHeader.MinorSubsystemVersion)162 NtHdrs.x32.OptionalHeader.MajorOperatingSystemVersion, NtHdrs.x32.OptionalHeader.MinorOperatingSystemVersion, 163 NtHdrsNew.x32.OptionalHeader.MajorOperatingSystemVersion, NtHdrsNew.x32.OptionalHeader.MinorOperatingSystemVersion); 164 if ( NtHdrsNew.x32.OptionalHeader.MajorSubsystemVersion != NtHdrs.x32.OptionalHeader.MajorSubsystemVersion 165 || NtHdrsNew.x32.OptionalHeader.MinorSubsystemVersion != NtHdrs.x32.OptionalHeader.MinorSubsystemVersion) 132 166 Info(1,"SubsystemVersion %u.%u -> %u.%u", 133 NtHdrs. OptionalHeader.MajorSubsystemVersion, NtHdrs.OptionalHeader.MinorSubsystemVersion,134 NtHdrsNew. OptionalHeader.MajorSubsystemVersion, NtHdrsNew.OptionalHeader.MinorSubsystemVersion);167 NtHdrs.x32.OptionalHeader.MajorSubsystemVersion, NtHdrs.x32.OptionalHeader.MinorSubsystemVersion, 168 NtHdrsNew.x32.OptionalHeader.MajorSubsystemVersion, NtHdrsNew.x32.OptionalHeader.MinorSubsystemVersion); 135 169 136 170 if (fseek(pFile, offNtHdrs, SEEK_SET) != 0) 137 171 return Error("Failed to seek to PE header at %#lx: %s", offNtHdrs, strerror(errno)); 138 if (fwrite(&NtHdrsNew, sizeof(NtHdrsNew), 1, pFile) != 1)172 if (fwrite(&NtHdrsNew, cbNewHdrs, 1, pFile) != 1) 139 173 return Error("Failed to write PE header at %#lx: %s", offNtHdrs, strerror(errno)); 140 174 } … … 148 182 */ 149 183 if ( uNtVersion <= MK_VER(3, 10) 150 && NtHdrsNew. FileHeader.NumberOfSections > 0)151 { 152 uint32_t cbShdrs = sizeof(IMAGE_SECTION_HEADER) * NtHdrsNew. FileHeader.NumberOfSections;184 && NtHdrsNew.x32.FileHeader.NumberOfSections > 0) 185 { 186 uint32_t cbShdrs = sizeof(IMAGE_SECTION_HEADER) * NtHdrsNew.x32.FileHeader.NumberOfSections; 153 187 PIMAGE_SECTION_HEADER paShdrs = (PIMAGE_SECTION_HEADER)calloc(1, cbShdrs); 154 188 if (!paShdrs) … … 158 192 unsigned long offShdrs = offNtHdrs 159 193 + RT_UOFFSETOF(IMAGE_NT_HEADERS32, 160 OptionalHeader.DataDirectory[NtHdrsNew. OptionalHeader.NumberOfRvaAndSizes]);194 OptionalHeader.DataDirectory[NtHdrsNew.x32.OptionalHeader.NumberOfRvaAndSizes]); 161 195 if (fseek(pFile, offShdrs, SEEK_SET) != 0) 162 196 return Error("Failed to seek to section headers at %#lx: %s", offShdrs, strerror(errno)); … … 165 199 166 200 bool fFoundBss = false; 167 uint32_t uRvaEnd = NtHdrsNew. OptionalHeader.SizeOfImage;168 uint32_t uRvaIat = NtHdrsNew. OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size > 0169 ? NtHdrsNew. OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress : UINT32_MAX;170 uint32_t i = NtHdrsNew. FileHeader.NumberOfSections;201 uint32_t uRvaEnd = NtHdrsNew.x32.OptionalHeader.SizeOfImage; 202 uint32_t uRvaIat = NtHdrsNew.x32.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size > 0 203 ? NtHdrsNew.x32.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress : UINT32_MAX; 204 uint32_t i = NtHdrsNew.x32.FileHeader.NumberOfSections; 171 205 while (i-- > 0) 172 206 if (!(paShdrs[i].Characteristics & IMAGE_SCN_TYPE_NOLOAD)) … … 240 274 * This stucks 241 275 */ 242 unsigned uNtVersion = MK_VER(3,10);276 unsigned uNtVersion = 0; 243 277 const char *pszFilename = NULL; 244 278 bool fAcceptOptions = true;
Note:
See TracChangeset
for help on using the changeset viewer.