大佬教程收集整理的这篇文章主要介绍了C挂钩我自己的程序功能,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
THREAD_ID FUNCTION_ADDRESS TIME EVENT_TYPE 5520 0xFF435360 0 ENTERED 5520 0xFF435ED3 25 ENTERED 5520 0xFF433550 40 ENTERED 5520 0xFF433550 50 EXITED 5520 0xFF433550 60 ENTERED 5520 0xFF433550 70 EXITED 5520 0xFF435ED3 82 EXITED 5520 0xFF435360 90 EXITED
对于看起来像这样忽略编译器优化的程序:
void test1(void) { int a = 0; ++a; } void test(void) { test1(); test1(); } void main(void) { test(); }
我找不到任何现成的解决方案,我可以找到的最近的是微软VSPerfReport,但它只输出在进入和退出时每个功能花了多长时间.
所以我开始研究用一个简单的函数挂钩我的所有函数,这个函数生成一个缓冲区,我可以从中生成上面的表.为了做到这一点,我只想创建一个在main的开头调用的函数,它可以通过整个exe修改CALL指令来调用我的钩子函数.
像MinHook等那样的库对我来说似乎都有点OTT,可能不会工作,因为它是一个x64应用程序而且我不是试图挂钩DLL函数.
所以我想只修改每个CALL指令中的JMP指令,即这个程序:
void main(void) { ...asm prologue test(); 002375C9 call test (235037h) } ...asm epilogue
@ILT+40(__set_errno): 0023502D jmp _set_errno (243D80h) @ILT+45(___crtGetEnvironmentStringsA): 00235032 jmp __crtGetEnvironmentStringsA (239B10h) test: 00235037 jmp test (237170h) @ILT+55(_wcstoul): 0023503C jmp wcstoul (27C5D0h) @ILT+60(__vsnprintf_s_l):
我想通过这个表并将与应用程序的.exe中的函数相关的所有JMP重新路由到包含定时代码的钩子函数,然后返回到调用函数.
那么ILT代表什么呢?我假设有一些Lookup Table,我将如何抓住它?
这是否有可能我听说过IAT挂钩,但我认为只有在挂钩DLL时才会这样.在这里我也忽略了退出,虽然另一个JMP代替RET指令可能有帮助吗?
谢谢你的帮助
以上是大佬教程为你收集整理的C挂钩我自己的程序功能全部内容,希望文章能够帮你解决C挂钩我自己的程序功能所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。