feiyang025 发表于 2024-4-1 09:24:53

远程线程实现DLL注入和shellcode注入以及OD调试原理


远程线程:
#include<windows.h>
#include<stdio.h>

//函数地址:00C31740
int main() {
      
      HANDLE hThread;
      HANDLE hProcess;

      // 1、得到要在其进程中创建线程的进程句柄
      hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,10940);

      if (hProcess == NULL) {
                OutputDebugString("OpenProcess fail");
                return -1;
      }
      // 2、通过进程句柄创建线程
      hThread = CreateRemoteThread(
                hProcess,
                NULL,//获取默认的安全描述符,当前用户的令牌权限
                0,//使用可执行文件的默认大小
                (LPTHREAD_START_ROUTINE)0x010817E0,// 创建线程调用的函数
                NULL,// 传递函数中的参数
                0, //线程在创建后立即运行
                NULL // 不返回线程标识符
      );

      if (hThread == NULL) {
                OutputDebugString("CreateRemoteThread fail");
                CloseHandle(hProcess);
                return -1;
      }

      printf("线程启动!\n");

      // 3、释放资源
      CloseHandle(hThread);
      getchar(); //进行堵塞
      return 0;

}
远程线程注入:
#include<Windows.h>
#include<Tlhelp32.h>
#include<stdio.h>
/*
远程线程注入
代码写的不太严谨,大家谅解
*/

DWORD GetOneProcessPid(const char *FileName) {
      HANDLE hSnapShot;
      PROCESSENTRY32 pro32;

      pro32.dwSize = sizeof(PROCESSENTRY32);
      // 1、获得当前进程的快照

      hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

      if (hSnapShot == INVALID_HANDLE_VALUE) {
                return -1;
      }

      bool bMore;
      // 2、遍历进程的名称是否为指定名称,获取指定进程名称的PID
      bMore = Process32First(hSnapShot, &pro32);
      while (bMore) {
                // 3、获取指定进程名称的PID
                if (!strcmp(pro32.szExeFile, FileName)) {
                        return pro32.th32ProcessID;
                }
                bMore = Process32Next(hSnapShot, &pro32);                  //遍历
      }

      // 4、释放资源
      CloseHandle(hSnapShot);

      return 0;
}
DWORD WINAPI ThreadProc(LPVOID lpParameter) {
      return 0;
}

bool LoadDll(DWORD ProcessPid,const char *DllPath) {
      HANDLE hProcess;
      DWORD DllPathLen;
      PDWORD addr;
      HMODULE hModule;
      PDWORD FuncAddr;

      // 1、获取要注入进程的句柄
      hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessPid);
      if (hProcess == NULL) {
                return false;
      }

      // 2、获取DLL的信息
      DllPathLen = strlen(DllPath) + 1; //+1的原因结尾需要\0 结尾

      // 3、申请指定进程中的内存
      addr = (PDWORD)VirtualAllocEx(
                hProcess, //申请指定进程的句柄
                NULL,// 安全描述符
                DllPathLen,// 申请内存的字节大小
                MEM_COMMIT,//
                PAGE_READWRITE // 内存的属性
      );

      printf("%x", addr);

      // 4、将DLL的信息写入到要注入的进程内存中
      WriteProcessMemory(hProcess, addr, DllPath, DllPathLen, NULL);

      // 5、要获取其进程的LoadLibraryA/W的函数地址,该函数保存在系统中的Kernel32.dll中,那么需要先获得Kernel32.dll的句柄
      hModule = GetModuleHandle("Kernel32.dll");

      // 6、从中获得LoadLibraryA/W的函数地址
      FuncAddr = (PDWORD)GetProcAddress(hModule, "LoadLibraryA"); //返回值为函数地址
      
      // 7、注入到指定进程中进行加载内存中申请的DLL信息,把LoadLibraryA的地址作为函数 来加载addr,也就是DLL的路径
      CreateRemoteThread(hProcess, NULL, 0, LPTHREAD_START_ROUTINE(FuncAddr), addr, 0, NULL);
      
      return true;
}

int main() {
      LoadDll(GetOneProcessPid("x.exe"),"C:\\Users\\dell\\Desktop\\test\\DLL2.dll");
      return 0;
}
**** Hidden Message *****

710774265 发表于 2024-4-12 13:57:37

好好学习天天向上
页: [1]
查看完整版本: 远程线程实现DLL注入和shellcode注入以及OD调试原理