端口Win32 DLL挂钩到Linux

ssu*_*ube 4 c++ linux dll hook winapi

我有一个程序(NWShader)挂钩到第二个程序的OpenGL调用(NWN)来做后处理效果和诸如此类的东西.

NWShader最初是为Windows构建的,通常是现代版本(win32),并使用DLL导出(让Windows加载它并获取一些OpenGL函数)和Detours(挂钩到其他函数).我正在使用Win在查看sysdir之前在当前目录中查找任何DLL的技巧,因此它会加载我的.我在DLL上使用此方法重定向:

#pragma comment(linker, "/export:oldFunc=nwshader.newFunc)
Run Code Online (Sandbox Code Playgroud)

将它们发送到我自己的DLL中的不同命名函数.然后我做任何处理并从系统DLL调用原始函数.

我需要将NWShader移植到Linux(NWN存在于两种版本中).据我所知,我需要做的是一个共享库(.so文件).如果这是在NWN可执行文件之前预加载的(我找到了一个shell脚本来处理它),我的函数将被调用.唯一的问题是我需要调用原始函数(我会使用各种DLL动态加载方法,我认为)并且需要能够像Detour一样进行内部函数挂钩.

目前我正在使用Ubuntu 9.10 x64(使用32位编译器标志).我无法在Google上找到太多帮助,但我不确切地知道*nix社区所指的是什么.我可以编写C++代码,但我更习惯于Windows.作为OpenGL,需要修改以与Linux兼容的唯一部分是挂钩代码和调用.有没有一种简单易行的方法,或者它是否涉及重新创建Detours并动态加载原始函数地址?

ezp*_*zpz 5

库预加载可以通过完成LD_PRELOAD.从那里你想看看dlopendlsym调用来获取原始库中的实际函数.如果你想手工做,这就是全部.

您还可以查看修改ltrace方式,以便提供挂钩功能(通过-e标志)并让ltrace为您处理簿记.

[编辑]手动执行此操作的示例:

#include <dlfcn.h>
#include <stdio.h>

int (*orig_puts)(const char *);

int puts (const char * str) {
    void * handle = dlopen("/lib/libc.so.6", RTLD_NOW | RTLD_GLOBAL);
    orig_puts = dlsym(handle,"puts");
    fprintf (stderr,"I have hooked your puts\n");
    return orig_puts(str);
}
Run Code Online (Sandbox Code Playgroud)

并有一个程序,如

#include <stdio.h>

int main () {
    puts ("Hello World");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

你得到以下:

$ ./a.out
Hello World
$ LD_PRELOAD=./libhook ./a.out
I have hooked your puts
Hello World
Run Code Online (Sandbox Code Playgroud)