我正在使用PE文件打包器,我可以成功加密可执行文件的.text部分,更改其入口点并添加新部分 . 新添加的部分将负责解密.text部分,然后跳转到原始入口点 .

现在,我想更进一步,在新的部分中执行更多代码 . 我几乎可以做我想要的一切,但是如果我调用外部函数(例如 iostream 来自 iostream ),修改后的可执行文件将在尝试执行非法指令时崩溃 . 新部分中存根的反汇编如下所示:

.newsec:0042C020                 push    ebp
.newsec:0042C021                 mov     ebp, esp
.newsec:0042C023                 push    offset loc_40EB50
.newsec:0042C028                 mov     eax, ds:dword_40E0B0
.newsec:0042C02D                 push    eax
.newsec:0042C02E                 call    loc_41A350
.newsec:0042C033                 add     esp, 8
.newsec:0042C036                 pop     ebp
.newsec:0042C037                 retn

地址 0x42c033 的行将跳转到.text部分,但那里的代码与std :: cout应该做的无关 .

为了帮助您,新部分中添加的代码位于文件stub.h / cpp中:

#pragma comment(linker, "/OPT:NOREF")
#pragma optimize( "", off )
#pragma section(".stub",read,write,execute)

__declspec(code_seg(".stub"))
void hello_test()
{
    std::cout << "hello world";
}

__declspec(code_seg(".stub"))
void default_stub_start(void) {
    __asm {
        call hello_test

        mov eax, 0x400000 //oep
        jmp eax
    }
}

然后,整个.stub部分将按照我添加到可执行文件的新部分进行复制 . 编译运行顺利,但修改后的可执行文件将崩溃,如上所述 . 如果我删除该行

std::cout << "hello world";

并用一些基本的数学代替它,它工作正常 .

我的问题是:如何在不破坏可执行文件的情况下使用外部函数?