2
0

ProcessHelper.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net.NetworkInformation;
  7. using System.Runtime.InteropServices;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows;
  11. namespace WechatPCMsgBakTool.Helpers
  12. {
  13. public class ProcessHelper
  14. {
  15. public static Process? GetProcess(string ProcessName)
  16. {
  17. Process[] processes = Process.GetProcessesByName(ProcessName);
  18. if (processes.Length == 0)
  19. return null;
  20. else if(processes.Length > 1) {
  21. SelectWechat selectWechat = new SelectWechat();
  22. MessageBox.Show("检测到有多个微信,请选择本工作区对应的微信");
  23. selectWechat.ShowDialog();
  24. if (selectWechat.SelectProcess == null)
  25. return null;
  26. Process? p = processes.ToList().Find(x => x.Id.ToString() == selectWechat.SelectProcess.ProcessId);
  27. if (p == null)
  28. return null;
  29. return p;
  30. }
  31. else
  32. return processes[0];
  33. }
  34. public static ProcessModule? FindProcessModule(int ProcessId, string ModuleName)
  35. {
  36. Process process = Process.GetProcessById(ProcessId);
  37. foreach (ProcessModule module in process.Modules)
  38. {
  39. if (module.ModuleName == ModuleName)
  40. return module;
  41. }
  42. return null;
  43. }
  44. public static List<int> FindProcessMemory(IntPtr processHandle, ProcessModule module, string content)
  45. {
  46. byte[] buffer = new byte[module.ModuleMemorySize];
  47. byte[] search = Encoding.ASCII.GetBytes(content);
  48. // 逐页读取数据
  49. List<int> offset = new List<int>();
  50. int readBytes;
  51. bool success = ReadProcessMemory(processHandle, module.BaseAddress, buffer, buffer.Length,out readBytes);
  52. if (!success || readBytes == 0)
  53. {
  54. int error = Marshal.GetLastWin32Error();
  55. Console.WriteLine($"ReadProcessMemory failed. GetLastError: {error}");
  56. }
  57. else
  58. {
  59. for (int i = 0; i < buffer.Length; i++)
  60. {
  61. if (buffer[i] == search[0])
  62. {
  63. for (int s = 1; s < search.Length; s++)
  64. {
  65. if (buffer[i + s] != search[s])
  66. break;
  67. if (s == search.Length - 1)
  68. offset.Add(i);
  69. }
  70. }
  71. }
  72. }
  73. return offset;
  74. }
  75. // 这里开始下面是对Windows API引用声明
  76. public static byte[]? ReadMemoryDate(IntPtr hProcess, IntPtr lpBaseAddress, int nSize = 100)
  77. {
  78. byte[] array = new byte[nSize];
  79. int readByte;
  80. if (!ReadProcessMemory(hProcess, lpBaseAddress, array, nSize, out readByte))
  81. return null;
  82. else
  83. return array;
  84. }
  85. [DllImport("kernel32.dll", SetLastError = true)]
  86. public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int nSize, out int lpNumberOfBytesRead);
  87. }
  88. }