2015-01-17 80 views
-1

我最近一直在学习C++,并且我正处于可以构建足够程序的阶段。DLL注入器问题

目前我只是想将一个DLL注入到我选择的进程中,但我遇到了麻烦,因为它注入时工作正常,但是当我没有DLL时它仍然像注入。

请帮忙。

我的资料来源:

#include <iostream> 
#include <Windows.h> 
#include <TlHelp32.h> 

using namespace std; 
bool InjectDLL(DWORD ProcessID); 

char FileToInject[] = "DLL.dll"; 
char ProcessName[] = "ac_client.exe"; 
typedef HINSTANCE (*fpLoadLibrary)(char*); 

int main() 
{ 
    DWORD processId = NULL; 

    PROCESSENTRY32 pe32 = {sizeof(PROCESSENTRY32)}; 
    HANDLE hProcSnap; 

    while(!processId) 
    { 
     system("CLS"); 
     cout << "|Coded by Proton|" << endl; 
     cout << "Waiting for AssaultCube ..." << endl; 
     hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

     if(Process32First(hProcSnap, &pe32)) 
     { 
      do 
      { 
       if(!strcmp(pe32.szExeFile, ProcessName)) 
       { 
        processId = pe32.th32ProcessID; 
        break; 
       } 
      } 
      while(Process32Next(hProcSnap, &pe32)); 
     } 
     Sleep(1000); 
    } 


    while(!InjectDLL(processId)) 
    { 
     system("CLS"); 
     cout << "DLL failed to inject." << endl; 
     Sleep(1000); 
    } 

    cout << "DLL Injected." << endl << endl; 
    cout << "Closing Injector in 5 seconds ..." << endl; 

    CloseHandle(hProcSnap); 
    Sleep(5000); 

    return 0; 
} 

bool InjectDLL(DWORD ProcessID) 
{ 
    HANDLE hProc; 
    LPVOID paramAddr; 

    HINSTANCE hDll = LoadLibrary("KERNEL32"); 

    fpLoadLibrary LoadLibraryAddr = (fpLoadLibrary)GetProcAddress(hDll, "LoadLibraryA"); 

    hProc = OpenProcess (PROCESS_ALL_ACCESS, false, ProcessID); 

    char dllPath[250] = "C:\\"; 

    strcat(dllPath, FileToInject); 

    paramAddr = VirtualAllocEx(hProc, 0, strlen(dllPath)+1, MEM_COMMIT, PAGE_READWRITE); 
    bool memoryWritten = WriteProcessMemory(hProc, paramAddr, dllPath, strlen(dllPath)+1, NULL); 

    CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryAddr, paramAddr, 0, 0); 

    CloseHandle(hProc); 

    return memoryWritten; 
} 

非常感谢!

+1

看起来很像这个其他问题的代码︰http://stackoverflow.com/q/12138841/103167 –

回答

1

不要忽略来自CreateRemoteThread的返回值。

使用线程句柄检查它是否仍在运行(WaitForSingleObject超时),如果退出,请检查其返回代码。

+0

我认为这有帮助,但我得到的错误,你可以发布后,它看起来像这样做的代码? – HueHueKing

+0

@JoshNazarino不!没人在这里成为你的代码矫正保姆,想象自己。 –