【发布时间】:2012-09-28 21:03:21
【问题描述】:
我正在做逆向工程并通过 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 的狂热爱好者,哈哈,但它是为类似性质的游戏编写的,所以很合适。
【问题讨论】:
-
我发现了一个使用宏的肮脏解决方案,我认为它应该可以正常工作,但我仍然更喜欢更自然的方式。虽然它已由编译器解决,但它完全符合我的要求:
#define SPLITDW(v) (BYTE)(v),(BYTE)(v>>8),(BYTE)(v>>16),(BYTE)(v>>24){{0xE9, SPLITDW((DWORD)&HOOK_LoadHudTextures - 0x400005)}, (void*)0x400000, 5},任何替代(和更好)的建议仍然值得赞赏。
标签: c++ c hook code-injection