reate emote hread-请教CreateRemoteThread远程注入进程的问题

问题描述

请教CreateRemoteThread远程注入进程的问题

我在控制台程序里用代码在宿主进程里注入一个MessageBox函数,能够成功运行,宿主进程显示对话框后一切正常,可是我用相同的代码在MFC创建的基于对话框程的序里,使用按钮来实现时,注入的对话框能够成功显示,但是一旦关闭注入的对话框,宿主进程就崩溃,我就纳闷了。我试过权限的问题,管理员权限运行也不行,在代码里改令牌也不行,请问到底什么原因导致的这种现象。以下是代码。
控制台程序

 #include <windows.h>

typedef int (__stdcall * PFN_MESSAGEBOX)(HWND, LPCTSTR, LPCTSTR, DWORD);

struct RemoteParam
{
    char sShow[12];
    DWORD dwMessageBox;
};

DWORD WINAPI threadProc(LPVOID lpParameter)
{
    RemoteParam *rp=(RemoteParam*)lpParameter;
    PFN_MESSAGEBOX pfnMessageBox=(PFN_MESSAGEBOX)(rp->dwMessageBox);
    pfnMessageBox(NULL,rp->sShow,rp->sShow,0);
    return 0;
}

void main()
{

    DWORD proId;
    const DWORD dwThreadSize=4096;

    HWND windHandle=::FindWindow(NULL,"MyGame");
    ::GetWindowThreadProcessId(windHandle,&proId);
    HANDLE proHandle=::OpenProcess(PROCESS_ALL_ACCESS,false,proId);

    void* allcAddr=::VirtualAllocEx(proHandle,0,dwThreadSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);

    ::WriteProcessMemory(proHandle,allcAddr,&threadProc,dwThreadSize,0);

    HMODULE hUser32=::LoadLibrary("User32.dll");

    RemoteParam RemoteData;
    ZeroMemory(&RemoteData,sizeof(RemoteParam));
    RemoteData.dwMessageBox=(DWORD)::GetProcAddress(hUser32,"MessageBoxA");

    strcat(RemoteData.sShow,"Hello");

    RemoteParam* paramAndFunc=(RemoteParam*)::VirtualAllocEx(proHandle,0,sizeof(RemoteData),MEM_COMMIT,PAGE_READWRITE);

    ::WriteProcessMemory(proHandle,paramAndFunc,&RemoteData,sizeof(RemoteData),0);

    DWORD dwId;

    HANDLE hRemoteHandle=::CreateRemoteThread(proHandle,NULL,0,(LPTHREAD_START_ROUTINE)allcAddr,paramAndFunc,0,&dwId);

    CloseHandle(hRemoteHandle);
    FreeLibrary(hUser32);  

}

MFC按钮消息响应函数里的代码

typedef int (__stdcall * PFN_MESSAGEBOX)(HWND, LPCTSTR, LPCTSTR, DWORD);

struct RemoteParam
{
    char sShow[12];
    DWORD dwMessageBox;
};

DWORD WINAPI threadProc(LPVOID lpParameter)
{
    RemoteParam *rp=(RemoteParam*)lpParameter;
    PFN_MESSAGEBOX pfnMessageBox=(PFN_MESSAGEBOX)(rp->dwMessageBox);
    pfnMessageBox(NULL,rp->sShow,rp->sShow,0);
    return 0;
}
void CMyDlg::OnButtonPourinto()
{
    //enableDebugPriv();
    DWORD proId;
    const DWORD dwThreadSize=4096;
    HWND windHandle=::FindWindow(NULL,"MyGame");
    ::GetWindowThreadProcessId(windHandle,&proId);
    HANDLE proHandle=::OpenProcess(PROCESS_ALL_ACCESS,false,proId);

    void* allcAddr=::VirtualAllocEx(proHandle,0,dwThreadSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE
        );
    ::WriteProcessMemory(proHandle,allcAddr,&threadProc,dwThreadSize,0);
    RemoteParam RemoteData;
    ZeroMemory(&RemoteData,sizeof(RemoteParam));
    HINSTANCE hUser32 = LoadLibrary("User32.dll");
    RemoteData.dwMessageBox=(DWORD)::GetProcAddress(hUser32,"MessageBoxA");
    strcat(RemoteData.sShow,"Hello");
    RemoteParam* paramAndFunc=(RemoteParam*)::VirtualAllocEx(proHandle,0,sizeof(RemoteData),MEM_COMMIT,PAGE_READWRITE);

    ::WriteProcessMemory(proHandle,paramAndFunc,&RemoteData,sizeof(RemoteData),0);

    DWORD dwId;
    HANDLE hRemoteHandle=::CreateRemoteThread(proHandle,NULL,0,(LPTHREAD_START_ROUTINE)allcAddr,paramAndFunc,0,&dwId);

    CloseHandle(hRemoteHandle);
    FreeLibrary(hUser32);
}

解决方案

不会是Debug/Release版本的问题吧?

解决方案二:

兄弟,感谢,果然是这个问题,我居然就没想到,把问题复杂化了。

时间: 2024-10-03 16:39:42

reate emote hread-请教CreateRemoteThread远程注入进程的问题的相关文章

32位程序对64位进程的远程注入实现

本文讲的是32位程序对64位进程的远程注入实现, 0x00 前言 要对指定进程进行远程注入,通常使用Windows提供的API CreateRemoteThread创建一个远程线程,进而注入dll或是执行shellcode. 在64位系统下,该方法需要特别注意,注入的目标进程要同程序的结构保持一致,即32位程序只能对32进程作注入,64位程序只能对64位进程作注入,32位程序对64位程序进行注入时会失败(32位和64位的结构不同). 然而,在某些特殊的环境下,无法提前预知目标进程的结构,准备两个

远程注入DLL(简单描述)

远程注入DLL(简单描述) 远程注入DLL 建议在阅读本文前先阅读取得句柄的令牌 OpenProcessToken()函数一文! 没错,现在讨论的就是传说中的远程注入技术,目前一种非常流行的隐藏技术,因为它没有进程,是通过远程插入线程调用DLL文件实现的!在这里先说一下.dll文件,.dll文件,其实就是动态连接库,它里面装封了提供.exe文件调用的函数,一般情况下,双击它,是不能运行它的,它只能由.exe来调用,于是就有了远程注入了,原理很简单:我们把后门的主要功能写成一个函数,然后装封到.d

C++封装远程注入类CreateRemoteThreadEx实例_C 语言

本文实例讲述了C++封装远程注入类CreateRemoteThreadEx的方法,分享给大家供大家参考.具体方法如下: 首先,类初始化时传入要注入的DLL文件名 只使用两个函数 复制代码 代码如下: // 注入DLL到指定的地址空间 BOOL InjectModuleInto(DWORD dwProcessId); // 从指定的地址空间卸载DLL BOOL EjectModuleFrom(DWORD dwProcessId); .h头文件如下: 复制代码 代码如下: #pragma once 

wmi如何远程终止进程??

问题描述 现在我用wmi实现了得到远程计算机的进程列表,可是如何用wmi结束远程计算机上的某个进程呢?网上有一些关于用wmi结束本地进程的,代码如下:ManagementObjectservice=newManagementObject("win32_service="winmgmt"");InvokeMethodOptionsoptions=newInvokeMethodOptions();options.Timeout=newTimeSpan(0,0,0,5);

不用重新配置,用jconsole连接远程机器进程及获得本地进程的JMX Url的终极办法

估计有很多人都在想用jconsole连接远程机器上的进程时,发现没有配置jmx端口,或者其它的东东. 下面介始一种很简单的办法,可以不用重启远程机器的进程: ssh -X  192.168.66.66  -l username 连接上去之后,可以直接运行jconsole进程,然后在本机就会弹出一个jconsole的窗口了. 实际上这个不是用jconsole连接远程机器的进程,而是把远程机器上的X输出转地本地来. 如果有提示失败,那么可能要配置下ssh可以转发X. ================

C#中如何启动本地或远程的进程

在C#中可以通过Process来启动一个进程,Process位于System.Diagnostics命名空间. 下面来看一个具体实例: 1 2 using System; 3 using System.Diagnostics; 4 5 namespace csharp_station.howto 6 { 7 /**//**//**//// <summary> 8 /// 在C#中启动IE进程 9 /// </summary> 10 class ProcessStart 11 { 1

ASP.NET在执行某获取远程服务器进程的用户名时报错“对象的当前状态使该操作无效”

问题描述 各位大神,我ASP.net中用c#语言获取远程主机的进程所属的用户名时,用到了网络上提供的以下语句,但在执行时报错:SelectQueryquery1=newSelectQuery("Select*fromWin32_ProcessWHEREprocessID="+pID);ManagementObjectSearchersearcher1=newManagementObjectSearcher(query1);try{foreach(ManagementObjectdisk

请教一个远程数据库的应用怎么设计?

问题描述 Oracle的数据库,希望远程调用,比如从互联网调用,不需要安装Oracle客户端,应该怎么设计呢?有点象股票软件那样,只要本地装个VB.net的程序就行了,不用关心数据库.非常感谢. 解决方案 解决方案二:这样的话,也就是每个客户端都能直接访问你的数据库了,还是通过internet,你自己觉得合理不直接做成网站吧解决方案三:必然是cs结构服务器点也写个软件暴露服务器软件端口不暴露数据库端口解决方案四:服务器做成webservice是现在比较流行的方法解决方案五:引用3楼的回复: 服务

bootstrap远程对话框问题

问题描述 bootstrap远程对话框问题 我需要点击一个按钮打开对话框,但对话框的内容是一个远程URL.如何做修改 div id="editModel" class="modal hide fade" > × 编辑 这样好像不行的 相关文章 bootstrap模态对话框怎么设置出滚动条 使用bootstrap框架建立modal对话框,对话框并不能够正常显示 如何在vs中,做一个对话框,通过按钮调用或关闭"P2P远程协助文件传输SDK.exe&quo