我正在做逆向工程并通过 DLL 修补游戏的内存。通常我会坚持在一个或多个函数中修补所有内容的旧方法。但是感觉它可以通过使用一个结构数组来更好地完成,该数组定义了需要发生的内存写入并一次循环遍历它们。更容易管理,IMO。
不过,我想让它保持不变。因此,数据一次性全部存在(在 .rdata 中),而不必为每个补丁动态分配内存,这是一个简单的“字节大小”数据任务,例如:
struct struc_patch
{
BYTE val[8]; // max size of each patch (usually I only use 5 bytes anyway for call and jmp writes)
// I can of course increase this if really needed
void *dest;
char size;
} patches[] =
{
// simply write "01 02 03 04" to 0x400000
{{0x1, 0x2, 0x3, 0x4}, (void*)0x400000, 4},
};
//[...]
for each(struc_patch p in patches)
{
memcpy(p.dest, p.val, p.size);
}
但是当我想对这些类型更感兴趣时,我找不到将像“0x90909090”这样的整数指定为字节数组“90 90 90 90”的方法。所以这行不通:
struct struc_patch
{
BYTE val[8]; // max size of each patch (usually I only use 5 bytes anyway for call and jmp writes)
// I can of course increase this if really needed
void *dest;
char size;
} patches[] =
{
// how to write "jmp MyHook"? Here, the jmp offset will be truncated instead of overlapping in the array. Annoying.
{{0xE9, (DWORD)&MyHook - 0x400005}, (void*)0x400000, 5},
};
当然,主要问题是 &MyHook 必须由编译器解决。还有其他方法可以获得所需的结果并保持不变吗?
老实说,我对 STL 的经验很少。因此,如果有使用它的解决方案,我可能需要对其进行详细解释,以便正确理解代码。我是一个大 C/C++/WinAPI 瘾君子,哈哈,但它是为类似性质的游戏编写的,所以它适合。