Я создал метод инъекции dll на моей машине на С++, который отлично работает, когда я пытаюсь вставить определенную DLL в игру. Однако, когда я запускаю программу на моем компьютере-друге (где распространяются распространяемые компоненты Visual Studio, я не предупреждаю, что мне нужен MSVCR и т.д. (Распространяемые).
Поэтому я собрал в режиме выпуска следующий параметр в Visual Studio 2012: Библиотека времени выполнения: многопотоковая /MT . Теперь, когда я запускаю его на своего друга
Я предупреждаю, что мне нужна только библиотека MSVCP110D.dll (странно, запрашивая отладочную версию) (нет антивируса, и UAC отключен).
Я скопировал запрошенную библиотеку вручную в пути выпуска и все еще не работаю.
В чем проблема?
Это код инъекции, который я сделал:
#include <Windows.h>
#include <iostream>
#include <stdio.h>
#include <string>
#include <TlHelp32.h>
class process
{
private:
HWND hProcWnd ;
DWORD id ;
LPCWSTR lpWindowName ;
struct PPARAM
{
DWORD pId ;
HWND pHwnd ;
};
public:
process(string lpProcessName)
{
HANDLE process_list = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 lcProcess;
PPARAM pParam;
pParam.pHwnd = nullptr;
lcProcess.dwSize = sizeof(PROCESSENTRY32);
do {
char ch[260];
char DefChar = ' ';
WideCharToMultiByte(CP_ACP,0,lcProcess.szExeFile,-1,ch,260,&DefChar, NULL);
string ss(ch);
if(ss == lpProcessName)
{
id = lcProcess.th32ProcessID;
pParam.pId = id;
EnumWindows(enumCallback , (LPARAM)&pParam);
break;
}
}while(Process32Next(process_list,&lcProcess));
hProcWnd = pParam.pHwnd;
}
static BOOL CALLBACK enumCallback(HWND hWnd , LPARAM lParam)
{
DWORD _tId = 0;
PPARAM &pData = *(PPARAM*)lParam;
GetWindowThreadProcessId(hWnd , &_tId);
if(_tId != pData.pId)
{
return 1;
}
pData.pHwnd = hWnd;
return 0;
}
int inject(string lpLibraryPath)
{
if(hProcWnd == nullptr)
{
printf(ERROR_HWND_INEXISTENT);
return 0;
}
HANDLE hProc;
LPVOID paramAddr;
HINSTANCE hDll;
hDll = LoadLibrary(L"KERNEL32");
fpLoadLibrary LoadLibraryAddr = (fpLoadLibrary)GetProcAddress(hDll, "LoadLibraryA");
hProc = OpenProcess(PROCESS_ALL_ACCESS, false, id);
paramAddr = VirtualAllocEx(hProc, 0, strlen(lpLibraryPath.c_str()) + 1, MEM_COMMIT, PAGE_READWRITE);
if(WriteProcessMemory(hProc, paramAddr, lpLibraryPath.c_str(), strlen(lpLibraryPath.c_str()) + 1, NULL) == NULL)
{
printf("\nCouldn't write data to process : %s , error code : %s\n" , lpLibraryPath.c_str() , GetLastError());
return 0;
}
CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryAddr, paramAddr, 0, 0);
CloseHandle(hProc);
return 1;
}
};
Вот основная функция - здесь я вызываю метод
int main()
{
string pName;
string dllPath = "c:\\C++ Dll to inject.dll";
cout<<"Enter the process to inject the dll into: ";
getline(cin , pName);
app::process prc(pName);
if(prc.inject(dllPath))
{
printf("Succesfully injected into process !\n\n\n");
}
return 0;
}
Я нашел несколько ссылок на stackoverflow, но они не помогли. как msvcp110.dll, как мне обойти это? или Отсутствует "MSVCP110D.dll" на вашем компьютере ". вопрос