【发布时间】:2020-08-15 20:06:33
【问题描述】:
我正在尝试使用 WinAppDbg 为游戏编写插件,其中涉及挂钩和调用该游戏中的现有函数。经过一些逆向工程工作,我得到了一些目标函数或类方法的 RVA 和签名。但是很快我发现WinAppDbg的文档只告诉我如何hook现有函数而不是调用它们。此外,通常目标函数的地址来自 Process.resolve_label,但我只有 RVA。如何将函数与它的 RVA 挂钩?谢谢!
------------------ 更新 1-----------
为了弄清楚我想要做什么,请考虑以下情况:
some_game.exe中有一个类方法叫bool Player::attack(this, Animal *some_animal),当我攻击任何动物时都会调用它。我想监控攻击事件,并可能随时模拟/触发攻击事件。
在检查了“some_game.pdb”文件后,我发现目标函数的RVA,即Player::attack,是0x00678840。我制作了一个myplugin.dll 文件,将在游戏进程中注入。
那么在myplugin.dll这样调用这个函数就很简单了
#include <windows.h>
auto module_addr = reinterpret_cast<unsigned int>(GetModuleHandle(NULL));
attack_func = reinterpret_cast<void(*)(void*, void*)>(0x00678840+module_addr);
attack_func(...)
在Microsoft Detours library的帮助下,钩子也很容易,首先定义一个辅助钩子函数void RegisterStaticHook(RVA sym, void* hook, void** org);:
#include <windows.h>
// Detours
#include <detours/detours.h>
typedef uint64_t VA;
typedef unsigned int RVA;
template<typename Type>
using Ptr = Type*;
enum class HookErrorCode {
ERR_SUCCESS,
ERR_TRANSACTION_BEGIN,
ERR_UPDATE_THREAD,
ERR_ATTACH,
ERR_DETACH,
ERR_TRANSACTION_COMMIT
};
template<typename T = Ptr<void>>
auto Hook(Ptr<T> p, T f) {
int error = DetourTransactionBegin();
if (error != NO_ERROR) {
return HookErrorCode::ERR_TRANSACTION_BEGIN;
}
error = DetourUpdateThread(GetCurrentThread());
if (error != NO_ERROR) {
return HookErrorCode::ERR_UPDATE_THREAD;
}
error = DetourAttach(
reinterpret_cast<Ptr<PVOID>>(p),
reinterpret_cast<PVOID>(f)
);
if (error != NO_ERROR) {
return HookErrorCode::ERR_ATTACH;
}
error = DetourTransactionCommit();
if (error != NO_ERROR) {
return HookErrorCode::ERR_TRANSACTION_COMMIT;
}
return HookErrorCode::ERR_SUCCESS;
}
void RegisterStaticHook(RVA sym, void* hook, void** org) {
auto base = reinterpret_cast<VA>(GetModuleHandle(NULL));
*org = reinterpret_cast<void*>(base + sym);
auto ret = Hook<void*>(org, hook);
if (ret != HookErrorCode::ERR_SUCCESS) {
std::cout << "[Error] ";
switch (ret) {
case HookErrorCode::ERR_TRANSACTION_BEGIN:
std::cout << "DetourTransactionBegin";
break;
case HookErrorCode::ERR_UPDATE_THREAD:
std::cout << "DetourUpdateThread";
break;
case HookErrorCode::ERR_ATTACH:
std::cout << "DetourAttach";
break;
case HookErrorCode::ERR_DETACH:
std::cout << "DetourDetach";
break;
case HookErrorCode::ERR_TRANSACTION_COMMIT:
std::cout << "DetourTransactionCommit";
break;
default:
break;
}
std::cout << "failed!" << std::endl;
}
}
然后像这样用“RegisterStaticHook”挂钩my_attack:
void** org;
bool my_attack(void* player_this, void* animal){
...
}
RegisterStaticHook(0x00678840, my_attack, org);
我的问题是如何用 WinAppDbg 做到这一点。
【问题讨论】:
-
到目前为止您尝试过什么。给我们一些代码和一个具体的错误信息或描述你如何不工作。
-
其实我什至不知道怎么做,所以我什么都不能尝试。我已经成功地用 C++ 做到了,我知道如何用Microsoft's Detour library 做到这一点。但是,由于我对底层的东西了解的很少,而且WinAppDbg也没有给我任何相关的例子,所以我一开始就不知道怎么做。
标签: python debugging reverse-engineering