MemoryModulePP icon indicating copy to clipboard operation
MemoryModulePP copied to clipboard

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

Open haozia816 opened this issue 3 years ago • 6 comments

两层内存加载情况下,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; }

haozia816 avatar Dec 06 '22 03:12 haozia816

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

bb107 avatar Dec 07 '22 00:12 bb107

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

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

haozia816 avatar Dec 07 '22 01:12 haozia816

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

bb107 avatar Dec 07 '22 02:12 bb107

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

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

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

bb107 avatar Dec 07 '22 08:12 bb107

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

haozia816 avatar Dec 09 '22 00:12 haozia816

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

bb107 avatar Dec 15 '22 09:12 bb107