制作函数C#

时间:2015-05-30 16:26:36

标签: c# function readprocessmemory

我正在制作一个简单的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;
}

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

1 个答案:

答案 0 :(得分: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) --> address = result + 0x13A8 --> RPM(address,result) --> 
    address = result + 0x4 -->  RPM(address,result) 

然后返回result的值,之后GetValueForLives()获取uint值并将其转换为int值,然后返回int值给来电者。