我的问题是:DLL是采用远线程注入的方法,
已经成功在远程进程中使用远线程的方法成功装载,
但是,在注入的DLL的DllMain()入口函数中,却不能使用CreateThread()的方法执行DLL中的其他函数,
这些函数中都没有 while 循环,
一般什么情况下这样的方法会失败?

解决方案 »

  1.   

    应该不会吧,DllMain中用CreateThread是通常用的方法
      

  2.   

    回复#1楼:可是我的就是失败,
    非常的郁闷,
    其实我的代码很简单,
    就是使用 CreateThread() 执行一个 DllThreadFunction() 函数,
    DllThreadFunction() 函数中仅仅使用了几句嵌入汇编,最后用 memcpy() 对远程进程的代码进行了写操作,
    其实代码就很简单的几行,就不贴出来了,
    主要想听听大家的真知灼见,
    有什么原因会失败?
      

  3.   

    你所说的不能用,到底是CreateThreae没执行,还是执行了,但是线程没有启动起来,还是线程也启动了,但是线程执行时出错了。
      

  4.   

    回复#3楼:我在DllMain中,在CreateThread()后面放了一个
    if( hThread == 0 )
    {
    MessageBox()...
    }
    然后这个 MessageBox() 总是弹出来...
      

  5.   

    回复#4楼:我在DllMain中,在CreateThread()后面放了一个if( hThread == 0 )
    {
    MessageBox()...
    }然后这个 MessageBox() 总是弹出来...
      

  6.   


    hDllThread = ::CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)(&DllThreadFunction), NULL, 0, &DllThreadId );
    if( hDllThread == 0 )
    {
    MessageBox()...
    }这个 MessageBox 会永远弹出来...
      

  7.   

    直接弹出一个messagebox只能算是毫无用处,它除了告诉你错了之外啥也不能告诉你
    至少你得在失败后用GetLastError得到当前错误码,并且用下面帖子中35楼得方法把错误信息报告出来http://topic.csdn.net/u/20100602/09/325d1209-b8d5-44c9-a69a-c647eb5b0d6b.html
      

  8.   

    采用回调函数都方法试试
    包含头文件 Windows
    DWORD __stdcall ThreadOne(LPVOID lParam)
    {
      //函数体
    }
      

  9.   

    非常感谢LS诸位热情的回复帮助,现在问题解决了,
    现在把问题原因写出来,给大家提供参考,原因就是 Visual Studio 2005 的 SDK 省略了 DllMain() 入口函数的一些代码,
    当时 DllMain() 创建时, 是个空函数,
    参考了 Jeffrey Richter 的书, 在 DllMain() 中自己手动添加如下代码就可以了:
    switch( ul_reason_for_call )
    {
    case DLL_PROCESS_ATTACH:
    // 在此处创建线程
    break;
    case ...
    }