模块中除了“DllMain”之外还有其他东西用于初始化吗?

逆向工程 动态链接 pe32 编译器优化
2021-07-09 20:54:52

好吧,其实我是手动映射模块插入过程,事实上,我的电话映射DllEntryPoint从标准结构IMAGE_NT_HEADERS从而IMAGE_NT_HEADERS::OptionalHeader::AddressOfEntryPoint等等...

问题:考虑以下代码:

void Log(const char*, ...);


class Test
{
    private:
        struct List_t
        {
            const uint32_t x;
            const uint32_t y; 
        } List;

    public:
        Test(List_t z) : List(z) { Log("Called event 0! \n"); }
        ~Test() {}
};



void Entry()
{
    Test Instance
    (
        {
            0x200,
            0x400
        }
    );

    Log("Called! \n");  
}


BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{

    if(fdwReason == 1)
        Entry();

    return TRUE;
}

所以如果模块入口点被IMAGE_NT_HEADERS::OptionalHeader::AddressOfEntryPoint映射器调用,构造函数Test()永远不会被执行,而该Entry()函数被成功执行,现在如果模块加载了标准,LoadLibraryA();那么Test()构造函数被成功调用......

我在哪里可以找到有关此的一些信息?

我听说过一些关于CRT初始化程序的事情,但我找不到任何深入的东西......

1个回答

对于程序,您还必须注意TLS 回调这些在入口点之前运行,但我只在 .exe 文件上看到过这些,从未在 DLL 上看到过。尽管如此,Peter Ferrie 表示 DLL 文件存在 TLS 回调。我相信他在这方面的专业知识,即使我自己在对 DLL 进行逆向工程时从未见过其中的一个。

无论如何,DllMain在你的情况下有那个fdwReason参数。这个在这里很重要,你不应该在1那里使用文字,而是正确的符号名称:DLL_PROCESS_ATTACH .

DLL_PROCESS_ATTACH, DLL_PROCESS_DETACH, DLL_THREAD_ATTACH,DLL_THREAD_DETACH是当前定义的值。一个switch因此声明将是更明智这里。

根据您被召回的原因,DllMain您可以采取行动。

现在虽然我不知道该类是否意味着是一个单例,但很明显,内部发生的所有事情Entry()都是在堆栈上创建销毁该类的实例。一旦离开该函数的作用域,该实例将被销毁。您应该能够通过向Log()dtor添加类似调用的内容来验证这一点。

至于 CRT 初始值设定项,是的,这些都存在。在继续阅读之前,请阅读我的另一个答案

...

好的,假设您阅读了我的回答,DllMain当您使用默认 CRT 构建时,CRT 与预期的不同之处在于它已经包含您可能指的 CRT 初始化代码。然而,如果您告诉链接器使用替代方案,/entry您仍然会为 DLL 入口函数使用相同的原型,但您必须处理初始化。从字面上看,你可能需要的所有信息,在链接回答这个相关的问题上,并在上述答复中提到里面的文件。