gpt4 book ai didi

winapi - CreateRemoteThread 返回 ERROR_ACCESS_DENIED - Windows 7 DLL 注入(inject)

转载 作者:行者123 更新时间:2023-12-03 22:32:24 42 4
gpt4 key购买 nike

我正在尝试编写一个使用 CreateRemoteThread 的程序注入(inject)一个dll。

问题是 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;

经过大量的谷歌搜索后,我找不到这不应该工作的原因。

CreateRemoteThread 在 Windows 7 下不起作用吗?
如果是这样,我是否犯了任何明显的错误?

最佳答案

它失败的原因是因为您的代码是 32 位的,而您的目标进程是 64 位的。

您拥有多少特权并不重要。 Windows 不会让这种情况发生。

我有同样的问题。要么生成一个系统 32 位 exe 并将其注入(inject),要么将代码移植到 64 位(这意味着它不能在 32 位系统上运行)。

编辑

很久以前,我发现了一种将代码注入(inject)和从任何处理器模式目标中注入(inject)的好方法。它涉及将处理器模式动态切换到(任何)目标的模式。被称为“天堂之门”。为此,您必须使用内联汇编。所以基本上你可以在 32 位 exe 中同时拥有 64 位和 32 位代码,检测机器是否为 64 位,然后跳转到 64 位模式并运行 64 位代码。然后,您将遍历导入以找到 ntdll 并加载 64 位 kernel.dll 和其他库。以下是任何感兴趣的人的示例链接:http://bit.ly/19P0Lh3

关于winapi - CreateRemoteThread 返回 ERROR_ACCESS_DENIED - Windows 7 DLL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9456228/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com