首页
社区
课程
招聘
未解决 [求助]远程线程注入windows10 64位计算器失败
发表于: 2020-3-25 21:28 5780

未解决 [求助]远程线程注入windows10 64位计算器失败

2020-3-25 21:28
5780
系统环境 :windows10 64位
我注入其它程序(如记事本)可以,注入计算器就失败。使用鬼手56大佬的也是注入失败。有没有大佬能给小弟解解惑
	// 1.打开目标进程
	HANDLE hProcess = OpenProcess(
		PROCESS_ALL_ACCESS,		// 打开权限
		FALSE,					// 是否继承
		dwProcessId);			// 进程PID
	if (NULL == hProcess)
	{
		MessageBox(L"打开目标进程失败!");
		return FALSE;
	}

	// 2.在目标进程中申请空间
	LPVOID lpPathAddr = VirtualAllocEx(
		hProcess,					// 目标进程句柄
		0,							// 指定申请地址
		strlen(pszDllFileName)+1,	// 申请空间大小
		MEM_RESERVE | MEM_COMMIT,	// 内存的状态
		PAGE_READWRITE);			// 内存属性
	if (NULL == lpPathAddr)
	{
		MessageBox(L"在目标进程中申请空间失败!");
		CloseHandle(hProcess);
		return FALSE;
	}

	// 3.在目标进程中写入Dll路径
	SIZE_T dwWriteSize = 0;
	if (FALSE == WriteProcessMemory(
		hProcess,					// 目标进程句柄
		lpPathAddr,					// 目标进程地址
		pszDllFileName,					// 写入的缓冲区
		strlen(pszDllFileName) + 1,	// 缓冲区大小
		&dwWriteSize))				// 实际写入大小
	{
		MessageBox(L"目标进程中写入Dll路径失败!");
		CloseHandle(hProcess);
		return FALSE;
	}

	//获取LoadLibraryA的函数地址
	//FARPROC可以自适应32位与64位
	FARPROC pFuncProcAddr = GetProcAddress(GetModuleHandle((LPCWSTR)L"kernel32.dll"),"LoadLibraryA");
	if (NULL == pFuncProcAddr)
	{
		MessageBox(L"获取LoadLibrary函数地址失败!");
		CloseHandle(hProcess);
		return FALSE;
	}

	// 4.在目标进程中创建线程
	HANDLE hThread = CreateRemoteThread(
		hProcess,					// 目标进程句柄
		NULL,						// 安全属性
		NULL,						// 栈大小
		(PTHREAD_START_ROUTINE)pFuncProcAddr,	// 回调函数
		lpPathAddr,					// 回调函数参数
		NULL,						// 标志
		NULL						// 线程ID
	);
	if (NULL == hThread)
	{
		MessageBox(L"目标进程中创建线程失败!");
		CloseHandle(hProcess);
		return FALSE;
	}

	// 5.等待线程结束
	WaitForSingleObject(hThread, -1);

	// 6.清理环境
	VirtualFreeEx(hProcess, lpPathAddr, 0, MEM_RELEASE);
	CloseHandle(hThread);
	CloseHandle(hProcess);
	return TRUE;
}
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
	{
		MessageBox(NULL, L"远程线程注入成功!", L"提示", NULL);
		break;
	}
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-3-25 21:50 被自己的小白编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (20)
雪    币: 201
活跃值: (234)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
代码贴出来啊兄弟
2020-3-25 21:44
0
雪    币: 2255
活跃值: (238)
能力值: ( LV6,RANK:85 )
在线值:
发帖
回帖
粉丝
3
拍手笑沙鸥 代码贴出来啊兄弟
代码应该没有问题,记事本可以注入成功,win7 计算器也可以注入成功,就win10 计算器不知道为啥不行
2020-3-25 21:52
0
雪    币: 4154
活跃值: (1535)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
注入用的程序是64位吗?你的代码在我的系统上成功了...
2020-3-25 22:40
0
雪    币: 2255
活跃值: (238)
能力值: ( LV6,RANK:85 )
在线值:
发帖
回帖
粉丝
5
Boring勇哥 注入用的程序是64位吗?你的代码在我的系统上成功了...
是64位
2020-3-26 00:08
1
雪    币: 4154
活跃值: (1535)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
自己的小白 是64位
你可以把dll的名称改成ntdll,然后等待线程结束后读取线程的退出代码(也就是LoadLibraryA的返回值),看看是不是nullptr。这样可以排除注入程序的问题。
2020-3-26 00:35
0
雪    币: 10967
活跃值: (2930)
能力值: ( LV5,RANK:71 )
在线值:
发帖
回帖
粉丝
7
win10 64 进程名?calc?
2020-3-26 09:47
0
雪    币: 2255
活跃值: (238)
能力值: ( LV6,RANK:85 )
在线值:
发帖
回帖
粉丝
8
joker陈 win10 64 进程名?calc?
2020-3-26 11:41
0
雪    币: 2255
活跃值: (238)
能力值: ( LV6,RANK:85 )
在线值:
发帖
回帖
粉丝
9
Boring勇哥 你可以把dll的名称改成ntdll,然后等待线程结束后读取线程的退出代码(也就是LoadLibraryA的返回值),看看是不是nullptr。这样可以排除注入程序的问题。
我试试看,感谢
2020-3-26 11:41
0
雪    币: 2255
活跃值: (238)
能力值: ( LV6,RANK:85 )
在线值:
发帖
回帖
粉丝
10
Boring勇哥 你可以把dll的名称改成ntdll,然后等待线程结束后读取线程的退出代码(也就是LoadLibraryA的返回值),看看是不是nullptr。这样可以排除注入程序的问题。
我注入记事本退出代码就不是0,注入计算器退出代码就是0
2020-3-26 12:10
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
win10 各种奇葩的限制 ASLR  CFG GS保护 ACG CIG保护啊 还有在ETW新增加的一大坨监视 原先win7不监视的一些中断 页面 异常啊 键鼠啊 它都可以检测 默认开启的hypervistor啊  页面隔离补丁啊 各种细节 你都注意到了吗
最后于 2020-3-26 13:53 被killpy编辑 ,原因:
2020-3-26 13:51
0
雪    币: 429
活跃值: (423)
能力值: ( LV6,RANK:81 )
在线值:
发帖
回帖
粉丝
12
low level原因吧?或许你dll打印调试信息是成功的
2020-3-26 14:25
0
雪    币: 2255
活跃值: (238)
能力值: ( LV6,RANK:85 )
在线值:
发帖
回帖
粉丝
13
killpy win10 各种奇葩的限制 ASLR  CFG GS保护 ACG CIG保护啊&nb ...
好多都不了解,学到了,感谢
2020-3-26 15:54
0
雪    币: 2255
活跃值: (238)
能力值: ( LV6,RANK:85 )
在线值:
发帖
回帖
粉丝
14
mlgbwoai low level原因吧?或许你dll打印调试信息是成功的
低权限吗,我提权了
2020-3-26 15:56
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
我也没成功....你成功了么
2020-3-26 23:06
0
雪    币: 2255
活跃值: (238)
能力值: ( LV6,RANK:85 )
在线值:
发帖
回帖
粉丝
16
mb_qmsimfgr 我也没成功....你成功了么
没有,而且我试了试APC注入好像也不行
2020-3-27 09:48
0
雪    币: 4154
活跃值: (1535)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
楼主你的win10版本号多少我装个试试
2020-3-27 10:53
0
雪    币: 2255
活跃值: (238)
能力值: ( LV6,RANK:85 )
在线值:
发帖
回帖
粉丝
18
Boring勇哥 楼主你的win10版本号多少我装个试试
2020-3-27 11:04
0
雪    币: 4154
活跃值: (1535)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
19
我知道了。

如图,我用调试器附加在计算器上手动加载一个dll,失败了,LastError是ERROR_ACCESS_DENIED。
经查资料发现,计算器在win10系统中是 App Containor(类似于沙箱的虚拟环境) 应用程序 ,这种应用程序会受制于一个特殊的系统用户 "ALL APPLICATION PACKAGES",检查被加载的dll文件的访问控制列表可知,上述用户没有访问此文件的权限,故拒绝访问。
解决方案:如图,手动修改dll文件的访问控制列表,授予"ALL APPLICATION PACKAGES"读取和执行权限。

验证:

加载成功。理论上远程线程也会加载成功。
2020-3-27 19:40
0
雪    币: 2255
活跃值: (238)
能力值: ( LV6,RANK:85 )
在线值:
发帖
回帖
粉丝
20
感谢,学到了
2020-3-28 11:04
0
雪    币: 223
活跃值: (180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
#include <iostream>
#include <windows.h>
#include <string.h>
#include <string>
using namespace std;

HWND hwnd = NULL;
DWORD dwProcessId = NULL;
HANDLE hProcess = NULL;
PVOID lpPathAddr = NULL;

char pszDllFileName[25] = "F:\\test\\1\\2Dll1.dll";
char loadfunc[25] = "LoadLibraryA";
FARPROC loadfuncaddr = NULL;

BOOL todo(){
 hwnd = ::FindWindow("Notepad", NULL);	//以注入记事本为例
 if (hwnd == NULL)
 {
     MessageBox(NULL, "找不到记事本", "错误", MB_OK);
 }
   GetWindowThreadProcessId(hwnd, &dwProcessId);

// 1.打开目标进程
HANDLE hProcess = OpenProcess(
    PROCESS_ALL_ACCESS,     // 打开权限
    FALSE,                  // 是否继承
    dwProcessId);           // 进程PID
if (NULL == hProcess)
{
    MessageBox(NULL, "打开目标进程失败", "错误", MB_OK);
    return FALSE;
}

// 2.在目标进程中申请空间
LPVOID lpPathAddr = VirtualAllocEx(
    hProcess,                   // 目标进程句柄
    0,                          // 指定申请地址
    strlen(pszDllFileName) + 1,   // 申请空间大小
    MEM_RESERVE | MEM_COMMIT, // 内存的状态
    PAGE_READWRITE);            // 内存属性
if (NULL == lpPathAddr)
{
    MessageBox(NULL, "在目标进程中申请空间失败", "错误", MB_OK);
    CloseHandle(hProcess);
    return FALSE;
}

// 3.在目标进程中写入Dll路径
SIZE_T dwWriteSize = 0;
if (FALSE == WriteProcessMemory(
    hProcess,                   // 目标进程句柄
    lpPathAddr,                 // 目标进程地址
    pszDllFileName,                 // 写入的缓冲区
    strlen(pszDllFileName) + 1,   // 缓冲区大小
    &dwWriteSize))              // 实际写入大小
{
    MessageBox(NULL, "目标进程中写入Dll路径失败!", "错误", MB_OK);
    CloseHandle(hProcess);
    return FALSE;
}

//获取LoadLibraryA的函数地址
//FARPROC可以自适应32位与64位
FARPROC pFuncProcAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
if (NULL == pFuncProcAddr)
{
    MessageBox(NULL, "获取LoadLibrary函数地址失败!", "错误", MB_OK);
    CloseHandle(hProcess);
    return FALSE;
}

// 4.在目标进程中创建线程
HANDLE hThread = CreateRemoteThread(
    hProcess,                   // 目标进程句柄
    NULL,                       // 安全属性
    NULL,                       // 栈大小
    (PTHREAD_START_ROUTINE)pFuncProcAddr,   // 回调函数
    lpPathAddr,                 // 回调函数参数
    NULL,                       // 标志
    NULL                        // 线程ID
);
if (NULL == hThread)
{
    MessageBox(NULL, "目标进程中创建线程失败!", "错误", MB_OK);
    CloseHandle(hProcess);
    return FALSE;
}

// 5.等待线程结束
WaitForSingleObject(hThread, -1);

// 6.清理环境
VirtualFreeEx(hProcess, lpPathAddr, 0, MEM_RELEASE);
CloseHandle(hThread);
CloseHandle(hProcess);
return TRUE;
}

int main()
{
    std::cout << "Hello World!\n";
    todo();
}


注入DLL还是借用你的

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        MessageBox(NULL, L"远程线程注入成功!", L"提示", NULL);
        break;
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}



我借用你的记事本都注入不了,能否帮抽空看下,操作系统版本如下:

2020-8-20 22:54
0
游客
登录 | 注册 方可回帖
返回
//