2016-12-21 3 views
-1

В настоящее время я пытаюсь подключить функцию MessageBeep в user32.dll с помощью EasyHook. Если im работает [этот пример] [1], все работает нормально. Но если я заменю идентификатор потока в строках 52 и 60 с идентификатором потока моего тестового приложения, хук не применяется для программы ohter.EasyHook не работает для других потоков

Почему SetExclusiveACL-Method не принимает никаких других идентификаторов потоков? например

hook.ThreadACL.SetExclusiveACL(new int[] { 8788 }); 

Я использую следующий код для извлечения нити-ID моего тестового приложения и проверить, если крючок работает на функции MessageBeep:

Sub Main() 
    While True 
     Console.WriteLine(GetCurrentThreadId().ToString) 
     MessageBeep(&H40) 
     If Console.ReadKey().KeyChar = "c"c Then 
      Console.Clear() 
     End If 
    End While 
End Sub 
+0

Что вы имеете в виду под «другой программой»? –

+0

У меня есть два приложения: 1. пример, предоставленный разработчиками EasyHook 2. моя тестовая программа в vb.net с приведенным выше кодом В исходном примере идентификатор потока передан SetExclusiveACL (новый int [] { 0}); ist zero (что означает, что хук применяется к текущему потоку). Я хочу применить привязку к любому идентификатору потока, но мне не удается получить эту работу – user4841702

+1

Итак, вы имеете в виду, что вы установили крючок для MessageBeep в Application A Вы вызываете MessageBeep в приложении B. И вы ожидаете, что ваша функция hook в приложении A будет выполнена? –

ответ

1

Если вы хотите подключить к целевой процесс, вам нужно вставить свою DLL в целевой процесс, EasyHook уже предоставляет способ сделать это. И внутри этой библиотеки DLL вы можете установить LocalHook для MessageBeep. Ниже приведен пример кода, чтобы сделать инъекцию с помощью RemoteHooking.Inject

//create channel to send text data and log 
RemoteHooking.IpcCreateServer<LogChannel>(ref _logChannelName, WellKnownObjectMode.Singleton); 

RemoteHooking.IpcCreateServer<TextDataChannel>(
    ref _textDataChannelName, WellKnownObjectMode.Singleton); 

CommandChannel = new Common.IPC.CommandChannel(); 

string filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\" + INJECT_DLL_NAME; 
RemoteHooking.Inject(processID,InjectionOptions.DoNotRequireStrongName, 
       filePath, 
       filePath, 
       _logChannelName, _textDataChannelName, CommandChannel.PipeName, _pendingMsgType); 

Обновлено: Вы можете обратиться к этой ссылке https://www.codeproject.com/Articles/27637/EasyHook-The-reinvention-of-Windows-API-hooking

Смежные вопросы