Closed woowloop closed 1 year ago
另外x86下如果没有开启safeseh有个简单的办法,可以考虑直接把RtlIsValidHandler函数给disable掉就没有问题了
你好,对于x86下需要启用safeseh的问题,我在readme中已经提到了,绕过RtlIsValidHandler不是最佳的实践。对于LdrHashEntry和RtlFindLdrTableEntryByBaseName不是通用的,欢迎指出系统特例。对于内存越界的问题,我再确认一下,欢迎PR。
LdrHashEntry 在win7以下系统是RtlUpcaseUnicodeChar((wch)) - (WCHAR)'A' RtlFindLdrTableEntryByBaseName在第一项不是ntdll模块时就出问题了
我通过反编译发现,xp、vista和win7的HashEntry实现都不一样,我已经添加了相应版本的处理,但意义不大。RtlFindLdrTableEntryByBaseName的实现原理是遍历Ldr中的某一个循环链表,与节点的顺序无关。如图所示,只有InInitializationOrderModuleList的第一个模块是ntdll,其他的都是test.exe。而此函数使用的是InLoadOrderModuleList,第一个模块显然不是ntdll。
很抱歉把函数打错了 是这个RtlFindLdrpHashTable函数 之前有测出来过第一项不是ntdll然后获取到的LdrpHashTable是个不正确的值 忘了是哪个系统什么条件测出来的了 这个函数我是在调用RtlInsertMemoryTableEntry时才调用 另外HashEntry我在vista中测试依然是减去A而不是1 vista(6002pack2) 你的是哪个版本?
HashEntry计算不正确会影响到RtlInsertMemoryTableEntry这个函数里的i值可能导致数组越界 同时RtlFindLdrpHashTable也会计算错误 为何意义不大?
HashEntry计算不正确会影响到RtlInsertMemoryTableEntry这个函数里的i值可能导致数组越界 同时RtlFindLdrpHashTable也会计算错误 为何意义不大?
因为vista几乎没人使用了,MMPP无法在xp上运行。
很抱歉把函数打错了 是这个RtlFindLdrpHashTable函数 之前有测出来过第一项不是ntdll然后获取到的LdrpHashTable是个不正确的值 忘了是哪个系统什么条件测出来的了 这个函数我是在调用RtlInsertMemoryTableEntry时才调用 另外HashEntry我在vista中测试依然是减去A而不是1 vista(6002pack2) 你的是哪个版本?
我随便找了一个版本测试的(Vista Business 版本6.0.6000),确实是减的1
Vista Ultimate SP2 版本 6.0.6002也是减1
确实是减一 xp也是 当时没有反汇编 但算出来的索引刚好一样的 (x-1)&31==x-'a'
Utils 的RtlFindMemoryBlockFromModuleSection函数--SearchContext->RemainingLength;这个代码应该放到if外边 否则第二次查找的时候就可能内存越界崩溃了。LdrHashEntry计算函数和RtlFindLdrTableEntryByBaseName查找函数的计算方式是个经验值 在一些系统是不适用的