首页
社区
课程
招聘
[求助]大家好,请问知道线程的句柄或ID,如何获取线程的执行地址?
发表于: 2017-4-24 11:26 5276

[求助]大家好,请问知道线程的句柄或ID,如何获取线程的执行地址?

2017-4-24 11:26
5276

前辈们好。。。


线程是通过CreateThread创建的,创建的时候第三个参数是执行函数地址。


我现在想通过线程ID或者线程句柄,取得这个执行函数地址。请问怎么获取?


网络上的NtQueryInformationThread函数获得,但经过测试,我创建了n个线程,这个函数获取到这N个线程的“入口地址”都是一样的,而且没有一个对。


于是我感觉这个函数不可以获得线程执行地址,所以请问有没有办法获得?


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

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
                那你感觉下    那个函数可以获取线程入口地址呗
2017-4-24 12:20
0
雪    币: 103
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不知道才问,你的意思这个函数可以?那为什么获取出来的地址不一样呢?
2017-4-24 12:26
0
雪    币: 103
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
,我做了个demo程序,创建了两个线程,PCHunter(xuntr)我用这个查看线程入口,这个工具上显示的线程入口地址,都是一样的地址,而且地址也是错的,所以这个软件的线程入口查看,也是用了NtQueryInformationThread这个函数。
2017-4-24 12:28
0
雪    币: 407
活跃值: (1816)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
第二个参数传的是什么?ThreadQuerySetWin32StartAddress?
2017-4-24 13:58
0
雪    币: 2347
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
取到的才是真实起始地址  你可以Hook相关函数flt一下取得线程函数起始地址
2017-4-24 14:30
0
雪    币: 103
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Thead 第二个参数传的是什么?ThreadQuerySetWin32StartAddress?
是的,我做了个demo,创建多线程,每个线程调用函数不一样。用这个参数  结果每个线程入口地址都不对,都是一样的。请问有其他方法吗
2017-4-25 13:37
0
雪    币: 103
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
空白即是正义 取到的才是真实起始地址 你可以Hook相关函数flt一下取得线程函数起始地址
您好,我想通过线程句柄或线程或ID方式获得
2017-4-25 13:38
0
雪    币: 2347
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
xushanfeng 您好,我想通过线程句柄或线程或ID方式获得
那就直接通过ethread结构得到吧  得到的就是和xt显示一样的起始地址
2017-4-25 17:33
0
雪    币: 103
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
ethread结构,不知道怎么获取我查查资料看看吧,谢谢你了
2017-4-26 11:15
0
雪    币: 775
活跃值: (2292)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
DWORD  GetThreadStartAddr(DWORD dwThreadId)
{
	HMODULE hNtdll = LoadLibrary(_T("ntdll.dll"));
	if (!hNtdll)
	{
		return 0;
	}
	NTQUERYINFORMATIONTHREAD NtQueryInformationThread = NULL;
	NtQueryInformationThread = (NTQUERYINFORMATIONTHREAD)
		GetProcAddress(hNtdll, "NtQueryInformationThread");
	if (!NtQueryInformationThread)
	{
		return 0;
	}
	HANDLE ThreadHandle = NULL;
	ThreadHandle = OpenThread(THREAD_QUERY_INFORMATION, FALSE, dwThreadId);
	if (!ThreadHandle)
	{
		return 0;
	}
	DWORD dwStaAddr = NULL;
	DWORD dwReturnLength = 0;
	if (NtQueryInformationThread(ThreadHandle, ThreadQuerySetWin32StartAddress,
		&dwStaAddr, sizeof(dwStaAddr), &dwReturnLength))
	{
		return 0;
	}
	return dwStaAddr;
}

取得线程入口地址和xt的一模一样,送给楼主了

2017-4-26 13:25
0
雪    币:
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我也有同样问题。楼主怎么解决的
2017-4-26 19:40
0
雪    币: 103
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
AperOdry DWORD  GetThreadStartAddr(DWORD dwThreadId) { HMODULE hNtdll& ...
您好,这个代码不行,xt获取到的入口地址也是错误的,就是因为用了这方式
2017-4-28 16:08
0
雪    币: 103
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
封心aa 我也有同样问题。楼主怎么解决的
您好,我还没解决。。 
2017-4-28 16:09
0
雪    币: 103
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
知道的大侠可以联系下我讨论下吗?我q      19619八3633,不会让你们白忙
2017-4-28 16:10
0
雪    币: 775
活跃值: (2292)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
xushanfeng 您好,这个代码不行,xt获取到的入口地址也是错误的,就是因为用了这方式
入口地址的确有一样的。。
2017-4-28 22:17
0
雪    币: 1787
活跃值: (340)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
xushanfeng 知道的大侠可以联系下我讨论下吗?我q 19619八3633,不会让你们白忙
用procexp就能看到了。
2017-4-29 00:31
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
18
谁告诉你CreateThread第三个参数的地址就是线程起始地址了
真正的起始地址是ntdll里的RtlUserThreadStart,这玩意才是线程从用户层开始的地方。
那玩意会call你的ThreadProc,所以你认为ThreadProc是起始地址,实际上这之前跑了很多东西你都没看到。
2017-5-1 11:33
0
游客
登录 | 注册 方可回帖
返回
//