Print original/new subsystem names and turn new subsystem name case insensitive

This commit is contained in:
Rafal Kupiec 2023-10-17 22:12:46 +02:00
parent a522cdc583
commit 1f72016fc2
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4

View File

@ -15,6 +15,7 @@ typedef struct _PE_SUBSYSTEM
} PE_SUBSYSTEM, *PPE_SUBSYSTEM; } PE_SUBSYSTEM, *PPE_SUBSYSTEM;
static PE_SUBSYSTEM SubSystems[] = { static PE_SUBSYSTEM SubSystems[] = {
{0x00, "INVALID_SUBSYSTEM"},
{0x01, "NT_NATIVE"}, {0x01, "NT_NATIVE"},
{0x02, "WINDOWS_GUI"}, {0x02, "WINDOWS_GUI"},
{0x03, "WINDOWS_CLI"}, {0x03, "WINDOWS_CLI"},
@ -37,7 +38,7 @@ static PE_SUBSYSTEM SubSystems[] = {
{0x19, "XT_APPLICATION_GDI"} {0x19, "XT_APPLICATION_GDI"}
}; };
int getSubSystemID(char *Name) PPE_SUBSYSTEM getSubSystem(char *Name)
{ {
int Index; int Index;
int SubSystemsCount; int SubSystemsCount;
@ -50,15 +51,39 @@ int getSubSystemID(char *Name)
for(Index = 0; Index < SubSystemsCount; Index++) for(Index = 0; Index < SubSystemsCount; Index++)
{ {
SubSystem = &SubSystems[Index]; SubSystem = &SubSystems[Index];
if(strcmp(SubSystem->Name, Name) == 0) if(strcasecmp(SubSystem->Name, Name) == 0)
{ {
/* Subsystem found, return its ID */ /* Subsystem found, return its ID */
return SubSystem->Identifier; return SubSystem;
} }
} }
/* No valid subsystem found */ /* No valid subsystem found */
return 0x00; return &SubSystems[0];
}
char *getSubSystemName(int Identifier)
{
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(SubSystem->Identifier == Identifier)
{
/* Subsystem found, return its ID */
return SubSystem->Name;
}
}
/* No valid subsystem found */
return SubSystems[0].Name;
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@ -67,7 +92,7 @@ int main(int argc, char *argv[])
unsigned char Signature[4]; unsigned char Signature[4];
unsigned int HeaderOffset; unsigned int HeaderOffset;
unsigned short SubSystem; unsigned short SubSystem;
int NewSubSystem; PPE_SUBSYSTEM NewSubSystem;
/* Check for proper number of arguments */ /* Check for proper number of arguments */
if(argc != 3) if(argc != 3)
@ -113,11 +138,11 @@ int main(int argc, char *argv[])
/* Read the current SubSystem value */ /* Read the current SubSystem value */
fread(&SubSystem, sizeof(unsigned short), 1, ExeFile); fread(&SubSystem, sizeof(unsigned short), 1, ExeFile);
printf("Original SubSystem: 0x%04X\n", SubSystem); printf("Original SubSystem: 0x%04X <%s>\n", SubSystem, getSubSystemName(SubSystem));
/* Parse the new SubSystem value from the command line argument */ /* Parse the new SubSystem value from the command line argument */
NewSubSystem = getSubSystemID(argv[2]); NewSubSystem = getSubSystem(argv[2]);
if(NewSubSystem == 0) if(NewSubSystem->Identifier == 0)
{ {
/* Invalid SubSystem provided */ /* Invalid SubSystem provided */
printf("Error: %s is not a valid PE SubSystem\n", argv[2]); printf("Error: %s is not a valid PE SubSystem\n", argv[2]);
@ -125,13 +150,13 @@ int main(int argc, char *argv[])
} }
/* Print new SubSystem identifier */ /* Print new SubSystem identifier */
printf("New SubSystem: 0x%04X\n", NewSubSystem); printf("New SubSystem: 0x%04X <%s>\n", NewSubSystem->Identifier, NewSubSystem->Name);
/* Seek back to the SubSystem field in the optional header */ /* Seek back to the SubSystem field in the optional header */
fseek(ExeFile, -sizeof(unsigned short), SEEK_CUR); fseek(ExeFile, -sizeof(unsigned short), SEEK_CUR);
/* Write the new SubSystem value */ /* Write the new SubSystem value */
fwrite(&NewSubSystem, sizeof(unsigned short), 1, ExeFile); fwrite(&NewSubSystem->Identifier, sizeof(unsigned short), 1, ExeFile);
/* Close the file */ /* Close the file */
fclose(ExeFile); fclose(ExeFile);