首页 电脑 电脑学堂 查看内容

DLL注射Windows Vista

2009-2-4 23:08 839 0

摘要:       本文提供了一个了解如何注入一个动态库( DLL )到32位进程在Windows Vista中使用远程线程,并考虑到地址空间布局随机化( A...
关键词: nbsp LoadLibraryA 地址 004021 一个 线程 偏移 空间 远程 进程

      本文提供了一个了解如何注入一个动态库( DLL )到32位进程在Windows Vista中使用远程线程,并考虑到地址空间布局随机化( ASLR ) 。 示例代码使用汇编语言编写的( MASM32 )使用WinAsm的IDE 。 .这应该可以让您更好地了解如何动态库可以注射。      装载lib库的过程很简单。 程序员可以动态加载一个使用LoadLibrary函数从Windows的API ,例如: #include <stdio.h> #include <stdlib.h> #include <windows.h> int main(int argc, char *argv[]) { HANDLE hlib; char *lib = "E:\\mylib.dll"; printf("Loading library: %s\n",lib); hlib = LoadLibraryA(lib); printf("Handle: %X\n",hlib); system("PAUSE"); return 0; }      因此,我们可以使用CreateRemoteThread函数来创建一个线程执行的LoadLibraryA与thread的路径作为参数。  HANDLE WINAPI CreateRemoteThread CreateRemoteThread (    __in   HANDLE hProcess ,     __in   LPSECURITY_ATTRIBUTES lpThreadAttributes ,     __in   SIZE_T dwStackSize ,    __in   LPTHREAD_START_ROUTINE lpStartAddress ,     __in   LPVOID lpParameter ,     __in   DWORD dwCreationFlags ,     __out  LPDWORD lpThreadId   ); hProcess hProcess .是处理到远程进程中,我们打算要注入我们的 library。 lpStartAddress lpStartAddress 这是地址(或偏移)的功能我们将开始执行线程。就我们而言这应该是平等的偏移LoadLibraryA在偏远的进程地址空间。 lpParameter lpParameter 这是地址参数(库路径)我们的目标,作为参数设置的LoadLibraryA功能。 请注意,这也必须在地址空间的远程过程。 主要问题 ,我们必须考虑到如下: 偏移LoadLibraryA不固定(而不是在这之后微软实施地址空间布局随机或ASLR ) 我们 library的路径字符串中不存在远程线程的地址空间 Offset of LoadLibraryA 偏移LoadLibraryA 驻留在内部的Kernel32.dll 每个library进程运行在我们的作业系统这是一个至关重要的。 每次开机有一个概率的地址kernel32 library将改变由于ASLR 。 幸运的是,地址LoadLibraryA在我们的过程是相同的一个偏远的进程。 因此,我们将需要使用GetProcAddress结合GetModuleHandle 。 下面的示例代码,这一点: #include <stdio.h> #include <stdlib.h> #include <windows.h> int main(int argc, char *argv[]){  HINSTANCE kernel32; FARPROC proc; char *procname = “LoadLibraryA”;char *modulename = “Kernel32″; kernel32 = GetModuleHandle(modulename); printf(”hModule: %X\n”,kernel32);proc = GetProcAddress(kernel32,procname); printf(”hProc: %X\n”,proc);system(”PAUSE”); return 0;}  获取路径内的远程进程的地址空间 做这样的事,我们需要分配空间的远程线程的地址空间使用VirtualAllocEx修补功能,然后我们的路径,并使用WriteProcessMemory函数。 您可以查找此两项功能MSDN上使用以下链接: VirtualAllocEx VirtualAllocEx WriteProcessMemory WriteProcessMemory 另一种“黑客”你可以使用,你的名字你可以在一个字符串 library内的可执行文件然后将其复制的文件夹内的可执行文件或任何其他文件夹中所界定的PATH环境变量。 示例程序的十六进制转储以下您可以使用ernel32.dll (在00402229 )或nel32.dll (在0040222A ) 32.dll (在0040222D )或什至NameA (在00402243 )为您的图书馆的文件名。 004020F0    ø ...... 004020F0 00402100    BoxParamA.´.EndD 00402100 00402110    ialog.ü.GetDlgIt 00402110 00402120    emTextA.± Messag 00402120 00402130    eBoxA. 00402130 00402140    emTextA.user32.d 00402140 00402150    ll..R.CreateRemo 00402150 00402160    teThread..›.Exit 00402160 00402170    Process.Ì.Format 00402170 00402180    MessageA.. 00402180 00402190    urrentProcessId. 00402190 004021A0    ( GetLastError.. 004021A0 004021B0    4 GetModuleHandl 004021B0 004021C0    eA..S GetProcAdd 004021C0.. 004021D0    ress.. 004021D0.. OpenProc 004021E0    ess.\ RtlZeroMem 004021E0 004021F0    ory.Þ VirtualAll 004021F0 00402200    ocEx.. 00402200 ocEx 00402210    cessMemory.. 00402210 00402220    trlenA..kernel32 00402220 00402230    .dll....GetOpenF 00402230的。 00402240    ileNameA..comdlg 00402240 00402250    32.dll.......... 00402250  下载源代码和可执行文件
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部