-4

我正在制作一个简单的 C# 培训师,我在其中使用ReadProcessMemory.

目前我这样做:

RPM(base,buffer) --> buffer+offset1=finaladdress --> RPM(finaladdress,buffer) -->  
BitConverter.ToInt32(buffer, 0) = value 

现在我想使用一个函数来自动化这个过程(因为这个过程对于多级指针来说很混乱)。

我找到了这个:

uint []offsets = {0xDFCDD8, 0x13A8, 0x4}
getAddress(offsets);

uint getAddress(offsets[])
{
    int i;
    uint address;
    address = readProcessMemory(offsets[0]);
    for(i=1; i<(sizeof(offsets)/sizeof(uint)); i++)
    {
        address = ReadProcessMemory(address + offsets[i]);
    }
    return address;
}

但我不明白这是如何工作的。任何人都可以向我解释或给我其他功能吗?

4

1 回答 1

0

该代码不是完全有效的 C# 代码,因此这可能是您难以理解它的原因。但基本上它似乎完全按照您所说的手动执行,它只是对数组中的每个元素进行重定向。

这是一个重新编写的版本,它是有效的代码加上一些调整,以便更容易描述正在发生的事情。

int GetValueForLives()
{
   uint[] offsets = {0xDFCDD8, 0x13A8, 0x4}
   uint uncastValue = GetAddress(offsets);
   int value = BitConverter.ToInt32(uncastValue, 0);
}

uint GetAddress(uint[] offsets)
{
    int i;
    uint address;
    uint result = readProcessMemory(offsets[0]);
    for(i=1; i < offsets.Length; i++)
    {
        address = result + offsets[i]
        result = ReadProcessMemory(address);
    }
    return result;
}

因此,GetAddress()所做的基本上是使用 2 个重定向来执行旧的手动方法。

RPM(0xDFCDD8,result) --> 地址 = 结果 + 0x13A8 --> RPM(地址,result) -->
    地址 = 结果 + 0x4 --> RPM(地址,结果)

然后它返回 的值result,然后GetValueForLives()获取该uint值并将其转换为一个int值,然后将该int值返回给调用者。

于 2015-05-30T17:38:31.747 回答