sdbzjqr 发表于 2022-9-3 07:32

不同进程间SendMessage求助

本帖最后由 sdbzjqr 于 2022-9-3 07:33 编辑

我注入一个DLL文件到一个x64的应用程序,HOOKMessageBox获取Msg的内容。(其实是HOOK recv,先搞个MessageBox做个测试)
这个DLL文件和我的主程序之间的通信问题,采用SendMessage或者PostMessage,但是我按照百度的方法实现不了,求助下怎么解决。
      
      public struct COPYDATASTRUCT
      {
            public IntPtr dwData;
            public int cbData;
            
            public string lpData;
      }
      static IntPtr MessageBoxW_Hooked(IntPtr hWnd, string text, string caption, uint type)
      {
            string strTest = "25425";
            Win32API.COPYDATASTRUCT cds;
            cds.dwData = (IntPtr)100;
            cds.lpData = strTest;
            byte[] sarr = System.Text.Encoding.UTF8.GetBytes(strTest);
            int len = sarr.Length;
            cds.cbData = len + 1;
            Win32API.SendMessage(hwndtest, 0x62, 5, ref cds);

            return MessageBoxW(hwndtest, "已注入-" + hwndtest, "已注入-" + caption, type);
      }
以上为DLL SendMessage
                protected override void DefWndProc(ref Message m)
                {
                        switch (m.Msg)
                        {
               case 0x62:
                  Win32API.COPYDATASTRUCT mystr = new Win32API.COPYDATASTRUCT();
                  Type mytype = mystr.GetType();
                  mystr = (Win32API.COPYDATASTRUCT)m.GetLParam(mytype);
                  string str2 = mystr.lpData;
                  label1.Text = str2;
                  break;
            default:
                                        base.DefWndProc(ref m);
                                        break;
                        }
                }
以上为主程序的消息函数。

报这个错误,网上查了好久都找不解决办法,求大神帮助。

fuhohua 发表于 2022-9-3 10:02

SendMessage或PostMessage只能发送给窗口程序,推荐你试试线程通信用PostThreadMessage

fuhohua 发表于 2022-9-3 10:22

本帖最后由 fuhohua 于 2022-9-3 10:28 编辑

PostThreadMessage声明


      
      public static extern bool PostThreadMessage(int threadId, uint msg, IntPtr wParam, IntPtr lParam);


Dll部分

// 首先通过主程序路径获取主程序进程Id(processId)(这里没有贴出代码)
// 然后发送消息到主程序的主线程
PostThreadMessage(Process.GetProcessById(processId).Threads.Id, 2048, IntPtr.Zero, IntPtr.Zero);


主程序部分
让你主程序的Form类继承 IMessageFilter接口,然后实现方法PreFilterMessage
   
public partial class FrmMain : Form, IMessageFilter
{
      /// <summary>
      /// 过滤消息
      /// </summary>
      /// <param name="m"></param>
      /// <returns></returns>
      public bool PreFilterMessage(ref Message m)
      {
            if (m.Msg == 2048)
            {
                // 干你想干的
                return true;
            }
            return false;
      }
}

在Form类的构造函数添加消息监视
   
public FrmMain()
      {
            // 添加进程消息监视
            MsgFilter msgFilter = new();
            Application.AddMessageFilter(msgFilter);

            InitializeComponent();
      }

天心阁下 发表于 2022-9-3 13:17

不同进程传COPYDATASTRUCT只能用WM_COPYDATA
否则wParam或是lParam都只是指针!!指针!!一个偏移地址!!
读另一个进程的指针当然不行

blgzs 发表于 2022-9-5 16:31

sdbzjqr 发表于 2022-9-6 13:44

谢谢各位

sdbzjqr 发表于 2022-9-6 14:20

fuhohua 发表于 2022-9-3 10:22
PostThreadMessage声明




谢谢大佬
页: [1]
查看完整版本: 不同进程间SendMessage求助