[duda] Crear nueva seccion en ejecutable
Publicado: 29 Sep 2012, 12:36
Buenas,
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:
He probado varias formas, pero el resultado siempre es el mismo "no es una aplicación Win32 válida"...
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.
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.