forked from xt-sys/xtchain
		
	Upgrade LLVM and rewrite exetool in C
This commit is contained in:
		| @@ -28,7 +28,7 @@ CMAKEVCS="https://gitlab.kitware.com/cmake/cmake.git" | |||||||
|  |  | ||||||
| # LLVM Settings | # LLVM Settings | ||||||
| LLVMDIR="${SRCDIR}/llvm" | LLVMDIR="${SRCDIR}/llvm" | ||||||
| LLVMTAG="llvmorg-16.0.0" | LLVMTAG="llvmorg-16.0.4" | ||||||
| LLVMVCS="https://github.com/llvm/llvm-project.git" | LLVMVCS="https://github.com/llvm/llvm-project.git" | ||||||
|  |  | ||||||
| # Make Settings | # Make Settings | ||||||
| @@ -533,14 +533,13 @@ xtchain_build() | |||||||
|         for EXEC in dlltool ld objdump; do |         for EXEC in dlltool ld objdump; do | ||||||
|             ln -sf ../${GENERIC}/bin/${EXEC}-wrapper ${BINDIR}/bin/${ARCH}-w64-mingw32-${EXEC} |             ln -sf ../${GENERIC}/bin/${EXEC}-wrapper ${BINDIR}/bin/${ARCH}-w64-mingw32-${EXEC} | ||||||
|         done |         done | ||||||
|         for EXEC in windres xtcspecc; do |         for EXEC in exetool windres xtcspecc; do | ||||||
|             if [ ! -e ${BINDIR}/bin/${EXEC} ]; then |             if [ ! -e ${BINDIR}/bin/${EXEC} ]; then | ||||||
|                 gcc ${WRKDIR}/tools/${EXEC}.c -o ${BINDIR}/bin/${EXEC} |                 gcc ${WRKDIR}/tools/${EXEC}.c -o ${BINDIR}/bin/${EXEC} | ||||||
|             fi |             fi | ||||||
|             ln -sf ${EXEC} ${BINDIR}/bin/${ARCH}-w64-mingw32-${EXEC} |             ln -sf ${EXEC} ${BINDIR}/bin/${ARCH}-w64-mingw32-${EXEC} | ||||||
|         done |         done | ||||||
|     done |     done | ||||||
|     cp ${WRKDIR}/scripts/exetool ${BINDIR}/bin/ |  | ||||||
|     cp ${WRKDIR}/scripts/xtclib ${BINDIR}/lib/xtchain/ |     cp ${WRKDIR}/scripts/xtclib ${BINDIR}/lib/xtchain/ | ||||||
|     cp ${WRKDIR}/scripts/xtchain ${BINDIR}/ |     cp ${WRKDIR}/scripts/xtchain ${BINDIR}/ | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,79 +0,0 @@ | |||||||
| #!/usr/bin/env python3 |  | ||||||
|  |  | ||||||
| import sys |  | ||||||
| import struct |  | ||||||
|  |  | ||||||
| if len(sys.argv) < 3: |  | ||||||
|     print("XTChain ExeTool for modifying PE/COFF image subsystem\nNot sufficient parametrs. '[PE/COFF Image File]' '[SubSystem]'") |  | ||||||
|     sys.exit(1) |  | ||||||
|  |  | ||||||
| ImageFile = sys.argv[1] |  | ||||||
| Subsystem = sys.argv[2].upper() |  | ||||||
|  |  | ||||||
| # Set proper subsystem |  | ||||||
| if Subsystem == "UNKNOWN": |  | ||||||
|     ImageSubsystem = 0x00 |  | ||||||
| elif Subsystem == "NT_NATIVE": |  | ||||||
|     ImageSubsystem = 0x01 |  | ||||||
| elif Subsystem == "WINDOWS_GUI": |  | ||||||
|     ImageSubsystem = 0x02 |  | ||||||
| elif Subsystem == "WINDOWS_CLI": |  | ||||||
|     ImageSubsystem = 0x03 |  | ||||||
| elif Subsystem == "WINDOWS_CE_OLD": |  | ||||||
|     ImageSubsystem = 0x04 |  | ||||||
| elif Subsystem == "OS2_CUI": |  | ||||||
|     ImageSubsystem = 0x05 |  | ||||||
| elif Subsystem == "POSIX_CUI": |  | ||||||
|     ImageSubsystem = 0x07 |  | ||||||
| elif Subsystem == "NATIVE_WINDOWS": |  | ||||||
|     ImageSubsystem = 0x08 |  | ||||||
| elif Subsystem == "WINDOWS_CE_GUI": |  | ||||||
|     ImageSubsystem = 0x09 |  | ||||||
| elif Subsystem == "EFI_APPLICATION": |  | ||||||
|     ImageSubsystem = 0x0A |  | ||||||
| elif Subsystem == "EFI_BOOT_SERVICE_DRIVER": |  | ||||||
|     ImageSubsystem = 0x0B |  | ||||||
| elif Subsystem == "EFI_RUNTIME_DRIVER": |  | ||||||
|     ImageSubsystem = 0x0C |  | ||||||
| elif Subsystem == "EFI_ROM": |  | ||||||
|     ImageSubsystem = 0x0D |  | ||||||
| elif Subsystem == "XBOX": |  | ||||||
|     ImageSubsystem = 0x0E |  | ||||||
| elif Subsystem == "WINDOWS_BOOT_APPLICATION": |  | ||||||
|     ImageSubsystem = 0x10 |  | ||||||
| elif Subsystem == "XT_NATIVE_KERNEL": |  | ||||||
|     ImageSubsystem = 0x14 |  | ||||||
| elif Subsystem == "XT_NATIVE_APPLICATION": |  | ||||||
|     ImageSubsystem = 0x15 |  | ||||||
| elif Subsystem == "XT_NATIVE_DRIVER": |  | ||||||
|     ImageSubsystem = 0x16 |  | ||||||
| elif Subsystem == "XT_DYNAMIC_LIBRARY": |  | ||||||
|     ImageSubsystem = 0x17 |  | ||||||
| elif Subsystem == "XT_APPLICATION_CLI": |  | ||||||
|     ImageSubsystem = 0x18 |  | ||||||
| elif Subsystem == "XT_APPLICATION_GDI": |  | ||||||
|     ImageSubsystem = 0x19 |  | ||||||
| else: |  | ||||||
|     print("Invalid subsystem privided") |  | ||||||
|     exit(2) |  | ||||||
|  |  | ||||||
| # Open PE/COFF image file |  | ||||||
| PeImage = open(sys.argv[1], "r+b") |  | ||||||
|  |  | ||||||
| # Get PE header |  | ||||||
| PeImage.seek(0x3C) |  | ||||||
| (PeHeader,)=struct.unpack("H", PeImage.read(2)) |  | ||||||
|  |  | ||||||
| # Get PE signature |  | ||||||
| PeImage.seek(PeHeader) |  | ||||||
| (PeSignature,)=struct.unpack("I", PeImage.read(4)) |  | ||||||
| if PeSignature != 0x4550: |  | ||||||
|     print("Invalid or corrupted PE header") |  | ||||||
|  |  | ||||||
| # Set new image subsystem |  | ||||||
| PeImage.seek(PeHeader + 0x5C) |  | ||||||
| print("Setting subsystem to " + str(ImageSubsystem)) |  | ||||||
| PeImage.write(struct.pack("H", ImageSubsystem)) |  | ||||||
|  |  | ||||||
| # Close PE/COFF image file |  | ||||||
| PeImage.close() |  | ||||||
							
								
								
									
										142
									
								
								tools/exetool.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								tools/exetool.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | |||||||
|  | /** | ||||||
|  |  * PROJECT:     XTchain | ||||||
|  |  * LICENSE:     See COPYING.md in the top level directory | ||||||
|  |  * FILE:        tools/exetool.c | ||||||
|  |  * DESCRIPTION: Portable Executable (PE) utility for changing subsystem | ||||||
|  |  * DEVELOPERS:  Rafal Kupiec <belliash@codingworkshop.eu.org> | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "xtchain.h" | ||||||
|  |  | ||||||
|  | typedef struct _PE_SUBSYSTEM | ||||||
|  | { | ||||||
|  |     int Identifier; | ||||||
|  |     char *Name; | ||||||
|  | } PE_SUBSYSTEM, *PPE_SUBSYSTEM; | ||||||
|  |  | ||||||
|  | static PE_SUBSYSTEM SubSystems[] = { | ||||||
|  |     {0x01, "NT_NATIVE"}, | ||||||
|  |     {0x02, "WINDOWS_GUI"}, | ||||||
|  |     {0x03, "WINDOWS_CLI"}, | ||||||
|  |     {0x04, "WINDOWS_CE_OLD"}, | ||||||
|  |     {0x05, "OS2_CUI"}, | ||||||
|  |     {0x07, "POSIX_CUI"}, | ||||||
|  |     {0x08, "NATIVE_WINDOWS"}, | ||||||
|  |     {0x09, "WINDOWS_CE_GUI"}, | ||||||
|  |     {0x0A, "EFI_APPLICATION"}, | ||||||
|  |     {0x0B, "EFI_BOOT_SERVICE_DRIVER"}, | ||||||
|  |     {0x0C, "EFI_RUNTIME_DRIVER"}, | ||||||
|  |     {0x0D, "EFI_ROM"}, | ||||||
|  |     {0x0E, "XBOX"}, | ||||||
|  |     {0x10, "WINDOWS_BOOT_APPLICATION"}, | ||||||
|  |     {0x14, "XT_NATIVE_KERNEL"}, | ||||||
|  |     {0x15, "XT_NATIVE_APPLICATION"}, | ||||||
|  |     {0x16, "XT_NATIVE_DRIVER"}, | ||||||
|  |     {0x17, "XT_DYNAMIC_LIBRARY"}, | ||||||
|  |     {0x18, "XT_APPLICATION_CLI"}, | ||||||
|  |     {0x19, "XT_APPLICATION_GDI"} | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | int getSubSystemID(char *Name) | ||||||
|  | { | ||||||
|  |     int Index; | ||||||
|  |     int SubSystemsCount; | ||||||
|  |     PPE_SUBSYSTEM SubSystem; | ||||||
|  |  | ||||||
|  |     /* Count number of subsystems avaialble */ | ||||||
|  |     SubSystemsCount = sizeof(SubSystems) / sizeof(PE_SUBSYSTEM); | ||||||
|  |  | ||||||
|  |     /* Find subsystem */ | ||||||
|  |     for(Index = 0; Index < SubSystemsCount; Index++) | ||||||
|  |     { | ||||||
|  |         SubSystem = &SubSystems[Index]; | ||||||
|  |         if(strcmp(SubSystem->Name, Name) == 0) | ||||||
|  |         { | ||||||
|  |             /* Subsystem found, return its ID */ | ||||||
|  |             return SubSystem->Identifier; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | 	/* No valid subsystem found */ | ||||||
|  |     return 0x00; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main(int argc, char *argv[]) | ||||||
|  | { | ||||||
|  |     FILE *ExeFile; | ||||||
|  |     unsigned char Signature[4]; | ||||||
|  |     unsigned int HeaderOffset; | ||||||
|  |     unsigned short SubSystem; | ||||||
|  |     int NewSubSystem; | ||||||
|  |  | ||||||
|  |     /* Check for proper number of arguments */ | ||||||
|  |     if(argc != 3) | ||||||
|  |     { | ||||||
|  |         printf("Usage: %s <filename> <new SubSystem>\n", argv[0]); | ||||||
|  |         return 1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /* Open the EXE file in binary mode */ | ||||||
|  |     ExeFile = fopen(argv[1], "r+b"); | ||||||
|  |     if(ExeFile == NULL) | ||||||
|  |     { | ||||||
|  |         /* Failed to open PE file */ | ||||||
|  |         printf("ERROR: Unable to open file %s\n", argv[1]); | ||||||
|  |         return 1; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /* Verify that the input file has a valid DOS header */ | ||||||
|  |     fread(Signature, sizeof(unsigned char), 4, ExeFile); | ||||||
|  |     if(Signature[0] != 'M' || Signature[1] != 'Z') | ||||||
|  |     { | ||||||
|  |         /* Invalid DOS header */ | ||||||
|  |         printf("ERROR: %s is not a valid EXE file\n", argv[1]); | ||||||
|  |         fclose(ExeFile); | ||||||
|  |         return 1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /* Verify that the input file has a valid PE header */ | ||||||
|  |     fseek(ExeFile, 0x3C, SEEK_SET); | ||||||
|  |     fread(&HeaderOffset, sizeof(unsigned int), 1, ExeFile); | ||||||
|  |     fseek(ExeFile, HeaderOffset, SEEK_SET); | ||||||
|  |     fread(Signature, sizeof(unsigned char), 4, ExeFile); | ||||||
|  |     if(Signature[0] != 'P' || Signature[1] != 'E' || Signature[2] != 0 || Signature[3] != 0) | ||||||
|  |     { | ||||||
|  |         /* Invalid PE header */ | ||||||
|  |         printf("Error: %s is not a valid PE file\n", argv[1]); | ||||||
|  |         fclose(ExeFile); | ||||||
|  |         return 1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /* Seek to the offset of the SubSystem field in the optional header */ | ||||||
|  |     fseek(ExeFile, HeaderOffset + 0x5C, SEEK_SET); | ||||||
|  |  | ||||||
|  |     /* Read the current SubSystem value */ | ||||||
|  |     fread(&SubSystem, sizeof(unsigned short), 1, ExeFile); | ||||||
|  |     printf("Original SubSystem: 0x%04X\n", SubSystem); | ||||||
|  |  | ||||||
|  |     /* Parse the new SubSystem value from the command line argument */ | ||||||
|  |     NewSubSystem = getSubSystemID(argv[2]); | ||||||
|  |     if(NewSubSystem == 0) | ||||||
|  |     { | ||||||
|  |         /* Invalid SubSystem provided */ | ||||||
|  |         printf("Error: %s is not a valid PE SubSystem\n", argv[2]); | ||||||
|  |         return 1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /* Print new SubSystem identifier */ | ||||||
|  |     printf("New SubSystem: 0x%04X\n", NewSubSystem); | ||||||
|  |  | ||||||
|  |     /* Seek back to the SubSystem field in the optional header */ | ||||||
|  |     fseek(ExeFile, -sizeof(unsigned short), SEEK_CUR); | ||||||
|  |  | ||||||
|  |     /* Write the new SubSystem value */ | ||||||
|  |     fwrite(&NewSubSystem, sizeof(unsigned short), 1, ExeFile); | ||||||
|  |  | ||||||
|  |     /* Close the file */ | ||||||
|  |     fclose(ExeFile); | ||||||
|  |  | ||||||
|  |     /* Finished successfully */ | ||||||
|  |     printf("SubSystem successfully modified!\n"); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user