मैं एक प्रोग्राम लिखने की कोशिश कर रहा हूं जो CreateRemoteThread
का उपयोग एक डीएल इंजेक्ट करने के लिए करता है।CreateRemoteTrread वापसी ERROR_ACCESS_DENIED - विंडोज 7 डीएलएल इंजेक्शन
समस्या यह है कि CreateRemoteThread काम करने से इनकार कर रहा है। GetLastError() 5 लौटा रहा है जो ERROR_ACCESS_DENIED है। मैं समझ नहीं सकता क्यों!
मैं इस वीडियो http://www.youtube.com/watch?v=H3O3hmXkt1I से काम कर रहा हूं।
#include <iostream>
#include <direct.h>
#include <Windows.h>
#include <TlHelp32.h>
using namespace std;
char* GetCurrentDir()
{
char* szRet = (char*)malloc(MAX_PATH);
_getcwd(szRet, MAX_PATH);
return szRet;
}
LPCTSTR SzToLPCTSTR(char* szString)
{
LPTSTR lpszRet;
size_t size = strlen(szString)+1;
lpszRet = (LPTSTR)malloc(MAX_PATH);
mbstowcs_s(NULL, lpszRet, size, szString, _TRUNCATE);
return lpszRet;
}
void WaitForProcessToAppear(LPCTSTR lpcszProc, DWORD dwDelay)
{
HANDLE hSnap;
PROCESSENTRY32 peProc;
BOOL bAppeared = FALSE;
while(!bAppeared)
{
if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) != INVALID_HANDLE_VALUE)
{
peProc.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hSnap, &peProc))
while(Process32Next(hSnap, &peProc) && !bAppeared)
if(!lstrcmp(lpcszProc, peProc.szExeFile))
bAppeared = TRUE;
}
CloseHandle(hSnap);
Sleep(dwDelay);
}
}
DWORD GetProcessIdByName(LPCTSTR lpcszProc)
{
HANDLE hSnap;
PROCESSENTRY32 peProc;
DWORD dwRet = -1;
if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) != INVALID_HANDLE_VALUE)
{
peProc.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hSnap, &peProc))
while(Process32Next(hSnap, &peProc))
if(!lstrcmp(lpcszProc, peProc.szExeFile))
dwRet = peProc.th32ProcessID;
}
CloseHandle(hSnap);
return dwRet;
}
BOOL InjectDll(DWORD dwPid, char* szDllPath)
{
DWORD dwMemSize;
HANDLE hProc;
LPVOID lpRemoteMem, lpLoadLibrary;
BOOL bRet = FALSE;
if((hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid)) != NULL)
{
dwMemSize = strlen(szDllPath);
if((lpRemoteMem = VirtualAllocEx(hProc, NULL, dwMemSize, MEM_COMMIT, PAGE_READWRITE)) != NULL)
if(WriteProcessMemory(hProc, lpRemoteMem, szDllPath, dwMemSize, NULL))
{
lpLoadLibrary = GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
if(CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)lpLoadLibrary, lpRemoteMem, 0, NULL) != NULL)
{
bRet = TRUE;
}
cout << GetLastError();
}
}
CloseHandle(hProc);
return bRet;
}
int main()
{
char szProc[MAX_PATH], szDll[MAX_PATH];
char* szDllPath = (char*)malloc(MAX_PATH);
LPTSTR lpszProc = NULL;
for(;;)
{
cout << "Process: ";
cin >> szProc;
cout << "DLL: ";
cin >> szDll;
szDllPath = GetCurrentDir();
strcat_s(szDllPath, MAX_PATH, "\\");
strcat_s(szDllPath, MAX_PATH, szDll);
cout << "Waiting for process.. ." << szDllPath << " " << szDll << endl;
WaitForProcessToAppear(SzToLPCTSTR(szProc), 100);
if(InjectDll(GetProcessIdByName(SzToLPCTSTR(szProc)), szDllPath))
cout << "Injection Succeeded!" << endl;
else
cout << "Injection Failed!" << endl;
cout << "\n";
}
return 0;
उचित मात्रा में गुगलिंग के बाद मुझे कोई कारण नहीं मिल रहा है कि यह क्यों काम नहीं कर रहा है।
क्या बनाएँRemoteThread विंडोज 7 के तहत काम नहीं करता है? यदि ऐसा होता है, तो क्या मैंने कोई स्पष्ट गलतियां की हैं?
इस कोड में बहुत सारी बग हैं। सबसे प्रासंगिक एक GetLastError को कॉल कर रहा है भले ही आपको एपीआई फ़ंक्शन से FALSE रिटर्न न मिले। –
मुझे लगता है कि आपको यह भी सुनिश्चित करना चाहिए कि आप अपनी सामग्री को व्यवस्थापक के रूप में चलाएं, न कि नियमित उपयोगकर्ता के रूप में, क्योंकि यूएसी शायद इंजेक्शन प्रक्रिया के साथ गड़बड़ कर लेता है। – foxx1337
एक एक्सेस संबंधित समस्या यह है कि आपको 'PROCESS_ALL_ACCESS' के साथ 'ओपनप्रोसेस' नहीं बुलाया जाना चाहिए। आवश्यक पहुंच अधिकारों के न्यूनतम सेट के साथ इसे कॉल करें। इसके पीछे कारण यहां दस्तावेज है: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684880(v=vs.85).aspx –