首页
社区
课程
招聘
[求助]SPOOLSV进程注入的问题
发表于: 2010-7-21 10:23 7182

[求助]SPOOLSV进程注入的问题

2010-7-21 10:23
7182
为了截取发送给打印机的数据,通过HOOK去拦截,现在已经做好HOOK了,但是在注入到进程的时候出现了问题,也是通过网上远程线程注入的办法注入DLL。

开始的时候,一直是权限不够,后来我提升了权限,也不会失败了,每一步都是返回成功,但是用工具查看,发现spoolsv.exe一直都没被注入我的DLL,但是换成别的EXE都可以成功注入。

我有2个问题:1 注入的进程我做的事spoolsv是否对? 2 提升权限后应该没问题了,但是工具还是查看不到相应DLL,是哪的错?代码我也贴过来

#include <windows.h>
#include <winsvc.h>
#include <tlhelp32.h>
#include <stdio.h>
// DLL注入函数 
bool LoadLib(DWORD dwProcessId, LPWSTR lpszLibName)

  HANDLE hProcess = NULL;
  HANDLE hThread = NULL; 
  LPWSTR lpszRemoteFile = NULL;
  int  error = 0;
    
  // 打开远程进程
  hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION  | PROCESS_VM_WRITE, FALSE,dwProcessId);
  if (hProcess == NULL) 
  { 
    error = GetLastError();
    MessageBox(NULL, "OpenProcess failed with error " , "Error", MB_ICONINFORMATION + MB_OK);
    return FALSE;
  }
  
  // 在远程进程中分配存贮DLL文件名的空间
  lpszRemoteFile = (LPWSTR)VirtualAllocEx(hProcess, NULL, sizeof(WCHAR) * lstrlenW(lpszLibName) + 1,MEM_COMMIT, PAGE_READWRITE); 
  if (lpszRemoteFile == NULL)
  {
    error = GetLastError();
    MessageBox(NULL, "VirtualAllocEx failed with error " , "Error",  MB_ICONINFORMATION + MB_OK);
    return FALSE;
  }
  // 复制DLL文件名到远程刚分配的进程空间
  if (!WriteProcessMemory(hProcess, lpszRemoteFile,(PVOID)lpszLibName, sizeof(WCHAR) * lstrlenW(lpszLibName) + 1,NULL))
  {
    error = GetLastError();
    MessageBox(NULL, "WriteProcessMemory failed with error " , "Error",MB_ICONINFORMATION + MB_OK);
    return FALSE;
  }
  // 取得LoadLibrary函数在Kennel32.dll中的地址
  PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32.dll"),"LoadLibraryW");
  if (pfnThreadRtn == NULL)
  {
    error = GetLastError();
    MessageBox(NULL, "GetProcAddress failed with error " , "Error", MB_ICONINFORMATION + MB_OK);
    return FALSE;
  }
  // 创建远程线程 c,0髛jgeJ.  
  hThread = CreateRemoteThread(hProcess,
    NULL,
    0,
    pfnThreadRtn, // LoadLibrary地址
    lpszRemoteFile, // 要加载的DLL名
    0,
    NULL);
  if (hThread == NULL) 
  {  
    error = GetLastError();
    MessageBox(NULL, "CreateRemoteThread failed with error " , "Error", MB_ICONINFORMATION + MB_OK);
    return FALSE;
  }
  // 等待线程返回 
  WaitForSingleObject(hThread, INFINITE); 
  // 释放进程空间中的内存
  VirtualFreeEx(hProcess, lpszRemoteFile, 0, MEM_RELEASE); 
  // 关闭句柄 
  CloseHandle(hThread);
  CloseHandle(hProcess); 
  return TRUE;


bool SetPrivilege()
{
  HANDLE hToken;
  TOKEN_PRIVILEGES tp;
  LUID luid;
  TOKEN_PRIVILEGES tpPrevious;
  DWORD cbPrevious = sizeof(TOKEN_PRIVILEGES);
  
  
  if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  {
    if(!LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &luid )) 
    {
      return false;
    }
    // 1) Get current privilege setting
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    tp.Privileges[0].Attributes = 0;
    
    AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &tpPrevious, &cbPrevious);
    if (GetLastError() != ERROR_SUCCESS) 
    {
      return false;
    }

    // 2) Set privilege based on previous setting
    tpPrevious.PrivilegeCount = 1;
    tpPrevious.Privileges[0].Luid = luid;
    //if (bEnablePrivilege) 
    //{
    tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED);
    //}
    //else
    //{
    //  tpPrevious.Privileges[0].Attributes ^= (SE_PRIVILEGE_ENABLED & tpPrevious.Privileges[0].Attributes);
    //}
    AdjustTokenPrivileges( hToken, FALSE, &tpPrevious, cbPrevious, NULL, NULL );
    if (GetLastError() != ERROR_SUCCESS) 
    {
      return false;
    }

  }
  return TRUE;
}

void main() 
{
  LPWSTR m_szDllFile = L"C:\\inject\\Debug\\hookxxx.dll";
  DWORD m_dwProcessId = 0;
  PROCESSENTRY32 pe;
  // 创建快照句柄
  HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  // 先搜索系统中第一个进程的信息
  Process32First(hSnapshot, &pe);
  // 下面对系统中的所有进程进行枚举,并保存其信息
  do{
    if(strcmp(pe.szExeFile,"explorer.exe") == 0      ) 
    { 
      m_dwProcessId =pe.th32ProcessID;
      break;
    }
  }
  while (Process32Next(hSnapshot, &pe));
  // 关闭快照句柄
  CloseHandle(hSnapshot);
  //提高本程序的权限
  if( TRUE == SetPrivilege() )
  {
    LoadLib(m_dwProcessId, m_szDllFile);
  }
  getchar();
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
2
如果每一步都成功,那可能是hookxxx.dll的入口执行异常,导致加载失败。也可能是所需支持库无法被加载等等。
2010-7-21 12:02
0
雪    币: 284
活跃值: (297)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
问题是  如果我注入到notepad 完全没问题,一遇到系统进程,比如explorer spoolsv就只能正确执行,但无法注入了

刚在虚拟机调试了下,发现注入到spoolsv这个进程是正确的

再次请教!谢谢
2010-7-21 13:56
0
雪    币: 284
活跃值: (297)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我的意思是说 截取打印数据  确实需要注入到spoolsv进程  但是上面的代码就是注入不了
还是不清楚哪的问题    加载DLL需要的东西都有 就是系统进程才注入不了
2010-7-21 13:58
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
装了360了吧,卸载后再试试,我也遇到过类似问题,360的搞的鬼,关闭没用,卸掉才有用
2010-7-21 14:11
0
雪    币: 284
活跃值: (297)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我虚拟机 什么都没装  奇怪了  很悲剧
2010-7-21 14:21
0
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
7
奇怪了。我没遇到过。
系统进程的注入,只要提权成功。没有不成功注入的道理嘛。我天天这么干,都没出现问题。。。
2010-7-22 15:48
0
雪    币: 91
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我都要疯掉了, 你到底是成功还是没有成功, 唉...
2010-7-23 09:56
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我也遇到同样的问题
2010-7-31 22:35
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我还没有时间调试,应该是权限造成的
2010-7-31 22:37
0
游客
登录 | 注册 方可回帖
返回
//