如何通过线程ID获得线程模块名和起始地址呀

ggg82 2004-04-20 02:31:24
我想通过线程ID获得线程模块名和起始地址,但不知怎么做?请高手指点,谢谢
...全文
2198 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xstring 2004-04-27
  • 打赏
  • 举报
回复
运行结果(略去了一些内容)

无法获得线程 00000000 的相关信息,错误代码为 87
无法获得线程 00000008 的相关信息,错误代码为 5
...... (略,重复内容)
无法获得线程 00000578 的相关信息,错误代码为 5
线程 000006a4 的起始地址为 01018574
线程 000006a4 所在进程ID为 000006a0
线程 000006a4 所在进程映象为 D:\WINDOWS\Explorer.EXE
线程 000006a4 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\explorer.exe
线程 000006c8 的起始地址为 00000000
线程 000006c8 所在进程ID为 000006a0
线程 000006c8 所在进程映象为 D:\WINDOWS\Explorer.EXE
线程 000006c8 可执行代码所在模块为
线程 000006cc 的起始地址为 77291A7A
线程 000006cc 所在进程ID为 000006a0
线程 000006cc 所在进程映象为 D:\WINDOWS\Explorer.EXE
线程 000006cc 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\shlwapi.dll
线程 000006d0 的起始地址为 77F5B56D
线程 000006d0 所在进程ID为 000006a0
线程 000006d0 所在进程映象为 D:\WINDOWS\Explorer.EXE
线程 000006d0 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\ntdll.dll
线程 000006d8 的起始地址为 77F65155
线程 000006d8 所在进程ID为 000006a0
线程 000006d8 所在进程映象为 D:\WINDOWS\Explorer.EXE
线程 000006d8 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\ntdll.dll
线程 000006e4 的起始地址为 77291A7A
线程 000006e4 所在进程ID为 000006a0
线程 000006e4 所在进程映象为 D:\WINDOWS\Explorer.EXE
线程 000006e4 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\shlwapi.dll
线程 0000077c 的起始地址为 748327CF
线程 0000077c 所在进程ID为 000006a0
线程 0000077c 所在进程映象为 D:\WINDOWS\Explorer.EXE
线程 0000077c 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\stobject.dll
线程 00000780 的起始地址为 72C42F87
线程 00000780 所在进程ID为 000006a0
线程 00000780 所在进程映象为 D:\WINDOWS\Explorer.EXE
线程 00000780 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\wdmaud.drv
线程 00000580 的起始地址为 75DBD72E
线程 00000580 所在进程ID为 000006a0
线程 00000580 所在进程映象为 D:\WINDOWS\Explorer.EXE
线程 00000580 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\browseui.dll
线程 00000584 的起始地址为 77F6E673
线程 00000584 所在进程ID为 000006a0
线程 00000584 所在进程映象为 D:\WINDOWS\Explorer.EXE
线程 00000584 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\ntdll.dll
线程 0000069c 的起始地址为 00000000
线程 0000069c 所在进程ID为 000006a0
线程 0000069c 所在进程映象为 D:\WINDOWS\Explorer.EXE
线程 0000069c 可执行代码所在模块为
线程 000006f8 的起始地址为 00405607
线程 000006f8 所在进程ID为 000006f4
线程 000006f8 所在进程映象为 D:\Program Files\D-Tools\daemon.exe
线程 000006f8 可执行代码所在模块为 \Device\HarddiskVolume2\Program Files\D-Tools\daemon.exe
线程 00000700 的起始地址为 00404990
线程 00000700 所在进程ID为 000006f4
线程 00000700 所在进程映象为 D:\Program Files\D-Tools\daemon.exe
线程 00000700 可执行代码所在模块为 \Device\HarddiskVolume2\Program Files\D-Tools\daemon.exe
线程 0000071c 的起始地址为 00402643
线程 0000071c 所在进程ID为 00000718
线程 0000071c 所在进程映象为 D:\WINDOWS\system32\ctfmon.exe
线程 0000071c 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\ctfmon.exe
线程 00000730 的起始地址为 00403854
线程 00000730 所在进程ID为 0000072c
线程 00000730 所在进程映象为 D:\Program Files\Microsoft Office\OFFICE11\ONENOTEM.EXE
线程 00000730 可执行代码所在模块为 \Device\HarddiskVolume2\Program Files\Microsoft Office\OFFICE11\ONENOTEM.EXE
线程 000007f8 的起始地址为 00401FDE
线程 000007f8 所在进程ID为 000007f4
线程 000007f8 所在进程映象为 D:\Program Files\Internet Explorer\iexplore.exe
线程 000007f8 可执行代码所在模块为 \Device\HarddiskVolume2\Program Files\Internet Explorer\IEXPLORE.EXE
线程 00000090 的起始地址为 00008DE4
线程 00000090 所在进程ID为 000007f4
线程 00000090 所在进程映象为 D:\Program Files\Internet Explorer\iexplore.exe
线程 00000090 可执行代码所在模块为
线程 000001d4 的起始地址为 77F5B56D
线程 000001d4 所在进程ID为 000007f4
线程 000001d4 所在进程映象为 D:\Program Files\Internet Explorer\iexplore.exe
线程 000001d4 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\ntdll.dll
线程 000001e0 的起始地址为 76008075
线程 000001e0 所在进程ID为 000007f4
线程 000001e0 所在进程映象为 D:\Program Files\Internet Explorer\iexplore.exe
线程 000001e0 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\wininet.dll
线程 000001f8 的起始地址为 72C42F87
线程 000001f8 所在进程ID为 000007f4
线程 000001f8 所在进程映象为 D:\Program Files\Internet Explorer\iexplore.exe
线程 000001f8 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\wdmaud.drv
线程 000001fc 的起始地址为 769F22FA
线程 000001fc 所在进程ID为 000007f4
线程 000001fc 所在进程映象为 D:\Program Files\Internet Explorer\iexplore.exe
线程 000001fc 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\winmm.dll
线程 00000250 的起始地址为 74629575
线程 00000250 所在进程ID为 000007f4
线程 00000250 所在进程映象为 D:\Program Files\Internet Explorer\iexplore.exe
线程 00000250 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\mshtml.dll
线程 0000033c 的起始地址为 7688BA88
线程 0000033c 所在进程ID为 000007f4
线程 0000033c 所在进程映象为 D:\Program Files\Internet Explorer\iexplore.exe
线程 0000033c 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\shdocvw.dll
线程 00000390 的起始地址为 72DFE310
线程 00000390 所在进程ID为 000007f4
线程 00000390 所在进程映象为 D:\Program Files\Internet Explorer\iexplore.exe
线程 00000390 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\msxml3.dll
线程 0000046c 的起始地址为 7688BA88
线程 0000046c 所在进程ID为 000007f4
线程 0000046c 所在进程映象为 D:\Program Files\Internet Explorer\iexplore.exe
线程 0000046c 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\shdocvw.dll
线程 00000604 的起始地址为 74629575
线程 00000604 所在进程ID为 000007f4
线程 00000604 所在进程映象为 D:\Program Files\Internet Explorer\iexplore.exe
线程 00000604 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\mshtml.dll
线程 000003d4 的起始地址为 71A84690
线程 000003d4 所在进程ID为 000007f4
线程 000003d4 所在进程映象为 D:\Program Files\Internet Explorer\iexplore.exe
线程 000003d4 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\mswsock.dll
线程 0000058c 的起始地址为 771524D4
线程 0000058c 所在进程ID为 000007f4
线程 0000058c 所在进程映象为 D:\Program Files\Internet Explorer\iexplore.exe
线程 0000058c 可执行代码所在模块为 \Device\HarddiskVolume2\WINDOWS\system32\ole32.dll
线程 000005a8 的起始地址为 00008DE7
线程 000005a8 所在进程ID为 000007f4
线程 000005a8 所在进程映象为 D:\Program Files\Internet Explorer\iexplore.exe
线程 000005a8 可执行代码所在模块为
无法获得线程 000000f8 的相关信息,错误代码为 5
无法获得线程 000000fc 的相关信息,错误代码为 5
无法获得线程 0000015c 的相关信息,错误代码为 5
无法获得线程 00000198 的相关信息,错误代码为 5
线程 000004cc 的起始地址为 00401886
线程 000004cc 所在进程ID为 000004bc
线程 000004cc 所在进程映象为 D:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.exe
线程 000004cc 可执行代码所在模块为 \Device\HarddiskVolume2\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.exe
线程 000004d0 的起始地址为 00008DFD
线程 000004d0 所在进程ID为 000004bc
线程 000004d0 所在进程映象为 D:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.exe
线程 000004d0 可执行代码所在模块为
..... (略)

有个别线程无法获得线程可执行代码所在模块,这一般是因为这些线程代码不是在dll中或exe中,而是由程序将可执行代码copy到另外一个位置再CreateThread造成的。
xstring 2004-04-27
  • 打赏
  • 举报
回复
可执行程序

#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x400
#include <stdio.h>
#include <tchar.h>
#include <locale.h>
#include <windows.h>
#include <psapi.h>
#include <Tlhelp32.h>

#pragma comment (lib, "psapi.lib")

//
// Thread Information Classes
//

typedef enum _THREADINFOCLASS {
ThreadBasicInformation,
ThreadTimes,
ThreadPriority,
ThreadBasePriority,
ThreadAffinityMask,
ThreadImpersonationToken,
ThreadDescriptorTableEntry,
ThreadEnableAlignmentFaultFixup,
ThreadEventPair_Reusable,
ThreadQuerySetWin32StartAddress,
ThreadZeroTlsCell,
ThreadPerformanceCount,
ThreadAmILastThread,
ThreadIdealProcessor,
ThreadPriorityBoost,
ThreadSetTlsArrayAddress,
ThreadIsIoPending,
ThreadHideFromDebugger,
ThreadBreakOnTermination,
MaxThreadInfoClass
} THREADINFOCLASS;

typedef struct _CLIENT_ID {
HANDLE UniqueProcess;
HANDLE UniqueThread;
} CLIENT_ID;
typedef CLIENT_ID *PCLIENT_ID;

typedef struct _THREAD_BASIC_INFORMATION { // Information Class 0
LONG ExitStatus;
PVOID TebBaseAddress;
CLIENT_ID ClientId;
LONG AffinityMask;
LONG Priority;
LONG BasePriority;
} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;

extern "C" LONG (__stdcall *ZwQueryInformationThread) (
IN HANDLE ThreadHandle,
IN THREADINFOCLASS ThreadInformationClass,
OUT PVOID ThreadInformation,
IN ULONG ThreadInformationLength,
OUT PULONG ReturnLength OPTIONAL
) = NULL;


extern "C" LONG (__stdcall *RtlNtStatusToDosError) (
IN ULONG status) = NULL;

BOOL ShowThreadInfo (DWORD tid)
{
THREAD_BASIC_INFORMATION tbi;
PVOID startaddr;
LONG status;
HANDLE thread, process;

thread = ::OpenThread (THREAD_ALL_ACCESS, FALSE, tid);
if (thread == NULL)
return FALSE;

status = ZwQueryInformationThread (thread,
ThreadQuerySetWin32StartAddress,
&startaddr,
sizeof (startaddr),
NULL);

if (status < 0)
{
CloseHandle (thread);
SetLastError (RtlNtStatusToDosError (status));
return FALSE;
};

_tprintf (TEXT ("线程 %08x 的起始地址为 %p\n"),
tid,
startaddr);

status = ZwQueryInformationThread (thread,
ThreadBasicInformation,
&tbi,
sizeof (tbi),
NULL);

if (status < 0)
{
CloseHandle (thread);
SetLastError (RtlNtStatusToDosError (status));
return FALSE;
};

_tprintf (TEXT ("线程 %08x 所在进程ID为 %08x\n"),
tid,
(DWORD)tbi.ClientId.UniqueProcess);

process = ::OpenProcess (PROCESS_ALL_ACCESS,
FALSE,
(DWORD)tbi.ClientId.UniqueProcess);

if (process == NULL)
{
DWORD error = ::GetLastError ();
CloseHandle (thread);
SetLastError (error);
return FALSE;
};

TCHAR modname [0x100];
::GetModuleFileNameEx (process, NULL, modname, 0x100);

_tprintf (TEXT ("线程 %08x 所在进程映象为 %s\n"),
tid,
modname);

GetMappedFileName(process,
startaddr,
modname,
0x100);

_tprintf (TEXT ("线程 %08x 可执行代码所在模块为 %s\n"),
tid,
modname);

CloseHandle (process);
CloseHandle (thread);
return TRUE;
};

int main (void)
{
setlocale (LC_ALL, ".ACP");

HINSTANCE hNTDLL = ::GetModuleHandle (TEXT ("ntdll"));

(FARPROC&)ZwQueryInformationThread =
::GetProcAddress (hNTDLL, "ZwQueryInformationThread");

(FARPROC&)RtlNtStatusToDosError =
::GetProcAddress (hNTDLL, "RtlNtStatusToDosError");

HANDLE h = CreateToolhelp32Snapshot (TH32CS_SNAPTHREAD, 0);
THREADENTRY32 te;
te.dwSize = sizeof (te);
if (Thread32First (h, &te))
{
do
{
if (ShowThreadInfo (te.th32ThreadID))
{
}
else
{
_tprintf (TEXT("无法获得线程 %08x 的相关信息,错误代码为 %d\n"),
te.th32ThreadID, GetLastError ());
};
} while (Thread32Next (h, &te));
};
CloseHandle (h);
};
nf3 2004-04-26
  • 打赏
  • 举报
回复
up
fengyu1907 2004-04-23
  • 打赏
  • 举报
回复
tlhelp32.h中定义了很多可用的API,"Windows核心编程"每4章中有详细的介绍.
ggg82 2004-04-23
  • 打赏
  • 举报
回复
LocalVar(分乃身外之物,即使我回答对了,也别给分):

有点眉目了,只是我要刺探其他行程的线程,所以,lianglp()的方法不适用,当时也未明白其意义,现在才明白,还有就是dwStack = context.Ebp / 65536 * 65536 + 65536;
这一句是什么意思,不太明白,是否可以解释一下,谢谢
ggg82 2004-04-23
  • 打赏
  • 举报
回复
我查看了ebp,esp eip中的内容
为什么eip总是个固定值
而ebp,esp的值不像是地址,怎样换算呢,我对汇编并不懂,还望高手解答,谢谢!!
LocalVar 2004-04-22
  • 打赏
  • 举报
回复
在你的另一个帖子中回答了。

不过我觉得lianglp() 的方法更简单和通用,不知你为什么不用。
http://expert.csdn.net/Expert/topic/2993/2993709.xml?temp=.3677027
ggg82 2004-04-20
  • 打赏
  • 举报
回复
用OpenThread打开线程句柄后,还是无法得到该线程所在的模块呀
薛定谔之死猫 2004-04-20
  • 打赏
  • 举报
回复
关注
dot99 2004-04-20
  • 打赏
  • 举报
回复
HANDLE OpenThread(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwThreadId
);

不过我就是不会得到属于某进程的线程ID
ggg82 2004-04-20
  • 打赏
  • 举报
回复
OpenThread
没有这个API呀
fzd999 2004-04-20
  • 打赏
  • 举报
回复
你已经知道线程ID啦?不错哦。我上次还不知道ID呢~

用OpenThread打开线程内核对象
GetModuleFileName获取模块名,GetMoudleInformation获取起始地址
lianglp 2004-04-20
  • 打赏
  • 举报
回复
接管CreateThread()API函数,保存创建的所有线程ID和起始地址,然后
用GetMoudleInformation()API函数判断线程过程起始地址所处的模块当中就OK了。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧