当我用的程序把我的DLL插入到另一个进程时,总是不成功,返回的错误代码为0x08即:存储空间不足,无法处理该命令。老大们,什么情况会导致这个错误发生,救救我,我实在搞不明白了。

解决方案 »

  1.   

    我把loadlibrary的调用指令写进被插入的进程里面了,而后由被插入的进程调用loadlibrary把我的DLL加载它的进程空间里去,我的操作系统是win2000。
      

  2.   

    HANDLE CreateRemoteThread(    HANDLE hProcess, // handle to process to create thread in  
        LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes 
        DWORD dwStackSize, // initial thread stack size, in bytes
        LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function 
        LPVOID lpParameter, // pointer to argument for new thread  
        DWORD dwCreationFlags, // creation flags 
        LPDWORD lpThreadId  // pointer to returned thread identifier 
       );
    如果用以上方法实现,要注意参数的正确兴,lpStartAddress应是LoadLibrary的地址,lpParameter是DLL的地址,而且该地址应该位于那个要注射的进程之内,所以要涉及到WriteProcessMemory的调用,另外有些进程需要有调试权限才能注射的
      

  3.   

    远线程的方法也可以。
    http://nowcan.yeah.net找找。
      

  4.   

    “我把loadlibrary的调用指令写进被插入的进程里面了,而后由被插入的进程调用loadlibrary把我的DLL加载它的进程空间里去,我的操作系统是win2000。”如果这样的话,最好能用softice调试看看指令是否正确
      

  5.   

    我的指令应该是没有的问题,可是CreateRemoteThread在其它windowns平台上是没有实现的,并且,用来测试的程序是一个很简单的控制台,我自己写的似乎没有什么权限限制啊
      

  6.   

    我也常这样做就没有遇到过你这样的问题。不过loadlibrary时要注意的问题就是库文件名及函数名字符串的传送,我估计你没传送正确的字符串
      

  7.   

    这是我写的一个函数,将一个dll装载到指定的进程,从而实现真隐身,别人根本就不知道有一个线程在他的进程中执行,注意:并不是所有的进程都可以被加载的:
    BOOL CreateRemoteThreadLoadDll(LPCWSTR lpwLibFile, DWORD dwProcessId)
    {
    BOOL bRet = FALSE;
    HANDLE hProcess = NULL, hThread = NULL;
    PWSTR pszLibRemoteFile = NULL; __try
    {
    hProcess = OpenProcess(
    PROCESS_CREATE_THREAD |
    PROCESS_VM_OPERATION |
    PROCESS_VM_WRITE,
    FALSE, dwProcessId);

    if (hProcess == NULL)
    __leave; int cch = 1 + lstrlenW(lpwLibFile);
    int cb = cch * sizeof(WCHAR); pszLibRemoteFile = (PWSTR)VirtualAllocEx(
    hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
    if (pszLibRemoteFile == NULL)
    __leave;

    BOOL bw = WriteProcessMemory(hProcess, pszLibRemoteFile, 
    (PVOID)lpwLibFile, cb, NULL);
    if (!bw)
    __leave; PTHREAD_START_ROUTINE pfnThreadRnt = (PTHREAD_START_ROUTINE)
    GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
    if (pfnThreadRnt == NULL)
    __leave; hThread = CreateRemoteThread(hProcess, NULL, 0,
    pfnThreadRnt, pszLibRemoteFile, 0, NULL);
    if (hThread == NULL)
    __leave; WaitForSingleObject(hThread, INFINITE); bRet = TRUE;
    }__finally
    {
    if (pszLibRemoteFile != NULL)
    VirtualFreeEx(hProcess, pszLibRemoteFile, 0, MEM_RELEASE);

    if (hThread != NULL)
    CloseHandle(hThread); if (hProcess != NULL)
    CloseHandle(hProcess);
    } return bRet;
    }从指定的进程中卸掉dll
    BOOL CreateRemoteThreadUnloadDll(LPCWSTR lpwLibFile, DWORD dwProcessId)
    {
    BOOL bRet = FALSE;
    HANDLE hProcess = NULL, hThread = NULL;
    HANDLE hSnapshot = NULL; __try
    {
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
    if (hSnapshot == NULL)
    __leave;
    MODULEENTRY32W me = {sizeof(MODULEENTRY32W)};
    BOOL bFound = FALSE;
    BOOL bMoreMods = Module32FirstW(hSnapshot, &me);
    for (; bMoreMods; bMoreMods = Module32NextW(hSnapshot, &me))
    {
    bFound = (lstrcmpiW(me.szModule, lpwLibFile) == 0) ||
    (lstrcmpiW(me.szExePath, lpwLibFile) == 0);
    if (bFound)
    break;
    } if (!bFound)
    __leave; hProcess = OpenProcess(
    PROCESS_CREATE_THREAD |
    PROCESS_VM_OPERATION,
    FALSE, dwProcessId);

    if (hProcess == NULL)
    __leave; PTHREAD_START_ROUTINE pfnThreadRnt = (PTHREAD_START_ROUTINE)
    GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "FreeLibrary");
    if (pfnThreadRnt == NULL)
    __leave; hThread = CreateRemoteThread(hProcess, NULL, 0,
    pfnThreadRnt, me.modBaseAddr, 0, NULL);
    if (hThread == NULL)
    __leave; WaitForSingleObject(hThread, INFINITE); bRet = TRUE;
    }__finally
    {
    if (hSnapshot != NULL)
    CloseHandle(hSnapshot); if (hThread != NULL)
    CloseHandle(hThread); if (hProcess != NULL)
    CloseHandle(hProcess);
    } return bRet;
    }
      

  8.   

    谢谢楼下的老大,我还有一个问题要问啊,就是一般什么情况下,加载一个DLL时,错误代码是0x08,也即:没有存储空间处理此命令啊。另外你在win98下面没有createremotethread这个函数的实现啊,又怎么办啊?我是用的硬指令,而后用WriteProcessMemory函数把这些硬指令编码写到了对方的进程空间里去的。