为什么找到的基址,是进程名+16进制的数

{基址和偏移}为什么找到的基址,是进程名+16进制的数字?
说下CE的模块地址:
双击基址您会发现显示的竟然是 Tutorial.exe+60C34 而基址不是00460c34 这是为什么呢?
其实 Tutorial.exe+60C34 就等于 00460c34
一般来说游戏在电脑中申请的地址是从00400000开始的,进程名(在这里具体指Tutorial.exe)代表的就是 00400000 然后加上 60c34 自然就等于00460c34。
但是在某些情况下游戏的起始地址并不是从00400000开始的,或者说每次启动申请的地址都不相同;那么就不能用 00460c34 来添加指针了。
最后,再强调一下CE中的模块地址:在第6关的后面有提到过CE的模块地址,我说过这是科学的添加方法。
这一关也同样适用,就是在代码注入的时候。基址
0045A063 变成了 Tutorial.exe+5A063

注入的时候也应该是
小技巧:这种方法并不是百试百灵的,对于某些变态的游戏可能并不好使。
如何判断这种方法是否有效呢?
很简单:
在上面选中 显示模块地址 后,如果 0045A063 变成了 Tutorial.exe+5A063 说明这种方法好使。
反之如果 0045A063 还是 0045A063 则说明这种方法失效了。至于为什么,继续学习CE和编程,以后你就会明白。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要获取指定进程的特定模块中的变量或函地址,可以使用 `Process` 类来实现。以下是一个获取指定进程模块中变量地址的示例代码: ```csharp using System; using System.Diagnostics; using System.Runtime.InteropServices; class Program { static void Main(string[] args) { // 获取目标进程 Process targetProcess = Process.GetProcessesByName("process_name")[0]; // 获取模块基址 ProcessModule module = targetProcess.MainModule; IntPtr baseAddress = module.BaseAddress; // 定义偏移 int offset = 0x10; // 计算变量地址 IntPtr variableAddress = baseAddress + offset; // 打开目标进程的句柄 IntPtr processHandle = OpenProcess(ProcessAccessFlags.VirtualMemoryRead, false, targetProcess.Id); // 读取变量值 int value; bool success = ReadProcessMemory(processHandle, variableAddress, out value, sizeof(int), IntPtr.Zero); // 关闭进程句柄 CloseHandle(processHandle); if (success) { Console.WriteLine("Variable value: " + value); } else { Console.WriteLine("Failed to read variable value."); } Console.ReadKey(); } [DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, bool bInheritHandle, int dwProcessId); [DllImport("kernel32.dll", SetLastError = true)] static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, out int lpBuffer, int dwSize, IntPtr lpNumberOfBytesRead); [DllImport("kernel32.dll", SetLastError = true)] static extern bool CloseHandle(IntPtr hObject); [Flags] public enum ProcessAccessFlags : uint { VirtualMemoryRead = 0x00000010, VirtualMemoryWrite = 0x00000020, VirtualMemoryOperation = 0x00000008, ProcessQueryInformation = 0x00000400, ProcessVmRead = 0x00001000 } } ``` 在这个示例中,我们使用 `Process.GetProcessesByName` 方法获取了进程为 "process_name" 的进程,并且通过 `OpenProcess` 打开了该进程的句柄,最后使用 `ReadProcessMemory` 方法读取了变量的值。需要注意的是,为了读取指定进程的内存,我们需要使用 `ProcessAccessFlags.VirtualMemoryRead` 权限打开进程句柄,否则会出现 "访问被拒绝" 的错误。 如果要获取函地址,可以将偏移设置为函在模块中的 RVA(相对虚拟地址)。例如,如果要获取 `kernel32.dll` 模块中的 `LoadLibraryA` 函地址,可以将偏移设置为该函在模块中的 RVA,即 `0x00013C20`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值