C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C挂钩我自己的程序功能大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我想要描述我的应用程序,我特别想要记录从程序开始的时间,当程序内部调用的每个函数(在DLL中的ingnoring函数)被输入和退出时,即我想要一个简单的表看起来像这个:

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

这里的调用一个JMP表:

@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指令可能有帮助吗?

谢谢你的帮助

解决方法

你看过 Googles profiling tools吗?您@R_252_9381@修改更容易,而不是自己制作.它确实执行代码插入以执行其分析,因此它最小化,它们的注入框架对您有益.

但是,对于这样的事情,你通常想避免计时开销,所以我建议按地址跟踪,然后在完成分析时,将地址转换为符号名称.挂钩本身也是一项艰巨的任务,我建议制作一个功能的包装器,它不会改变功能入口或出口,而是重定向呼叫站点.

导入查找表,如果您计划分析内部函数,它也不会有多大用处.掌握它需要了解平台模块格式(PE,ELF,MACH-O)的内部结构.

大佬总结

以上是大佬教程为你收集整理的C挂钩我自己的程序功能全部内容,希望文章能够帮你解决C挂钩我自己的程序功能所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。