【问题标题】:Link to unresolved symbol while injecting dll [duplicate]注入dll时链接到未解析的符号[重复]
【发布时间】:2013-12-21 19:18:09
【问题描述】:

我正在尝试将 dll 注入进程,但编译后我得到 TestMain.obj : error LNK2019: link to unresolved external symbol __imp__StrStrIA@8 in function "unsigned long __cdecl GetPid(char *)" (?GetPid@@YAKPAD@Z)。经过多年尝试在我的代码中找到我的问题并尝试用谷歌搜索它,并与少林僧侣一起冥想,我失败了。 这是我的代码:

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

所以主要问题是那个错误。感谢您的回答。

【问题讨论】:

    标签: c++ winapi dll code-injection


    【解决方案1】:

    尝试添加

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

    低于你的另一个#includes

    【讨论】:

    • 谢谢它的工作,这意味着我添加了一个标题 并且它没有 lib 文件?
    • 是的。它没有链接lib文件。项目默认不包含一些用于链接的库,所以当你使用不常用的头文件时,请检查项目中是否包含lib文件。
    • 'Shlwapi.lib' 是一个常数,它应该是“Shlwapi.lib”,因为 Visual Studio 正在输出错误。
    猜你喜欢
    • 2014-01-02
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2019-08-15
    • 2011-11-15
    相关资源
    最近更新 更多