我正在为游戏开发一个发射器。 想拦截游戏中打印文本的功能。
我不知道包含此函数的代码是动态链接还是静态链接。所以我甚至不知道函数名称。
我通过微软Detours,Ninject和其他一些人拦截了这个游戏的一些windows-api调用。
但是这个也不在导入表中。
我该怎么做才能接到这个函数调用?应该使用什么样的分析器? IDA?如何做到这一点?
修改
终于找到了功能地址。谢谢,Skino!
试图用Detours挂钩,注入dll。注入DllMain:
typedef int (WINAPI *PrintTextType)(char *, int, float , int);
static PrintTextType PrintText_Origin = NULL;
int WINAPI PrintText_Hooked(char * a, int b, float c, int d)
{
return PrintText_Origin(a, b, c , d);
}
HMODULE game_dll_base;
/* game_dll_base initialization goes here */
BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
if(fdwReason==DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hinstDLL);
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
PrintText_Origin = (PrintTextType)((DWORD)game_dll_base + 0x6049B0);
DetourAttach((PVOID *)&PrintText_Origin , PrintText_Hooked);
DetourTransactionCommit();
}
}
它按预期挂钩。参数a
包含应显示的文本。但是,当调用原始函数return PrintText_Origin (a, b, c , d);
时,应用程序崩溃(http://i46.tinypic.com/ohabm.png,http://i46.tinypic.com/dfeh4.png)
原始功能反汇编:
绕道后:
EDIT2:
绕道后:
PrintText_Hooked
反汇编http://pastebin.com/FPRMK5qt w3_loader.dll 是注入的dll
我对ASM不好,请说出可能出错的地方?
答案 0 :(得分:1)
在这个阶段听起来你没有关于你想要挂钩的库函数的概念,并且你已经声明它(实际上至少是)导入表中的导入外部函数可能意味着负责生成文本的函数可能位于您直接拆卸或动态加载的应用程序的.text内,文本生成(特别是在游戏中)可能是应用程序的一部分。
根据我的经验,找到难以跟踪的代码的最简单方法是在文本显示期间或之前/之后不久停止应用程序,并使用IDA的神话般的调用图功能来确定负责编写的内容它(大量使用手表和断点!)
如果您有理由相信导出的函数可能未在导入表中显示,则请仔细查看对CreateRemoteThread或任何其他常用动态加载机制的调用。
我强烈反对它,但为了完整起见,你也可以在system service dispatch table中挂钩NtSetInformationThread。这里是针对不同Windows版本here的表的良好转储。如果你想自己获取表中的索引,你可以从ntdll.dll中反汇编NtSetInformationThread导出。
答案 1 :(得分:1)
想拦截游戏对打印文字功能的要求。
您可以将调试程序用于调查阶段。无论是IDA,还是Visual Studio(与例如HxD结合使用)都应该这样做。使用以下步骤识别功能应该相对容易:
Hello World!
)Extras
> Open RAM...
)†提供的文字不会被压缩(或者,无论出于何种原因,加密)直到最后一刻
完成调查阶段后,您已确定要注射钩子的位置,编写启动器时有两个选项:
‡能够继续使用游戏的最终补丁版本