鱼C论坛

 找回密码
 立即注册
查看: 3989|回复: 3

win7 64位 线程远程注入错误

[复制链接]
发表于 2014-2-10 10:50:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 nicho_Y 于 2014-2-10 10:50 编辑

编写一个远程注入程序,利用ntdll.dll的NtCreateThreadEx函数,但是程序返回的线程句柄是0.以下是程序源代码,用的是code::block编写的.
  1. #include "windows.h"
  2. #include "stdio.h"
  3. #include "tchar.h"
  4. #pragma comment(lib,"libadvapi32.a")
  5. BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
  6. {
  7.     TOKEN_PRIVILEGES tp;
  8.     HANDLE hToken;
  9.     LUID luid;
  10.     if( !OpenProcessToken(GetCurrentProcess(),
  11.                           TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
  12.                           &hToken) )
  13.     {
  14.         _tprintf("OpenProcessToken error: %u\n", GetLastError());
  15.         return FALSE;
  16.     }
  17.     if( !LookupPrivilegeValue(NULL,
  18.                               lpszPrivilege,
  19.                               &luid) )
  20.     {
  21.         _tprintf("LookupPrivilegeValue error: %u\n", GetLastError() );
  22.         return FALSE;
  23.     }
  24.     tp.PrivilegeCount = 1;
  25.     tp.Privileges[0].Luid = luid;
  26.     if( bEnablePrivilege )
  27.         tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  28.     else
  29.         tp.Privileges[0].Attributes = 0;
  30.     if( !AdjustTokenPrivileges(hToken,
  31.                                FALSE,
  32.                                &tp,
  33.                                sizeof(TOKEN_PRIVILEGES),
  34.                                (PTOKEN_PRIVILEGES) NULL,
  35.                                (PDWORD) NULL) )
  36.     {
  37.         _tprintf("AdjustTokenPrivileges error: %u\n", GetLastError() );
  38.         return FALSE;
  39.     }
  40.     if( GetLastError() == ERROR_NOT_ALL_ASSIGNED )
  41.     {
  42.         _tprintf("The token does not have the specified privilege. \n");
  43.         return FALSE;
  44.     }
  45.     return TRUE;
  46. }
  47. typedef DWORD (WINAPI *PFNTCREATETHREADEX)
  48. (
  49.     PHANDLE                 ThreadHandle,
  50.     ACCESS_MASK             DesiredAccess,
  51.     LPVOID                  ObjectAttributes,
  52.     HANDLE                  ProcessHandle,
  53.     LPTHREAD_START_ROUTINE  lpStartAddress,
  54.     LPVOID                  lpParameter,
  55.     BOOL                    CreateSuspended,
  56.     DWORD                   dwStackSize,
  57.     DWORD                   dw1,
  58.     DWORD                   dw2,
  59.     LPVOID                  Unknown
  60. );
  61. BOOL IsVistaOrLater()
  62. {
  63.     OSVERSIONINFO osvi;
  64.     ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
  65.     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  66.     GetVersionEx(&osvi);
  67.     if( osvi.dwMajorVersion >= 6 )
  68.         return TRUE;
  69.     return FALSE;
  70. }
  71. BOOL MyCreateRemoteThread(HANDLE hProcess, LPTHREAD_START_ROUTINE pThreadProc, LPVOID pRemoteBuf)
  72. {
  73.     HANDLE      hThread = NULL;
  74.     FARPROC     pFunc = NULL;
  75.     if( IsVistaOrLater() )    // Vista, 7, Server2008
  76.     {
  77.         pFunc = GetProcAddress(GetModuleHandle("ntdll.dll"), "NtCreateThreadEx");
  78.         if( pFunc == NULL )
  79.         {
  80.             printf("MyCreateRemoteThread() : GetProcAddress("NtCreateThreadEx") 调用失败!错误代码: [%d]\n",
  81.                    GetLastError());
  82.             return FALSE;
  83.         }
  84.         ((PFNTCREATETHREADEX)pFunc)(&hThread,
  85.                                     0x1FFFFF,
  86.                                     NULL,
  87.                                     hProcess,
  88.                                     pThreadProc,
  89.                                     pRemoteBuf,
  90.                                     FALSE,
  91.                                     NULL,
  92.                                     NULL,
  93.                                     NULL,
  94.                                     NULL);



  95.         if( hThread == NULL )
  96.         {
  97.             printf("MyCreateRemoteThread() : NtCreateThreadEx() 调用失败!错误代码: [%d]\n", GetLastError());
  98.             return FALSE;
  99.         }
  100.     }
  101.     else                    // 2000, XP, Server2003
  102.     {
  103.         hThread = CreateRemoteThread(hProcess,
  104.                                      NULL,
  105.                                      0,
  106.                                      pThreadProc,
  107.                                      pRemoteBuf,
  108.                                      0,
  109.                                      NULL);
  110.         if( hThread == NULL )
  111.         {
  112.             printf("MyCreateRemoteThread() : CreateRemoteThread() 调用失败!错误代码: [%d]\n", GetLastError());
  113.             return FALSE;
  114.         }
  115.     }
  116.     if( WAIT_FAILED == WaitForSingleObject(hThread, INFINITE) )
  117.     {
  118.         printf("MyCreateRemoteThread() : WaitForSingleObject() 调用失败!错误代码: [%d]\n", GetLastError());
  119.         return FALSE;
  120.     }
  121.     return TRUE;
  122. }
  123. BOOL InjectDll(DWORD dwPID, char *szDllName)
  124. {
  125.     HANDLE hProcess = NULL;
  126.     LPVOID pRemoteBuf = NULL;
  127.     FARPROC pThreadProc = NULL;
  128.     DWORD dwBufSize = strlen(szDllName)+1;
  129.     if ( !(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)) )
  130.     {
  131.         printf("[错误] OpenProcess(%d) 调用失败!错误代码: [%d]\n",
  132.         dwPID, GetLastError());
  133.         return FALSE;
  134.     }
  135.     pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize,
  136.                                 MEM_COMMIT, PAGE_READWRITE);
  137.     WriteProcessMemory(hProcess, pRemoteBuf, (LPVOID)szDllName,
  138.                        dwBufSize, NULL);
  139.     pThreadProc = GetProcAddress(GetModuleHandle("kernel32.dll"),
  140.                                  "LoadLibraryA");
  141.     if( !MyCreateRemoteThread(hProcess, (LPTHREAD_START_ROUTINE)pThreadProc, pRemoteBuf) )
  142.     {
  143.         printf("[错误] CreateRemoteThread() 调用失败!错误代码: [%d]\n", GetLastError());
  144.         return FALSE;
  145.     }
  146.     VirtualFreeEx(hProcess, pRemoteBuf, 0, MEM_RELEASE);
  147.     CloseHandle(hProcess);
  148.     return TRUE;
  149. }
  150. int main(int argc, char *argv[])
  151. {
  152.     SetPrivilege(SE_DEBUG_NAME, TRUE);

  153.    // if( argc != 3 )
  154.    // {
  155.    //      printf("用法 : %s <进程PID> <dll路径>/n", argv[0]);
  156.    //      return 1;
  157.    // }
  158.    //  if( !InjectDll((DWORD)atoi(argv[1]), argv[2]) )
  159.    //  {
  160.    //     printf("InjectDll调用失败!/n");
  161.    //      return 1;
  162.    //  }


  163.       if( !InjectDll((DWORD)atoi("3360"), "C:\\Windows\\firstdll.dll") ) //3360 是被注入程序的PID
  164.     {
  165.       printf("InjectDll调用失败!/n");
  166.          return 1;
  167.     }
  168.     printf("InjectDll调用成功!/n");
  169.     return 0;
  170. }
复制代码
在我附件有项目工程文件还有 firstdll.dll. 希望大牛们指点下小菜,谢谢

x64inject.zip

473.09 KB, 下载次数: 16

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-2-10 10:51:59 | 显示全部楼层
帖子是如何悬赏?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-10 16:18:56 | 显示全部楼层
顶起来,求大牛
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-11 10:03:26 | 显示全部楼层
顶顶顶~~~~~~~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-13 19:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表