Mówiąc o sekcji miałem na myśli jej nagłowek.
Zobacz jak to działa:
Kopiuj
#include <windows.h>
#include <stdio.h>
int main()
{
IMAGE_SECTION_HEADER section[2];
DWORD r;
char exe[MAX_PATH], exe2[MAX_PATH];
GetModuleFileName(0, exe, MAX_PATH); // exe = this.exe
GetModuleFileName(0, exe2, MAX_PATH);// exe2 = this.exe-nowy.exe
if (strstr(exe, "-nowy.exe")) // nie zapętlaj się
return MessageBox(0,"Hey, it works","",MB_TOPMOST);
strcat(exe2, "-nowy.exe");
if (!CopyFile(exe, exe2, false))
return MessageBox(0,"CopyFile failed","",MB_TOPMOST);
// modyfikujemy exe2
HANDLE hFile = CreateFile(exe2, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING,0,0);
if (hFile == INVALID_HANDLE_VALUE)
return MessageBox(0,"CreateFile failed","",MB_TOPMOST);
// load dos header
IMAGE_DOS_HEADER DosHdr;
IMAGE_NT_HEADERS NtHdr;
ReadFile(hFile, &DosHdr, sizeof(IMAGE_DOS_HEADER), &r, 0);
// go to nt header
SetFilePointer(hFile, DosHdr.e_lfanew, 0, FILE_BEGIN);
// and read it without optional hdr
#define SIZEOF_NTHDRONLY sizeof(IMAGE_NT_HEADERS) - sizeof(IMAGE_OPTIONAL_HEADER)
ReadFile(hFile, &NtHdr, SIZEOF_NTHDRONLY, &r, 0);
// secure me
if (NtHdr.FileHeader.SizeOfOptionalHeader > sizeof(IMAGE_OPTIONAL_HEADER))
MessageBox(0,"warning: buffer overflow\n",0,MB_TOPMOST);
ReadFile(hFile, &NtHdr.OptionalHeader, NtHdr.FileHeader.SizeOfOptionalHeader, &r, 0);
// zapamiętaj file offset pierwszej sekcji, wczytaj ją i następną
DWORD offset1 = SetFilePointer(hFile,0,0,FILE_CURRENT);
#define ISH_LEN sizeof(IMAGE_SECTION_HEADER), &r, 0
ReadFile(hFile, §ion[0], ISH_LEN);
ReadFile(hFile, §ion[1], ISH_LEN);
// upewniam się...
printf("section 1: %s\nsection 2: %s\n",section[0].Name, section[1].Name);
// wróć na pierwszą sekcję i wpisz tam drugi, a następnie pierwszy nagłówek sekcji
SetFilePointer(hFile, offset1, 0, FILE_BEGIN);
WriteFile(hFile, §ion[1], ISH_LEN);
WriteFile(hFile, §ion[0], ISH_LEN);
CloseHandle(hFile);
return (int)ShellExecute(0,"open",exe2,0,0,SW_SHOW);
}