Python 如何使用WinAppDbg钩住并调用给定RVA的现有函数?

Python 如何使用WinAppDbg钩住并调用给定RVA的现有函数?,python,debugging,reverse-engineering,Python,Debugging,Reverse Engineering,我正在尝试使用WinAppDbg为一个游戏编写插件,其中包括挂接和调用该游戏中的现有函数。经过一些逆向工程工作,我得到了一些目标函数或类方法的RVA和签名。但很快我发现WinAppDbg的文档只告诉我如何钩住现有函数,而不是调用它们。此外,通常目标函数的地址是从Process.resolve_标签获得的,但我只有RVA。如何用RVA钩住函数?谢谢 ------------------更新1----------------------- 为了明确我想做的事情,考虑下面的情况: 在some\u ga

我正在尝试使用WinAppDbg为一个游戏编写插件,其中包括挂接和调用该游戏中的现有函数。经过一些逆向工程工作,我得到了一些目标函数或类方法的RVA和签名。但很快我发现WinAppDbg的文档只告诉我如何钩住现有函数,而不是调用它们。此外,通常目标函数的地址是从Process.resolve_标签获得的,但我只有RVA。如何用RVA钩住函数?谢谢

------------------更新1-----------------------

为了明确我想做的事情,考虑下面的情况:

some\u game.exe
中有一个名为
bool Player::attack(this,Animal*some\u Animal)
的类方法,当我攻击任何动物时将调用它。我希望监视攻击事件,并在任何时候模拟/触发攻击事件

在检查“some_game.pdb”文件后,我发现目标函数的RVA,即
Player::attack
,是
0x00678840
。我制作了一个
myplugin.dll
文件,将在游戏过程中注入

这样在
myplugin.dll
中调用这个函数就很简单了

#包括
自动模块添加=重新解释转换(GetModuleHandle(NULL));
攻击函数=重新解释投射(0x00678840+模块添加);
攻击函数(…)
通过首先定义一个helper hook函数
void RegisterStaticHook(RVA-sym,void*hook,void**org),钩住也非常容易

#包括
//迂回
#包括
类型定义uint64_t VA;
typedef无符号整数RVA;
模板
使用Ptr=类型*;
枚举类HookErrorCode{
错误与成功,
开始时出错,
错误更新线程,
呃!,
呃!,
错误\事务\提交
};
模板
自动挂钩(Ptr p、T f){
int error=DetourTransactionBegin();
如果(错误!=无错误){
返回HookErrorCode::ERR\u事务\u开始;
}
错误=DetourUpdateThread(GetCurrentThread());
如果(错误!=无错误){
返回HookErrorCode::ERR\u UPDATE\u线程;
}
错误=绕道附加(
重新解释铸造(p),
重新解释铸造(f)
);
如果(错误!=无错误){
返回HookErrorCode::ERR_ATTACH;
}
错误=DetourTransactionCommit();
如果(错误!=无错误){
返回HookErrorCode::ERR\u TRANSACTION\u COMMIT;
}
返回HookErrorCode::ERR_SUCCESS;
}
void registerStatiSchook(RVA符号、void*hook、void**org){
auto base=reinterpret_cast(GetModuleHandle(NULL));
*组织=重新解释铸造(基本+符号);
自动返回=挂钩(组织,挂钩);
if(ret!=HookErrorCode::ERR_SUCCESS){

std::coutTL;DR:WinAppDbg并不真正支持此功能,而且这样做有点困难。请尝试Microsoft Detours

详细解释:

WinAppDbg是一个调试器,这意味着要修补/挂接等的目标程序运行在与Python脚本不同的单独Windows进程中。它只能以Win32 API允许的方式与已调试进程交互,不幸的是,目标进程中没有执行函数的机制

通过一些工作,您可以在某种程度上模拟此功能。基本上,这意味着修改寄存器和堆栈以执行挂钩函数的开头,确保堆栈中的所有指针实际上指向进程中的有效内存,并可能分配一些蹦床代码,以允许WinAppDbg在出现错误时中断执行nction已经返回。由于体系结构的差异,32位和64位都必须重新执行。这基本上是像GDB这样的调试器所做的


另一方面,迂回的方法是将DLL直接注入目标进程的内存中——因此执行代码很容易,因为您不必处理奇怪的Win32 API调用或跨进程映射内存。这也快得多。但您必须用C而不是Python编写代码。

您尝试过什么他的远。给我们一些代码和一个具体的错误信息或描述你怎么不工作。实际上我甚至不知道怎么做,所以我不能尝试任何东西。我已经成功地用C++做了,我知道如何做它。然而,因为我只知道一些有关底层的东西,WinAppDbg没有给我任何相关的例子,我只是。我从一开始就不知道怎么做。