吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 834|回复: 6
收起左侧

[求助] 不同进程间SendMessage求助

  [复制链接]
sdbzjqr 发表于 2022-9-3 07:32
本帖最后由 sdbzjqr 于 2022-9-3 07:33 编辑

我注入一个DLL文件到一个x64的应用程序,HOOK  MessageBox获取Msg的内容。(其实是HOOK recv,先搞个MessageBox做个测试)
这个DLL文件和我的主程序之间的通信问题,采用SendMessage或者PostMessage,但是我按照百度的方法实现不了,求助下怎么解决。
[C#] 纯文本查看 复制代码
        [StructLayout(LayoutKind.Sequential)]
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }

[C#] 纯文本查看 复制代码
        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
[C#] 纯文本查看 复制代码
                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;
                        }
                }

以上为主程序的消息函数。
截图_20220903072902.png
报这个错误,网上查了好久都找不解决办法,求大神帮助。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

fuhohua 发表于 2022-9-3 10:02
SendMessage或PostMessage只能发送给窗口程序,推荐你试试线程通信用PostThreadMessage
fuhohua 发表于 2022-9-3 10:22
本帖最后由 fuhohua 于 2022-9-3 10:28 编辑

PostThreadMessage声明
[C#] 纯文本查看 复制代码
 [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool PostThreadMessage(int threadId, uint msg, IntPtr wParam, IntPtr lParam);


Dll部分
[C#] 纯文本查看 复制代码
// 首先通过主程序路径获取主程序进程Id(processId)(这里没有贴出代码)
// 然后发送消息到主程序的主线程
PostThreadMessage(Process.GetProcessById(processId).Threads[0].Id, 2048, IntPtr.Zero, IntPtr.Zero);


主程序部分
让你主程序的Form类继承 IMessageFilter接口,然后实现方法PreFilterMessage
[C#] 纯文本查看 复制代码
    
 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类的构造函数添加消息监视
[C#] 纯文本查看 复制代码
   
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声明
[mw_shl_code=csharp,true]
[DllImport("user32.dll", SetLastError = true)]

谢谢大佬
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 04:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表