From Wikipedia, the free encyclopedia
|
|
This article may not meet the general notability guideline. Please help to establish notability by adding reliable, secondary sources about the topic. If notability cannot be established, the article is likely to be merged, redirected, or deleted. (March 2009) |
In computer programming, DLL injection is a technique used to run code within the address space of another process by forcing it to load a dynamic-link library.[6]
[edit] Approaches on Microsoft Windows
There are at least four ways to force a program to load a DLL on Microsoft Windows:
- DLLs listed under the registry key
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLswill be loaded into every process that links to User32.dll as that DLL attaches itself to the process.[9] - Process manipulation functions such as CreateRemoteThread can be used to inject a DLL into a program after it has started.[13]
- Get a handle to the target process. This can be done by spawning the process[18]
- Allocate some memory in the target process,[21]
- Create a new thread in the target process[6]
- The operating system will now call DllMain in the injected DLL.[24]
- Note that without precautions, this approach can be detected by the target process due to the DLL_THREAD_ATTACH notifications sent to every loaded module as a thread starts.[24]
- Windows hooking calls such as SetWindowsHookEx.[27]
- Use the debugging functions to pause all threads, and then hijack an existing thread in the application to execute injected code, that in turn could load a DLL.[29]
[edit] Approaches on Unix-like systems
On Unix-like operating systems with the dynamic linker based on ld.so (on BSD) and ld-linux.so (on Linux), arbitrary libraries can be linked to a new process by giving the library's pathname in the LD PRELOAD environment variable, that can be set globally or individually for a single process.[30]
For example, in bash, this command launches the command "prog-help" with the shared library from file "test.so" linked into it at the launchtime:
LD_PRELOAD="./test.so" prog—help
Such a library can be created with GCC by compiling the source file containing the new globals to be linked, with the -fpic or -fPIC option,[32] The library has access to external symbols declared in the program like any other library.
[edit] References
- ^ Rocky Pulley (2005-05-19). "Extending Task Manager with DLL Injection". CodeProject. CodeProject. http://secure.codeproject.com/KB/threads/taskex.aspx. Retrieved 2008-09-01.
- ^ "Working with the AppInit_DLLs registry value". Microsoft Help and Support. Microsoft. 2006-11-21. http://support.microsoft.com/kb/197571. Retrieved 2008-08-31.
- ^ Raymond Chen (2007-12-13). "AppInit_DLLs should be renamed Deadlock_Or_Crash_Randomly_DLLs". The Old New Thing. Microsoft. http://blogs.msdn.com/oldnewthing/archive/2007/12/13/6648400.aspx. Retrieved 2008-08-31.
- ^ "dllmain.c". ReactOS. ReactOS Foundation. 2008-07-08. http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/misc/dllmain.c?view=markup. Retrieved 2008-08-31.
- ^ "Dll Injection". DreamInCode.net. MediaGroup1. 2006-05-04. http://www.dreamincode.net/code/snippet407.htm. Retrieved 2008-08-31.
- ^ Greg Jenkins (November 2007). "DLL Injection Framework". Ring3 Circus. WordPress. http://www.ring3circus.com/downloads/dll-injection-framework/. Retrieved 2008-08-31.
- ^ Drew Benton (2007-08-17). "A More Complete DLL Injection Solution Using CreateRemoteThread". CodeProject. CodeProject. http://69.10.233.10/KB/threads/completeinject.aspx. Retrieved 2008-09-01.
-
^ CreateProcess
ms-help://MS.PSDKXPSP2.1033/dllproc/base/createprocess.htmPlatform SDK for Windows XP SP2. Microsoft. Retrieved on 2008-08-31. -
^ PROCESS_INFORMATION
ms-help://MS.PSDKXPSP2.1033/dllproc/base/process_information_str.htmPlatform SDK for Windows XP SP2. Microsoft. Retrieved on 2008-08-31. -
^ GetWindowThreadProcessId Function
ms-help://MS.PSDKXPSP2.1033/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/getwindowthreadprocessid.htmPlatform SDK for Windows XP SP2. Microsoft. Retrieved on 2008-08-31. -
^ EnumProcesses
ms-help://MS.PSDKXPSP2.1033/perfmon/base/enumprocesses.htmPlatform SDK for Windows XP SP2. Microsoft. Retrieved on 2008-08-31. -
^ GetModuleBaseName
ms-help://MS.PSDKXPSP2.1033/perfmon/base/getmodulebasename.htmPlatform SDK for Windows XP SP2. Microsoft. Retrieved on 2008-08-31. -
^ VirtualAllocEx
ms-help://MS.PSDKXPSP2.1033/memory/base/virtualallocex.htmPlatform SDK for Windows XP SP2. Microsoft. Retrieved on 2008-08-31. -
^ WriteProcessMemory
ms-help://MS.PSDKXPSP2.1033/debug/base/writeprocessmemory.htmPlatform SDK for Windows XP SP2. Microsoft. Retrieved on 2008-08-31. - ^ "Outpost Bypassing Self-Protection via Advanced DLL injection with handle stealing Vulnerability". Matousec. 2006-12-01. http://www.matousec.com/info/advisories/Outpost-Bypassing-Self-Protection-via-Advanced-DLL-injection-with-handle-stealing.php. Retrieved 2008-08-31.
-
^ CreateRemoteThread
ms-help://MS.PSDKXPSP2.1033/dllproc/base/createremotethread.htmPlatform SDK for Windows XP SP2. Microsoft. Retrieved on 2008-08-31. -
^ LoadLibrary
ms-help://MS.PSDKXPSP2.1033/dllproc/base/loadlibrary.htmPlatform SDK for Windows XP SP2. Microsoft. Retrieved on 2008-08-31. - DllMain
ms-help://MS.PSDKXPSP2.1033/dllproc/base/dllmain.htmPlatform SDK for Windows XP SP2. Microsoft. Retrieved on 2008-08-31. -
^ SetWindowsHookEx Function
ms-help://MS.PSDKXPSP2.1033/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.htmPlatform SDK for Windows XP SP2. Microsoft. Retrieved on 2008-08-31. - ^ "AppInit_DLLs Registry Value and Windows 95". Microsoft Help and Support. Microsoft. 2005-03-01. http://support.microsoft.com/kb/134655. Retrieved 2008-08-31.
- ^ "Dll Injection using SetWindowsHookEx() Method". Game Reversal. 2008-04-03. http://www.gamereversal.com/index.php?option=com_content&view=article&id=56%3Adll-injection-using-setwindowshookex-method&catid=39%3Ac--c-core-concepts&Itemid=1. Retrieved 2008-09-01.
- ^ "SetThreadContext DLL Injection". 2007-01-16. http://nerd.egloos.com/2940083. Retrieved 2008-09-01.
- ^ Ben Botto (2008-09-06). "DLL Injector". http://busybin.com/busybin/C++/dll_injector/. Retrieved 2008-09-01.
-
^ Linus Torvalds; David Engel, Eric Youngdale, Peter MacDonald, Hongjiu Lu, Lars Wirzenius and Mitch D'Souza (1998-03-14). ld.so/ld-linux.so – dynamic linker/loader
man ld.soUNIX man pages. Retrieved on 2008-08-31. -
^ "Code Gen Options". Using the GNU Compiler Collection (GCC). Free Software Foundation. http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Code-Gen-Options.html#Code-Gen-Options. Retrieved 2008-08-31. "
-fpicGenerate position-independent code (PIC) suitable for use in a shared library, if supported for the target machine. sqq." -
^ "Link Options". Using the GNU Compiler Collection (GCC). Free Software Foundation. http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Link-Options.html#Link-Options. Retrieved 2008-08-31. "
-sharedProduce a shared object which can then be linked with other objects to form an executable. sqq."