Llevo unos días peleandome con el código y no logro que el ejecutable quede "funcional".
El caso es que estoy intentando meter una nueva sección en un ejecutable:
Código: Seleccionar todo
PIMAGE_DOS_HEADER IDH;
PIMAGE_NT_HEADERS INTH;
PIMAGE_SECTION_HEADER ISH;
DWORD NewSectionSize = dwStubFileSize;
LPBYTE Temp = (LPBYTE)malloc( dwOriginalFileSize + NewSectionSize );
CopyMemory(&Temp[0], lpOriginalFileBuffer, dwOriginalFileSize);
//CopyMemory(&Temp[ dwOriginalFileSize ], lpStubFileBuffer, dwStubFileSize);
CopyMemory(&Temp[0], lpOriginalFileBuffer, dwOriginalFileSize);
memset(&Temp[dwOriginalFileSize], 0, NewSectionSize);
IDH = (PIMAGE_DOS_HEADER)&Temp[0];
INTH = (PIMAGE_NT_HEADERS)&Temp[ IDH->e_lfanew ];
for(DWORD i=0; i < INTH->FileHeader.NumberOfSections; i++)
{
ISH = (PIMAGE_SECTION_HEADER)&Temp[ IDH->e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * i ];
ISH->Misc.VirtualSize = ISH->SizeOfRawData;
}
DWORD NumberOfSections = INTH->FileHeader.NumberOfSections;
DWORD e_lfanew = IDH->e_lfanew;
ISH = (PIMAGE_SECTION_HEADER)&Temp[ IDH->e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * (NumberOfSections-1) ];
DWORD LastVirtualOffset = ISH->VirtualAddress;
CopyMemory(&Temp[ IDH->e_lfanew - 0x28 ], &lpOriginalFileBuffer[ IDH->e_lfanew ], sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * INTH->FileHeader.NumberOfSections);
memset(&Temp[ e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * (NumberOfSections - 1) ], 0, 0x28);
IDH->e_lfanew = IDH->e_lfanew - 0x28;
INTH = (PIMAGE_NT_HEADERS)&Temp[ IDH->e_lfanew ];
ISH = (PIMAGE_SECTION_HEADER)&Temp[ e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * (NumberOfSections - 1) ];
BYTE SectionName[8] = ".newsec";
CopyMemory( ISH->Name, SectionName, 8 );
ISH->SizeOfRawData = NewSectionSize;
ISH->PointerToRawData = dwOriginalFileSize;
ISH->Characteristics = 0xE0000020;
ISH->VirtualAddress = LastVirtualOffset + INTH->OptionalHeader.SectionAlignment;
ISH->Misc.VirtualSize = NewSectionSize;
INTH->FileHeader.NumberOfSections = INTH->FileHeader.NumberOfSections + 1;
INTH->OptionalHeader.SizeOfImage = ISH->VirtualAddress + ISH->Misc.VirtualSize;
DWORD dwBytesWritten;
HANDLE hNewFile;
hNewFile = CreateFile(szFinalFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
if( hStubFile == INVALID_HANDLE_VALUE ) {
MessageBox(g_hWnd, L"IMPOSIBLE CREAR ARCHIVO!", WINDOW_TITLE, MB_OK | MB_ICONERROR);
return FALSE;
}
WriteFile(hNewFile, Temp, (dwOriginalFileSize + NewSectionSize), &dwBytesWritten, NULL);
CloseHandle(hNewFile);
Estoy haciendo algo mal? (Bueno, eso esta claro que sí jaja)
Podriais guiarme un poco en que punto fallo?
Muchas gracias por adelanatado.
Mil saludos!
PD: las variables "Stub" y "Original", vienen de más arriba, tan solo son tamaños y datos de 2 archivos que cargo en memoria previamente. Original => seleccionado por el user, Stub => un MessageBox, previamente compilado a parte.