BOOL ShellCodeToAnySections(DWORD numberOfSecitons,PVOID fileName) {
BYTE shellcode[] = { 0x6a,0x00,0x6a,0x00,0x6a,0x00,0x6a,0x00,0xe8,0xD9,0x42,0xcd,0x74,0xe9,0x12,0xc9,0xff,0xff };
PVOID pFileBuffer = FileToFileBuffer(fileName);
PVOID pImageBuffer = FileBufferToImageBuffer(pFileBuffer);
PIMAGE_DOS_HEADER pDosHeader = pImageBuffer;
PIMAGE_NT_HEADERS pNTHeader = (DWORD)pDosHeader + pDosHeader->e_lfanew;
if (pNTHeader->Signature != IMAGE_NT_SIGNATURE) {
printf("File is not PE\n");
free(pFileBuffer);
return FALSE;
}
PIMAGE_FILE_HEADER pFileHeader = &pNTHeader->FileHeader;
PIMAGE_OPTIONAL_HEADER pOptHeader = (DWORD)pFileHeader + sizeof(IMAGE_FILE_HEADER);
PIMAGE_SECTION_HEADER pSecHeader = (DWORD)pOptHeader + pFileHeader->SizeOfOptionalHeader;
if (numberOfSecitons >= pFileHeader->NumberOfSections) {
printf("over max number of sections\n");
return FALSE;
}
pSecHeader += numberOfSecitons;
if ((int)(pSecHeader->SizeOfRawData - pSecHeader->Misc.PhysicalAddress) < (int)sizeof(shellcode)) {
printf("section size is not enough\n");
return FALSE;
}
pSecHeader->Characteristics |= IMAGE_SCN_MEM_EXECUTE;
PVOID pWritePosition = (DWORD)pImageBuffer + pSecHeader->VirtualAddress + pSecHeader->Misc.VirtualSize;
PVOID e8Addr = (DWORD)MessageBoxA - (pOptHeader->ImageBase + pSecHeader->VirtualAddress + pSecHeader->Misc.PhysicalAddress + 8 + 5);
PVOID e9Addr = pOptHeader->AddressOfEntryPoint - (pSecHeader->VirtualAddress + pSecHeader->Misc.PhysicalAddress + 8 + 5 + 5);
*(PDWORD)(shellcode + 9) = e8Addr;
*(PDWORD)(shellcode + 9 + 5) = e9Addr;
pOptHeader->AddressOfEntryPoint = pSecHeader->VirtualAddress + pSecHeader->Misc.VirtualSize;
memcpy(pWritePosition, shellcode, sizeof(shellcode));
pImageBuffer = ImageBufferToFileBuffer("C:\\Users\\12459\\Downloads\\111.exe", pImageBuffer);
if (!pImageBuffer) {
printf("fwrite failed\n");
return FALSE;
}
free(pImageBuffer);
return TRUE;
}