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:
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"
@ -1470,7 +1477,7 @@ void HookLibrary( HMODULE hMod, LPCVOID lpFileName, BOOL wide, LPCSTR funcName )
LPCWSTR name;
WCHAR wname[MAX_PATH];
if (hMod && hMod != hKernel)
if (hMod && hMod != hKernel && hMod != hDllInstance)
{
if (!wide)
{
@ -1514,7 +1521,9 @@ HMODULE WINAPI MyLoadLibraryExA( LPCSTR lpFileName, HANDLE hFile,
DWORD 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" );
return hMod;
}
@ -1524,7 +1533,9 @@ HMODULE WINAPI MyLoadLibraryExW( LPCWSTR lpFileName, HANDLE hFile,
DWORD 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" );
return hMod;
}

View File

@ -78,7 +78,7 @@
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 "version.h"

View File

@ -24,6 +24,13 @@
#define lenof(array) (sizeof(array)/sizeof(*(array)))
#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
{

View File

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

View File

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