plthook
plthook copied to clipboard
Is the library loaded by dlopen replaceable?
I want to hook XSetSelectionOwner,libx11.so is loaded dlopen. What should I do?
- ProcessA
HANDLE hOneSo = dlopen("libOneSo.so", RTLD_LAZY);
if (hOneSo == NULL)
{
printf("Test:: dlopen Failed.\n");
return 1;
}
typedef void (*PFN_OneSo)();
PFN_OneSo pOneSo = (PFN_OneSo)dlsym(hOneSo, "OneSo");
if (pOneSo == NULL)
{
printf("Test:: dlsym failed.Err:%d\n", errno);
return 1;
}
pOneSo();
dlclose(hOneSo);
$ ldd Test.bin
linux-vdso.so.1 (0x00007fffd7dd7000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f30952db000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f30952b8000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f3095087000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f309506a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3094e78000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3095424000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f3094b0c000)
- libOneSo.so
void OneSo()
{
Display * display = XOpenDisplay(":0");
if (display == NULL)
{
printf("OneSo:: Open Display Failed.\n");
return;
}
int rlt = XSetSelectionOwner(display,1,1,1);
printf("OneSo:: XSetSelectionOwner Rlt:%d\n",rlt);
}
$ ldd libOneSo.so
linux-vdso.so.1 (0x00007fffac99f000)
libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007f599b5d1000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f599b3df000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f599b3d9000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f599b3b6000)
/lib64/ld-linux-x86-64.so.2 (0x00007f599b84d000)
libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f599b38a000)
libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007f599b384000)
libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f599b37c000)
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f599b362000)