Articles of DLL

.so在linux下注入:如何查找dlopen()的地址?

最近我对Linux感兴趣,正在尝试创build一个能够注入共享对象(即.so文件,“dynamic加载库”,Windows下的“DLL”)的程序。我知道这可以通过设置一个环境variables,但我想要在已经运行的进程上执行。 我已经知道如何在Windows下做到这一点。 有几种方法,但一般来说,您可以通过使用CreateRemoteThread()创build远程线程来调用LoadLibrary()。 当然你需要在远程进程中使用LoadLibrary的地址,但是(以我的经验),每个进程的偏移总是相同的。 我已经做了一些关于如何在Linux下完成的研究。 例如Phrack 59中一篇有趣的文章展示了如何做到这一点。 文章也有一个源代码附加,但由于一些假设是由目标进程,它是32位,我不能得到它的工作。 其他的东西,我碰到: 一个codeproject文章 ,但这只是解释如何从gdb内做到这一点。 (我会张贴更多的链接,但网站限制我2: – /。) 首先,我想获取远程进程中dlopen()函数的地址。 为此,我想通过获取stream程的ELF头,并遍历符号表。 其实,我设法做到这一点,通过: 1)获取ELF头(根据我的经验,存储在0x400000下的64位) 2)在标题为DYNAMIC的程序标题中find全局偏移量表。 3)通过访问全局偏移表中的第二个条目来获取第一个link_map。 4)迭代link_map链的dynamic部分,从而获得string表,符号表和散列表的地址(* Hash_Table + 0x4保存符号表中的条目数量。) 5)遍历符号表 从我的程序输出一些示例: ** looking at lib "" ** Trying to find symbol main in symbol table… numentries: 49 index 1 name: val: 0 … index 49 name: memcpy val: 0 symbol […]

端口Win32的DLL挂钩到Linux

我有一个程序(NWShader)挂钩到第二个程序的OpenGL调用(NWN)做后处理效果和什么。 NWShader最初是为Windows构build的,通常是现代版本(win32),同时使用DLL导出(以获取Windows加载它并获取一些OpenGL函数)和Detours(挂钩到其他函数)。 我使用的技巧,在检查sysdir之前,Win将在当前目录中查找任何DLL,因此会加载我的。 我有在这个方法redirect的DLL: #pragma comment(linker, "/export:oldFunc=nwshader.newFunc) 将它们发送到我自己的DLL中不同的命名函数。 然后我做任何处理,并从系统DLL调用原来的function。 我需要将NWShader移植到Linux(NWN存在于两种版本中)。 据我所知,我需要做的是共享库(.so文件)。 如果这是在NWN可执行文件(我发现一个shell脚本来处理这个)之前预加载,我的函数将被调用。 唯一的问题是我需要调用原始函数(我会使用各种DLLdynamic加载方法,我认为),需要能够执行类似Detour的内部函数挂钩。 目前,我正在构buildUbuntu 9.10 x64(带有32位编译器标志)。 我在Google上找不到太多帮助,但是我不知道这个* nix社区究竟是指什么的。 我可以编写C ++,但我更习惯于Windows。 作为OpenGL,需要修改与Linux兼容的唯一部分是钩子代码和调用。 有没有一个简单而简单的方法来做到这一点,或者它会涉及重新创buildDetours并dynamic加载原始函数地址?

如何从Linux上的Python调用Wine的DLL?

我正在Linux中编写一个python脚本,并且需要调用Wine中的一些Windows函数。 具体来说就是AllocateAndInitializeSid和LookupAccountSidW和LookupAccountSidW ,以确定谁login到远程Windows计算机。 这些function是葡萄酒中的advapi32.dll的一部分( 编辑 :使用答案,我能够调用的function,但LookupAccountSidW只适用于本地计算机)。 我怎样才能访问这些function,或一般的葡萄酒DLL? 我试过了 >>> cdll.LoadLibrary("~/.wine/drive_c/windows/system32/advapi32.dll") 但是会导致错误: OSError:〜/ .wine / drive_c / windows / system32 / advapi32.dll:无效的ELF标头 有另一种ctypes函数可以工作,或者我可以使用一些葡萄酒界面吗?

更新共享库而不重新启动进程

如果我的进程正在加载一个.so库,并且如果该库的新版本可用,是否可以切换到新的库而不进行进程重启? 或者答案取决于是否有一个参数更改为库中现有的function之一? 我正在一个运行100个进程的漂亮大系统中工作,每个系统加载10个库。 这些库提供了特定的function,由独立的团队提供。 所以当一个库的变化(对于一个错误修复可以说)理想的事情是将其发布在内部而不会影响正在运行的进程。 可能吗 ? 编辑谢谢! 在我的情况下,当一个新的库可用时,所有正在运行的进程必须开始使用它。 它没有select让他们运行旧版本,并在以后拿起新的。 所以看起来更安全的select是重新加载进程。

如何从共享库调用函数?

从共享库/ DLL调用函数最简单和最安全的方法是什么? 我最感兴趣的是在linux上这样做,但如果有一个平台无关的方式会更好。 有人可以提供示例代码来展示如何进行以下工作,用户将自己的foo版本编译到共享库中? // function prototype, implementation loaded at runtime: std::string foo(const std::string); int main(int argc, char** argv) { LoadLibrary(argv[1]); // loads library implementing foo std::cout << "Result: " << foo("test"); return 0; } 顺便说一句,我知道如何编译共享库( foo.so ),我只需要知道一个简单的方法来加载它在运行时。

无法为Java进程设置LD_LIBRARY_PATH

我想从shell脚本中调用我的linux可执行文件。 在调用这个可执行文件之前,我想用特定的值来设置LD_LIBRARY_PATH。 我的shell脚本如下: Parent.sh(包含2行) – source set_env.sh – executable.so Set_env.sh – setenv LD_LIBRARY_PATH /proj/something 在从Linux控制台手动执行Parent.sh scipt时,将正确调用LD_LIBRARY_PATH来调用executable.so。 但是将它与java代码整合为: String[] commandArray ={"Parent.sh"}; Runtime runtime = Runtime.getRuntime(); Process javap = runtime.exec(commandArray); javap.waitFor(); LD_LIBRARY_PATH未设置为可执行文件 我希望说明是明确的:) 请让代码中知道最新错误。

从Linux使用Windows DLL

我们需要接口到第三方应用程序,但公司背后的应用程序不公开消息协议,并只提供Windows DLL的接口。 我们的应用程序是基于Linux的,所以我不能直接与DLL沟通。 我找不到任何现有的解决scheme,所以我正在考虑在Linux和Windows之间编写基于套接字的桥接,但是我确定这不是一个独特的问题,有人应该这样做。 您知道任何允许从Linux上的C应用程序调用Windows DDL函数的解决scheme吗? 它可以使用葡萄酒或单独的Windows PC – 无所谓。 提前谢谢了。

如何截取dll方法调用?

如何截取dll方法调用? 有什么可用的技术? 它只能在C / C ++中完成吗? 如何拦截从所有正在运行的进程到给定的DLL的方法调用? 如何拦截从给定的进程到给定的DLL的方法调用?

有没有更好的方式来加载在C + +的DLL?

现在我做这样的事情,如果我有很多我想在我的DLL中引用的函数,它似乎很混乱。 有没有一种更好,更干净的方式来访问函数,而不必为每个函数定义创build一个typedef,以便它将编译和正确加载函数。 我的意思是函数定义已经在.h文件中,我不应该重新声明他们后我加载函数(或我?)有没有比使用LoadLibary更好的解决scheme? 如果在Visual Studio 2005项目设置中可以做同样的事情,我不一定需要这个function。 BHannan_Test_Class.h #include "stdafx.h" #include <windows.h> #ifndef BHANNAN_TEST_CLASS_H_ #define BHANNAN_TEST_CLASS_H_ extern "C" { // Returns n! (the factorial of n). For negative n, n! is defined to be 1. int __declspec (dllexport) Factorial(int n); // Returns true iff n is a prime number. bool __declspec (dllexport) IsPrime(int n); } #endif […]

如何获取mscorlib.ni.lib(.Net Framework 3.5)的PDB文件

做了很多search之后,我仍然无法得到问题的解决scheme。 我有一个mdmp文件。 调用堆栈显示它正在使用mscorlib.ni.dll。 所以要获取函数信息,我需要得到它的pdb文件。 mscorlib.ni.dll的版本是2.0.50727.3655。 我相信它来自.Net Framework 3.5。 由于mscorlib.ni.dll是由ngen.exe生成的本机优化的dll,所以我需要使用ngen.exe createpdb生成此dll的pdf。 ngen.exe createpdb "C:\Windows\assembly\…\mscorlib.ni.dll" "C:\SymbolCache" 结果如下: 在“C:\ Windows \ Microsoft.NET \ Framework64 \ v3.5”文件夹中找不到ngen.exe 我可以在文件夹“C:\ Windows \ Microsoft.NET \ Framework64 \ v2”中findngen.exe,但没有createpdb选项。 我可以在文件夹“C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319”中findngen.exe,它确实支持createpdb选项,但报告错误。 Microsoft(R)CLR本机映像生成器 – 版本4.0.30319.18408版权所有(c)Microsoft Corporation。 版权所有。 在本机映像“C:\ Windows \ assembly \ NativeImages_v2.0.507 7_64 \ mscorlib \ 5cd1c2848ff40eb0a8c149706ee394fa […]