【问题标题】:How to find my static address from CheatEngine in C# with Memory functions如何在 C# 中使用内存函数从 CheatEngine 中找到我的静态地址
【发布时间】:2019-12-11 00:37:06
【问题描述】:

所以我用作弊引擎在 TeamSpeak 3 中找到了我的 ping 静态地址。 地址是 "Qt5Gui.dll"+005F2E58 所以模块 Qt5Gui.dll + 偏移量 0x005F2E58

使用 Cheat Engine,重启应用后获取 ping 值不是问题。

现在我尝试使用内存函数在 C# 中找到这个地址,但我没有得到我的地址。

通缉地址是:16CE3AB92E40549592 我的程序得到我:14072403

如何像作弊引擎一样找到正确的地址?

我的 getModule 函数:

 static IntPtr getModule(String processName, String moduleName)
        {
            Process[] ProcessList = Process.GetProcessesByName(processName);
            IntPtr BaseAddress = IntPtr.Zero;

            if (ProcessList.Length > 0)
            {
                Process process = ProcessList[0];

                foreach (System.Diagnostics.ProcessModule Module in process.Modules)
                {
                    if (Module.ModuleName.Contains(moduleName))
                    {
                        BaseAddress = Module.BaseAddress;
                        break;
                    }

                }

            }

            return BaseAddress;
        }


主要功能:

String process = "ts3client_win64";

IntPtr handle = getProcessHandle(process);

if (!handle.Equals(new IntPtr(1337)))
    {
      IntPtr qtGui = getModule(process, "Qt5Gui.dll");
      int pingOffset = 0x005F2E58;
      IntPtr pingAdress = IntPtr.Add(qtGui, pingOffset);

      Int64 finalPingAdress = pingAdress.ToInt64();

      MessageBox.Show("Ping Adress: " + finalPingAdress);
     }
     else
     {
        MessageBox.Show("Process Not Found!");
     }


【问题讨论】:

  • 你确定Cheat Engine中显示的地址是实际的当前地址吗?您是否单步执行代码以确保您正在查看正确的流程和模块?您也可以尝试在调试器中验证模块地址。到目前为止,您的代码没有明显的问题,而且两个地址完全不同(偏移量除外),所以我不确定我们能做些什么来帮助您。您是否尝试从目标进程读取内存?另外,你为什么期待16CE3AB92E40549592?你应该得到0x16CE5116840(十进制的1567211219008)。

标签: c# windows memory offset


【解决方案1】:

要使用 modulename.dll + 0xDEADC0DE 方案基地址遍历多级指针,您可以使用我的代码

public static IntPtr FindDMAAddy(IntPtr hProc, IntPtr ptr, int[] offsets)
{
    var buffer = new byte[IntPtr.Size];
    foreach (int i in offsets)
    {
        ReadProcessMemory(hProc, ptr, buffer, buffer.Length, out var read);

        ptr = (IntPtr.Size == 4)
        ? IntPtr.Add(new IntPtr(BitConverter.ToInt32(buffer, 0)), i)
        : ptr = IntPtr.Add(new IntPtr(BitConverter.ToInt64(buffer, 0)), i);
    }
    return ptr;
}

public static IntPtr GetModuleBaseAddress(Process proc, string modName)
{
    IntPtr addr = IntPtr.Zero;

    foreach (ProcessModule m in proc.Modules)
    {
        if (m.ModuleName == modName)
        {
            addr = m.BaseAddress;
            break;
        }
    }
    return addr;
}

这是我使用此代码执行您想做的事情的示例

Process process;

process = Process.GetProcessesByName("ac_client")[0];

var hProc = OpenProcess(0x001F0FFF, false, process.Id);

var modBase = GetModuleBaseAddress(process, "ac_client.exe");

var addr = FindDMAAddy(hProc, (IntPtr)(modBase + 0x10f4f4), new int[] { 0x374, 0x14, 0 });

Console.WriteLine("0x" + addr.ToString("X"));
Console.ReadKey();

【讨论】:

    猜你喜欢
    • 2020-08-05
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2012-08-13
    • 2014-07-12
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多