Linux Ubuntu下的绕行功能

Posted

技术标签:

【中文标题】Linux Ubuntu下的绕行功能【英文标题】:Detour function under Linux Ubuntu 【发布时间】:2015-08-18 14:28:29 【问题描述】:

我在 Windows 下使用 Detours (http://research.microsoft.com/en-us/projects/detours/),但现在我使用 Linux Ubuntu 并且我想 Detour /挂钩一个函数。 我想绕道去我的函数,之后我想调用原始函数。 (我可以hook函数,但之后就不能使用原来的了)。

所以,我决定写一个detour函数。首先,我将函数复制到另一个地方,但我无法执行它。你能帮我吗,为什么我不能执行它?我遇到了分段错误。

我的代码:

int (* h_Com_Printf)(const char *fmt, ...);
...
void *memBuffer;
int size = 0x4F; // size of the function

memBuffer = (void*)malloc(size);
memcpy(memBuffer, (void*)0x08060DEA, size); // copy the function

h_Com_Printf = (int (*)(const char *fmt, ...))memBuffer;
h_Com_Printf("print function: %d\n", 1); // segmentation fault HERE

谢谢!

Com_Printf 在“可执行文件”(IDA Pro)中: 图片:http://kepfeltoltes.hu/150818/ida_printf_www.kepfeltoltes.hu_.png

在 VirtualBox 中运行的 Linux。 (会是问题吗?)

【问题讨论】:

我发现了 this 模板的优点,可能对你有帮助。 它没用 :( 再次出现分段错误... 是什么让你认为显然是任意地址 0x08060dea 的内存包含函数指令?并不是说它没有 - 但这绝对不是 MCVE 原样...... 我是从 Ida Pro 那里想到的:kepfeltoltes.hu/150818/ida_printf_www.kepfeltoltes.hu_.png 【参考方案1】:

仅复制函数字节是不够的,即使您知道 if 的确切大小(并非总是如此),因为有很多与 EIP 相关的指令(在您的示例中调用 _vsnprintf,例如实例)。因此,通常所做的(事实上,Detours 正在做的)是仅复制被钩子代码(JMP 或 CALL)覆盖的字节并重新计算与 EIP 相关的偏移量。为此,您需要能够解码指令并在必要时重新计算相对偏移量的反汇编程序。弯路实际上包括一个。我建议您查看 Detours 资源,以更好地了解为了放置钩子做了什么。

希望对你有帮助

【讨论】:

以上是关于Linux Ubuntu下的绕行功能的主要内容,如果未能解决你的问题,请参考以下文章

如何把windows下的文件拷贝到Ubuntu下的Linux系统

Linux系统下的vi编辑器的使用(以VMware下的Ubuntu64为例)

Mac/Ubuntu下的数据建模工具PDMan,替代PowerDesigner

debian下的vi和centos的vi有啥不一眼

ubuntu里怎么安装迅雷

恢复绕行的库函数