src: pefile: add checkMachine()
This commit is contained in:
parent
e1edc5f50a
commit
3d691645a4
@ -76,7 +76,10 @@ int PackW32PeI386::readFileHeader() {
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
bool PackW32PeI386::canPack() {
|
bool PackW32PeI386::canPack() {
|
||||||
if (!readFileHeader() || ih.cpu < IMAGE_FILE_MACHINE_I386 || ih.cpu > 0x150)
|
if (!readFileHeader())
|
||||||
|
return false;
|
||||||
|
checkMachine(ih.cpu);
|
||||||
|
if (ih.cpu < IMAGE_FILE_MACHINE_I386 || ih.cpu > 0x150)
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -66,8 +66,10 @@ Linker *PackW64PeAmd64::newLinker() const { return new ElfLinkerAMD64; }
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
bool PackW64PeAmd64::canPack() {
|
bool PackW64PeAmd64::canPack() {
|
||||||
// just check if machine type is 0x8664
|
if (!readFileHeader())
|
||||||
if (!readFileHeader() || ih.cpu != IMAGE_FILE_MACHINE_AMD64)
|
return false;
|
||||||
|
checkMachine(ih.cpu);
|
||||||
|
if (ih.cpu != IMAGE_FILE_MACHINE_AMD64)
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -60,7 +60,10 @@ const int *PackW64PeArm64::getFilters() const { return nullptr; }
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
bool PackW64PeArm64::canPack() {
|
bool PackW64PeArm64::canPack() {
|
||||||
if (!readFileHeader() || ih.cpu != IMAGE_FILE_MACHINE_ARM64)
|
if (!readFileHeader())
|
||||||
|
return false;
|
||||||
|
checkMachine(ih.cpu);
|
||||||
|
if (ih.cpu != IMAGE_FILE_MACHINE_ARM64)
|
||||||
return false;
|
return false;
|
||||||
throwCantPack("not yet implemented");
|
throwCantPack("not yet implemented");
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@ -114,6 +114,7 @@ void PackWinCeArm::processTls(Interval *) // pass 1
|
|||||||
bool PackWinCeArm::canPack() {
|
bool PackWinCeArm::canPack() {
|
||||||
if (!readFileHeader())
|
if (!readFileHeader())
|
||||||
return false;
|
return false;
|
||||||
|
checkMachine(ih.cpu);
|
||||||
if (ih.cpu != IMAGE_FILE_MACHINE_ARM && ih.cpu != IMAGE_FILE_MACHINE_THUMB)
|
if (ih.cpu != IMAGE_FILE_MACHINE_ARM && ih.cpu != IMAGE_FILE_MACHINE_THUMB)
|
||||||
return false;
|
return false;
|
||||||
use_thumb_stub |= ih.cpu == IMAGE_FILE_MACHINE_THUMB || (ih.entry & 1) == 1;
|
use_thumb_stub |= ih.cpu == IMAGE_FILE_MACHINE_THUMB || (ih.entry & 1) == 1;
|
||||||
|
|||||||
@ -158,12 +158,12 @@ Packer *PackMaster::visitAllPackers(visit_func_t func, InputFile *f, const optio
|
|||||||
D(PackDjgpp2);
|
D(PackDjgpp2);
|
||||||
D(PackTmt);
|
D(PackTmt);
|
||||||
D(PackWcle);
|
D(PackWcle);
|
||||||
|
// D(PackW64PeArm64EC); // NOT YET IMPLEMENTED
|
||||||
|
// D(PackW64PeArm64); // NOT YET IMPLEMENTED
|
||||||
D(PackW64PeAmd64);
|
D(PackW64PeAmd64);
|
||||||
D(PackW32PeI386);
|
D(PackW32PeI386);
|
||||||
}
|
}
|
||||||
D(PackWinCeArm);
|
D(PackWinCeArm);
|
||||||
// D(PackW64PeArm64EC); // NOT YET IMPLEMENTED
|
|
||||||
// D(PackW64PeArm64); // NOT YET IMPLEMENTED
|
|
||||||
D(PackExe);
|
D(PackExe);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@ -117,6 +117,34 @@ bool PeFile::testUnpackVersion(int version) const {
|
|||||||
// util
|
// util
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
// early check of machine to generate a helpful error message
|
||||||
|
// FIXME/TODO: proper check for ARM64EC
|
||||||
|
// FIXME/TODO: proper check for ARM64X "universal" binary
|
||||||
|
// CHPE Compiled Hybrid PE: Microsoft internal only?
|
||||||
|
// CHPEV2 Compiled Hybrid PE: ARM64EC, ARM64X
|
||||||
|
/*static*/ int PeFile::checkMachine(unsigned cpu) {
|
||||||
|
// known but not supported
|
||||||
|
if (cpu == IMAGE_FILE_MACHINE_ARMNT)
|
||||||
|
throwCantPack("win32/arm32 is not supported"); // obsolete
|
||||||
|
if (cpu == IMAGE_FILE_MACHINE_ARM64)
|
||||||
|
throwCantPack("win64/arm64 is not supported");
|
||||||
|
// FIXME: it seems that arm64ec actually uses MACHINE_AMD64 ???
|
||||||
|
if (cpu == IMAGE_FILE_MACHINE_ARM64EC)
|
||||||
|
throwCantPack("win64/arm64ec is not supported");
|
||||||
|
|
||||||
|
// supported
|
||||||
|
if (cpu == IMAGE_FILE_MACHINE_AMD64)
|
||||||
|
return UPX_F_W64PE_AMD64;
|
||||||
|
if (cpu == IMAGE_FILE_MACHINE_ARM || cpu == IMAGE_FILE_MACHINE_THUMB)
|
||||||
|
return UPX_F_WINCE_ARM;
|
||||||
|
if (cpu >= IMAGE_FILE_MACHINE_I386 && cpu <= 0x150) // what is this 0x150 ???
|
||||||
|
return UPX_F_W32PE_I386;
|
||||||
|
|
||||||
|
// other or unkown (alpha, mips, etc.)
|
||||||
|
throwCantPack("pefile: unsupported machine %#x", cpu);
|
||||||
|
return 0; // pacify msvc
|
||||||
|
}
|
||||||
|
|
||||||
int PeFile::readFileHeader() {
|
int PeFile::readFileHeader() {
|
||||||
struct alignas(1) exe_header_t {
|
struct alignas(1) exe_header_t {
|
||||||
LE16 mz;
|
LE16 mz;
|
||||||
|
|||||||
@ -82,6 +82,7 @@ protected:
|
|||||||
int canUnpack0(unsigned max_sections, unsigned objs, unsigned ih_entry, unsigned ih_size);
|
int canUnpack0(unsigned max_sections, unsigned objs, unsigned ih_entry, unsigned ih_size);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
static int checkMachine(unsigned cpu);
|
||||||
virtual int readFileHeader();
|
virtual int readFileHeader();
|
||||||
virtual bool testUnpackVersion(int version) const override;
|
virtual bool testUnpackVersion(int version) const override;
|
||||||
virtual void readPeHeader() = 0;
|
virtual void readPeHeader() = 0;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user