bb107 / MemoryModulePP

MemoryModule which compatible with Win32 API and support exception handling
MIT License
342 stars 93 forks source link

作者厉害!原版的加载我的dll有问题,用你这个成功了,不过运行一段时间后断言失败 #23

Open shadowbanewuha opened 1 year ago

shadowbanewuha commented 1 year ago

if (MmpGlobalDataPtr->MmpTls->MmpTlsList.Flink != &MmpGlobalDataPtr->MmpTls->MmpTlsList) { assert(NtCurrentTeb()->ThreadLocalStoragePointer == nullptr); }

file: MmpTls , line:378

不知道啥原因

bb107 commented 1 year ago

你好,这个问题可能是由“带线程局部存储的TppWorkerThread”引起的,最新的提交已修复。#58379ac

shadowbanewuha commented 1 year ago

非常感谢!!

shadowbanewuha commented 1 year ago

最近发现在使用GdiPlus这个系统库时,可能引起崩溃 MmpTls.cpp Line: 283

` ++MmpGlobalDataPtr->MmpTls->MmpActiveThreadCount; LeaveCriticalSection(&MmpGlobalDataPtr->MmpTls->MmpTlspLock);

__skip_tls: return Context.ThreadStartRoutine(Context.ThreadParameter); }`

这个可以解决嘛

shadowbanewuha commented 1 year ago

我屏蔽了这里的HOOK,暂时好像不崩溃了,就是不知道有什么影响没 //DetourAttach((PVOID*)&MmpGlobalDataPtr->MmpTls->Hooks.OriginRtlUserThreadStart, HookRtlUserThreadStart);

bb107 commented 1 year ago

可以提供详细的异常状态吗?

shadowbanewuha commented 1 year ago

Critical error detected c0000374 0x7776C97F (ntdll.dll) (TestDemo.exe 中)处有未经处理的异常: 0xC0000374: 堆已损坏。 (参数: 0x777AA918)。

bb107 commented 1 year ago

你是直接从内存加载的gdiplus?还是通过内存dll间接加载的?我没有复现出来,能提供一个简单的示例吗?

shadowbanewuha commented 1 year ago

我测试了下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 commented 1 year ago

顺便问下 ,关闭这个有影响吗? //DetourAttach((PVOID*)&MmpGlobalDataPtr->MmpTls->Hooks.OriginRtlUserThreadStart, HookRtlUserThreadStart); 我现在开启状态会引起偶尔崩溃,关闭后好像没出现过

bb107 commented 1 year ago

顺便问下 ,关闭这个有影响吗? //DetourAttach((PVOID*)&MmpGlobalDataPtr->MmpTls->Hooks.OriginRtlUserThreadStart, HookRtlUserThreadStart); 我现在开启状态会引起偶尔崩溃,关闭后好像没出现过

关闭后会导致新线程无法使用内存模块的tls数据,并且新线程退出时会在HookLdrShutdownThread处崩溃

shadowbanewuha commented 1 year ago

嗷嗷,那影响还是挺大的,等我完全搭好了环境,把代码和dll都发你试试哈

bb107 commented 1 year ago

我修复了一个错误,你更新一下看看问题解决了没

shadowbanewuha commented 1 year ago

我试了下,还是会偶尔崩溃,但崩溃位置变了,好像跟lock有关。 但如果在内存加载前先手动加载几个系统dll,则不会崩溃,不知道长久运行时会不会崩溃。 LoadLibrary("C:\Windows\SysWOW64\windows.storage.dll"); LoadLibrary("C:\Windows\SysWOW64\ntdll.dll"); ........

bb107 commented 1 year ago

或许是跟Wow64进程的native64线程有关,我没有处理64位TEB的TLS。需要发出详细的异常状态才能进一步判断。

shadowbanewuha commented 1 year ago

有两种情况的崩溃: 第一种报错是这个: 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 commented 1 year ago

有用其他加载器(如BlackBone)试过吗?我感觉不像是TLS的问题。我最新的提交添加了原始处理TLS的方法(特征码定位LdrpHandleTlsData),使用stdafx.h中的MMPP_USE_TLS宏来控制。你试一下,看看使用ntdll的TLS处理方法是否会崩溃。

shadowbanewuha commented 1 year ago

OKOK,现在暂时没碰到崩溃了,如果出现了再采用你这个~