开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 7617|回复: 3
收起左侧

[C#源码] 夜神模拟器发包操作发送文本等

[复制链接]
发表于 2017-8-15 09:58:57 | 显示全部楼层 |阅读模式   广西壮族自治区柳州市
  1.         private string AdbPath { get; set; }
  2.         private string DevicesInfo { get; set; }
  3.         private  int MousePort { get; set; }
  4.         private int TxtPort { get; set; }
  5.         private int Pid { get; set; }
  6.         /// <summary>
  7.         /// 模拟器对应的虚拟机ID
  8.         /// </summary>
  9.         public int NoxVmHandlePid { get; set; }
  10.         /// <summary>
  11.         ///
  12.         /// </summary>
  13.         public  IntPtr MainWindowHandle { get; set; }

  14.        /// <summary>
  15.        /// 初始化构造函数要求夜神模拟器版本 2.5.0.0
  16.        /// </summary>
  17.         /// <param name="path">模拟器路径 列:“H:\夜神模拟器\Nox\bin\”</param>
  18.         /// <param name="name">要启动的模拟器名称 列“Nox_1”</param>
  19.         public AdbOperation(string path,string name)
  20.        {
  21.             AdbPath = path + "nox_adb.exe";
  22.             Process process = new Process();
  23.             ProcessStartInfo startInfo = new ProcessStartInfo
  24.             {
  25.                 FileName = path+"Nox",
  26.                 Arguments = "-clone:"+name,
  27.             };
  28.             process.StartInfo = startInfo;
  29.             process.Start();
  30.             Pid = process.Id;
  31.            Thread thread = new Thread(() =>
  32.            {
  33.                int port = 0;
  34.                while (true)
  35.                {
  36.                    Thread.Sleep(2000);
  37.                    if (port == 0)
  38.                    {
  39.                        port = MemoryReadWrite.ReadInt(process.Handle, (IntPtr) 0x00685240);
  40.                    }
  41.                    else
  42.                    {
  43.                        if (port > 0)
  44.                        {
  45.                            if (port != MemoryReadWrite.ReadInt(process.Handle, (IntPtr) 0x00685240))
  46.                            {
  47.                                DevicesInfo = string.Format("127.0.0.1:{0}",
  48.                                    MemoryReadWrite.ReadInt(process.Handle, (IntPtr) 0x00685240).ToString());//设备端口

  49.                                MousePort = MemoryReadWrite.ReadInt(process.Handle, (IntPtr)0x00685258);//鼠标端口

  50.                                TxtPort = MemoryReadWrite.ReadInt(process.Handle, (IntPtr) 0x00685244);//文本端口
  51.                                NoxVmHandlePid = GetNoxVmHandlePid(name);
  52.                                MainWindowHandle = process.MainWindowHandle;
  53.                                break;
  54.                            }
  55.                        }
  56.                    }
  57.                }
  58.            }) {IsBackground = true};
  59.            thread.Start();
  60.            
  61.         }
复制代码
  1. /// <summary>
  2.         /// 修改内存页面属性
  3.         /// </summary>
  4.         /// <param name="processHandle"></param>
  5.         /// <param name="pvAddressRemote"></param>
  6.         /// <returns></returns>
  7.         private static void VirtualProtectEx(IntPtr processHandle, IntPtr pvAddressRemote)
  8.         {
  9.             int i = 0;
  10.             Miscellaneous.VirtualProtectEx(processHandle, pvAddressRemote, 2, 4, ref i);
  11.         }

  12.         /// <summary>
  13.         /// 读内存4字节整数型
  14.         /// </summary>
  15.         /// <param name="processHandle">进程句柄 IntPtr.Zero 表示本进程</param>
  16.         /// <param name="pvAddressRemote">要读取的内存地址</param>
  17.         /// <returns></returns>
  18.         public static int ReadInt(IntPtr processHandle, IntPtr pvAddressRemote)
  19.         {
  20.             try
  21.             {
  22.                 if (processHandle == IntPtr.Zero)
  23.                 {
  24.                     VirtualProtectEx(Miscellaneous.GetCurrentProcess(), pvAddressRemote);
  25.                     return Marshal.ReadInt32(pvAddressRemote);
  26.                 }
  27.                 else
  28.                 {
  29.                     byte[] vBuffer = new byte[4];
  30.                     IntPtr vBytesAddress = Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0);
  31.                     VirtualProtectEx(processHandle, pvAddressRemote);
  32.                     Miscellaneous.ReadProcessMemoryInt(processHandle, pvAddressRemote, vBytesAddress, 4, IntPtr.Zero);
  33.                     return Marshal.ReadInt32(vBytesAddress);
  34.                 }
  35.             }
  36.             catch
  37.             {

  38.                 return 0;
  39.             }
  40.         }
复制代码
  1. /// <修改内存页面属性>
  2.         ///
  3.         /// </修改内存页面属性>
  4.         /// <param name="hWnd"></param>
  5.         /// <param name="lpAddress"></param>
  6.         /// <param name="dwSize"></param>
  7.         /// <param name="flNewProtect"></param>
  8.         /// <param name="lpf噜阿噜dProtect"></param>
  9.         /// <returns></returns>
  10.         [DllImport("kernel32.dll")]
  11.         public static extern bool VirtualProtectEx(IntPtr hWnd, IntPtr lpAddress, Int32 dwSize, Int32 flNewProtect,  ref Int32 lpf噜阿噜dProtect);
复制代码
  1. /// <读内存四字节>
  2.         ///
  3.         /// </读内存四字节>
  4.         /// <param name="hProcess"></param>
  5.         /// <param name="lpBaseAddress"></param>
  6.         /// <param name="lpBuffer"></param>
  7.         /// <param name="nSize"></param>
  8.         /// <param name="lpNumberOfBytesRead"></param>
  9.         /// <returns></returns>
  10.         [DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")]
  11.         public static extern bool ReadProcessMemoryInt(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, uint nSize, IntPtr lpNumberOfBytesRead);
复制代码
  1. /// <summary>
  2.         /// 输入文本字符串
  3.         /// </summary>
  4.         /// <param name="text">要输入的字符串</param>
  5.         public void InputText(string text)
  6.         {
  7.             try
  8.             {
  9.                 var socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  10.                 IPAddress ip = IPAddress.Parse("127.0.0.1");
  11.                 IPEndPoint point = new IPEndPoint(ip, TxtPort);
  12.                 socketSend.Connect(point);
  13.                 byte[] sendData = Encoding.UTF8.GetBytes(text.Trim());
  14.                 socketSend.Send(sendData);
  15.                 socketSend.Close();
  16.             }
  17.             catch (Exception)
  18.             {
  19.                 MessageBox.Show("TCP连接或者发送失败");
  20.             }
  21.         }

  22.         ///<summary>
  23.         /// 模拟鼠标点击 屏幕分辨率要求="280 450 120"
  24.         /// </summary>
  25.         /// <param name="x">模拟器屏幕左上角0开始</param>
  26.         /// <param name="y">模拟器屏幕左上角0开始</param>
  27.         public void MouseClick(int x,int y)
  28.         {
  29.             SendUdpData(MousePort, string.Format("MULTI:1:0:{0}:{1}.", x.ToString(), y.ToString()));
  30.             SendUdpData(MousePort, string.Format("MULTI:1:1:{0}:{1}.", x.ToString(), y.ToString()));
  31.            // Execute(AdbPath + "   -s " + DevicesInfo + " shell input tap" + "  " + x.ToString()+" "+y.ToString(), 0);
  32.         }

  33.         /// <summary>
  34.         /// 屏幕滑动
  35.         /// </summary>
  36.         /// <param name="startX">起始x</param>
  37.         /// <param name="startY">起始y</param>
  38.         /// <param name="purposeX">目标x</param>
  39.         /// <param name="purposeY">目标y</param>
  40.         public  void Sliding(int startX, int startY, int purposeX, int purposeY)
  41.         {
  42.             SendUdpData(MousePort, string.Format("MULTI:1:0:{0}:{1}", startX.ToString(), startY.ToString()));
  43.             SendUdpData(MousePort, string.Format("MULTI:1:2:{0}:{1}", purposeX.ToString(), purposeY.ToString()));
  44.             SendUdpData(MousePort, string.Format("MULTI:1:1:{0}:{1}", purposeX.ToString(), purposeY.ToString()));

  45.         }

  46.         /// <summary>
  47.         /// 发送UDP数据
  48.         /// </summary>
  49.         /// <param name="port">端口</param>
  50.         /// <param name="sendData">要发送的内容</param>
  51.         public static void SendUdpData(int port, string sendData)
  52.         {
  53.             var client = new UdpClient();
  54.             var remotePoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
  55.             byte[] sendUdpData = Encoding.UTF8.GetBytes(sendData);
  56.             client.Send(sendUdpData, sendUdpData.Length, remotePoint);
  57.         }
复制代码
以前写的代码有点乱将就看吧 这几个端口的内存地址 针对版本的 其他版本可以 自己CE搜索端口就有地址了  最重要的还是 TCP和UDP数据的发送哪里
发表于 2018-6-5 02:49:36 | 显示全部楼层   拉脱维亚
正如楼上几位说的,不太看得懂。。。。。
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
发表于 2017-8-30 15:23:20 | 显示全部楼层   四川省成都市
没有读懂。看来学习回炉再学习下
回复 支持 反对

使用道具 举报

发表于 2017-8-24 22:49:22 | 显示全部楼层   河南省信阳市
  有点看不懂k
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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