【发布时间】:2016-05-03 02:56:17
【问题描述】:
我有一个使用 MSVC 6.0 构建的已编译 32 位 Windows 应用程序。我想注入代码并将读取或写入重定向到变量。对于简单的情况,例如:
DWORD& dword_995344 = *(DWORD*)0x995344;
可以工作。但我也希望将代码编译为自己的独立 exe。显然这是行不通的,因为 0x995344 不太可能是有效地址。例如,它也不适用于 char buffer[256]; // at address 0xdeadbeef。
然后我想也许我可以想出一些模板包装器:
template<DWORD VarAddr, class VarType>
class Var
{
public:
using VarTypePtr = VarType*;
Var()
{
mVar = (VarTypePtr)VarAddr;
}
Var(const Var&) = delete;
Var& operator = (const Var&) = delete;
operator VarType()
{
return *mVar;
}
void operator = (VarType v)
{
*mVar = v;
}
private:
VarTypePtr mVar;
};
Var<0x00995344, DWORD> dword_995344_;
void Test()
{
dword_995344_ = 7;
DWORD y = dword_995344_;
}
但再次处理所有类型和案例并不简单,或者在某些情况下也可能不可能。是否有其他技术(无论多么 hacky :))可以捕获读取和写入,因此我可以执行以下操作:
DWORD dword_995344 = 0;
void InstallVarHooks()
{
RedirectReadWrites(&dword_995344, 0x995344);
}
【问题讨论】:
-
您的意思是一个应用程序监视另一个应用程序写入地址或监视一个应用程序内吗?
-
在一个应用程序中,我的 dll 被注入到在给定地址具有 DWORD var 的目标中(因此 0xwhatever 在我当前的进程地址空间中)
-
这些变量是栈还是堆?
标签: c++ windows reverse-engineering