У меня странная проблема
Я вручную отобразил exe, и руководство exe отобразило файл dll, и при вызове DllMain происходит сбой во время инициализации crt
когда я обычно выполняю exe-файл, он вручную загружает dll с ручным отображением и без проблем выполняет DllMain
когда я вручную отображаю этот exe-файл, но без него загружаю dll (у меня есть источник exe-файла) и выполняю его, exe-файл работает без нареканий
это не происходит для всех библиотек DLL, я проверил это с некоторыми библиотеками из System32, и никаких сбоев не произошло
поэтому я прикрепил windbg к цели, чтобы увидеть, что происходит, и ошибку, которую я получил:
(a6a6c.a7718): Ошибка проверки безопасности или переполнение буфера стека — код c0000409 (!!! второй шанс !!!)
000000bc`e2515698 cd29 int 29h
Я также прикрепил отладчик Visual Studio, но я получил: Запрошен выход из фатальной программы
так как я загружаю exe вручную, а dll загружается из exe вручную, то Visual Studio и windbg не могут использовать файлы pdb, но я сгенерировал трассировку стека
Я открыл dll в IDA pro и загрузил файл pdb, затем перевел трассировку стека и знал, где происходит ошибка
это трассировка стека:
abort()
set_terminate()
__ExceptionPtr
??$?0AEAPEAUEHExceptionRecord@@_N@?$_Ref_count_obj_alloc@V__ExceptionPtr@@U?$_StaticAllocator@H@@@std@@qeaa@AEBU?$_StaticAllocator@H@@aeapeauehexceptionrecord@@$$QEA_N@Z
??$allocate_shared@V__ExceptionPtr@@U?$_StaticAllocator@H@@aeapeauehexceptionrecord@@_N@std@@ya?AV?$shared_ptr@V__ExceptionPtr@@@0@AEBU?$_StaticAllocator@H@@aeapeauehexceptionrecord@@$$QEA_N@Z
?_CopyException@__ExceptionPtr@@sa?AV?$shared_ptr@V__ExceptionPtr@@@std@@PEBXPEBU_s_ThrowInfo@@_N@Z
dynamic_initializer_for____ExceptionPtr::m_badAllocExceptionPtr_ lea rcx, dynamic_atexit_destructor_for____ExceptionPtr__m_badAllocExceptionPtr_
_initterm
dllmain_crt_process_attach
dllmain_dispatch
инициализация не удалась, поэтому программа вызывает abort для завершения
Я думал, что это связано с cookie-файлами безопасности, но я вручную инициализирую его следующим кодом (взято из blackbone):
PIMAGE_LOAD_CONFIG_DIRECTORY config = (PIMAGE_LOAD_CONFIG_DIRECTORY)(image + optHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].VirtualAddress);
uintptr_t pcookie = config->SecurityCookie;
if (pcookie) {
FILETIME ftime;
LARGE_INTEGER lgint;
GetSystemTimeAsFileTime(&ftime);
QueryPerformanceCounter(&lgint);
uintptr_t cookie = GetCurrentProcessId() ^ GetCurrentThreadId() ^ (uintptr_t)(&cookie);
cookie ^= *(uintptr_t*)&ftime;
cookie ^= (lgint.QuadPart << 32) ^ lgint.QuadPart;
cookie &= 0xFFFFFFFFFFFF;
if (cookie == 0x2B992DDFA232)
cookie++;
memcpy((void*)(pcookie), &cookie, sizeof(uintptr_t));
}
После некоторых проверок эта проблема, похоже, возникает для DLL, которые используют CRT, когда они вручную отображаются из ручного сопоставления EXE или DLL
Кто-нибудь знает причину этого?
Задача ещё не решена.
Других решений пока нет …