首页
社区
课程
招聘
[求助]windows64位 dll注入到任务管理器问题
发表于: 2018-1-31 14:51 6358

[求助]windows64位 dll注入到任务管理器问题

2018-1-31 14:51
6358
系统:windows 7旗舰版  x64
部件:   inject.exe-------用来将dll注入到任务管理器         活动解决方案平台:x64(也就是说是64位)
              injectdll.dll------需要注入的dll                              活动解决方案平台:x64 (也就是说是64位)
编译:vs2010   在windows 7旗舰版 32位 上编译
这是我远程注入的流程:

详细:VirtualAllocEx------在宿主进程中为我的线程和线程参数申请空间
           WriteProcessMemory------在申请的空间中写入内容
           CreateRemoteThread------找到kernel32.dll中LoadLibraryA的地址,作为我起的线程的start address,通过这个线程注入我的injectdll.dll到任务管理器中。
我用相同的代码在windows 7旗舰版 32位上是能够成功注入任务管理器中,但是到了windows7旗舰版 64位就不行了
执行步骤到 CreateRemoteThread都是正确的,但是dll就是没有成功注入到任务管理器中,但是能够注入到其他普通的非任务管理器中。是因为x64任务管理器权限比较高还是怎么?
我在网上找到了如下代码:
//提升进程访问权限  
bool enableDebugPriv()  
{  
	HANDLE hToken;  
	LUID sedebugnameValue;  
	TOKEN_PRIVILEGES tkp;  

	if (!OpenProcessToken(GetCurrentProcess(),   
		TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {  
			return false;  
	}  
	if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) {  
		CloseHandle(hToken);  
		return false;  
	}  
	tkp.PrivilegeCount = 1;  
	tkp.Privileges[0].Luid = sedebugnameValue;  
	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  
	if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) {  
		CloseHandle(hToken);  
		return false;  
	}  
	return true;  
}   
提高权限后,任然不能够成功注入。
各位能不能给我点指点,或者提供点思路?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (20)
雪    币: 139
活跃值: (193)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
64位程序无法加载32位DLL
2018-1-31 15:35
0
雪    币: 285
活跃值: (1100)
能力值: ( LV13,RANK:405 )
在线值:
发帖
回帖
粉丝
3
可以GetLastError看一下,去msdn查一下返回值,看看错误原因
2018-1-31 15:42
0
雪    币: 206
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
醉花阴柳 64位程序无法加载32位DLL
dll是64位的
2018-1-31 15:43
0
雪    币: 206
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
sudozhange 可以GetLastError看一下,去msdn查一下返回值,看看错误原因
getlasterror:0                                  执行正常
现在是我注入其他程序是正常的,注入任务管理器就是不行
2018-1-31 15:47
0
雪    币: 285
活跃值: (1100)
能力值: ( LV13,RANK:405 )
在线值:
发帖
回帖
粉丝
6
这小孩真骚 getlasterror:0 执行正常 现在是我注入其他程序是正常的,注入任务管理器就是不行
内存区段呢,你的注入是哪种注入?
2018-1-31 15:53
0
雪    币: 285
活跃值: (1100)
能力值: ( LV13,RANK:405 )
在线值:
发帖
回帖
粉丝
7
刚才我测试了下,如果用管理员权限是可以注入的,否则权限不足
2018-1-31 16:07
0
雪    币: 206
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
sudozhange 刚才我测试了下,如果用管理员权限是可以注入的,否则权限不足
这是我在网上找的实现代码,就是标准的CreateRemoteThread   我这边也用了管理员的方式执行任然不行,测试dll是64位的dll,就是任务管理器注入不进去
int main(int argc, char* argv[])  
{  

	//定义线程体的大小  
	const DWORD dwThreadSize = 4096;  
	DWORD dwWriteBytes;  
	//提升进程访问权限  
	enableDebugPriv();  

	char *szExeName="taskmgr.exe";
OutputDebugStringA("1");
	DWORD dwProcessId = processNameToId(szExeName);  
	if (dwProcessId == 0) {  
		OutputDebugStringA("no this exe");
		return -1;  
	}  
	//根据进程ID得到进程句柄  
	HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);  
	OutputDebugStringA("2");
	if (!hTargetProcess) {  
		OutputDebugStringA("Open target process failed !");  
		return 0;  
	}  

	//在宿主进程中为线程体开辟一块存储区域  
	//在这里需要注意MEM_COMMIT | MEM_RESERVE内存非配类型以及PAGE_EXECUTE_READWRITE内存保护类型  
	//其具体含义请参考MSDN中关于VirtualAllocEx函数的说明。  
	void* pRemoteThread = VirtualAllocEx(hTargetProcess, 0,   
		dwThreadSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);  
	if (!pRemoteThread) {  
		OutputDebugStringA("Alloc memory in target process failed !");  
		return 0;  
	}  
	OutputDebugStringA("3");
	//将线程体拷贝到宿主进程中  
	if (!WriteProcessMemory(hTargetProcess,   
		pRemoteThread, &threadProc, dwThreadSize, 0)) {  
			OutputDebugStringA("Write data to target process failed !");  
			return 0;  
	}  
	//定义线程参数结构体变量  
	RemoteParam remoteData;  
	ZeroMemory(&remoteData, sizeof(RemoteParam));  

	//填充结构体变量中的成员  
	HINSTANCE hUser32 = LoadLibrary("kernel32.dll");  
	remoteData.dwMessageBox = (DWORD)GetProcAddress(hUser32, "LoadLibraryA");  
	strcat_s(remoteData.szMsg, "E:\\hjx\\workspace\\hook\\nokilltest\\Release\\dll64.dll");  

	//为线程参数在宿主进程中开辟存储区域  
	RemoteParam* pRemoteParam = (RemoteParam*)VirtualAllocEx(  
		hTargetProcess , 0, sizeof(RemoteParam), MEM_COMMIT, PAGE_READWRITE);  

	if (!pRemoteParam) {  
		OutputDebugStringA("Alloc memory failed !");  
		return 0;  
	}  
	OutputDebugStringA("4");
	//将线程参数拷贝到宿主进程地址空间中  
	if (!WriteProcessMemory(hTargetProcess ,  
		pRemoteParam, &remoteData, sizeof(remoteData), 0)) {  
			OutputDebugStringA("Write data to target process failed !");  
			return 0;  
	}  

	//在宿主进程中创建线程  
	HANDLE hRemoteThread = CreateRemoteThread(  
		hTargetProcess, NULL, 0, (DWORD (__stdcall *)(void *))pRemoteThread,   
		pRemoteParam, 0, &dwWriteBytes);  
	if (!hRemoteThread) {  
		OutputDebugStringA("Create remote thread failed !");  
		return 0;  
	}  
	printf("getlasterror:%d",GetLastError());
	OutputDebugStringA("5");
	CloseHandle(hRemoteThread);  
	FreeLibrary(hUser32); 
	getchar();
	return 0;  
}

2018-1-31 16:13
0
雪    币: 5596
活跃值: (2173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
x64位要用x64的。有碰到使用debug的dll注入不了,release可以注入。你可以试试
2018-1-31 16:30
0
雪    币: 206
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
wanttobeno x64位要用x64的。有碰到使用debug的dll注入不了,release可以注入。你可以试试
是64,也是release   
注入其他进程能够成功,eg  :calc.exe
就是任务管理器注入不了
2018-1-31 16:41
0
雪    币: 285
活跃值: (1100)
能力值: ( LV13,RANK:405 )
在线值:
发帖
回帖
粉丝
11
这小孩真骚 这是我在网上找的实现代码,就是标准的CreateRemoteThread   我这边也用了管理员的方式执行任然不行,测试dll是64位的dll,就是任务管理器注入不 ...
你可以看下我的帖子,反射式注入那个我刚刚试了下,是成功执行的
2018-1-31 19:15
0
雪    币: 206
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
sudozhange 你可以看下我的帖子,反射式注入那个我刚刚试了下,是成功执行的
好的
2018-2-1 08:43
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
写个服务进程,用system权限注入。
2018-2-2 13:44
0
雪    币: 206
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
wilway 写个服务进程,用system权限注入。[em_6]
嗯,好的有需要会尝试一下。谢谢各位,现在用的是@sudozhange  推荐的reflective  dll注入
2018-2-2 14:22
0
雪    币: 1112
活跃值: (184)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这小孩真骚 嗯,好的有需要会尝试一下。谢谢各位,现在用的是@sudozhange 推荐的reflective dll注入
应用级createremotethread注入,注入与被注入程序是需要统一会话层的,不能用system权限
2018-2-2 15:19
0
雪    币: 206
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
syxdotar 这小孩真骚 嗯,好的有需要会尝试一下。谢谢各位,现在用的是@sudozhange 推荐的reflective dll注入 应用级createremote ...
刚刚试了下用服务进程的方式进行dll注入,createremotethread  的getlasterror返回8  没有足够空间,如果通过一般exe就能成功,这是不是你说的这种情况。不太懂这些。但是我看了有些dll是能够通过服务进程进行注入的,有什么细节需要注意吗?求指点
2018-2-2 16:45
0
雪    币: 407
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这样?
2018-2-2 18:02
0
雪    币: 206
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
Thead 这样?
方便说下怎么实现的吗
2018-2-2 18:45
0
雪    币: 407
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
这小孩真骚 方便说下怎么实现的吗[em_6]
NtCreateThreadEx
2018-2-2 19:14
0
雪    币: 206
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
win7 旗舰版x64 NtCreateThreadEx failed............很奇怪的是GetLastError返回的是0
NTSTATUS status = funNtCreateThreadEx( 
                        &hThread, 
                        0x1FFFFF,   //GENERIC_ALL
                        NULL, 
                        process,
                        (LPTHREAD_START_ROUTINE) addr,   //LoadLibraryA
                        arg,         //dll address 用VirtualAllocEx在宿主进程中分配的
                        FALSE, //start instantly
                        NULL,
                        NULL,
                        NULL,
                        &ntbuffer
                        );
不知道怎么回事?请问你知道原因吗

2018-2-3 11:37
0
雪    币: 206
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
NtCreateThreadEx任然是在32位上跑的溜得很,x64上比较尴尬
还有一个就是在写windows服务的时候,win32的解决方案程序在  32,64位上都能跑,倒是x64编译的服务在windows7  x64上提示服务没有响应控制功能。想锤人。
了解的,指点下小弟,thanks
2018-2-3 11:42
0
游客
登录 | 注册 方可回帖
返回
//