我确实想不出如何插入两个线程!

解决方案 »

  1.   

    可以用钩子插入
    可以修改注册表app_init项
    可以CreateRemoteThread
      

  2.   

    谢谢上面的大哥,有简单的程序吗?主要是插入部分,象面的程序如何插:
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
        switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    MyMain();
    break;
    case DLL_THREAD_ATTACH:
    break;
    case DLL_THREAD_DETACH:
    break;
    case DLL_PROCESS_DETACH:
    break;
        }
        return TRUE;
    }
    int MyMain()
    {
    WSADATA wsadata;
    ...........

    while (true) //循环等待,如有新的连接请求就接收
    {
    msgsockid = new SOCKET;
    *msgsockid = accept(sockid, (sockaddr*)&srv_addr,NULL);
    if (*msgsockid == INVALID_SOCKET)
    {
    delete msgsockid;
    Sleep(2000);
    }
    else
    {
    //创建用户线程
    if (CreateThread(NULL,
    0,
    (LPTHREAD_START_ROUTINE)UserThread,
    msgsockid,
    0,
    NULL) == NULL)
    {
    delete msgsockid;
    Sleep(2000);
    }
    }
    } return 0;
    }
    DWORD WINAPI UserThread(SOCKET *UserSockid)
    {
    .......}
      

  3.   

    上面的如dll 里的可以用钩子插入
    比如对指定程序挂wh-getmessage,钩子被调用时你的dll就被隐射到远进程的地址空间了,mymain()也就得以运行。挂钩子我就不说了哈。
    自己程序里的线程函数可以先openprocess打开你要插入的线程(权限不够的话先提升权限),在里面分配空间writeprocess将你的线程函数和参数写进去,最后createremotethread运行。
      

  4.   

    我的顾虑是:分配空间writeprocess将线程函数和参数写进去,是要写两次吧,因为我有两个函数,先将MyMain写入,但mymain要调用UserThread,我们知道函数地址,这个时候我就不知道怎样搞了