• 远程线程注入


    #include <windows.h>
    #include <tlhelp32.h>
    #include <stdio.h>
    
    int EnableDebugPriv(const char * name)  //提升进程为DEBUG权限
    {
      HANDLE hToken;
      TOKEN_PRIVILEGES tp;
      LUID luid;
      //打开进程令牌环
      if(!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
        &hToken) )
      {
        //printf("OpenProcessToken error
    ");
        return 1;
      }
      //获得进程本地唯一ID
      if(!LookupPrivilegeValue(NULL,name,&luid))
      {
       // printf("LookupPrivilege error!
    ");
      }
      tp.PrivilegeCount = 1;
      tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;
      tp.Privileges[0].Luid = luid;
      //调整进程权限
      if(!AdjustTokenPrivileges(hToken,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL) )
      {
       // printf("AdjustTokenPrivileges error!
    ");
        return 1;
      }
      return 0;
    }
    
    BOOL InjectDll(const char *DllFullPath, const DWORD dwRemoteProcessId) //注入函数
    {
      HANDLE hRemoteProcess;
      //获得调试权限
      if(EnableDebugPriv(SE_DEBUG_NAME))
      {
       // printf("add privilege error");
        return FALSE;
      }
      //打开目标进程
    
        if((hRemoteProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwRemoteProcessId))==NULL)
     // if((hRemoteProcess=OpenProcess( PROCESS_CREATE_THREAD||PROCESS_QUERY_INFORMATION||PROCESS_VM_OPERATION||PROCESS_VM_WRITE||PROCESS_VM_READ,FALSE,dwRemoteProcessId))==NULL)
      {
       // printf("OpenProcess error
    ");
        return FALSE;
      }
      char *pszLibFileRemote;
        //申请存放dll文件名的路径
      pszLibFileRemote=(char *)VirtualAllocEx( hRemoteProcess, NULL, lstrlen(DllFullPath)+1,MEM_COMMIT, PAGE_READWRITE);
      if(pszLibFileRemote==NULL)
      {
       // printf("VirtualAllocEx error
    ");
        return FALSE;
      }
      //把dll的完整路径写入到内存,
      if(WriteProcessMemory(hRemoteProcess,pszLibFileRemote,(void *)DllFullPath,lstrlen(DllFullPath)+1,NULL) == 0)
      {
       // printf("WriteProcessMemory error
    ");
        return FALSE;
      }
      //得到LoadLibraryA函数地址
      PTHREAD_START_ROUTINE pfnStartAddr=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryA");
      if(pfnStartAddr == NULL)
      {
       // printf("GetProcAddress error
    ");
        return FALSE;
      }
      HANDLE hRemoteThread;
      //启动远程线程
     // pfnStartAddr:线程函数的地址  LoadLibraryA
     //pszLibFileRemote:线程参数 c:1.dll
    
      if( (hRemoteThread = CreateRemoteThread(hRemoteProcess,NULL,0, pfnStartAddr,pszLibFileRemote,0,NULL))==NULL)
      {
       // printf("CreateRemoteThread error
    ");
        return FALSE;
      }
      return TRUE;
    }
    
    DWORD GetProcessID(char *ProcessName)  //获得进程PID
    {
      PROCESSENTRY32 pe32;
      pe32.dwSize=sizeof(pe32);
      //获得系统内所有进程快照
      HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
      if(hProcessSnap==INVALID_HANDLE_VALUE)
      {
      //  printf("CreateToolhelp32Snapshot error");
        return 0;
      }
      //枚举列表中的第一个进程
      BOOL bProcess=Process32First(hProcessSnap,&pe32);
      while(bProcess)
      {
        //比较找到的进程名和我们要查找的进程名,一样则返回进程id
        if(strcmp(pe32.szExeFile,ProcessName)==0)
          return pe32.th32ProcessID;
        //继续查找
        bProcess=Process32Next(hProcessSnap,&pe32);
      }
      CloseHandle(hProcessSnap);
      return 0;
    }
    
    
    
    
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpCmdLine,
                         int nCmdShow)
    {
      char Path[255];
      char DllPath[255];
      //得到widnows系统路径
        GetSystemDirectory(Path,sizeof(Path));
      //0x00截断字符,得到盘符
      Path[3]=0x00;
      //得到IE带路径文件名
     // strcat(Path,"Program Files\Internet Explorer\iexplore.exe");
      //启动IE,为了防止系统中没有IE进程
     //   WinExec(Path,SW_HIDE);
      //暂停两秒,等待IE启动
    //  Sleep(2000);
      //得到IE进程
      DWORD Pid=GetProcessID("IEXPLORE.EXE");
      //得到程序自身路径
      GetCurrentDirectory(sizeof(DllPath),DllPath);
      //得到DLL带路径文件名
      strcat(DllPath,"\test.dll");
      //注入IE进程
        InjectDll(DllPath,Pid);
      return 0;
    }
  • 相关阅读:
    Linux中常用操作命令
    JQuery Each循环遍历每个元素
    get set
    Launch Screen在iOS7/8中的实现
    程序猿必备的Git教程
    浏览器的工作原理:新式网络浏览器幕后揭秘
    浏览器的工作原理:新式网络浏览器幕后揭秘
    游览器中javascript的执行过程
    游览器中javascript的执行过程
    浅析 Cordova for iOS
  • 原文地址:https://www.cnblogs.com/Browneyes/p/4920403.html
Copyright © 2020-2023  润新知