PECoder Ответов: 0

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?

0 Ответов