LoadLibrary hooking improvements.

Don't hook ourself from LoadLibrary or LoadLibraryEx.
Test additional LoadLibraryEx flags before deciding to hook.
This commit is contained in:
Jason Hood 2014-01-25 23:43:41 +10:00
parent cf6f8c741e
commit b2c8a9ec12
5 changed files with 28 additions and 11 deletions

17
ANSI.c
View File

@ -107,6 +107,13 @@
v1.65, 28 August, 2013: v1.65, 28 August, 2013:
fix \e[K (was using window, not buffer). fix \e[K (was using window, not buffer).
v.166, 20 & 21 September, 2013:
fix 32-bit process trying to detect 64-bit process.
v1.67, 25 January, 2014:
don't hook ourself from LoadLibrary or LoadLibraryEx;
update the LoadLibraryEx flags that should not cause hooking.
*/ */
#include "ansicon.h" #include "ansicon.h"
@ -1470,7 +1477,7 @@ void HookLibrary( HMODULE hMod, LPCVOID lpFileName, BOOL wide, LPCSTR funcName )
LPCWSTR name; LPCWSTR name;
WCHAR wname[MAX_PATH]; WCHAR wname[MAX_PATH];
if (hMod && hMod != hKernel) if (hMod && hMod != hKernel && hMod != hDllInstance)
{ {
if (!wide) if (!wide)
{ {
@ -1514,7 +1521,9 @@ HMODULE WINAPI MyLoadLibraryExA( LPCSTR lpFileName, HANDLE hFile,
DWORD dwFlags ) DWORD dwFlags )
{ {
HMODULE hMod = LoadLibraryExA( lpFileName, hFile, dwFlags ); HMODULE hMod = LoadLibraryExA( lpFileName, hFile, dwFlags );
if (!(dwFlags & LOAD_LIBRARY_AS_DATAFILE)) if (!(dwFlags & (LOAD_LIBRARY_AS_DATAFILE |
LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE |
LOAD_LIBRARY_AS_IMAGE_RESOURCE)))
HookLibrary( hMod, lpFileName, FALSE, "LoadLibraryExA" ); HookLibrary( hMod, lpFileName, FALSE, "LoadLibraryExA" );
return hMod; return hMod;
} }
@ -1524,7 +1533,9 @@ HMODULE WINAPI MyLoadLibraryExW( LPCWSTR lpFileName, HANDLE hFile,
DWORD dwFlags ) DWORD dwFlags )
{ {
HMODULE hMod = LoadLibraryExW( lpFileName, hFile, dwFlags ); HMODULE hMod = LoadLibraryExW( lpFileName, hFile, dwFlags );
if (!(dwFlags & LOAD_LIBRARY_AS_DATAFILE)) if (!(dwFlags & (LOAD_LIBRARY_AS_DATAFILE |
LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE |
LOAD_LIBRARY_AS_IMAGE_RESOURCE)))
HookLibrary( hMod, lpFileName, TRUE, "LoadLibraryExW" ); HookLibrary( hMod, lpFileName, TRUE, "LoadLibraryExW" );
return hMod; return hMod;
} }

View File

@ -78,7 +78,7 @@
don't write the reset sequence if output is redirected. don't write the reset sequence if output is redirected.
*/ */
#define PDATE L"21 September, 2013" #define PDATE L"25 January, 2014"
#include "ansicon.h" #include "ansicon.h"
#include "version.h" #include "version.h"

View File

@ -24,6 +24,13 @@
#define lenof(array) (sizeof(array)/sizeof(*(array))) #define lenof(array) (sizeof(array)/sizeof(*(array)))
#define TSIZE(size) ((size) * sizeof(TCHAR)) #define TSIZE(size) ((size) * sizeof(TCHAR))
#ifndef LOAD_LIBRARY_AS_IMAGE_RESOURCE
#define LOAD_LIBRARY_AS_IMAGE_RESOURCE 0x20
#endif
#ifndef LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE
#define LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 0x20
#endif
typedef struct typedef struct
{ {

View File

@ -63,8 +63,7 @@ BOOL get_LLW32( void )
len = GetSystemWow64Directory( buf, MAX_PATH ); len = GetSystemWow64Directory( buf, MAX_PATH );
wcscpy( buf + len, L"\\kernel32.dll" ); wcscpy( buf + len, L"\\kernel32.dll" );
// MinGW-w64 had a typo, calling it LINRARY. kernel32 = LoadLibraryEx( buf, NULL, LOAD_LIBRARY_AS_IMAGE_RESOURCE );
kernel32 = LoadLibraryEx( buf, NULL, 0x20/*LOAD_LIBRARY_AS_IMAGE_RESOURCE*/ );
if (kernel32 == NULL) if (kernel32 == NULL)
{ {
DEBUGSTR( 1, L"Unable to load 32-bit kernel32.dll!" ); DEBUGSTR( 1, L"Unable to load 32-bit kernel32.dll!" );

View File

@ -2,11 +2,11 @@
version.h - Version defines. version.h - Version defines.
*/ */
#define PVERS L"1.66" // wide string #define PVERS L"1.67" // wide string
#define PVERSA "1.66" // ANSI string (windres 2.16.91 didn't like L) #define PVERSA "1.67" // ANSI string (windres 2.16.91 didn't like L)
#define PVERE L"166" // wide environment string #define PVERE L"167" // wide environment string
#define PVEREA "166" // ANSI environment string #define PVEREA "167" // ANSI environment string
#define PVERB 1,6,6,0 // binary (resource) #define PVERB 1,6,7,0 // binary (resource)
#ifdef _WIN64 #ifdef _WIN64
# define BITS L"64" # define BITS L"64"