编译DLL Injector时构建失败

时间:2014-06-23 09:49:36

标签: c++ visual-studio-2010 visual-c++ dll-injection

我是新手C ++编码员。我一直在尝试从互联网教程中编译自己的DLL Injector

这是我的代码:

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


#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;

int main(int argc, char * argv[]) 
{
// The name of the process you want to inject
DWORD pID = GetTargetThreadIDFromProcName("notepad.exe"); 

// Get the dll's full path name 
char buf[MAX_PATH] = {0}; 
GetFullPathName("Project1.dll", MAX_PATH, buf, NULL);  // On the place where is Project1.dll you can put the name of your dll
printf(buf); 
printf("\n"); 

// Inject our main dll
if(!Inject(pID, buf)) 
{ 
 printf("Not loaded!"); // If injection is not sucsessfull 
}
else
{ 
 printf("Loaded!"); //  If injection is sucsessfull 
} 
_getch(); 
return 0; 
} 

BOOL Inject(DWORD pID, const char * DLL_NAME) 
{ 
HANDLE Proc; 
HMODULE hLib; 
char buf[50] = {0}; 
LPVOID RemoteString, LoadLibAddy; 
if(!pID) 
  return false; 
Proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID); 
if(!Proc) 
{ 
  sprintf(buf, "OpenProcess() failed: %d", GetLastError()); 
  //MessageBox(NULL, buf, "Loader", MB_OK); 
  printf(buf); 
  return false; 
} 
LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"); 
// Allocate space in the process for our DLL
RemoteString = (LPVOID)VirtualAllocEx(Proc, NULL, strlen(DLL_NAME), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 
// Write the string name of our DLL in the memory allocated 
WriteProcessMemory(Proc, (LPVOID)RemoteString, DLL_NAME, strlen(DLL_NAME), NULL); 
// Load our <strong class="highlight">DLL</strong> 
CreateRemoteThread(Proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (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) 
{ 
  //MessageBox(NULL, "Error: Unable to create toolhelp snapshot!", "2MLoader", MB_OK); 
  printf("Error: Unable to create toolhelp snapshot!"); 
  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; 
}    

我一直收到错误:

  

“1&gt; Injector.obj:错误LNK2019:未解析的外部符号__imp__StrStrIA @ 8在函数”unsigned long __cdecl GetTargetThreadIDFromProcName(char const *)“中引用(?GetTargetThreadIDFromProcName @@ YAKPBD @ Z)
  1&gt; C:\ Users \ Rizker \ documents \ visual studio 2010 \ Projects \ Injector \ Debug \ Injector.exe:致命错误LNK1120:1个未解析的外部“

感谢任何帮助。哦,是的,这段代码在我格式化我的电脑之前曾经工作过,但在那之后,我认为这种方式有所破坏。

原帖:http://www.mpgh.net/forum/showthread.php?t=209479

1 个答案:

答案 0 :(得分:1)

链接器无法找到StrStrI功能,您应在文件中添加Shlwapi.lib

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