2012-11-17 45 views
4

因此,我正在读取另一个程序的内存以用于逆向工程。我正在使用kernel32.dll中的函数。读取一块内存,将其存储到本地结构中

功能如下:

ReadProcessMemory(Handle, new IntPtr(Address), buffer, BytesToRead, out ptrBytesRead); 

我用它来读取位存储位,就像这样:

public static int ReadInt32(IntPtr Handle, long Address) 
    { 
     return BitConverter.ToInt32(ReadBytes(Handle, Address, 4), 0); 
    } 

然后调用ReadInt32使用程序处理和地址我正在寻找阅读,添加该程序的基地址,因为它不是静态的。

我想要做的是读一整块内存(最多1300条记录,每条记录的内存步长为0xB0)。

我不确定究竟是什么最好的方法去做这件事。我研究过它,看起来有可能做一些事情,我把所有东西都拿出来,基本上把它转换成我自己的结构。我遇到的问题是我不知道我需要做些什么。我可以在脑海中看到它,但不能将笔放在纸上。

我会扩大表明,它实际上是一个二维数组,看起来像这样的结构:需要

int OFFSET_CREATURE_ID = 0; 
    int OFFSET_CREATURE_TYPE = 3; 
    int OFFSET_CREATURE_NAME = 4; 
    int OFFSET_CREATURE_Z = 36; 
    int OFFSET_CREATURE_Y = 40; 
    int OFFSET_CREATURE_X = 44; 
    int OFFSET_CREATURE_IS_WALKING = 80; 
    int OFFSET_CREATURE_DIRECTION = 84; 
    int OFFSET_CREATURE_OUTFIT = 100; 
    int OFFSET_CREATURE_OUTFIT_HEAD = 104; 
    int OFFSET_CREATURE_OUTFIT_BODY = 108; 
    int OFFSET_CREATURE_OUTFIT_LEGS = 112; 
    int OFFSET_CREATURE_OUTFIT_FEET = 116; 
    int OFFSET_CREATURE_OUTFIT_ADDON = 120; 
    int OFFSET_CREATURE_LIGHT = 124; 
    int OFFSET_CREATURE_LIGHT_COLOR = 128; 
    int OFFSET_CREATURE_HP_BAR = 140; 
    int OFFSET_CREATURE_WALK_SPEED = 144; 
    int OFFSET_CREATURE_IS_VISIBLE = 148; 
    int OFFSET_CREATURE_SKULL = 152; 
    int OFFSET_CREATURE_PARTY = 156; 
    int OFFSET_CREATURE_WARICON = 164; 
    int OFFSET_CREATURE_ISBLOCKING = 168; 

每这些偏移在我的结构被分配到不同的元素。其中一些是bool,一些int和一些字符串。我有结构。我无法保证长度会消耗每个偏移量的整个“步长”,但是当我读取这些值时,我认为我需要每次都声明一个结构体的新实例(我将每500ms左右读取一次,也许更多!250条记录的总读取时间约为50ms,这是我期望读的!我确实需要能够做到1300)。

请不要混淆代码,只是解释我应该做的就足够了。当我使用这些数量的代码时,我会遇到很多困难,所以除非有人会把一个能够读取所有这些数据的类放在一起,用一个结构来存储它(这样我就可以将它转换成与我的工作),我会欣赏字面上最小的代码。

回答

3

对于原始类型,如果你知道偏移,你可以简单地采取从偏移n(数据开始)的位n+1并使用BitConverter转换的类型。因为您不能用ToInt32(byte[] value, int startIndex)等方法指定结尾,所以您必须将这些字节复制到新数组中。

让我们假设这个例子中的每件事都是int。我也将假设所有的偏移量都在一个数组中。字节是从ReadInt32

int[] values = new int[Bytes.Length/4]; 
byte[] current = new byte[4]; 
BitConverter bc = new BitConvert(); 
for (i = 0; i < Bytes.Length/4 -1; i++) 
{ 
    Buffer(Bytes, i(4), current, 0, 4); 
    values[i] = bc.ToInt32(current, 0); 
} 

了这是一个巨大的简化,但它应该是足以让你在正确的方向移动memblock。你可能甚至不想使用循环(也许你只是硬编码所有的BitConverter指令,这就是你在从C/C++的数据库读取时如何进行序列化)如果你有很多类型,这也会使事情变得更简单。无论哪种方式,基本概念将是使用位转换器将您从另一个程序中读取的字节部分转换为您的数据结构中各自的属性。

+0

看起来可以管理,我想我可以将这个概念适应我的代码。 谢谢! – XtrmJosh

相关问题