[求助]无dll的远程线程注入代码引发被注入程序的崩溃

雨者 雨者 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
[求助]写了一段无dll的远程线程注入代码,可是为什么每次注入都会引发被注入程序的崩溃?一直没有找到原因,请大家帮个忙,谢谢!

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
#include <string.h>
#include <windows.h>
#include <strsafe.h>
#include <tlhelp32.h>

#define MAX_LENGTH 30
#pragma warning(disable:4996)

using namespace std;

typedef struct _RemoteParam
{
CHAR szOperation[10];
CHAR szAddrerss[MAX_LENGTH];
DWORD dwSeAdress;
}RemoteParam;

DWORD WINAPI ThreadProc(RemoteParam *lprp)
{
typedef HINSTANCE(WINAPI *MShellExecute)(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd);
MShellExecute MSE;
MSE = (MShellExecute)lprp->dwSeAdress;
MSE(NULL, lprp->szOperation, lprp->szAddrerss, NULL, NULL, SW_SHOWNORMAL);
return 0;
}

DWORD GetProcessID(CHAR *ProcessName)
{
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)
{
if (strcmp(strupr(pe32.szExeFile), strupr(ProcessName)) == 0)
return pe32.th32ProcessID;
bProcess = Process32Next(hProcessSnap, &pe32);
}
CloseHandle(hProcessSnap);
return 0;
}

int EnableDebugPriv(const TCHAR *name)
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&hToken))
{
printf("OpenProcessToken error\n");
return 1;
}
if (!LookupPrivilegeValue(NULL, name, &luid))
{
printf("LookupPrivilege error!\n");
return 1;
}
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!\n");
return 1;
}
return 0;
}

BOOL InjectProcess(const DWORD dwPid)
{
if (EnableDebugPriv(SE_DEBUG_NAME)) return FALSE;
HANDLE hWnd = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
if (!hWnd) return FALSE;
RemoteParam rp;
ZeroMemory(&rp, sizeof(RemoteParam));
rp.dwSeAdress = (DWORD)GetProcAddress(LoadLibrary("Shell32.dll"), "ShellExecuteA");
StringCchCopy(rp.szAddrerss, sizeof(rp.szAddrerss), "https://www.baidu.com");
StringCchCopy(rp.szOperation, sizeof(rp.szOperation), "open");
RemoteParam *pRemoteParam = (RemoteParam *)VirtualAllocEx(hWnd, 0, sizeof(RemoteParam), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (!pRemoteParam) return FALSE;
if (!WriteProcessMemory(hWnd, pRemoteParam, &rp, sizeof(RemoteParam), 0)) return FALSE;
LPVOID pRemoteThread = VirtualAllocEx(hWnd, 0, 1024 * 4, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (!pRemoteThread) return FALSE;
if (!WriteProcessMemory(hWnd, pRemoteThread, &ThreadProc, 1024 * 4, 0)) return FALSE;
HANDLE hThread = CreateRemoteThread(hWnd, NULL, 0, (LPTHREAD_START_ROUTINE)pRemoteThread, (LPVOID)pRemoteParam, 0, NULL);
if (!hThread) return FALSE;
return TRUE;
}

int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
CHAR szProcName[MAX_LENGTH] = "\0";
StringCchCopy(szProcName, MAX_LENGTH, "explorer.exe");
InjectProcess(GetProcessID(szProcName));
return 0;
}
...全文

相关推荐

dll远程线程注入(支持64bit win7)

在实际应用中,远程线程注入需要谨慎操作,因为它可能涉及安全和权限问题。在没有适当授权的情况下对其他进程进行操作,可能会导致程序崩溃或被系统阻止。

arvon2012

远程线程注入引发的Windows会话崩溃:从DLL路径解析到CSRSS阻塞的深度排障

远程线程注入是Windows进程间代码加载的基础机制,其核心原理在于通过CreateRemoteThread在目标进程上下文中调度执行用户代码。然而真实环境中,该操作远不止API调用成功那么简单——它会触发完整的用户态初始化链,包括PEB解析、DLL路径搜索(LoadLibraryExW)、模块映射(LdrpLoadDll)及会话级IPC同步(CSRSS通信)。当注入DLL存在符号冲突、PATH路径污染或Session 0隔离适配缺失时,极易引发系统级雪崩:Winlogon加载失败、RDP超时、域策略中断。

clugcpne10995

C++ DLL远程线程注入实战:从原理到代码实现

动态链接库(DLL)是Windows系统中实现代码复用和模块化的重要机制,其核心原理在于允许程序在运行时加载外部代码模块。通过系统API如LoadLibrary,进程可以动态引入功能,这构成了软件扩展和插件系统的基础。在软件调试、安全研究和功能扩展等应用场景中,有时需要主动将DLL载入目标进程,这就引出了进程注入技术。其中,远程线程注入是一种经典方法,它利用CreateRemoteThread等API,在目标进程内开辟线程执行LoadLibrary,从而加载指定DLL。本文聚焦于C++实现,深入解析了该技术

weixin_34006468

远程注入线程中一些经常犯的错误

  作者:韩思远          出处:http://blog.csdn.net/siyuanpc     这是我在CSDN写的第一篇文章!希望大家多支持!谢谢!  大家可能都知道远程注入的过程,网络上也有很多关于远程注入的文章大体都是写如何注入的过程和API的用法!但却忽视了一些细节的地方!本篇文章结合JEFFREY RICHTER的远程注入线程为背景深入分析这些代码后面容易让初学

chrisxisaier

远程线程注入,dll注入,vc

当目标进程执行时,注入的DLL的代码也会被执行。DLL注入通常用于扩展程序功能、监测或控制其他程序。

singwhatiwanna
评论 1
收藏 已收藏
分享
返回顶部
雨者
安全技术/病毒 9,513 成员 28,940 内容