Я работаю над 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?
}