XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension.NetCore.MemoryEditor

【DLL】内存读写工具/编辑器

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFEExtension.NetCore.MemoryEditor

优化部分构建器 添加md文档

f4e7fe9
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

10 个文件 +135 -28
Modified README.md +62 -1
@@ -1 +1,62 @@
1 # XFEExtension.NetCore.MemoryEditor
1 # XFEExtension.NetCore.MemoryEditor
2
3 ## �����ڴ������
4 ```csharp
5 public static class Program
6 {
7 public static UpdatableMemoryManager Manager { get; } = MemoryManager.CreateBuilder() //�����ڴ�������Ĺ�����
8 .WithAutoReacquireProcess("ExampleGame") //��Ŀ������˳����Զ����»�ȡĿ�����ƵĽ���
9 .WithFindProcessWhenCreate() //����������ʱ����ʼѰ��Ŀ�����ƵĽ��̣����ǰ��������Ŀ��������ƴ˴����Բ������ã�
10 .BuildUpdatableManager(
11 MemoryItemBuilder.Create<int>("Level") //Ϊÿ����ַ����һ������
12 .WithResolvePointer("xxx-xxx-xx.dll", 0x0072A200, 0x14A0, 0x0, 0x80, 0xE4, 0x0, 0x1EC) //�ڴ��ַ��ģ�����ơ���ַ��ƫ�Ʋ���
13 .WithListener(), //���Ӽ�����
14 MemoryItemBuilder.Create<float>("HealthPoint")
15 .WithResolvePointer("xxx-xxx-xx.dll", 0x0072A200, 0x12E8, 0x0, 0x80, 0xE4, 0x0, 0x1E0)
16 .WithListener(),
17 MemoryItemBuilder.Create<float>("Stamina")
18 .WithResolvePointer("xxx-xxx-xx.dll", 0x0072A200, 0x14E0, 0x48, 0x10, 0x20, 0x50, 0x20, 0x1B0)
19 .WithListener());
20 //�Ƽ�ʹ�ÿɸ����ڴ������
21 }
22
23 public partial class MainForm : Form
24 {
25 public MainForm()
26 {
27 InitializeComponent();
28 Program.Manager.ValueChanged += Manager_ValueChanged;//�����ڴ�ֵ�ı��¼�
29 }
30
31 private void Manager_ValueChanged(XFEExtension.NetCore.MemoryEditor.Manager.MemoryItem sender, MemoryValue e)
32 {
33 Trace.WriteLine($"���ƣ�{e.CustomName} ��ַ��{sender:X}\t�Ƿ��ȡ��ֵ �ϴΣ�{e.PreviousValueGetSuccessful} ��Σ�{e.CurrentValueGetSuccessful} ֵ�ӣ�{e.PreviousValue} ���Ϊ��{e.CurrentValue}");
34 switch (e.CustomName)
35 {
36 case "Level":
37 if (e.CurrentValueGetSuccessful)
38 {
39 if (!sender.Write(��д��ֵ))
40 Trace.WriteLine($"Level��д��ʧ��");
41 }
42 break;
43 case "HealthPoint":
44 if (e.CurrentValueGetSuccessful)
45 {
46 if (!sender.Write(��д��ֵ))
47 Trace.WriteLine("HealthPoint��д��ʧ��");
48 }
49 break;
50 case "Stamina":
51 if (e.CurrentValueGetSuccessful)
52 {
53 if (!sender.Write(��д��ֵ))
54 Trace.WriteLine("Stamina��д��ʧ��");
55 }
56 break;
57 default:
58 break;
59 }
60 }
61 }
62 ```
Modified XFEExtension.NetCore.MemoryEditor/DynamicMemoryListener.cs +1 -1
@@ -48,7 +48,7 @@ public abstract class DynamicMemoryListener(string customName, Func<nint?> getAd
48 48 }
49 49 }
50 50 var currentValue = MemoryEditor.ReadMemory(this.processHandler, memoryAddress!.Value, memoryAddressType);
51 if (lastValue is null == currentValue is null || lastValue?.Equals(currentValue) == false)
51 if (lastValue is null != currentValue is null || lastValue?.Equals(currentValue) == false)
52 52 {
53 53 valueChanged?.Invoke(this, new(lastValue is not null, currentValue is not null, lastValue, currentValue, name));
54 54 lastValue = currentValue;
Modified XFEExtension.NetCore.MemoryEditor/Manager/MemoryItem.cs +1 -1
@@ -71,7 +71,7 @@ public abstract class MemoryItem(string name, Type memoryItemType, MemoryEditor
71 71 /// <returns>返回结果</returns>
72 72 public T Read<T>() where T : struct
73 73 {
74 Read<T>(out T result);
74 Read(out T result);
75 75 return result;
76 76 }
77 77 /// <summary>
Modified XFEExtension.NetCore.MemoryEditor/Manager/MemoryListenerManager.cs +6 -12
@@ -49,6 +49,7 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
49 49 {
50 50 currentProcess?.Dispose();
51 51 currentProcess = value;
52 value.EnableRaisingEvents = true;
52 53 ProcessName = value.ProcessName;
53 54 ProcessHandler = MemoryEditor.GetProcessHandle(value.Id, ProcessAccessFlags);
54 55 currentProcess.Exited += CurrentProcess_Exited;
@@ -107,6 +108,7 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
107 108 if (!IsListening)
108 109 IsListening = true;
109 110 var staticMemoryListener = MemoryListener.CreateStaticListener(customName, memoryAddress, type);
111 listenerDictionary.Add(customName, staticMemoryListener);
110 112 staticMemoryListener.ValueChanged += (sender, e) => ValueChanged?.Invoke(sender, e);
111 113 if (startListen)
112 114 _ = staticMemoryListener.StartListen(ProcessHandler, frequency);
@@ -117,6 +119,7 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
117 119 if (!IsListening)
118 120 IsListening = true;
119 121 var dynamicMemoryListener = MemoryListener.CreateDynamicListener(customName, memoryAddressGetFunc, type);
122 listenerDictionary.Add(customName, dynamicMemoryListener);
120 123 dynamicMemoryListener.ValueChanged += (sender, e) => ValueChanged?.Invoke(sender, e);
121 124 if (startListen)
122 125 _ = dynamicMemoryListener.StartListen(ProcessHandler, frequency);
@@ -127,6 +130,7 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
127 130 if (!IsListening)
128 131 IsListening = true;
129 132 var updatableMemoryListener = MemoryListener.CreateUpdatableListener(customName, memoryAddressUpdateFunc, type);
133 listenerDictionary.Add(customName, updatableMemoryListener);
130 134 updatableMemoryListener.ValueChanged += (sender, e) => ValueChanged?.Invoke(sender, e);
131 135 if (startListen)
132 136 _ = updatableMemoryListener.StartListen(ProcessHandler, frequency);
@@ -160,7 +164,6 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
160 164 /// <inheritdoc/>
161 165 public override async Task StopListeners()
162 166 {
163 IsListening = false;
164 167 var taskList = new List<Task>();
165 168 foreach (var listener in listenerDictionary.Values)
166 169 {
@@ -171,18 +174,9 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
171 174 /// <inheritdoc/>
172 175 public override async Task StopListener(string customName) => await listenerDictionary[customName].StopListen();
173 176 /// <inheritdoc/>
174 public override void RemoveListener(string customName)
175 {
176 listenerDictionary.Remove(customName);
177 if (listenerDictionary.Count == 0)
178 IsListening = false;
179 }
177 public override void RemoveListener(string customName) => listenerDictionary.Remove(customName);
180 178 /// <inheritdoc/>
181 public override void ClearListeners()
182 {
183 IsListening = false;
184 listenerDictionary.Clear();
185 }
179 public override void ClearListeners() => listenerDictionary.Clear();
186 180 /// <summary>
187 181 /// 内存监听器
188 182 /// </summary>
Modified XFEExtension.NetCore.MemoryEditor/Manager/MemoryManagerBuilder.cs +7 -3
@@ -32,10 +32,13 @@ public abstract class MemoryManagerBuilder()
32 32 /// <summary>
33 33 /// 使用自动重新获取进程
34 34 /// </summary>
35 /// <param name="processName">进程名称</param>
35 36 /// <param name="reacquireProcessFrequency">重新获取进程的检测频率(单位毫秒)</param>
36 37 /// <returns></returns>
37 public MemoryManagerBuilder WithAutoReacquireProcess(int reacquireProcessFrequency = 500)
38 public MemoryManagerBuilder WithAutoReacquireProcess(string processName = "", int reacquireProcessFrequency = 500)
38 39 {
40 if (processName != string.Empty)
41 ProcessName = processName;
39 42 AutoReacquireProcess = true;
40 43 ReacquireProcessFrequency = reacquireProcessFrequency;
41 44 return this;
@@ -45,9 +48,10 @@ public abstract class MemoryManagerBuilder()
45 48 /// </summary>
46 49 /// <param name="processName">进程名称</param>
47 50 /// <returns></returns>
48 public MemoryManagerBuilder WithFindProcessWhenCreate(string processName)
51 public MemoryManagerBuilder WithFindProcessWhenCreate(string processName = "")
49 52 {
50 ProcessName = processName;
53 if (processName != string.Empty)
54 ProcessName = processName;
51 55 FindProcessWhenCreate = true;
52 56 return this;
53 57 }
Modified XFEExtension.NetCore.MemoryEditor/Manager/UpdatableMemoryItem.cs +27 -2
@@ -1,4 +1,6 @@
1 using XFEExtension.NetCore.ImplExtension;
1 using System.Diagnostics;
2 using XFEExtension.NetCore.DelegateExtension;
3 using XFEExtension.NetCore.ImplExtension;
2 4
3 5 namespace XFEExtension.NetCore.MemoryEditor.Manager;
4 6
@@ -12,10 +14,33 @@ namespace XFEExtension.NetCore.MemoryEditor.Manager;
12 14 [CreateImpl]
13 15 public abstract class UpdatableMemoryItem(string name, Func<nint?> memoryAddressUpdateFunc, Type memoryItemType, MemoryEditor memoryEditor) : MemoryItem(name, memoryItemType, memoryEditor)
14 16 {
17 private UpdatableMemoryListener? listener;
15 18 /// <summary>
16 19 /// 监听器
17 20 /// </summary>
18 public UpdatableMemoryListener? Listener { get; protected set; }
21 public UpdatableMemoryListener? Listener
22 {
23 get => listener;
24 protected set
25 {
26 listener = value;
27 if (listener is not null)
28 {
29 listener.MemoryAddressUpdated += Listener_MemoryAddressUpdated;
30 MemoryAddress = listener.MemoryAddress;
31 }
32 }
33 }
34 /// <summary>
35 /// 地址更新时触发
36 /// </summary>
37 public event XFEEventHandler<UpdatableMemoryListener, nint>? MemoryAddressUpdated;
38 private void Listener_MemoryAddressUpdated(UpdatableMemoryListener sender, nint e)
39 {
40 if (MemoryAddress != e)
41 MemoryAddress = e;
42 MemoryAddressUpdated?.Invoke(sender, e);
43 }
19 44 /// <summary>
20 45 /// 内存地址更新方法
21 46 /// </summary>
Modified XFEExtension.NetCore.MemoryEditor/MemoryListener.cs +2 -1
@@ -1,4 +1,5 @@
1 using XFEExtension.NetCore.DelegateExtension;
1 using System.Diagnostics;
2 using XFEExtension.NetCore.DelegateExtension;
2 3
3 4 namespace XFEExtension.NetCore.MemoryEditor;
4 5
Modified XFEExtension.NetCore.MemoryEditor/StaticMemoryListener.cs +1 -1
@@ -38,7 +38,7 @@ public abstract class StaticMemoryListener(string customName, nint memoryAddress
38 38 try
39 39 {
40 40 var currentValue = MemoryEditor.ReadMemory(this.processHandler, memoryAddress, memoryAddressType);
41 if (lastValue is null == currentValue is null || lastValue?.Equals(currentValue) == false)
41 if (lastValue is null != currentValue is null || lastValue?.Equals(currentValue) == false)
42 42 {
43 43 valueChanged?.Invoke(this, new(lastValue is not null, currentValue is not null, lastValue, currentValue, name));
44 44 lastValue = currentValue;
Modified XFEExtension.NetCore.MemoryEditor/UpdatableMemoryListener.cs +24 -3
@@ -1,4 +1,6 @@
1 using XFEExtension.NetCore.ImplExtension;
1 using System.Diagnostics;
2 using XFEExtension.NetCore.DelegateExtension;
3 using XFEExtension.NetCore.ImplExtension;
2 4
3 5 namespace XFEExtension.NetCore.MemoryEditor;
4 6
@@ -13,6 +15,10 @@ public abstract class UpdatableMemoryListener(string customName, Func<nint?> upd
13 15 {
14 16 private nint memoryAddress = updateAddressFunc.Invoke() ?? default;
15 17 /// <summary>
18 /// 地址更新时触发
19 /// </summary>
20 public event XFEEventHandler<UpdatableMemoryListener, nint>? MemoryAddressUpdated;
21 /// <summary>
16 22 /// 内存地址
17 23 /// </summary>
18 24 public nint MemoryAddress
@@ -37,13 +43,27 @@ public abstract class UpdatableMemoryListener(string customName, Func<nint?> upd
37 43 CurrentListeningTask = Task.Run(async () =>
38 44 {
39 45 object? lastValue = null;
40 try { lastValue = MemoryEditor.ReadMemory(this.processHandler, memoryAddress, memoryAddressType); } catch { }
46 if (memoryAddress != 0)
47 try { lastValue = MemoryEditor.ReadMemory(this.processHandler, memoryAddress, memoryAddressType); } catch { }
41 48 while (isListening)
42 49 {
43 50 try
44 51 {
52 if (memoryAddress == 0)
53 {
54 if (lastValue is not null)
55 {
56 valueChanged?.Invoke(this, new(lastValue is not null, false, lastValue, null, name));
57 lastValue = null;
58 }
59 while (memoryAddress == 0 && isListening)
60 {
61 UpdateAddress();
62 await Task.Delay(this.frequency);
63 }
64 }
45 65 var currentValue = MemoryEditor.ReadMemory(this.processHandler, memoryAddress, memoryAddressType);
46 if (lastValue is null == currentValue is null || lastValue?.Equals(currentValue) == false)
66 if (lastValue is null != currentValue is null || lastValue?.Equals(currentValue) == false)
47 67 {
48 68 valueChanged?.Invoke(this, new(lastValue is not null, currentValue is not null, lastValue, currentValue, name));
49 69 lastValue = currentValue;
@@ -66,5 +86,6 @@ public abstract class UpdatableMemoryListener(string customName, Func<nint?> upd
66 86 ProcessHandler = processHandler;
67 87 }
68 88 memoryAddress = updateAddressFunc.Invoke() ?? memoryAddress;
89 MemoryAddressUpdated?.Invoke(this, memoryAddress);
69 90 }
70 91 }
Modified XFEExtension.NetCore.MemoryEditor/XFEExtension.NetCore.MemoryEditor.csproj +4 -3
@@ -8,18 +8,19 @@
8 8 <Title>XFEExtension.NetCore.MemoryEditor</Title>
9 9 <Authors>XFEstudio</Authors>
10 10 <Company>寰宇朽力网络科技</Company>
11 <Description>内存读写工具</Description>
11 <Description>内存读写工具,支持使用基址,内置内存管理器</Description>
12 12 <PackageIcon>logoIcon.png</PackageIcon>
13 13 <PackageReadmeFile>README.md</PackageReadmeFile>
14 14 <RepositoryUrl>https://github.com/XFEstudio/XFEExtension.NetCore.MemoryEditor.git</RepositoryUrl>
15 15 <PackageTags>XFE;XFEExtension;MemoryEdit;Memory</PackageTags>
16 <PackageReleaseNotes>大幅度优化结构,完善监听器</PackageReleaseNotes>
16 <PackageReleaseNotes>新增内存管理器
17 整体框架大幅更改</PackageReleaseNotes>
17 18 <Copyright>寰宇朽力网络科技版权所有</Copyright>
18 19 <PackageProjectUrl>https://github.com/XFEstudio/XFEExtension.NetCore.MemoryEditor.git</PackageProjectUrl>
19 20 <GenerateDocumentationFile>True</GenerateDocumentationFile>
20 21 <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
21 22 <PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
22 <Version>1.4.0</Version>
23 <Version>2.0.0</Version>
23 24 </PropertyGroup>
24 25
25 26 <ItemGroup>