我写了一个程序,向IE8远程注入一个DLL,采用的是CreateRemoteThread+LoadLibrary的方式。
我在注入的dll中声明了一个有虚函数的类,并且定义了这个类的一个全局静态对象。当远程注入时,dllmain函数中创建了一个新的有消息循环的线程。
问题在于,在某些XP+IE8的机器中,当我在新线程中调用全局静态对象的虚方法时发生Access violation,崩溃。
大部分机器都完全没有问题。同时,还有一些机器,当我使用windebug open exectable打开IE8时,进程发生上面的崩溃,如果不使用windebug,则正常。
而且,当我将全局静态变量在dllmain中new出来,全局仅保存对象指针,则正常。
这种诡异现象不知道是否有高手可以指点迷津!

解决方案 »

  1.   

    有没有用GetProcessAddress获得LoadLibrary在kernel中的确切地址?
    有没有用VirtualAllocEx在无端进程空间为dll文件名分配空间?
    还有,为什么用 全局静态对象?
      

  2.   

    内存访问冲突嘛,因为debug模式下内存多是可以读可写的,而正常运行时就按原来规定的访问属性进行了保护,这时候不严谨的代码就会出错了。
      

  3.   

    你是在DllMain里创建线程的,在线程执行并调用函数的时候,你是否能保证全局静态变量里的对象的构造函数已经被调用完毕?可以试下写个导出函数,创建线程,多调用一次CreateRemoteThread来执行这个函数。