static IMAGE_FILE_HEADER fh;
static IMAGE_OPTIONAL_HEADER oh;
+static PE64_IMAGE_OPTIONAL_HEADER oh64;
static IMAGE_SECTION_HEADER sh[16];
typedef struct Imp Imp;
// 64-bit architectures
case '6':
pe64 = 1;
+ PEFILEHEADR = rnd(sizeof(dosstub)+sizeof(fh)+sizeof(oh64)+sizeof(sh), PEFILEALIGN);
break;
// 32-bit architectures
default:
+ PEFILEHEADR = rnd(sizeof(dosstub)+sizeof(fh)+sizeof(oh)+sizeof(sh), PEFILEALIGN);
break;
}
-
- PEFILEHEADR = rnd(sizeof(dosstub)+sizeof(fh)+sizeof(oh)+sizeof(sh), PEFILEALIGN);
+
PESECTHEADR = rnd(PEFILEHEADR, PESECTALIGN);
nextsectoff = PESECTHEADR;
nextfileoff = PEFILEHEADR;
for (i=0; i<sizeof(fh); i++)
cput(((char*)&fh)[i]);
- for (i=0; i<sizeof(oh); i++)
- cput(((char*)&oh)[i]);
+ if(pe64) {
+ for (i=0; i<sizeof(oh64); i++)
+ cput(((char*)&oh64)[i]);
+ } else {
+ for (i=0; i<sizeof(oh); i++)
+ cput(((char*)&oh)[i]);
+ }
for (i=0; i<nsect; i++)
for (j=0; j<sizeof(sh[i]); j++)
cput(((char*)&sh[i])[j]);
m->s->sub = dynamic->sub;
dynamic->sub = m->s;
m->s->value = dynamic->size;
- dynamic->size += 4;
+ dynamic->size += PtrSize;
}
- dynamic->size += 4;
+ dynamic->size += PtrSize;
}
return dr;
for(d = dr; d != nil; d = d->next) {
d->thunkoff = cpos() - n;
for(m = d->ms; m != nil; m = m->next)
- lputl(m->off);
- lputl(0);
+ pe64 ? vputl(m->off) : lputl(m->off);
+ pe64 ? vputl(0): lputl(0);
}
// add pe section and pad it at the end
seek(cout, datsect->PointerToRawData + ftbase, 0);
for(d = dr; d != nil; d = d->next) {
for(m = d->ms; m != nil; m = m->next)
- lputl(m->off);
- lputl(0);
+ pe64 ? vputl(m->off) : lputl(m->off);
+ pe64 ? vputl(0): lputl(0);
}
cflush();
-
+
// finally write import descriptor table
seek(cout, fileoff, 0);
for(d = dr; d != nil; d = d->next) {
cflush();
// update data directory
- oh.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = isect->VirtualAddress;
- oh.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size = isect->VirtualSize;
- oh.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = dynamic->value - PEBASE;
- oh.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size = dynamic->size;
+ if(pe64) {
+ oh64.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = isect->VirtualAddress;
+ oh64.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size = isect->VirtualSize;
+ oh64.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = dynamic->value - PEBASE;
+ oh64.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size = dynamic->size;
+ } else {
+ oh.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = isect->VirtualAddress;
+ oh.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size = isect->VirtualSize;
+ oh.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = dynamic->value - PEBASE;
+ oh.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size = dynamic->size;
+ }
seek(cout, 0, 2);
}
IMAGE_SCN_CNT_INITIALIZED_DATA|
IMAGE_SCN_MEM_EXECUTE|IMAGE_SCN_MEM_READ;
- d = addpesection(".data", segdata.len, segdata.filelen, &segdata);
+ d = addpesection(".data", segdata.len, pe64 ? segdata.len : segdata.filelen, &segdata);
d->Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA|
IMAGE_SCN_MEM_READ|IMAGE_SCN_MEM_WRITE;
fh.NumberOfSections = nsect;
fh.TimeDateStamp = time(0);
- fh.SizeOfOptionalHeader = sizeof(oh);
fh.Characteristics = IMAGE_FILE_RELOCS_STRIPPED|
IMAGE_FILE_EXECUTABLE_IMAGE|IMAGE_FILE_DEBUG_STRIPPED;
- if(thechar == '8')
- fh.Characteristics |= IMAGE_FILE_32BIT_MACHINE;
- oh.Magic = 0x10b; // PE32
- oh.MajorLinkerVersion = 1;
- oh.MinorLinkerVersion = 0;
- oh.SizeOfCode = t->SizeOfRawData;
- oh.SizeOfInitializedData = d->SizeOfRawData;
- oh.SizeOfUninitializedData = 0;
- oh.AddressOfEntryPoint = entryvalue()-PEBASE;
- oh.BaseOfCode = t->VirtualAddress;
- oh.BaseOfData = d->VirtualAddress;
-
- oh.ImageBase = PEBASE;
- oh.SectionAlignment = PESECTALIGN;
- oh.FileAlignment = PEFILEALIGN;
- oh.MajorOperatingSystemVersion = 4;
- oh.MinorOperatingSystemVersion = 0;
- oh.MajorImageVersion = 1;
- oh.MinorImageVersion = 0;
- oh.MajorSubsystemVersion = 4;
- oh.MinorSubsystemVersion = 0;
- oh.SizeOfImage = nextsectoff;
- oh.SizeOfHeaders = PEFILEHEADR;
- oh.Subsystem = 3; // WINDOWS_CUI
- oh.SizeOfStackReserve = 0x00200000;
- oh.SizeOfStackCommit = 0x00001000;
- oh.SizeOfHeapReserve = 0x00100000;
- oh.SizeOfHeapCommit = 0x00001000;
- oh.NumberOfRvaAndSizes = 16;
+ if (pe64) {
+ fh.SizeOfOptionalHeader = sizeof(oh64);
+ oh64.Magic = 0x20b; // PE32+
+ oh64.MajorLinkerVersion = 1;
+ oh64.MinorLinkerVersion = 0;
+ oh64.SizeOfCode = t->SizeOfRawData;
+ oh64.SizeOfInitializedData = d->SizeOfRawData;
+ oh64.SizeOfUninitializedData = 0;
+ oh64.AddressOfEntryPoint = entryvalue()-PEBASE;
+ oh64.BaseOfCode = t->VirtualAddress;
+
+ oh64.ImageBase = PEBASE;
+ oh64.SectionAlignment = PESECTALIGN;
+ oh64.FileAlignment = PEFILEALIGN;
+ oh64.MajorOperatingSystemVersion = 4;
+ oh64.MinorOperatingSystemVersion = 0;
+ oh64.MajorImageVersion = 1;
+ oh64.MinorImageVersion = 0;
+ oh64.MajorSubsystemVersion = 4;
+ oh64.MinorSubsystemVersion = 0;
+ oh64.SizeOfImage = nextsectoff;
+ oh64.SizeOfHeaders = PEFILEHEADR;
+ oh64.Subsystem = 3; // WINDOWS_CUI
+ oh64.SizeOfStackReserve = 0x00200000;
+ oh64.SizeOfStackCommit = 0x00001000;
+ oh64.SizeOfHeapReserve = 0x00100000;
+ oh64.SizeOfHeapCommit = 0x00001000;
+ oh64.NumberOfRvaAndSizes = 16;
+ } else {
+ fh.SizeOfOptionalHeader = sizeof(oh);
+ fh.Characteristics |= IMAGE_FILE_32BIT_MACHINE;
+ oh.Magic = 0x10b; // PE32
+ oh.MajorLinkerVersion = 1;
+ oh.MinorLinkerVersion = 0;
+ oh.SizeOfCode = t->SizeOfRawData;
+ oh.SizeOfInitializedData = d->SizeOfRawData;
+ oh.SizeOfUninitializedData = 0;
+ oh.AddressOfEntryPoint = entryvalue()-PEBASE;
+ oh.BaseOfCode = t->VirtualAddress;
+ oh.BaseOfData = d->VirtualAddress;
+
+ oh.ImageBase = PEBASE;
+ oh.SectionAlignment = PESECTALIGN;
+ oh.FileAlignment = PEFILEALIGN;
+ oh.MajorOperatingSystemVersion = 4;
+ oh.MinorOperatingSystemVersion = 0;
+ oh.MajorImageVersion = 1;
+ oh.MinorImageVersion = 0;
+ oh.MajorSubsystemVersion = 4;
+ oh.MinorSubsystemVersion = 0;
+ oh.SizeOfImage = nextsectoff;
+ oh.SizeOfHeaders = PEFILEHEADR;
+ oh.Subsystem = 3; // WINDOWS_CUI
+ oh.SizeOfStackReserve = 0x00200000;
+ oh.SizeOfStackCommit = 0x00001000;
+ oh.SizeOfHeapReserve = 0x00100000;
+ oh.SizeOfHeapCommit = 0x00001000;
+ oh.NumberOfRvaAndSizes = 16;
+ }
pewrite();
}