2012-08-27 74 views
-1

我正在尝试做一些DLL注入。我想我尽我所能,但不幸的是没有解决问题。我总是得到ERROR CODE 127,这意味着ERROR_PROC_NOT_FOUND。我正在使用Windows 7 64位。DLL注入失败,代码127

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

using namespace std; 

char FileToInject[] = "theDll.dll"; 
char ProcessName[] = "calc.exe"; 

typedef HINSTANCE (*fpLoadLibrary)(char*); 

bool InjectDLL(DWORD processId); 

int main() { 
    DWORD processId = NULL; 

    PROCESSENTRY32 pre32 = {sizeof(PROCESSENTRY32)}; 
    HANDLE hProcSnap; 
    cout << "BEFORECreateToolhelo32Snapshot:" << GetLastError() <<endl; 
    while(!processId) { 

      system("CLS"); 
      cout << "Searching..." << endl; 
      hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
      cout << "CreateToolhelo32Snapshot:" << GetLastError() <<endl; 

      if(Process32First(hProcSnap, &pre32)) { 

        do { 

         if(!(strcmp(pre32.szExeFile, ProcessName))) { 

          processId = pre32.th32ProcessID; 
          break; 

         } 

        } 
        while(Process32Next(hProcSnap, &pre32)); 
      } 
      Sleep(1000); 
    } 
    cout << GetLastError() <<endl; 
    while(!InjectDLL(processId)) { 
     cout << "DLL Injection failed" << endl; 
     Sleep(1000); 
    } 

    cout << "DLL Injected successfully" << endl; 
    getchar(); 
    CloseHandle(hProcSnap); 

    return 0; 
} 

bool InjectDLL(DWORD processId) { 

    HANDLE hProc; 
    LPVOID paramAddr; 
    cout << "START:" << GetLastError() <<endl; 
    HINSTANCE hDll = LoadLibrary("KERNEL32"); 
    cout << "LoadLibrary:" << GetLastError() <<endl; 

    fpLoadLibrary LoadLibraryAddr = (fpLoadLibrary)GetProcAddress(hDll, "LibraryLoadA"); 
    cout << "LoadLibraryArr:" << GetLastError() <<endl; 
    hProc = OpenProcess(PROCESS_ALL_ACCESS, false, processId); 
    cout << "OpenProcess:" << GetLastError() <<endl; 
    char DllPath[250] = "C:\\Hacks\test.dll"; 

    paramAddr = VirtualAllocEx(hProc, 0, strlen(DllPath) + 1, MEM_COMMIT, PAGE_READWRITE); 
    cout << "VirtualAlloxEx:" <<GetLastError() <<endl; 
    bool MemoryWritten = WriteProcessMemory(hProc, paramAddr, DllPath, strlen(DllPath) + 1, NULL); 
    cout << "WriteProcessMemory:" << GetLastError() <<endl; 
    CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryAddr, paramAddr, 0, 0); 
    cout << "CreateRemoteThread:" <<GetLastError() <<endl; 
    CloseHandle(hProc); 
    return MemoryWritten; 
} 

输出如下:

Searching... 
CreateToolhelp32Snapshot: 18 ERROR_NO_MORE_FILES 
LoadLibrary:18 ERROR_NO_MORE_FILES 
LoadLibraryArr:127 ERROR_PROC_NOT_FOUND 
OpenProcess:127 ERROR_PROC_NOT_FOUND 
VirtualAlloxEx:127 ERROR_PROC_NOT_FOUND 
WriteProcessMemory:127 ERROR_PROC_NOT_FOUND 
CreateRemoteThread:5 ACCESS DENIED 
DLL Injected successfully 

程序找到的calc.exe是没有问题的过程,但在此之后出现问题。有人能帮助我吗?

谢谢

塔马斯

+0

在哪一行是错误?您是否使用依赖关系walker检查导出的过程的确切名称? – tenfour

+0

@thefiloe:如果增加任何价值,请只为该问题添加评论。 –

回答

1

这是一个问题:

char DllPath[250] = "C:\\Hacks\test.dll"; 

最后一个反斜杠没有逃脱。更改为:

char DllPath[250] = "C:\\Hacks\\test.dll"; 

的函数被调用LoadLibraryA(),不LibraryLoadA()

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

其他一些建议:

  • 仅检查GetLastError()如果前面WINAPI函数失败。
  • 只有在以前的WINAPI代码(或其他代码)成功后才能继续处理。
+0

谢谢hmjd这解决了我的问题。还有一件事。我把它发给了我的朋友,他得到了和我一样的输出,但是这对他不起作用。他也在Windows 7 64位上。这怎么会发生?他在他的电脑上建立了解决方案,没有任何问题。 – stomseven

+0

只有我能给的建议是确保一切都一样。你是什​​么意思_same output_?如果你给他的二进制文件有用吗? – hmjd

+0

我认为唯一的区别是我使用Visual C++ Express 2010,他使用最新的VS.建筑物显示没有错误。输出显示没有错误。然而,没有任何反应。 – stomseven

0

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

你倒是应该解决的字符串LoadLibraryA。该

OpenProcess:127 ERROR_PROC_NOT_FOUND 
VirtualAlloxEx:127 ERROR_PROC_NOT_FOUND (<-- sic) 
WriteProcessMemory:127 ERROR_PROC_NOT_FOUND 

错误,因为你正在使用即使GetLastError这些功能也许甚至没有失败引起的。所以在调用GetLastError之前,请确保这些函数产生一个错误返回值(NULL或类似的)。