2016-11-14 4 views
1

Я использую EasyHook слишком перехватывает вызовы DrawTextW при тестировании с помощью блокнота, если я открываю Help -> About, он фиксирует весь текст, который появляется на экране, как ожидалось. Однако, если я открою файл -> Открыть, блокнот упадет. Я не ожидаю, что он захватит любой текст, но я не могу понять, почему блокнот рушится. Любая помощь будет оценена по достоинству.EasyHook DrawTextW user32.dll Инъекция, сбой приложения

using EasyHook; 
using System; 
using System.Text; 
using System.Runtime.InteropServices; 
using System.Threading; 
using UI; 

namespace MyClassLibrary 
{ 
    public class Main : IEntryPoint 
    { 
     [StructLayout(LayoutKind.Sequential)] 
     public struct HDC__ 
     { 
      public int unused; 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     public struct tagRECT 
     { 
      public int left; 
      public int top; 
      public int right; 
      public int bottom; 
     } 

     [DllImport("user32.dll", EntryPoint = "DrawTextW")] 
     public static extern int DrawTextW([In()] IntPtr hdc, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder lpchText, int cchText, ref tagRECT lprc, uint format); 


     [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)] 
     public delegate int TDrawTextW(
      [In()] IntPtr hdc, 
      [MarshalAs(UnmanagedType.LPWStr)] 
      StringBuilder lpchText, 
      int cchText, 
      ref tagRECT lprc, 
      uint format); 


     static string ChannelName; 
     RemoteMon Interface; 

     LocalHook DrawTextWHook; 
     public Main(RemoteHooking.IContext InContext, String InChannelName) 
     { 
      try 
      { 
       Interface = RemoteHooking.IpcConnectClient<RemoteMon>(InChannelName); 
       ChannelName = InChannelName; 
       Interface.IsInstalled(RemoteHooking.GetCurrentProcessId()); 
      } 
      catch (Exception ex) 
      { 
       Interface.ErrorHandler(ex); 
      } 
     } 

     static int hkDrawTextW(
        [In()] IntPtr hdc, 
        [MarshalAs(UnmanagedType.LPWStr)] 
        StringBuilder lpchText, 
        int cchText, 
        ref tagRECT lprc, 
        uint format) 
     { 
      try 
      { 
       ((Main)HookRuntimeInfo.Callback).Interface.GotDrawTextW(lpchText); 
       return DrawTextW(hdc, lpchText, cchText, ref lprc, format); 
      } 
      catch (Exception ex) 
      { 
       ((Main)HookRuntimeInfo.Callback).Interface.ErrorHandler(ex); 
       return 0; 
      } 
     } 

     public void Run(RemoteHooking.IContext InContext, String InChannelName) 
     { 
      try 
      { 
       DrawTextWHook = LocalHook.Create(LocalHook.GetProcAddress("user32.dll", "DrawTextW"), 
               new TDrawTextW(hkDrawTextW), this); 
       DrawTextWHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 }); 
      } 
      catch (Exception ex) 
      { 
       Interface.ErrorHandler(ex); 
      } 
      try 
      { 
       RemoteHooking.WakeUpProcess(); 
      } 
      catch (Exception ex) 
      { 
       Interface.ErrorHandler(ex); 
      } 
      while (true) 
      { 
       Thread.Sleep(10000); 
      } 
     } 
    } 
} 
+0

Я рекомендую прикреплять отладчик к блокноту и посмотреть, помогает ли это. Также попробуйте изменить функцию hook, чтобы ничего не делать, кроме как вернуть исходное значение. –

+0

Я попытался прокомментировать вызов GotDrawTextW раньше и получил те же результаты. Я попытаюсь посмотреть, смогу ли я узнать больше об этом отладчике. – williamt

ответ

0

Существует проблема с сортировкой текста в StringBuilder, когда открывается диалоговое окно Open. Я не на 100% уверен в причине, но, возможно, разница между инициализированной строкой COM и одной инициализированной с помощью malloc? В прошлом я столкнулся с проблемами со строками, зависящими от того, как их базовая память была инициализирована.

Решение заключается в использовании строки вместо StringBuilder для текстового параметра. Замените внешний и делегат и другие соответствующие области строковым параметром:

[DllImport("user32.dll", EntryPoint = "DrawTextW")] 
    public static extern int DrawTextW([In()] IntPtr hdc, [MarshalAs(UnmanagedType.LPWStr)] String lpchText, int cchText, ref tagRECT lprc, uint format); 

    [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)] 
    public delegate int TDrawTextW(
     [In()] IntPtr hdc, 
     [MarshalAs(UnmanagedType.LPWStr)] 
     String lpchText, 
     int cchText, 
     ref tagRECT lprc, 
     uint format); 

    static int hkDrawTextW(
       [In()] IntPtr hdc, 
       [MarshalAs(UnmanagedType.LPWStr)] 
       String lpchText, 
       int cchText, 
       ref tagRECT lprc, 
       uint format) 
    { 
     ... 
    } 
+0

Спасибо, что решила мою проблему красиво. Трудно найти информацию об этом типе вещей. – williamt

+0

Рад помочь, да, это сложно сделать с ними, потому что, как правило, трудно диагностировать проблему, глядя на код в одиночку, часто требуется воспроизвести ее в коде, и это требует времени и усилий. –