Aner Izraeli Ответов: 2

Невозможно подключить функции реестра с помощью MS-detours (32bit)


я использую ms-detours для подключения функций. я успешно впрыскиваю свою dll в процесс. я успешно ловлю функции createfile\deletefile и вижу их событие в "debugView".

я не могу поймать все функции реестра.

пытался:

REGSETVALUEX OrigRegSetValueEx = NULL;

REGOPENKEYEXA OrigRegOpenKeyExA = NULL;

REGOPENKEY OrigRegOpenKey = NULL;

REGCREATEKEYEXW OrigRegCreateKeyExW = NULL;

REGCREATEKEYW OrigRegCreateKeyW = NULL;

REGSETVALUEXW OrigRegSetValueExW = NULL;

у меня есть самописный код (c#) 32-битной консольной программы, которая имеет 3 функции:

createNewFile
Это
откройте подраздел реестра и установите значение ключа. кодовый СНиП № 3:

введите код здесь string Mash = String.Concat(Окружающая Среда.Имя Машины, Окружающая Среда.Версия_ос.VersionString, Environment.Имя пользователя); объект registrykey rkApp = реестр.Текущий пользователь.OpenSubKey("программное обеспечение\Microsoft\окна\CurrentVersion равное\выполнить", истина); rkApp.Метод setValue("значение", пюре); rkApp.Рядом();
createNewFile + DeleteFile - перехват успешно.

откройте подраздел реестра и установите значение ключа. - не ловлю событие


я использую следующий код для функций и обходных путей:

Что я уже пробовал:

Я отлаживал с помощью:

1.Process monitor - который ловит мои события. ProcessMonitor Улавливает События Реестра

2.поместил messagebox3 в функцию 'HookRegSetValue' и не видел, как она выскакивает. я не уверен, но предполагаю, что это проблема с объездами.

3.попробовал другие функции реестра - ни одна из них не сработала.



include "stdafx.h"
include "windows.h"
include "tchar.h"
include "stdio.h"


typedef HANDLE(WINAPI *CREATEFILEW)(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);
typedef HANDLE(WINAPI *DELETEFILEW)(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);
typedef LONG(WINAPI *REGSETVALUE)(HKEY, LPCTSTR, DWORD,LPCSTR,DWORD);


CREATEFILEW OrigCreteFileW = NULL;
DELETEFILEW OrigDeleteFileW = NULL;
REGSETVALUE OrigRegSetValue = NULL;


HANDLE WINAPI HookCreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
{
	OutputDebugString(__TEXT("Inside HookCreateFileW"));
    OutputDebugStringW(lpFileName);
	return OrigCreteFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}
HANDLE WINAPI HookDeleteFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
{
	OutputDebugString(__TEXT("Inside HookDeleteFileW"));
	OutputDebugStringW(lpFileName);
	return OrigDeleteFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}
LONG WINAPI HookRegSetValue(HKEY hKey, LPCTSTR lpSubKey, DWORD dwType, LPCTSTR lpData, DWORD cbData)
{
	MessageBox(0, "And text here3", "MessageBox caption", MB_OK);
	OutputDebugString(__TEXT("Inside HookRegSetValue"));
	OutputDebugStringW((LPCWSTR)hKey);
	return OrigRegSetValue(hKey, lpSubKey, dwType, lpSubKey, cbData);
}


void InstallHooks(void)
{
	
	HMODULE modKernel32 = GetModuleHandle(TEXT("KERNEL32.dll"));
	HMODULE advapi32 = GetModuleHandle(TEXT("ADVAPI32.dll"));

	
	OrigCreteFileW = (CREATEFILEW)GetProcAddress(modKernel32, "CreateFileW");
	OrigDeleteFileW = (DELETEFILEW)GetProcAddress(modKernel32, "DeleteFileW");
	OrigRegSetValue = (REGSETVALUE)GetProcAddress(advapi32, "RegSetValue");

	// install hooks
	DetourTransactionBegin();
	DetourUpdateThread(GetCurrentThread());

	//File Hooks

	OutputDebugString(__TEXT("4.DetourAttach"));
	/*DetourAttach(&(PVOID&)OrigCreteFileW, HookCreateFileW);
	OutputDebugString(__TEXT("HookCreateFileW"));
	DetourAttach(&(PVOID&)OrigDeleteFileW, HookDeleteFileW);
	OutputDebugString(__TEXT("HookDeleteFileW"));*/
	DetourAttach(&(PVOID&)OrigRegSetValue, HookRegSetValue);
	OutputDebugString(__TEXT("HookRegSetValue"));


	DetourTransactionCommit();

void RestoreHooks(void)
{

	DetourTransactionBegin();
	DetourUpdateThread(GetCurrentThread());

	//File Hooks

	OutputDebugString(__TEXT("5.DetourDetach"));
	DetourTransactionCommit();
}

// dllmain.cpp : Defines the entry point for the DLL application.


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		OutputDebugString(__TEXT("InstallHooks"));
		InstallHooks();
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		//OutputDebugString(__TEXT("RestoreHooks"));
		//RestoreHooks();
		break;
	}
	return TRUE;
}

Arthur V. Ratz

Я просмотрел ваш код и понятия не имею, почему именно это происходит. Вероятно, не все вызовы API могут быть подключены с помощью MS-Detours.

2 Ответов

Рейтинг:
0

Arthur V. Ratz

Я только что просмотрел ваш код, и все это кажется мне немного странным. Я бы рекомендовал вам прочитать эту статью Подключение API с помощью MS Detours


Рейтинг:
0

Member 3017361

Я столкнулся с той же проблемой: потребовался день отладки того, что нужно зацепить.
Если вы хотите зацепить доступ к реестру-вам нужно зацепить версии внутри kernelbase.dll нет advapi32.dll или kernel32.dll-да. В противном случае некоторые вещи будут зацеплены, но другие, такие как CoCreateInstance, будут пропущены.