Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
haozia816 opened this issue Dec 6, 2022 · 6 comments

Comments

@haozia816
Copy link

haozia816 commented Dec 6, 2022

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

@bb107
Copy link
Owner

bb107 commented Dec 7, 2022

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

@haozia816
Copy link
Author

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

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

@bb107
Copy link
Owner

bb107 commented Dec 7, 2022

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

@bb107
Copy link
Owner

bb107 commented Dec 7, 2022

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

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

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

@haozia816
Copy link
Author

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

@bb107
Copy link
Owner

bb107 commented Dec 15, 2022

你可以在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
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants