首页
社区
课程
招聘
[求助]能不能将类作为CreateRemoteThread的参数
发表于: 2013-5-27 12:47 4187

[求助]能不能将类作为CreateRemoteThread的参数

2013-5-27 12:47
4187
class MyClass{
public:
        static void  A()
        {
                return;
        }
};

DWORD __stdcall threadProc(LPVOID lParam)
{
        MyClass* pRP = (MyClass*)lParam;
        pRP->A();
        return 0;
}

void CzhuruDlg::InjectFunc(DWORD  dwProcessId, LPVOID pFun, DWORD boolParam, DWORD *Param, DWORD ParamSize )
{
        // TODO: 在此添加控件通知处理程序代码
        //定义线程体的大小
    const DWORD dwThreadSize = 4096;
    DWORD dwWriteBytes;
        MyClass* pRemoteParam;
    HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
        if (!hTargetProcess)  return;

    void* pRemoteThread = VirtualAllocEx(hTargetProcess, 0, dwThreadSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
        if (!pRemoteThread) return;

    //将线程体拷贝到宿主进程中
    if (!WriteProcessMemory(hTargetProcess,pRemoteThread, pFun, dwThreadSize, 0)) return;

    if(boolParam)
        {
                pRemoteParam = (MyClass*)VirtualAllocEx(hTargetProcess , 0, ParamSize, MEM_COMMIT, PAGE_READWRITE);
                if (!pRemoteParam) return;
                //将线程参数拷贝到宿主进程地址空间中
                if (!WriteProcessMemory(hTargetProcess ,pRemoteParam, Param, ParamSize, 0))  return;
    }

    //在宿主进程中创建线程
        HANDLE hRemoteThread;
        if(boolParam)
        {
                hRemoteThread = CreateRemoteThread(
                        hTargetProcess, NULL, 0, (DWORD (__stdcall *)(void *))pRemoteThread,
                        pRemoteParam, 0, &dwWriteBytes);
        }
        else
        {
                hRemoteThread = CreateRemoteThread(
                        hTargetProcess, NULL, 0, (DWORD (__stdcall *)(void *))pRemoteThread,
                        NULL, 0, &dwWriteBytes);
        }

        if(WaitForSingleObject(hRemoteThread,INFINITE) != WAIT_OBJECT_0)
        {
                CString StrTmp;
                StrTmp.Format("%d",GetLastError());
                MessageBox(StrTmp);
        }
        CloseHandle(hRemoteThread);
        CloseHandle(hTargetProcess);
        VirtualFreeEx(hTargetProcess,pRemoteThread,4096,MEM_RELEASE);
        if(boolParam)    VirtualFreeEx(hTargetProcess,pRemoteParam,ParamSize,MEM_RELEASE);
        return;
}

void CzhuruDlg::OnBnClickedButton1()
{
        DWORD dwProcessId = 0;
        HWND   hdesktop=::GetDesktopWindow();   
        HWND   hCurWnd = ::GetWindow(hdesktop,GW_CHILD);
    while(hCurWnd )   
    {
                ::GetWindowText(hCurWnd,str,300);
        if (strstr(str,"记事本"))
                {
                        //MessageBox(str,NULL,NULL);
                        GetWindowThreadProcessId(hCurWnd,&dwProcessId);
                        break;
                }
                hCurWnd = ::GetWindow(hCurWnd,GW_HWNDNEXT);
        }
    if(dwProcessId)
        {
                MyClass myc;
                DWORD ParamSum = sizeof(MyClass);
                InjectFunc(dwProcessId,threadProc, 1, (DWORD *)&myc, ParamSum);
        }
}

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 183
活跃值: (1058)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
除了要拷贝类本身的数据成员外,还需要考虑到类的成员函数。
2013-5-27 15:13
0
雪    币: 91
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
能说详细一点嘛。
2013-5-27 16:33
0
雪    币: 183
活跃值: (1058)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
    MyClass myc;
    DWORD ParamSum = sizeof(MyClass);
    InjectFunc(dwProcessId,threadProc, 1, (DWORD *)&myc, ParamSum);

用sizeof(MyClass)计算的内容是没包含类的成员函数的, 类的成员函数还要单独拷贝,并且要记录下拷贝到目标进程的地址,而且还要修正调用类成员函数的相关代码。
可以写个简单测试,看下你拷贝的sizeof(MyClass)到底拷贝了哪些数据, 类成员函数是通过什么方式来调用的(最好在汇编模式下跟踪查看)。
2013-5-27 16:46
0
雪    币: 91
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
那这样就麻烦了。我还不如一个一个函数直接写入执行了。
2013-5-27 18:47
0
雪    币: 53
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
把类写成dll,注入到目标里。
2013-5-29 07:23
0
游客
登录 | 注册 方可回帖
返回
//