我工作的一个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";
和一些基本的数学取代它,它工作正常。
我的问题是:我该如何使用外部函数不破坏可执行文件?
我忘了这个问题,但实际上是找到了解决办法几个月问了之后。这里的问题是一个必须手动链接到外部函数,因为一旦代码被解压到内存的地址没有在运行时知道。
要做到这一点,应该做到以下几点:
有关详细信息,“rootkit的阿森纳”的第10章是必读的。