Skip to content

两层内存加载情况下,Win7程序不能运行 (MemoryModule -> MemoryModulePP binary -> APP binary) #19

Open

Description

@haozia816

两层内存加载情况下,Win7下多线程程序不能运行,创建线程就会崩溃,单线程程序正常;多线程程序在Win10下正常

加载顺序:MemoryModule(https://github.com/fancycode/MemoryModule) -> MemoryModulePP binary -> APP binary

跟踪代码发现MmpTLS.cpp->MmpUserThreadStart中的auto size = CONTAINING_RECORED(record->TlspLdrBlock, TLS_VERCTOR, ModuleTlsData)->Length;获取到的size不正常,值为大数,但Win10中其是正常的

MemoryModulePP的API使用的LoadLibraryMemory

同时我注释掉了以下代码,以下代码会直接崩溃
auto tls = CONTAINING_RECORD(NtCurrentTeb()->ThreadLocalStoragePointer, TLS_VECTOR, TLS_VECTOR::ModuleTlsData);
if (tls && tls->Length > MMP_START_TLS_INDEX) {
RtlRaiseStatus(STATUS_NOT_SUPPORTED);
return FALSE;
}

Activity

  1. bb107 commented on Dec 7, 2022

    @bb107
    Owner

    你好,感谢反馈。通过测试发现,如果进程中没有处理过TLS信息,TLS_VECTOR使用的是ThreadId字段,而不是Length字段。此时无论在Win7还是Win10都会存在这个问题。我已经提交了对这种情况的处理。需要注意的是,MemoryModulePP编译成dll后包含TLS信息,而MemoryModule没有处理;MemoryModulePP使用结构化异常处理,而MemoryModule不支持异常处理。因此不推荐两个库混用。

  2. haozia816 commented on Dec 7, 2022

    @haozia816
    Author

    强制将Length视为0,MemoryModulePP工作没问题,但是程序还是不能正常工作。没有其他办法去获取真实的Length吗?

    还请教下“MemoryModulePP使用结构化异常处理,而MemoryModule不支持异常处理”这个会影响什么?能举个例子吗,非常感谢!

  3. bb107 commented on Dec 7, 2022

    @bb107
    Owner

    当MMPP初始化的时候,如果程序没有加载过任何含有TLS的模块,那么线程的TLS_VECTOR可以看作是空的(你可以在调试器里查看ntdll!LdrpTlsTable是不是空链表)。如图所示,这段代码可以正常运行。
    Snipaste_2022-12-07_10-10-16
    MMPP中使用了大量的__try{}__except{}结构来探测和验证输入参数,如果不支持异常处理可能会导致异常无法被catch到。

  4. bb107 commented on Dec 7, 2022

    @bb107
    Owner

    强制将Length视为0,MemoryModulePP工作没问题,但是程序还是不能正常工作。没有其他办法去获取真实的Length吗?

    还请教下“MemoryModulePP使用结构化异常处理,而MemoryModule不支持异常处理”这个会影响什么?能举个例子吗,非常感谢!

    关于应用程序不能正常工作的问题,建议先不经过MM而直接加载MMPP,看看能不能正常工作。

  5. haozia816 commented on Dec 9, 2022

    @haozia816
    Author

    感谢,我试了MMPP直接是能加载的,把Length都视为0的时候,MM->MMPP->APP下会崩溃

  6. bb107 commented on Dec 15, 2022

    @bb107
    Owner

    你可以在exe中声明一个thread_local变量,并在某个函数里引用一下它。这时候TLS_VECTOR的length就不是0了,看看能不能正常运行。目前已知的条件无法定位到问题的位置,如果方便的话可以贴一个能复现问题的代码。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions