0xc00007b рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рддрд╣рдд рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


рд╢реБрдн рджрд┐рдиред рдХреНрдпрд╛ рдЖрдк 0xc00007b рдЕрдкрд╡рд╛рдж рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ? X-Ray рдЗрдВрдЬрди рдХреЛ x64 рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ, 0cx00007b рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд░рд┐рдкреЛрд░реНрдЯреЗрдВ рдЖрдИ рд╣реИрдВред 90% рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ 64 рдмрд┐рдЯ рдУрдкрдирд▓ рдбреНрд░рд╛рдЗрд╡рд░ рдХреА рдХрдореА рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдереАред


рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рд▓рдЧрд╛рддрд╛рд░ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдХрд┐ рдЖрдкрдХреЛ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдХреЗ рдмрд╛рдж рд╣рдордиреЗ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рдПрдХ рдПрдлрдПрдХреНрдпреВ рд▓рд┐рдЦрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдРрд╕реА рдЦрдмрд░реЗрдВ рджреВрд░ рдирд╣реАрдВ рд╣реБрдИрдВ, рд╕реАрдЖрдИрдПрд╕ рдореЗрдВ рд▓реЛрдЧ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрдврд╝рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛: рдпрджрд┐ рдХреЛрдИ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрдВрдЬрди рдХреЗ рдиреАрдЪреЗ рд╕реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред


рдЪрд░рдг 1: рдЬрдм dll рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рдХрд░рдирд╛


рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдирд┐рд░реНрдорд╛рдг ( рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЯрд┐рдкреНрдкрдгреА ) рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рддреЛ, рдЪрд░рдг 1: рд╕реНрдкрд╖реНрдЯ рд▓рд┐рдВрдХрд┐рдВрдЧ рдпрд╛ рд╣рд╛рдп extern "C" ред


рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП: рдЗрдВрдЬрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рдХреА рддрд░рд╣ред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


1) рд╣рдо рдбрд╛рдпрдирд╛рдорд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЗрдВрдЬрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрдВрдХреНрд╢рди рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ:


 extern "C" --// LoadLibrary,     ,  API { void ENGINE_API RunApplication(LPCSTR commandLine) { ... // Your code } } 

2) рд╣рдорд╛рд░реЗ exe рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ:


 using RunFunc = void(__cdecl*)(const char*); //       bool OpenALFound = false; //     int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { if(OpenALFound) { HMODULE hLib = LoadLibrary("xrEngine.dll"); //      IsRunFunc RunFunc = (IsRunFunc)GetProcAddress(hLib, "RunApplication"); //     RunFunc(params); //   } return 0; } 

рдЪрд░рдг 2: рдбреНрд░рд╛рдЗрд╡рд░ рдХреА рдЬрд╛рдВрдЪ


рдЦреИрд░, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рд╣рдореЗрдВ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдорд┐рд▓рддрд╛ рд╣реИ (рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдУрдПрд╕ рд╣рдореЗрд╢рд╛ рд╕реА :) рдЦрдВрдб рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЪрд╛рд▓рдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбреАрдПрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ:


 /// R_ASSERT -  ,      ,   -      ... // WinMain code TCHAR szOpenALDir[MAX_PATH] = { 0 }; //    R_ASSERT(GetSystemDirectory(szOpenALDir, MAX_PATH * sizeof(TCHAR))); #ifndef UNICODE _snprintf_s(szOpenALDir, MAX_PATH * sizeof(CHAR), "%s%s", szOpenALDir, "\\OpenAL32.dll"); #else _snwprintf_s(szOpenALDir, MAX_PATH * sizeof(WCHAR), L"%s%s", szOpenALDir, L"\\OpenAL32.dll"); #endif DWORD dwOpenALInstalled = GetFileAttributes(szOpenALDir); //  ,    .   , . if (dwOpenALInstalled != INVALID_FILE_ATTRIBUTES) { OpenALFound = true; } 

рдЪрд░рдг 3: рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдорд┐рд▓реА


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╕реЗ рдкреВрдЫрдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


 // ,      bool IsProcessWithAdminPrivilege() { SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; LPVOID pAdministratorsGroup = nullptr; BOOL bRet = FALSE; // init SID to control privileges AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pAdministratorsGroup); // ckeck membership CheckTokenMembership(nullptr, pAdministratorsGroup, &bRet); // clean pointer if (pAdministratorsGroup) { FreeSid(pAdministratorsGroup); pAdministratorsGroup = nullptr; } return !!bRet; } { ...// WinMain code //    ,     if (!IsProcessWithAdminPrivilege()) { TCHAR szPathToLib[MAX_PATH] = { 0 }; GetModuleFileName(nullptr, szPathToLib, ARRAYSIZE(szPathToLib)); SHELLEXECUTEINFO shellInfo = { sizeof(SHELLEXECUTEINFO) }; shellInfo.lpVerb = TEXT("runas"); shellInfo.lpFile = szPathToLib; shellInfo.hwnd = nullptr; shellInfo.nShow = SW_NORMAL; if (ShellExecuteEx(&shellInfo)) ExitProcess(GetCurrentProcessId()); } } 

рд╕реНрдЯреЗрдЬ рджреЛ: рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ


 { ... // WinMain code TCHAR szPath[MAX_PATH] = { 0 }; //        GetModuleFileName(GetModuleHandle(nullptr), szPath, MAX_PATH); PathRemoveFileSpec(szPath); #ifndef UNICODE _snprintf_s(szPath, MAX_PATH * sizeof(CHAR), "%s%s", szPath, "\\OpenAL32.dll"); #else _snwprintf_s(szPath, MAX_PATH * sizeof(WCHAR), L"%s%s", szPath, L"\\OpenAL32.dll"); #endif dwOpenALInstalled = GetFileAttributes(szPath); if (dwOpenALInstalled != INVALID_FILE_ATTRIBUTES) //  ,   { DWORD LibrarySize = 0; HANDLE hFile = CreateFile(szPath, GENERIC_READ, NULL, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); R_ASSERT(hFile != INVALID_HANDLE_VALUE); FILE_STANDARD_INFO fileInfo = { 0 }; GetFileInformationByHandleEx(hFile, FileStandardInfo, &fileInfo, sizeof(fileInfo)); LPVOID pImage = HeapAlloc(GetProcessHeap(), 0, fileInfo.EndOfFile.QuadPart); ReadFile(hFile, pImage, fileInfo.EndOfFile.QuadPart, &LibrarySize, nullptr); CloseHandle(hFile); hFile = CreateFile(szOpenALDir, GENERIC_WRITE, NULL, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); R_ASSERT(hFile != INVALID_HANDLE_VALUE); WriteFile(hFile, pImage, fileInfo.EndOfFile.QuadPart, &LibrarySize, nullptr); HeapFree(GetProcessHeap(), 0, pImage); CloseHandle(hFile); OpenALFound = true; // ,    ,    } } 

рдирд┐рд╖реНрдХрд░реНрд╖


рдмреЗрд╢рдХ, рд╡рд┐рдзрд┐ рдмрд╣реБрдд рдордЬрд╝реЗрджрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рд╕рднреА рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдБ!

Source: https://habr.com/ru/post/hi431842/


All Articles