dll注入

dll注入

目录导航

基本内容

dll注入   所谓DLL注入就是将一个DLL放进某个进程的地址空间里,让它成为那个进程的一部分。要实现DLL注入,首先需要打开目标进程。

  例:

  hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | //允许远程创建线程

  PROCESS_VM_OPERATION | //允许远程VM操作

  PROCESS_VM_WRITE, //允许远程VM写

  FALSE, dwRemoteProcessId )

  由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。

  如果进程打不开,以后的操作就别想了。进程打开后,就可以建立远线程了,不过别急,先想想这个远线程的线程函数是什么?我们的目的是注入一个DLL。而且我们知道用LoadLibrary可以加载一个DLL到本进程的地址空间。于是,自然会想到如果可以在目标进程中调用LoadLibrary,不就可以把DLL加载到目标进程的地址空间了吗?对!就是这样。远线程就在这儿用了一次,建立的远线程的线程函数就是LoadLibrary,而参数就是要注入的DLL的文件名。(这里需要自己想一想,注意到了吗,线程函数ThreadProc和LoadLibrary函数非常相似,返回值,参数个数都一样) 还有一个问题,LoadLibrary这个函数的地址在哪儿?也许你会说,这个简单,GetProcAddress就可以得出。于是代码就出来了。

  char *pszLibFileRemote="my.dll";

  PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA");

  CreateRemoteThread( hRemoteProcess, NULL, 0, pfnStartAddr, pszLibFileRemote, 0, NULL);

  但是不对!不要忘了,这是远线程,不是在你的进程里,而pszLibFileRemote指向的是你的进程里的数据,到了目标进程,这个指针都不知道指向哪儿去了,同样pfnStartAddr这个地址上的代码到了目标进程里也不知道是什么了,不知道是不是你想要的LoadLibraryA了。但是,问题总是可以解决的,Windows有些很强大的API函数,他们可以在目标进程里分配内存,可以将你的进程中的数据拷贝到目标进程中。因此pszLibFileRemote的问题可以解决了。

  char *pszLibFileName="my.dll";//注意,这个一定要是全路径文件名,除非它在系统目录里;原因大家自己想想。

  //计算DLL路径名需要的内存空间

  int cb = (1 + lstrlenA(pszLibFileName)) * sizeof(char);

  //使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区

  pszLibFileRemote = (char *) VirtualAllocEx( hRemoteProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);

  //使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间

  iReturnCode = WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL);

  OK,现在目标进程也认识pszLibFileRemote了,但是pfnStartAddr好像不好办,我怎么可能知道LoadLibraryA在目标进程中的地址呢?其实Windows为我们解决了这个问题,LoadLibraryA这个函数是在Kernel32.dll这个核心DLL里的,而这个DLL很特殊,不管对于哪个进程,Windows总是把它加载到相同的地址上去。因此你的进程中LoadLibraryA的地址和目标进程中LoadLibraryA的地址是相同的(其实,这个DLL里的所有函数都是如此)。至此,DLL注入结束了。

L文件损坏  当前木马病毒经常感染或者替换系统文件dll文件,部分安全工具查杀后并未对dll文件进行系统修复,所以经常会出现以下现象:    1、网络游戏打不开(DNF,穿越火线,魔兽世界等等)   2、电脑没声音   3、电脑无故蓝屏   4、桌面无法显示 5、主页被修改为网址导航    6、桌面图标无法删除(淘宝、小游戏、电影等等,重启同样不能正常删除)

DLL 依赖项

  当某个程序或 DLL 使用其他 DLL 中的 DLL 函数时,就会创建依赖项。因此,该程序就不再是独立的,并且如果该依赖项被损坏,该程序就可能遇到问题。例如,如果发生下列操作之一,则该程序可能无法运行:   · 依赖 DLL 升级到新版本。   · 修复了依赖 DLL。   · 依赖 DLL 被其早期版本覆盖。   · 从计算机中删除了依赖 DLL。   这些操作通常称为 DLL 冲突。如果没有强制实现向后兼容性,则该程序可能无法成功运行。   DLL 入口点   在创建 DLL 时,可以有选择地指定入口点函数。当进程或线程将它们自身附加到 DLL 或者将它们自身从 DLL 分离时,将调用入口点函数。您可以使用入口点函数根据 DLL 的需要来初始化数据结构或者销毁数据结构。此外,如果应用程序是多线程的,则可以在入口点函数中使用线程本地存储 (TLS) 来分配各个线程专用的内存。下面的代码是一个 DLL 入口点函数的示例:   BOOL APIENTRY DllMain(   HANDLE hModule, // Handle to DLL module   DWORD ul_reason_for_call, // Reason for calling function   LPVOID lpReserved ) // Reserved   {   switch ( ul_reason_for_call )   {   case DLL_PROCESS_ATTACHED:   // A process is loading the DLL.   break;   case DLL_THREAD_ATTACHED:   // A process is creating a new thread.   break;   case DLL_THREAD_DETACH:   // A thread exits normally.   break;   case DLL_PROCESS_DETACH:   // A process unloads the DLL.   break;   }   return TRUE;   }   当入口点函数返回 FALSE 值时,如果您使用的是加载时动态链接,则应用程序不启动。如果您使用的是运行时动态链接,则只有个别 DLL 不会加载。   入口点函数只应执行简单的初始化任务,不应调用任何其他 DLL 加载函数或终止函数。例如,在入口点函数中,不应直接或间接调用 LoadLibrary 函数或 LoadLibraryEx 函数。此外,不应在进程终止时调用 FreeLibrary 函数。   注意:在多线程应用程序中,请确保将对 DLL 全局数据的访问进行同步(线程安全),以避免可能的数据损坏。为此,请使用 TLS 为各个线程提供唯一的数据。

导出 DLL 函数

  要导出 DLL 函数,您可以向导出的 DLL 函数中添加函数关键字,也可以创建模块定义文件 (.def) 以列出导出的 DLL 函数。

两种方法

  方法一、向导出的 DLL 函数中添加函数关键字   要使用函数关键字,您必须使用以下关键字来声明要导出的各个函数:   __declspec(dllexport)   要在应用程序中使用导出的 DLL 函数,您必须使用以下关键字来声明要导入的各个函数:   __declspec(dllimport)   通常情况下,您最好使用一个包含 define 语句和 ifdef 语句的头文件,以便分隔导出语句和导入语句。   方法二、创建模块定义文件 (.def) 以列出导出的 DLL 函数   使用模块定义文件来声明导出的 DLL 函数。当您使用模块定义文件时,您不必向导出的 DLL 函数中添加函数关键字。在模块定义文件中,您可以声明 DLL 的 LIBRARY 语句和 EXPORTS 语句。

特别调用

  关于特定情况下的调用,比如DLL函数中使用到了win32 API或者将C++生成的DLL供标准C语言使用,则需要注意以下一些情况:   如果使用到了win32 API,则应该使用调用方式为“__stdcall”。   在将C++生成的DLL供标准C语言使用,输出文件需要用“extern "C"”修饰,否则不能被标准C语言调用。如果使用“__stdcall”调用方式,可能产生C不识别的修饰名,所以设置导出函数时要采用.def文件形式,而不是__declspec(dllexport)形式。后者会进行修饰名转换,C语言无法识别函数。   下面的代码是一个定义文件的示例。   // SampleDLL.def   //   LIBRARY "sampleDLL"   EXPORTS   HelloWorld示例 DLL 和应用程序XXXXXXXX 在 Microsoft Visual C++ 6.0 中,可以通过选择“Win32 动态链接库”项目类型或“MFC 应用程序向导 (dll)”来创建 DLL。下面的代码是一个在 Visual C++ 中通过使用“Win32 动态链接库”项目类型创建的 DLL 的示例。   // SampleDLL.cpp   //#include "stdafx.h"   #define EXPORTING_DLL   #include "sampleDLL.h"   BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)   {   return TRUE;   }   void HelloWorld(){   MessageBox( NULL, TEXT("Hello World"), TEXT("In a DLL"), MB_OK);   }   // File: SampleDLL.h   //#ifndef INDLL_H   #define INDLL_H   #ifdef EXPORTING_DLLextern __declspec(dllexport) void HelloWorld() ;   #elseextern __declspec(dllimport) void HelloWorld() ;   #endif   #endif   下面的代码是一个“Win32 应用程序”项目的示例,该示例调用 SampleDLL DLL 中的导出 DLL 函数。   // SampleApp.cpp   //#include "stdafx.h"   #include "sampleDLL.h"   int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)   {   HelloWorld();   return 0;   }   注意:在加载时动态链接中,您必须链接在生成 SampleDLL 项目时创建的 SampleDLL.lib 导入库。   在运行时动态链接中,您应使用与以下代码类似的代码来调用 SampleDLL.dll 导出 DLL 函数。   ...   typedef VOID (*DLLPROC) (LPTSTR);   ...   HINSTANCE hinstDLL;   DLLPROC HelloWorld;   BOOL fFreeDLL;   hinstDLL = LoadLibrary("sampleDLL.dll");   if (hinstDLL != NULL)   {   HelloWorld = (DLLPROC) GetProcAddress(hinstDLL, "HelloWorld");   if (HelloWorld != NULL)   (HelloWorld);   fFreeDLL = FreeLibrary(hinstDLL);   }   ...

DLL内容说明

  KERNEL32.DLL ---- 低级内核函数。使用他可以完成内存管理、任务管理、   资源控制等。   USER32.DLL------于windows管理有关的函数。消息、菜单、光标、计时器   、通信和其他大多数非现实函数都可以从这里找到   GDI32.DLL-------图形设备接口库。于设备输出有关的函数:大多数绘图   、显示场景、图元文件、坐标及其字体函数都可以从这里找到。   COMDLG32.DLL\LZ32.DLL\VERSION.DLL\---这都是提供一些附加函数的库,包   括通用对话框、文件压缩、版本控制的支持。   COMCTL32.DLL --------一个新的windows控件集合,比如TreeView和RichTextBox   等等,最初这个是为了win95而制作的,但是现在也使用与NT下   MAPI32.DLL---------提供了一套电子邮件的专用函数   NETAPI32.DLL--------提供了一套访问和控制网络的函数   ODBC32.DLL--------ODBC功能的DLL之一   WINMM.DLL--------是多媒体控制访问函数集合   DLL(Delay Locked Loop,延时锁定回路提供一个数据滤波信号)

DLL错误的危害

  系统文件auditpolicygpinterop.dll出错,是由于木马病毒、或不小心下载了流氓软件被感染所致。而该文件又是系统/程序正常运行的前提条件,所以一旦不幸被感染,通常会伴随下几种情况:   1、桌面图标无法删除(淘宝、小游戏、电影等等,重启同样不能正常删除)   2、网络游戏打不开(DNF,穿越火线,魔兽世界等等)   3、电脑无故蓝屏   4、电脑没声音   5、桌面无法显示   6、主页被修改为网址导航

DLL修复方法

  auditpolicygpinterop.dll出错,很多是因为中了流氓软件的招,如果不太了解系统,不知道应该把auditpolicygpinterop.dll放在哪,那么建议使用修复工具对系统进行最全面的扫描和修复。   首先,建议使用金山毒霸。   然后,点击主界面的快速扫描,进行全面的系统扫描。   最后,按提示重新启动电脑,auditpolicygpinterop.dll下载修复完毕。   或者 360安全卫士,点击系统修复然后查杀木马。

相关百科
返回顶部
产品求购 求购