PE32+ .шифрование текстовых сегментов в C++
Я работаю над шифрованием сегмента PE32+ .text. Я добавил сегмент .stub и зашифровал сегмент .text. Я пытаюсь загрузить PE-разделы в память, расшифровать там сегмент .text и выполнить его из памяти во время выполнения. Но я не могу добавить эту логику к заглушке.
Я нашел много статей для 32-битного шифрования с использованием языка ассемблера. Можно ли это сделать без ассемблера для 64-битного PE? Пожалуйста, помогите мне сделать это на C++.
Что я уже пробовал:
void (*stub_addr)(void) = stub_fun;// stub_fun is the function to add the // decryption logic in .stub segment unsigned int stub_size = get_stub_size(stub_addr); //added .stub segment as follows PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)image_addr; if (dos_header->e_magic != 0x5A4D) { return NULL; } PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD_PTR)dos_header + dos_header->e_lfanew); const int name_max_length = 8; PIMAGE_SECTION_HEADER last_section = IMAGE_FIRST_SECTION(nt_headers) + (nt_headers->FileHeader.NumberOfSections - 1); PIMAGE_SECTION_HEADER new_section = IMAGE_FIRST_SECTION(nt_headers) + (nt_headers->FileHeader.NumberOfSections); memset(new_section, 0, sizeof(IMAGE_SECTION_HEADER)); new_section->Characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_CNT_CODE; memcpy(new_section->Name, section_name, name_max_length); new_section->Misc.VirtualSize = section_size; new_section->PointerToRawData = align_to_boundary(last_section->PointerToRawData + last_section->SizeOfRawData, nt_headers->OptionalHeader.FileAlignment); new_section->SizeOfRawData = align_to_boundary(section_size, nt_headers->OptionalHeader.SectionAlignment); new_section->VirtualAddress = align_to_boundary(last_section->VirtualAddress + last_section->Misc.VirtualSize, nt_headers->OptionalHeader.SectionAlignment); nt_headers->OptionalHeader.SizeOfImage = new_section->VirtualAddress + new_section->Misc.VirtualSize; nt_headers->FileHeader.NumberOfSections++; //Changed the stub as Entry Point Encrypted the .text segment //Now I am confused about how to add the decryption logic in the .stub segment. #pragma code_seg(".stub") void stub_fun () { //How to load the PE32+ to the memory, decrypt the .text segment and run it from memory. //Trying in C++ without using assembly language }
Richard MacCutchan
В вашем вопросе недостаточно информации. Пожалуйста, уточните и покажите любой код, который работает неправильно.
PECoder
Спасибо за ответ. Я добавил код, который я пытаюсь. Я читал много статей о PE32 (32bit) .text segment encryption, который использует встроенную сборку в функции заглушки. Я не могу использовать встроенный asm, так как 64-битный не поддерживает его, и я новичок в ассемблере. Пожалуйста, направьте меня с некоторыми хорошими материалами или образцом кода.
PECoder
Я пытаюсь сделать это без языка ассемблера. Я пытаюсь CreateFileMapping, OpenFileMapping и MapViewOfFile загрузить PE в память.
Можно ли запустить сопоставленный PE из самой памяти, используя дескриптор, возвращенный из MapViewOfFile?