`if (MmpGlobalDataPtr->MmpTls->MmpTlsList.Flink != &MmpGlobalDataPtr->MmpTls->MmpTlsList) { assert(NtCurrentTeb()->ThreadLocalStoragePointer == nullptr); }` file: MmpTls , line:378 不知道啥原因
Activity
bb107 commentedon Mar 8, 2023
你好,这个问题可能是由“带线程局部存储的TppWorkerThread”引起的,最新的提交已修复。#58379ac
shadowbanewuha commentedon Mar 9, 2023
非常感谢!!
shadowbanewuha commentedon Mar 16, 2023
最近发现在使用GdiPlus这个系统库时,可能引起崩溃
MmpTls.cpp
Line: 283
` ++MmpGlobalDataPtr->MmpTls->MmpActiveThreadCount;
LeaveCriticalSection(&MmpGlobalDataPtr->MmpTls->MmpTlspLock);
__skip_tls:
return Context.ThreadStartRoutine(Context.ThreadParameter);
}`
这个可以解决嘛
shadowbanewuha commentedon Mar 16, 2023
我屏蔽了这里的HOOK,暂时好像不崩溃了,就是不知道有什么影响没 //DetourAttach((PVOID*)&MmpGlobalDataPtr->MmpTls->Hooks.OriginRtlUserThreadStart, HookRtlUserThreadStart);
bb107 commentedon Mar 16, 2023
可以提供详细的异常状态吗?
shadowbanewuha commentedon Mar 17, 2023
Critical error detected c0000374
0x7776C97F (ntdll.dll) (TestDemo.exe 中)处有未经处理的异常: 0xC0000374: 堆已损坏。 (参数: 0x777AA918)。
bb107 commentedon Mar 17, 2023
你是直接从内存加载的gdiplus?还是通过内存dll间接加载的?我没有复现出来,能提供一个简单的示例吗?
shadowbanewuha commentedon Mar 17, 2023
我测试了下gidplus崩溃的这个是跟 windows.storage.dll有关,我先手动加载windows.storage.dll后就没出现过了。
但是还是出现了0x7776C97F (ntdll.dll) 这个崩溃。
然后我在内存加载之前,手动加载了另外几个系统dll,
LoadLibrary("C:\\Windows\\SysWOW64\\windows.storage.dll"); LoadLibrary("C:\\Windows\\SysWOW64\\ntdll.dll"); LoadLibrary("C:\\Windows\\SysWOW64\\WindowsCodecs.dll"); LoadLibrary("C:\\Windows\\SysWOW64\\WinTypes.dll"); LoadLibrary("C:\\Windows\\SysWOW64\\msctf.dll"); HMODULE handle = LoadLibrary("engine.dll"); //这个dll里面使用了内存加载核心dll现在崩溃概率大大降低了, 但昨天运行了十几分钟后还是出现过一次崩溃,就是这里:MmpTls.cpp
Line: 283,等再崩溃了我发你详细一点的信息
shadowbanewuha commentedon Mar 17, 2023
顺便问下 ,关闭这个有影响吗?
//DetourAttach((PVOID*)&MmpGlobalDataPtr->MmpTls->Hooks.OriginRtlUserThreadStart, HookRtlUserThreadStart);
我现在开启状态会引起偶尔崩溃,关闭后好像没出现过
bb107 commentedon Mar 17, 2023
关闭后会导致新线程无法使用内存模块的tls数据,并且新线程退出时会在HookLdrShutdownThread处崩溃
shadowbanewuha commentedon Mar 17, 2023
嗷嗷,那影响还是挺大的,等我完全搭好了环境,把代码和dll都发你试试哈
bb107 commentedon Mar 18, 2023
我修复了一个错误,你更新一下看看问题解决了没
shadowbanewuha commentedon Apr 7, 2023
我试了下,还是会偶尔崩溃,但崩溃位置变了,好像跟lock有关。
但如果在内存加载前先手动加载几个系统dll,则不会崩溃,不知道长久运行时会不会崩溃。
LoadLibrary("C:\Windows\SysWOW64\windows.storage.dll");
LoadLibrary("C:\Windows\SysWOW64\ntdll.dll");
........
bb107 commentedon Apr 7, 2023
或许是跟Wow64进程的native64线程有关,我没有处理64位TEB的TLS。需要发出详细的异常状态才能进一步判断。
shadowbanewuha commentedon Apr 7, 2023
有两种情况的崩溃:
第一种报错是这个:
onecore\net\netprofiles\service\src\nsp\dll\namespaceserviceprovider.cpp(550)\nlansp_c.dll!717A84C8: (caller: 7740E326) LogHr(2) tid(4d7c) 8007277C 此服务不存在。在指定的命名空间中找不这个服务。
0x7775F514 (ntdll.dll)处(位于 TestDemo.exe 中)引发的异常: 0xC0000005: 读取位置 0x011BAD1F 时发生访问冲突。
第二种是在 locks.cpp 这个文件里面崩溃:
extern "C" void __cdecl __acrt_lock(_In_ __acrt_lock_id _Lock) { EnterCriticalSection(&__acrt_lock_table[_Lock]); }报错是: HEAP[TestDemo.exe]: Invalid address specified to RtlValidateHeap( 01270000, 012A4BF0 )
bb107 commentedon Apr 14, 2023
有用其他加载器(如BlackBone)试过吗?我感觉不像是TLS的问题。我最新的提交添加了原始处理TLS的方法(特征码定位LdrpHandleTlsData),使用stdafx.h中的
MMPP_USE_TLS宏来控制。你试一下,看看使用ntdll的TLS处理方法是否会崩溃。shadowbanewuha commentedon May 4, 2023
OKOK,现在暂时没碰到崩溃了,如果出现了再采用你这个~