2013-12-21 23 views
-2

我正在尝试注入一个DLL到一个进程,但编译后我得到 TestMain.obj : error LNK2019: link to unresolved external symbol [email protected] in function "unsigned long __cdecl GetPid(char *)" ([email protected]@[email protected])。经过多年的努力,在我的代码中找到我的问题,并试图谷歌,并与少林僧侣默想,我失败了。 这是我的代码:链接到未解决的符号,同时注入DLL

#include <windows.h> 
#include <stdio.h> 
#include <tlhelp32.h> 
#include <shlwapi.h> 
#include <iostream> 
#include <conio.h> 
using namespace std; 

#define CREATE_THREAD_ACCESS (PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ) 

bool IsWindowsNT() 
{ 
    // check current version of Windows 
    DWORD version = GetVersion(); 
    // parse return 
    DWORD majorVersion = (DWORD)(LOBYTE(LOWORD(version))); 
    DWORD minorVersion = (DWORD)(HIBYTE(LOWORD(version))); 
    return (version < 0x80000000); 
} 

BOOL InjectDLL(DWORD ProcessID,char* DLL_NAME) 
{ 
    HANDLE Proc; 
    char buf[50]={0}; 
    LPVOID RemoteString, LoadLibAddy; 
    if(!ProcessID) 
     return false; 
    Proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID); 
    LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"); 
    RemoteString = (LPVOID)VirtualAllocEx(Proc, NULL, strlen(DLL_NAME), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); 
    WriteProcessMemory(Proc, (LPVOID)RemoteString, DLL_NAME,strlen(DLL_NAME), NULL); 
    CreateRemoteThread(Proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)RemoteString, NULL, NULL); 
    CloseHandle(Proc); 

    return true; 
} 

DWORD GetPid(char *procName) 
{ 
    PROCESSENTRY32 pe; 
    HANDLE thSnapshot; 
    BOOL retval, ProcFound = false; 

    thSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

    if(thSnapshot == INVALID_HANDLE_VALUE) 
    { 
     cout << "Error: unable to create toolhelp snapshot" << endl; 
    // MessageBox(NULL, "Error: unable to create toolhelp snapshot", "Loader", NULL); 
     return false; 
    } 

    pe.dwSize = sizeof(PROCESSENTRY32); 

    retval = Process32First(thSnapshot, &pe); 

    while(retval) 
    { 
     if(StrStrI(pe.szExeFile, procName)) 
     { 
     ProcFound = true; 
     break; 
     } 

     retval = Process32Next(thSnapshot,&pe); 
     pe.dwSize = sizeof(PROCESSENTRY32); 
    } 
    if (!ProcFound) return 0; 
    return pe.th32ProcessID; 
} 

BOOL LoadDll(char *procName, char *dllName) 
{ 
    DWORD ProcID = 0; 

    ProcID = GetPid(procName); 

    if(!(InjectDLL(ProcID, dllName))) 
    { 
     cout << "Process located, but injection failed" << endl; 
     _getch(); 
     exit(1); 
    } // MessageBox(NULL, "Process located, but injection failed", "Loader", NULL); 
    else 
    { 
     cout << " Injection successfull!" << endl; 
     _getch(); 
    } 
    return true; 
} 


int main() 
{ 
    char* ProcName = "notepad.exe"; 
    char* DllName = "Main.dll"; 
    LoadDll(ProcName, DllName); 
    return 0; 
} 

我的DLL:

#include <Windows.h> 
DWORD APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 
{ 
    switch(ul_reason_for_call) 
    { 
    case DLL_PROCESS_ATTACH: 
    // hInstance = (HINSTANCE) hModule; 
     MessageBox(0, "HOHOHOOHOHOHO!", "DLLHOOK", MB_OK); 
     return TRUE; 
    case DLL_PROCESS_DETACH: 
     break; 
    } 
    return TRUE; 
} 

所以今天的主要问题是,error.Thanks回答。

回答

3

尝试增加

#pragma comment (lib, 'Shlwapi.lib') 

下方的其他#includes

+0

THX它的工作,这意味着,我添加了一个头,这是没有LIB文件? – user3125836

+0

是的。它没有链接lib文件。该项目不包含一些默认链接的库,因此当您使用不常用的头时,请检查是否将lib文件包含在项目中。 – Valentin

+0

Thx回答 – user3125836