添加段的PE文件,入口点更改为新的部分,并执行任意代码

问题描述 投票:2回答:1

我工作的一个PE文件打包,我可以成功地加密的可执行文件的.text段,改变它的入口点和添加新的部分。新增加的部分将解密.text段的照顾,然后跳转到原来的入口点。

现在,我想去远一点,并在新的部分执行更多的代码。我可以做很多我想要的一切,但如果我调用外部函数(COUT从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 ::法院应该做的。

为了帮助你帮助我,在新的一节中添加的代码是在一个文件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";

和一些基本的数学取代它,它工作正常。

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

c++ c portable-executable
1个回答
0
投票

我忘了这个问题,但实际上是找到了解决办法几个月问了之后。这里的问题是一个必须手动链接到外部函数,因为一旦代码被解压到内存的地址没有在运行时知道。

要做到这一点,应该做到以下几点:

  • 走进程环境块迭代装载库的链接列表上。
  • 找到库KERNEL32.DLL,步行其导出表,例如获得GetProcAddress的调用LoadLibrary和的地址。
  • 使用解决之前加载并解决任何其他API的API。

有关详细信息,“rootkit的阿森纳”的第10章是必读的。

© www.soinside.com 2019 - 2024. All rights reserved.