2016-06-13 8 views
-2

Я не могу понять причину, по которой я получаю эту ошибку, у меня был внешний вид и, видимо, это связано с определением функции, которая ничего не делает? Я не могу сказать, что проблема здесь, к сожалению, поэтому любая помощь будет оценена по достоинству.C++ - Неразрешенный внешний в DLL Injector

Вот мой исходный код:

main.cpp

#include <Windows.h> 
#include <tlhelp32.h> 
#include <shlwapi.h> 
#include <conio.h> 
#include <stdio.h> 
#include <iostream> 

using namespace std; 

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

BOOL Inject(DWORD pID, const char * DLL_NAME); 
DWORD GetTargetThreadIDFromProcName(const char * ProcName); 

using namespace std; 

char buf[MAX_PATH]; 
LPVOID RemoteString, LoadLib; 
HANDLE Proc; 
DWORD pID; 

__int32 main() 
{ 
    pID = GetTargetThreadIDFromProcName("Program.exe"); 

    buf[MAX_PATH] = {0}; 
    GetFullPathName("DLL.dll", MAX_PATH, buf, NULL); 

    if(!Inject(pID, buf)) cout << ("Failed to inject!\n\n\n"); 
    system("pause"); 
    return 0; 
} 

BOOL Inject(DWORD pID, const char * DLL_NAME) 
{ 
    char buf[50] = {0}; 

    if(!pID) return false; 

    Proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID); 
    if(!Proc) return false; 

    LoadLib = (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)LoadLib, (LPVOID)RemoteString, NULL, NULL); 
    CloseHandle(Proc); 
    return true; 
} 

DWORD GetTargetThreadIDFromProcName(const char * ProcName) 
{ 
    PROCESSENTRY32 pe; 
    HANDLE thSnapShot; 
    BOOL retval, ProcFound = false; 

    thSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    if(thSnapShot == INVALID_HANDLE_VALUE) return false; 

    pe.dwSize = sizeof(PROCESSENTRY32); 
    retval = Process32First(thSnapShot, &pe); 
    while(retval) 
    { 
     if(StrStrI(pe.szExeFile, ProcName)) return pe.th32ProcessID; 
     retval = Process32Next(thSnapShot, &pe); 
    } 
    return 0; 
} 

Ошибка я получаю следующее:

main.obj

unresolved external symbol [email protected] referenced in function "unsigned long __cdecl GetTargetThreadIDFromProcName(char const *)" ([email protected]@[email protected]) 

Injector.exe

1 unresolved externals 

Любые решения или просто помощь в понимании, почему это происходит, было бы здорово!

+1

Вы ссылаетесь на 'shlwapi.lib'? https://msdn.microsoft.com/en-us/library/windows/desktop/bb773439(v=vs.85).aspx – Niall

+0

Да, я сделал это, ничего не изменилось. –

ответ

0

Как уже упоминалось в комментариях, похоже, что вы не связываетесь с shlwapi.lib. Вам нужно сделать это, чтобы позвонить StrStrI.