Encryption .PE32和x2B中的文本段加密;可执行

Encryption .PE32和x2B中的文本段加密;可执行,encryption,64-bit,stub,portable-executable,Encryption,64 Bit,Stub,Portable Executable,我正在从事PE段加密(在C++中)。我完成了PE32.text段加密。我将stub段添加到PE中,该段将在运行时解密.text段。在stub函数中使用内联程序集。但是我不能在PE32+可执行文件(64位exe)中实现相同的方法,因为它不支持内联汇编。我可以添加存根和加密文本段 问题在于存根中的解密逻辑 我尝试添加单独的.asm文件,但失败了,因为我不熟悉汇编语言。请帮助我提供有关PE32+段加密的任何好文档或示例 以下是代码部分: void (*stub_addr)(void) = stub_

我正在从事
PE
段加密(在
C++
中)。我完成了
PE32.text
段加密。我将
stub
段添加到
PE
中,该段将
在运行时解密.text
段。在s
tub
函数中使用内联程序集。但是我不能在
PE32+可执行文件(64位exe)
中实现相同的方法,因为它不支持内联汇编。我可以添加
存根
加密
文本段

问题在于
存根中的
解密逻辑

我尝试添加单独的
.asm
文件,但失败了,因为我不熟悉汇编语言。请帮助我提供有关
PE32+段加密的任何好文档或示例

以下是代码部分:

 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?
}

没有汇编语言是不可能的吗?我不知道如何在没有汇编的情况下完成它,特别是如果你在加密.text部分时,我可以把代码>加载PE到虚拟内存,解密。C++中的文本段< /代码>和代码>在程序集中继续从主()/<代码>继续执行。或者加载PE也应该在组装中?我对这个话题完全不熟悉,尤其是大会。你能提出一些好的文件来解释加密方法在代码> PE32 +<代码>(<代码> 64位< /代码>)中吗?类似于PE32所使用的方法,PE文件和其他所有的映射都可以在C++中完成。但是,解密存根需要在汇编中(虽然从技术上讲,您可以使用字节数组外壳代码并声称它不是汇编)。关于PE32+没有太多文档,但您可以看看UPX。非常感谢您的帮助。我也将通过UPX代码。没有汇编语言是可能的吗?我不知道如何在没有汇编的情况下完成它,特别是如果你正在加密.text部分,我可以在C++中编写代码>加载PE到解密,在C++中使用文本段< />代码>在代码中继续从主()/代码>继续执行。或者加载PE也应该在组装中?我对这个话题完全不熟悉,尤其是大会。你能提出一些好的文件来解释加密方法在代码> PE32 +<代码>(<代码> 64位< /代码>)中吗?类似于PE32所使用的方法,PE文件和其他所有的映射都可以在C++中完成。但是,解密存根需要在汇编中(虽然从技术上讲,您可以使用字节数组外壳代码并声称它不是汇编)。关于PE32+没有太多文档,但您可以看看UPX。非常感谢您的帮助。我还将检查UPX代码。