рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛ 7 рдХреЛ рдПрдХ рд░рдирд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреИрд╕реЗ рдбрд╛рд▓рд╛, рдФрд░ рдореБрдЭреЗ рд╕реА рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдирд╛ рдерд╛

рдЫрд╡рд┐

рдПрдХ рдмрд╛рд░, рдардВрдб рдХреЗ рдореМрд╕рдо рдореЗрдВ, рдПрдХ рдкреБрд░рд╛рдиреЗ рд╕реА ++ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЬреЛ рд╕рд╛рд▓реЛрдВ рдкрд╣рд▓реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЬрд╛рд╡рд╛ рдХреЗ рдмрдЬрд╛рдп рдирдпрд╛ рдЬрд╛рд╡рд╛ рд░рдирдЯрд╛рдЗрдо 7 рдбрд╛рд▓рдирд╛ рдерд╛ред рдХреБрдЫ рднреА рдирд╣реАрдВ, рдФрд░ рдЕрдЪрд╛рдирдХред

рдХреЛрдб рдЖрдо рддреМрд░ рдкрд░ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рд░рд▓ рд╣реИ - рдЬреЗрдПрдирдЖрдИ рдХрд╛ рдПрдХ рд╕рд╛ , рдФрд░ рдпрд╣рд╛рдВ рдпрд╣ рд╣реИ - рдПрдХ рдмреБрд░рд╛ рджрд╛рдВрдд ред рдореИрдВ рдХреЗрд╡рд▓ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдХреЛрдб рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЦрд╕рдЦрд╕ рдХреЗ рдиреАрдЪреЗ рд╕рдВрддреБрд▓рди рдХреЗ рдЪрдорддреНрдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред



рдХреИрд╕рд╛ рдерд╛


рдПрдХ рдмрд╛рд░, рдХрдИ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ jvm.dll рд╕реЗ рдЬреБрдбрд╝рд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг DLL рдмрдирд╛рдпрд╛, рдЗрд╕рдореЗрдВ рдврд╛рдИ рдХрд╛рд░реНрдп рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП, рдФрд░ рдЗрд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ "рдЦреАрдВрдЪрд╛"ред рдХрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдВрдХреЗрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ - рд╣рдореЗрдВ рдЕрднреА рднреА рдпрд╣ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рд╕реНрд╡рдпрдВ рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИред рдЗрд╕ рд╕рд░рд▓ рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛

bool LoadJavaEngine(HANDLE& engHandle) { bool loadResult = false; do { ... // here we have auto variables, nothing interesting // first we need to find java CRegKey rk; if(rk.Open(HKEY_LOCAL_MACHINE, L"SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.6", KEY_QUERY_VALUE) != ERROR_SUCCESS || rk.QueryValue(strBuf, L"RuntimeLib", &strBufSz) != ERROR_SUCCESS) break; WCHAR* backslashAddr = wcsrchr(strBuf, L'\\'); if(backslashAddr) BufLen = backslashAddr - strBuf; strBuf[BufLen] = L'\0'; // now C runtime knows where is jvm.dll located retnPWD = SetDllDirectoryW(strBuf); // ... nothing intersting - in the same manner we're looking for our proxy path in registry if((engHandle = LoadLibrary(strBuf))==NULL) break; // now try to initialize JVM by calling our proxy linked with jvm.dll CreateJavaVMFunPtr CreateJavaVM = (CreateJavaVMFunPtr)GetProcAddress(engHandle, "CreateJavaVM"); if(CreateJavaVM) loadResult = CreateJavaVM(needJNIProxy); } while(false); return loadResult; } 


рдиреАрд▓реЗ рд░рдВрдЧ рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реЗрдХ


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрдб рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рддреАрди рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рд▓реЗрддрд╛ рд╣реИ

  SetDllDirectory LoadLibrary GetProcAddress 


рдФрд░ рдЕрдм - рд╣рдо рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдЬрд╛рд╡рд╛ 6 рдХреЗ рд╕рд╛рде, рд╣рдо рдЬрд╛рд╡рд╛ 7 рдореЗрдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЖрд╢рд╛рд╡рд╛рджреА рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдЗрд╕ рддрд░рд╣ рдерд╛ - рд╣рдо рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдкрд░рд┐рд╡рд░реНрддрди
  if(rk.Open(HKEY_LOCAL_MACHINE, L"SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.6", 

рдкрд░
  if(rk.Open(HKEY_LOCAL_MACHINE, L"SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.7", 

рдФрд░ рдкреНрд░рд╕рд┐рджреНрдз рд▓рд┐рдереБрдЖрдирд┐рдпрд╛рдИ рдЫреБрдЯреНрдЯреА "рдУрдмреНрд▓реЛрдУрдорд╛рдЗрдЯрд┐рд╕" рдЖрддрд╛ рд╣реИ рдкрде рдирд╣реАрдВ рдорд┐рд▓рд╛ред рд╡рд╣ рд╣рдорд╛рд░рд╛ рд╕рд░рд▓ рдЫрджреНрдо рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред

рдЯреЗрд▓реАрдкреИрдереА рд╕рддреНрд░


рдХрд╛рд░реНрдпрд╡рд╛рд╣реА рдХреЗ рдЖрдзреЗ рдШрдВрдЯреЗ рдХреЗ рджреМрд░рд╛рди, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛:

  1. рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рд╣рдорд╛рд░реЗ рдЬрд╛рд╡рд╛ рдкреНрд▓рдЧ-рдЗрди рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ 2003 рд╕реЗ 2008 (MSVCR80.dll, MSVCR90.dll, рдЖрджрд┐) рдХреЗ рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ рджреНрд╡рд╛рд░рд╛ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдХреНрд░рдорд╢рдГ рдЬрд╛рд╡рд╛ 6, MSVCR71.dll рдХреЗ рд▓рд┐рдП рджреБрд░реНрд▓рдн рдерд╛ред
  2. рдирдпрд╛ рдЬрд╛рд╡рд╛ MSVCR100.dll (рд╣рд╛рдБ, рд╣рд╛рдБ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЧреНрд░рд╛рд╣рдХ рд╕рдВрд╕реНрдХрд░рдг MSVCR90.dll рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


Googling рдиреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ - рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рд╢реВрдиреНрдп рдкреНрд░рддрд┐ рд╡рдЬрди рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖред

рд╕рдВрд╕реНрдХрд╛рд░ рдбрдл


рдЫрд╡рд┐
рдФрд░ рдлрд┐рд░ рдЙрд╕рдХреА рдЬреЗрдм рд╕реЗ рдПрдХ рдмрдбрд╝реА рдлрд╛рдЗрд▓ рдирд┐рдХрд╛рд▓реА рдЧрдИ рдФрд░ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдПрдХ рдФрд░ рд░рд╛рдХреНрд╖рд╕ рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖред рдФрд░ рдПрдХ SetDllDirectory рдХреЗ рдмрдЬрд╛рдп, рдпрд╣реА рд╣реБрдЖ рд╣реИ:

  wcscat(strBuf, L"\\msvcr100.dll"); test = LoadLibraryW(strBuf); strBuf[BufLen] = L'\0'; wcscat(strBuf, L"\\client\\jvm.dll"); test = LoadLibraryW(strBuf); if(test == 0) { strBuf[BufLen] = L'\0'; wcscat(strBuf, L"\\server\\jvm.dll"); test = LoadLibraryW(strBuf); } strBuf[BufLen] = L'\0'; retnPWD = SetDllDirectoryW(strBuf); 

рдпрд╣реА рд╣реИ, рдпрджрд┐ рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ MSVCR100.dll рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдЕрдлрд╕реЛрд╕ред

рдЕрд╕реНрд╡реАрдХрд░рдг: рд╡рд┐рдХрд▓реНрдк "рдФрд░ рдЖрдк рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ" рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рдореБрдЦреНрдп рдЖрд╡реЗрджрди рдПрдбреЛрдм рдЗрдирдбрд┐рдЬрд╛рдЗрди рд╕рд░реНрд╡рд░ CS5 рд╣реИ, $ 7k рдкреНрд░рддрд┐ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рд▓рд┐рдПред

рдХрд╛рдВрдЯреЗрджрд╛рд░ рддрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг рд╡рд┐рд╖рдп рдкрд░ рдкрд┐рдЫрд▓реЗ рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

http://habrahabr.ru/post/122746/
http://habrahabr.ru/post/127574/

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


All Articles