From: Alejandro R. SedeƱo Date: Fri, 24 Feb 2017 03:25:45 +0000 (-0500) Subject: first pass X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?p=PuTTY.git;a=commitdiff_plain;h=510f49e405e71ba5c97875e7a019364e1ef5fac9 first pass --- diff --git a/windows/wingss.c b/windows/wingss.c index 6aaa20cf..6b4d0f15 100644 --- a/windows/wingss.c +++ b/windows/wingss.c @@ -83,18 +83,22 @@ struct ssh_gss_liblist *ssh_gss_setup(Conf *conf) == ERROR_SUCCESS) { DWORD type, size; LONG ret; - char *buffer; - - /* Find out the string length */ - ret = RegQueryValueEx(regkey, "InstallDir", NULL, &type, NULL, &size); + wchar_t *buffer; + /* Find out the string length, in bytes, for a wchar_t */ + ret = RegQueryValueExW(regkey, L"InstallDir", NULL, &type, NULL, &size); if (ret == ERROR_SUCCESS && type == REG_SZ) { buffer = snewn(size + 20, char); - ret = RegQueryValueEx(regkey, "InstallDir", NULL, - &type, (LPBYTE)buffer, &size); + ret = RegQueryValueExW(regkey, L"InstallDir", NULL, + &type, (LPBYTE)buffer, &size); if (ret == ERROR_SUCCESS && type == REG_SZ) { - strcat(buffer, "\\bin\\gssapi32.dll"); - module = LoadLibrary(buffer); + wcscat(buffer, L"\\bin\\"); + dll_hijacking_protection_add_path(buffer); + /* If 32-bit */ + module = LoadLibrary("gssapi32.dll"); + /* elif 64-bit */ + /* module = LoadLibrary("gssapi64.dll"); */ + } sfree(buffer); } diff --git a/windows/winmisc.c b/windows/winmisc.c index 11e2ca0f..8bd4c77f 100644 --- a/windows/winmisc.c +++ b/windows/winmisc.c @@ -176,11 +176,25 @@ void dll_hijacking_protection(void) } if (p_SetDefaultDllDirectories) { - /* LOAD_LIBRARY_SEARCH_SYSTEM32 only */ - p_SetDefaultDllDirectories(0x800); + /* LOAD_LIBRARY_SEARCH_SYSTEM32 | LOAD_LIBRARY_SEARCH_USER_DIRS only */ + p_SetDefaultDllDirectories(0x800|0x400); } } +void dll_hijacking_protection_add_path(const wchar_t *path) +{ + static HMODULE kernel32_module; + DECL_WINDOWS_FUNCTION(static, BOOL, AddDllDirectory, (PCWSTR)); + + if (!kernel32_module) { + kernel32_module = load_system32_dll("kernel32.dll"); + GET_WINDOWS_FUNCTION(kernel32_module, AddDllDirectory); + } + + if (p_AddDllDirectory) { + p_AddDllDirectory(path); + } +} BOOL init_winver(void) { ZeroMemory(&osVersion, sizeof(osVersion)); diff --git a/windows/winstuff.h b/windows/winstuff.h index c1918d4a..d7577cf6 100644 --- a/windows/winstuff.h +++ b/windows/winstuff.h @@ -506,6 +506,7 @@ void show_help(HWND hwnd); */ extern OSVERSIONINFO osVersion; void dll_hijacking_protection(void); +void dll_hijacking_protection_add_path(const wchar_t*); BOOL init_winver(void); HMODULE load_system32_dll(const char *libname); const char *win_strerror(int error);