线程注入 根据进程名字来实现注入

 
#include "stdafx.h"
#include "windows.h"
#include <TlHelp32.h>
#include "stdio.h"


// ========== 定义一个代码结构,本例为一个对话框============
struct MyData
{
int can1;
 char sz[64]; // 对话框显示内容
 DWORD dwMessageBox; // 对话框的地址
};

// ========== 远程线程的函数 ==============================
DWORD __stdcall RMTFunc(MyData *pData)
{
 typedef int(__stdcall*MMessageBox)(HWND,LPCTSTR,LPCTSTR,UINT);
 MMessageBox MsgBox = (MMessageBox)pData->dwMessageBox;
pData->can1=101010101;
 MsgBox(NULL,_itoa(pData->can1,pData->sz,10), NULL, MB_OK);
 return 0;
}

DWORD processNameToId(LPCTSTR lpszProcessName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hSnapshot, &pe)) {
MessageBox(NULL,
"The frist entry of the process list has not been copyied to the buffer",
"Notice", MB_ICONINFORMATION | MB_OK);
return 0;
}
while (Process32Next(hSnapshot, &pe)) {
if (!strcmp(lpszProcessName, pe.szExeFile)) {
return pe.th32ProcessID;
}
}

return 0;
}
//提升进程访问权限
bool enableDebugPriv()
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;

if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
return false;
}
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) {
CloseHandle(hToken);
return false;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) {
CloseHandle(hToken);
return false;
}
return true;
}
int main(int argc, char* argv[])
{

 

//提升进程访问权限
enableDebugPriv();

char szExeName[MAX_PATH] = { 0 };

printf("输入要插入的进程名字/n");
gets(szExeName);
printf("%c/n",szExeName);


//上面填写进程名字
DWORD dwProcessId = processNameToId(szExeName);
if (dwProcessId == 0) {
MessageBox(NULL, "The target process have not been found !",
"Notice", MB_ICONINFORMATION | MB_OK);
return -1;
}
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);

if (!hProcess) {
MessageBox(NULL, "Open target process failed !", "Notice", MB_ICONINFORMATION | MB_OK);
return 0;
}


// ===== 获得需要创建REMOTETHREAD的进程句柄 ===============================


// ========= 代码结构 ================================================
 MyData data;
 ZeroMemory(&data, sizeof (MyData));
 strcat(data.sz, "伙终于成功了 呵呵!!");

 HINSTANCE hUser = LoadLibrary("user32.dll");
 if (! hUser)
 {
  printf("Can not load library./n");
  return 0;
 }
 data.dwMessageBox = (DWORD)GetProcAddress(hUser, "MessageBoxA");
 FreeLibrary(hUser);
 if (! data.dwMessageBox)
  return 0;

// ======= 分配空间 ===================================================
 void *pRemoteThread
  = VirtualAllocEx(hProcess, 0,
      1024*4, MEM_COMMIT|MEM_RESERVE,
      PAGE_EXECUTE_READWRITE);
 if (! pRemoteThread)
  return 0;
 if (! WriteProcessMemory(hProcess, pRemoteThread, &RMTFunc, 1024*4, 0))
  return 0;

 MyData *pData
  = (MyData*)VirtualAllocEx(hProcess, 0,
      sizeof (MyData), MEM_COMMIT,
      PAGE_READWRITE);
 if (!pData)
  return 0;

 if (! WriteProcessMemory(hProcess, pData, &data, sizeof (MyData), 0))
  return 0;

// =========== 创建远程线程 ===========================================
 HANDLE hThread
  = CreateRemoteThread(hProcess, 0,
       0, (LPTHREAD_START_ROUTINE)pRemoteThread,
       pData, 0, 0);
 if (! hThread)
 {
  printf("远程线程创建失败");
  return 0;
 }
 CloseHandle(hThread);
 VirtualFreeEx(hProcess, pRemoteThread, 1024*3, MEM_RELEASE);
 VirtualFreeEx(hProcess, pData, sizeof (MyData), MEM_RELEASE);
 CloseHandle(hProcess);
 printf("Hello World!/n");
 
printf("插入%c进程成功/n输入回车退出程序。/n",szExeName);
gets(szExeName);
 return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
远程线程注入(Remote Thread Injection)是一种常见的恶意攻击技术,它利用现有进程的可信度,将恶意代码加载到目标进程中并执行。以下是一份实现远程线程注入的示例代码(仅供学习参考,不得用于非法用途): ```c++ #include <windows.h> #include <tchar.h> int _tmain(int argc, _TCHAR* argv[]) { DWORD pid, tid; HANDLE hProcess, hThread; LPVOID pRemoteCode, pRemoteMem; // 获取目标进程ID和线程ID pid = atoi(argv[1]); tid = atoi(argv[2]); // 打开目标进程句柄 hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); if (hProcess == NULL) { printf("Failed to open process %d\n", pid); return 1; } // 在目标进程中分配内存 pRemoteMem = VirtualAllocEx(hProcess, NULL, 1024, MEM_COMMIT, PAGE_READWRITE); if (pRemoteMem == NULL) { printf("Failed to allocate memory in process %d\n", pid); CloseHandle(hProcess); return 1; } // 在本地进程中准备要注入代码 DWORD dwSize = 0; char *pLocalCode = NULL; HANDLE hFile = CreateFileA("inject.dll", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { dwSize = GetFileSize(hFile, NULL); pLocalCode = new char[dwSize]; DWORD dwRead = 0; ReadFile(hFile, pLocalCode, dwSize, &dwRead, NULL); CloseHandle(hFile); } // 将要注入代码写入目标进程内存中 if (pLocalCode != NULL && dwSize > 0) { if (!WriteProcessMemory(hProcess, pRemoteMem, pLocalCode, dwSize, NULL)) { printf("Failed to write memory in process %d\n", pid); delete[] pLocalCode; VirtualFreeEx(hProcess, pRemoteMem, 0, MEM_RELEASE); CloseHandle(hProcess); return 1; } } // 在目标进程中创建远程线程,执行注入代码 pRemoteCode = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA"); hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pRemoteCode, pRemoteMem, 0, NULL); if (hThread == NULL) { printf("Failed to create remote thread in process %d\n", pid); delete[] pLocalCode; VirtualFreeEx(hProcess, pRemoteMem, 0, MEM_RELEASE); CloseHandle(hProcess); return 1; } // 等待远程线程执行完毕 WaitForSingleObject(hThread, INFINITE); printf("Remote thread in process %d exited\n", pid); // 清理资源 delete[] pLocalCode; VirtualFreeEx(hProcess, pRemoteMem, 0, MEM_RELEASE); CloseHandle(hThread); CloseHandle(hProcess); return 0; } ``` 此代码的主要流程为: 1. 获取目标进程ID和线程ID。 2. 打开目标进程句柄。 3. 在目标进程中分配内存。 4. 在本地进程中准备要注入代码。 5. 将要注入代码写入目标进程内存中。 6. 在目标进程中创建远程线程,执行注入代码。 7. 等待远程线程执行完毕。 8. 清理资源。 需要注意的是,此代码仅供学习参考,不得用于非法用途。在实际应用中,还需要考虑更多的安全性和兼容性因素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值