首页
社区
课程
招聘
[求助]DLL无法注入winlogon.exe
发表于: 2009-8-25 19:34 10702

[求助]DLL无法注入winlogon.exe

2009-8-25 19:34
10702
下面是我的代码:
与Windows核心编程的实例代码相同,只是在前后增加了改变进程权限的代码。
这段代码能注入非系统进程,但想注入winlogon.exe进程时就出现问题。
代码运行到WaitForSingleObject时就停住了。
请大侠们帮帮忙,我不知道什么原因,我的系统是XP sp3。
是不是系统还做了其他限制?禁止向系统进程远程创建线程?

注入代码:
BOOL WINAPI InjectLibW(DWORD dwProcessId, PCWSTR pszLibFile) {

   BOOL bOk = FALSE; // Assume that the function fails
   HANDLE hProcess = NULL, hThread = NULL;
   PWSTR pszLibFileRemote = NULL;

   __try {
	   
	  if(!EnablePrivilege(SE_DEBUG_NAME,TRUE))
		return bOk;
	   
      // Get a handle for the target process.
      hProcess = OpenProcess(
         PROCESS_QUERY_INFORMATION |   // Required by Alpha
         PROCESS_CREATE_THREAD     |   // For CreateRemoteThread
         PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx
         PROCESS_VM_WRITE		   |
		 PROCESS_VM_READ,
         FALSE, dwProcessId);
      if (hProcess == NULL) __leave;

      // Calculate the number of bytes needed for the DLL's pathname
      int cch = 1 + lstrlenW(pszLibFile);
      int cb  = cch * sizeof(wchar_t);

      // Allocate space in the remote process for the pathname
      pszLibFileRemote = (PWSTR) 
         VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
      if (pszLibFileRemote == NULL) __leave;

      // Copy the DLL's pathname to the remote process' address space
      if (!WriteProcessMemory(hProcess, pszLibFileRemote, 
         (PVOID) pszLibFile, cb, NULL)) __leave;

      // Get the real address of LoadLibraryW in Kernel32.dll
      PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
         GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
      if (pfnThreadRtn == NULL) __leave;

      // Create a remote thread that calls LoadLibraryW(DLLPathname)
      hThread = CreateRemoteThread(hProcess, NULL, 0, 
         pfnThreadRtn, pszLibFileRemote, 0, NULL);
      if (hThread == NULL) __leave;

      // Wait for the remote thread to terminate
      WaitForSingleObject(hThread, INFINITE);

      bOk = TRUE; // Everything executed successfully
   }
   __finally { // Now, we can clean everything up

      // Free the remote memory that contained the DLL's pathname
      if (pszLibFileRemote != NULL) 
         VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);

      if (hThread  != NULL) 
         CloseHandle(hThread);

      if (hProcess != NULL) 
         CloseHandle(hProcess);
   }

   EnablePrivilege(SE_DEBUG_NAME,FALSE);
   return(bOk);
}


DLL代码:
BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, PVOID fImpLoad)
{
//	MessageBox (NULL, TEXT ("DLL"), TEXT("aaaa"), MB_ICONERROR) ;
	switch(fdwReason)
	{
	case DLL_PROCESS_ATTACH:
		break;

	case DLL_THREAD_ATTACH:
		break;

	case DLL_THREAD_DETACH:
		break;

	case DLL_PROCESS_DETACH:
		break;
	}

	return(TRUE);
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我只会用易实现
是如此轻松
2009-8-25 22:58
0
雪    币: 196
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
哈哈~
前两天我也问了下这个问题,用重定位能注入winlogon.exe,但用DLL注入失败

后来有朋友说可能是桌面环境的问题,要改成winlogon.exe进程的桌面

我还没试过呢,感觉这个靠谱
2009-8-26 08:03
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你的代码如果没有MessageBox应该没问题
但是如果在DllMain 里直接MessageBox到Winlogon桌面就会死锁
如果目的是在登录桌面上Messagebox,应该新建一个线程,然后在那里输出消息
然后Win+L,Alt+Tab就能找到那个消息框了

如果是显示在当前桌面,就应该切换线程的桌面到Default。
上传的附件:
  • 2.PNG (38.10kb,393次下载)
2009-8-26 12:22
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
leftup好厉害~
2009-8-26 12:46
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
请问这个桌面环境问题是什么意思?
现在关键是我的loadlibrary线程好像没有运行,到WaitForSingleObject就停住了。
能获取远程线程的句柄,估计就已经创建线程了,但是线程一直等待。
2009-8-27 10:58
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我的messagebox只是为了检查能不能注入winlogon.exe,没有别的意思的。
为什么你的可以注入啊?
2009-8-27 11:00
0
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
8
我们普通用的桌面是Default,而Winlogon.exe是另一个,必须切换到登陆状态才能看到弹出的消息框。
如果代码没问题的话,这个CreateRemoteThread执行后,你应该听到MessageBox弹出时“叮”的一声了,有创建线程就是证明。csrss都能注入,Winlogon当然也没问题。
      // Create a remote thread that calls LoadLibraryW(DLLPathname)
      hThread = CreateRemoteThread(hProcess, NULL, 0, 
         pfnThreadRtn, pszLibFileRemote, 0, NULL);
      if (hThread == NULL) __leave;

      // Wait for the remote thread to terminate
      WaitForSingleObject(hThread, INFINITE);


因为你没有点MessageBox的确定,所以 WaitForSingleObject 等不到线程结束,于是你程序卡那儿了。就像上面所说的,你DLL里要创建一个线程再去弹框,然后注销按 Ctrl+Alt+Del 看结果。
2009-8-27 14:14
0
雪    币: 22
活跃值: (458)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
代码没问题啊 楼主不想建立线程测试 就用 MessageBeep 来测试看看 。。。

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{
        //  MessageBox (NULL, TEXT ("DLL"), TEXT("aaaa"), MB_ICONERROR) ;

        switch(ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
                {
                        Sleep(1000);
                        MessageBeep(1);
                        Sleep(1000);
                        MessageBeep(1);
                        Sleep(1000);
                        MessageBeep(1);
                }
                break;
               
        case DLL_THREAD_ATTACH:
                break;
               
        case DLL_THREAD_DETACH:
                break;
               
        case DLL_PROCESS_DETACH:
                break;
        }
       
  return(TRUE);
     
}
//================================

BOOL WINAPI InjectLibW(DWORD dwProcessId, PCWSTR pszLibFile)
{
  ....
}

BOOL WINAPI InjectLibA(DWORD dwProcessId, PCSTR pszLibFile)
{
        // Allocate a (stack) buffer for the Unicode version of the pathname
        PWSTR pszLibFileW = (PWSTR)
                _alloca((lstrlenA(pszLibFile) + 1) * sizeof(WCHAR));
        // Convert the ANSI pathname to its Unicode equivalent
        wsprintfW(pszLibFileW, L"%S", pszLibFile);
        // Call the Unicode version of the function to actually do the work.
        return(InjectLibW(dwProcessId, pszLibFileW));
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
        if(InjectLibA(1196,"C:\\test\\DLL\\xxxDLL.dll"))
        {
                MessageBox(0,"ok","ok",0);
        }

        return 0;
}
2009-8-27 16:09
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
明白!谢谢,我确实听到叮的一声。而且我犯了个很傻的错误,测试的时候,拷贝的是旧的Dll,测试的不是新编译的Dll,所以我一直认为不是messagebox的问题。
还有谢谢靴子兄了。
2009-8-27 16:36
0
雪    币: 265
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yvi
11
2009-8-27 19:33
0
雪    币: 43
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
用GINA 插winlogon,还能控制系统登录等。你搜一下msgina or gina.dll 编程 试试
2009-8-28 10:29
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好东西啊,膜拜学习中。。。
2009-9-5 22:13
0
游客
登录 | 注册 方可回帖
返回
//