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

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

Open
shadowbanewuha opened this issue Mar 7, 2023 · 17 comments
Assignees

Comments

@shadowbanewuha
Copy link

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

file: MmpTls , line:378

不知道啥原因

@bb107 bb107 self-assigned this Mar 8, 2023
@bb107
Copy link
Owner

bb107 commented Mar 8, 2023

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

@shadowbanewuha
Copy link
Author

非常感谢!!

@shadowbanewuha
Copy link
Author

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

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

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

这个可以解决嘛

@shadowbanewuha
Copy link
Author

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

@bb107
Copy link
Owner

bb107 commented Mar 16, 2023

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

@shadowbanewuha
Copy link
Author

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

@bb107
Copy link
Owner

bb107 commented Mar 17, 2023

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

@shadowbanewuha
Copy link
Author

我测试了下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
Copy link
Author

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

@bb107
Copy link
Owner

bb107 commented Mar 17, 2023

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

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

@shadowbanewuha
Copy link
Author

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

@bb107
Copy link
Owner

bb107 commented Mar 18, 2023

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

@shadowbanewuha
Copy link
Author

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

@bb107
Copy link
Owner

bb107 commented Apr 7, 2023

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

@shadowbanewuha
Copy link
Author

有两种情况的崩溃:
第一种报错是这个:
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
Copy link
Owner

bb107 commented Apr 14, 2023

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

@shadowbanewuha
Copy link
Author

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

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