我正在制作一个简单的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;
}
但我不明白这是如何运作的。任何人都可以向我解释或给我一个其他功能吗?
答案 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
值给来电者。