- Adding my pesum tool which does set the attribute IMAGE_SCN_MEM_NOT_PAGED

to sections with the name '.text', '.data', '.bss' and '.idata'.
- Some time ago I've wrote this tool because ld wasn't able to set the pe checksum to images.

svn path=/trunk/; revision=8156
This commit is contained in:
Hartmut Birr 2004-02-11 21:04:18 +00:00
parent e83ebbae2d
commit f90d73ad9d
3 changed files with 154 additions and 0 deletions

View file

@ -0,0 +1,4 @@
*.o
*.exe
*.sym
*.map

View file

@ -0,0 +1,20 @@
# $Id: makefile,v 1.1 2004/02/11 21:04:18 hbirr Exp $
PATH_TO_TOP = ../../..
TARGET_NORC = yes
TARGET_TYPE = program
TARGET_APPTYPE = console
TARGET_NAME = pesum
TARGET_OBJECTS = $(TARGET_NAME).o
include $(PATH_TO_TOP)/rules.mak
include $(TOOLS_PATH)/helper.mk
# EOF

View file

@ -0,0 +1,130 @@
#include <stdio.h>
#include <windows.h>
int main(int argc, char **argv)
{
FILE *fp;
int len;
long offset;
unsigned long OldCheckSum, CheckSum;
int i;
unsigned char *buffer;
if (argc < 2)
{
printf("PESum In [Out]\n");
printf(" If [out] is given, adding attribute IMAGE_SCN_MEM_NOT_PAGED to '.text', '.data', '.idata' and '.bss' sections.\n");
return 1;
}
fp = fopen(argv[1], "rb");
if (fp == NULL)
{
printf("Unable to open input file '%s'\n", argv[1]);
return 2;
}
fseek(fp, 0, SEEK_END);
len = ftell(fp);
fseek(fp, 0, SEEK_SET);
buffer=(unsigned char*) malloc(((len+1)/2)*2);
if (buffer == NULL)
{
fclose(fp);
printf("Not enough memory available.\n");
return 3;
}
memset(buffer, 0x00, ((len+1)/2)*2);
fread(buffer, len, 1, fp);
fclose(fp);
offset = ((PIMAGE_DOS_HEADER)buffer)->e_lfanew;
if (offset + sizeof(IMAGE_NT_HEADERS) >= len || ((PIMAGE_NT_HEADERS)&buffer[offset])->Signature != IMAGE_NT_SIGNATURE)
{
printf("'%s' isn't a PE image\n", argv[1]);
printf("%d %d\n", offset + sizeof(IMAGE_NT_HEADERS), len);
free(buffer);
return 4;
}
OldCheckSum = ((PIMAGE_NT_HEADERS)&buffer[offset])->OptionalHeader.CheckSum;
((PIMAGE_NT_HEADERS)&buffer[offset])->OptionalHeader.CheckSum = 0;
for(i=0; i<((PIMAGE_NT_HEADERS)&buffer[offset])->OptionalHeader.NumberOfRvaAndSizes; i++)
{
if (!((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].VirtualAddress)
break;
#if 1
printf("%-8.8s %08x %08x %08x ",
((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Name,
((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].VirtualAddress,
((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].SizeOfRawData,
((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics);
if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_CNT_CODE)
printf("C");
if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA)
printf("I");
if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
printf("U");
if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_MEM_READ)
printf("R");
if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_MEM_WRITE)
printf("W");
if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_MEM_EXECUTE)
printf("X");
if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_MEM_NOT_PAGED)
printf("nP");
if (((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics & IMAGE_SCN_MEM_DISCARDABLE)
printf("D");
#endif
if (argc>2)
{
char name[9];
strncpy(name, ((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Name, 8);
name[8]=0;
if(!strcmp(name, ".text") || !strcmp(name, ".data") || !strcmp(name, ".bss") || !strcmp(name, ".idata"))
{
((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics |= IMAGE_SCN_MEM_NOT_PAGED;
((PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION((PIMAGE_NT_HEADERS)&buffer[offset]))[i].Characteristics &= ~IMAGE_SCN_MEM_DISCARDABLE;
}
}
printf("\n");
}
printf("\n");
CheckSum = 0;
for(i = 0; i < len; i += 2)
{
CheckSum += *(unsigned short*)&buffer[i];
CheckSum = 0xffff & (CheckSum + (CheckSum >> 16));
}
CheckSum+=len;
if (argc > 2)
{
fp = fopen(argv[2], "wb+");
if (fp == NULL)
{
printf("Unable to open output file '%s'\n", argv[2]);
free(buffer);
return 5;
}
((PIMAGE_NT_HEADERS)&buffer[offset])->OptionalHeader.CheckSum = CheckSum;
fwrite(buffer, len, 1, fp);
fclose(fp);
printf("Creating '%s' from '%s' with PE checksum %08x\n", argv[2], argv[1], CheckSum);
}
else
printf("PE-checksum for '%s' is %08x (old %08x)\n", argv[1], CheckSum, OldCheckSum);
free(buffer);
return 0;
}