шифрование .text в исполняемом файле PE32 + - PullRequest
0 голосов
/ 09 ноября 2019

Я работаю над PE сегментным шифрованием (в C++). Я завершил шифрование сегмента PE32 .text. Я добавил stub сегмент к PE, который будет decrypt .text сегмент во время выполнения. Используется встроенная сборка в функции s tub. Но я не могу реализовать тот же метод в PE32+ executable(64bit exe), так как он не поддерживает встроенную сборку. Я могу добавить текстовый сегмент stub и encrypt.

Проблема связана с логикой decryption в stub.

Я пытался добавить отдельный .asmфайлы, но не удалось, так как я новичок в ассемблере. Пожалуйста, помогите мне с любой хорошей документацией или образцами на PE32+ segment encryption.

Это части кода:

 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 () {
//Trying in C++ without using assembly language

HANDLE hfile, hfile1;
    unsigned char* pmappedfile, * dummy;
    hfile = CreateFile(NULL, GENERIC_WRITE | GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
    hfile1 = CreateFileMapping(hfile, 0, PAGE_READWRITE, 0, 0, 0);
    pmappedfile = (unsigned char*)MapViewOfFile(hfile1, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    IMAGE_DOS_HEADER* pimagedosheader = (IMAGE_DOS_HEADER*)pmappedfile;
    dummy = (unsigned char*)(pmappedfile + pimagedosheader->e_lfanew);
    IMAGE_FILE_HEADER* pimagefileheader = (IMAGE_FILE_HEADER*)(pmappedfile + pimagedosheader->e_lfanew + 4);
    IMAGE_OPTIONAL_HEADER* pimageoptionalheader = (IMAGE_OPTIONAL_HEADER*)((unsigned char*)pimagefileheader + sizeof(IMAGE_FILE_HEADER));


//Decrypt the .text segment
//How to execute the exe from memory after decryption?
}
...