通过线程ID,获得这个线程的模块名,这个线程的起始地址,
不知道该怎么做,,希望高手多多指教!
不知道该怎么做,,希望高手多多指教!
解决方案 »
- 我用stringgrid的drawcell做了很多东西,问个触发的问题
- 特别推荐 CodeGear(原Borland) 中国公司范路先生 20 多个小时的视频讲座!
- 请问如何实现对一个目录下的所有同类文件进行循环处理,在线等待中!!
- 在動態SQL語句產生的adodataset中,如果有money字段需要貨幣形式顯示,應該怎樣做?
- 有没有在山东威海的朋友,女朋友要到山东威海三角集团不知道怎么样了?我要去那没办法一年的delphi经验在那能搞到关于delphi方面工作吗?
- 如何做一个菜单?就是一直都显示在窗体正上方的
- 请教:这样的SQL的语句该怎么写???
- 问个关于用adoquery查询MSSQL数据表的问题??
- 时间在一天一天过去,但我心急如焚啊!!!神救救我吧!!!
- 请问adoquery1中的要找记录怎么写?很急,帮帮我,一定给分!
- IE插件正常加载后,打开IE该加载项无任何反应
- ZwQueryInformationThread API菜鸟一问~
不是进程基地址,也不是模块基地址,我想要线程起始地址...
不过我应该误解你的意思了,,刚才查来查去,有个未公开的函数ZwQueryInformationThread,不知道怎么用
PSAPI,Tlhelp32;
type
_THREADINFOCLASS = (
ThreadBasicInformation,
ThreadTimes,
ThreadPriority,
ThreadBasePriority,
ThreadAffinityMask,
ThreadImpersonationToken,
ThreadDescriptorTableEntry,
ThreadEnableAlignmentFaultFixup,
ThreadEventPair_Reusable,
ThreadQuerySetWin32StartAddress,
ThreadZeroTlsCell,
ThreadPerformanceCount,
ThreadAmILastThread,
ThreadIdealProcessor,
ThreadPriorityBoost,
ThreadSetTlsArrayAddress,
ThreadIsIoPending,
ThreadHideFromDebugger,
ThreadBreakOnTermination,
MaxThreadInfoClass
);
THREADINFOCLASS = _THREADINFOCLASS; _CLIENT_ID = record
UniqueProcess:THANDLE;
UniqueThread:THANDLE;
end;
CLIENT_ID = _CLIENT_ID;
PCLIENT_ID = ^CLIENT_ID;
_THREAD_BASIC_INFORMATION = record // Information Class 0
ExitStatus: LONGINT;
TebBaseAddress:Pointer;
ClientId:CLIENT_ID;
AffinityMask:LONGINT;
Priority:LONGINT;
BasePriority:LONGInt;
end;
THREAD_BASIC_INFORMATION = _THREAD_BASIC_INFORMATION;
PTHREAD_BASIC_INFORMATION = ^_THREAD_BASIC_INFORMATION; TZwQueryInformationThread = function (
ThreadHandle: THANDLE;
ThreadInformationClass:THREADINFOCLASS;
ThreadInformation:Pointer;
ThreadInformationLength:LongWord;
ReturnLength:PULONG
) : LongInt;stdcall;TRtlNtStatusToDosError = function (status: LongWord):LongInt;
function OpenThread(
dwDesiredAccess:DWORD;
bInheritHandle:BOOL;
dwThreadId:DWORD
):Thandle;stdcall; external kernel32 name 'OpenThread';
var
ZwQueryInformationThread:TZwQueryInformationThread = Nil;
RtlNtStatusToDosError:TRtlNtStatusToDosError = Nil;function ShowThreadInfo(dwThreadID:DWORD;Memo: TStrings):LongBool;
var
tbi:THREAD_BASIC_INFORMATION;
startaddr:Pointer;
status: LongInt;
thread,process: THandle;
error: DWORD;
modname: String;
begin
Result := false;
thread := OpenThread($1fffff(*THREAD_ALL_ACCESS*), FALSE, dwThreadID);
if Thread = 0 then Exit; status := ZwQueryInformationThread(thread,
ThreadQuerySetWin32StartAddress,
@startaddr,
sizeof(startaddr),
NIL);
if status < 0 then
begin
CloseHandle(thread);
SetLastError(RtlNtStatusToDosError(status));
Exit;
end;
Memo.Add(Format('线程 %08x 的起始地址为 %p',[dwThreadID,startaddr]));
status := ZwQueryInformationThread(thread,
ThreadBasicInformation,
@tbi,
sizeof(tbi),
NIL);
if status < 0 then
begin
CloseHandle(thread);
SetLastError(RtlNtStatusToDosError(status));
Exit;
end;
Memo.Add(Format('线程 %08x 所在进程ID为 %08x',[dwThreadID,LongWord(tbi.ClientId.UniqueProcess)])); process := OpenProcess(PROCESS_ALL_ACCESS,
FALSE,
DWORD(tbi.ClientId.UniqueProcess));
if process = 0 then
begin
error := GetLastError;
CloseHandle(thread);
SetLastError(error);
Exit;
end; SetLength(modname,$100);
SetLength(modname,GetModuleFileNameEx(process,0,PChar(modname),$100));
Memo.Add(Format('线程 %08x 所在进程映象为 %s',[dwThreadID,modname])); SetLength(modname,$100);
SetLength(modname,GetMappedFileName(process,
startaddr,
PChar(modname),
$100));
Memo.Add(Format('线程 %08x 可执行代码所在模块为 %s',[dwThreadID,modname]));
CloseHandle(process);
CloseHandle(thread);
Result := TRUE;
end;
procedure TForm3.Button1Click(Sender: TObject);
var
hNTDLL:HMODULE;
hSnapshot: THandle;
lpTE:THREADENTRY32;
begin
hNTDLL := GetModuleHandle('NTDLL');
if hNTDLL = 0 then
begin
Memo1.Lines.Add('GetModuleHandle(NTDLL) failed!');
Exit;
end;
ZwQueryInformationThread := GetProcAddress(hNTDLL,'ZwQueryInformationThread');
RtlNtStatusToDosError := GetProcAddress(hNTDLL,'RtlNtStatusToDosError');
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
lpTE.dwSize := sizeof(lpTE);
if Thread32First(hSnapshot,lpTE) then
begin
Memo1.Lines.BeginUpdate;
try
Repeat
if Not ShowThreadInfo(lpTE.th32ThreadID,Memo1.Lines) then
Memo1.Lines.Add(Format('无法获得线程 %08x 的相关信息,错误代码为 %d',[lpTE.th32ThreadID,GetLastError]));
Until Not Thread32Next(hSnapshot,lpTE);
finally
Memo1.Lines.EndUpdate;
end;
end;
CloseHandle(hSnapshot);
end;
...
线程 12D4 的起始地址为 448F1C1D
线程 12D4 所在进程ID为 137C
线程 12D4 所在进程映象为 C:\Program Files\Internet Explorer\iexplore.exe
线程 12D4 可执行代码所在模块为 \Device\HarddiskVolume1\WINDOWS\system32\dxtrans.dll
线程 13E8 的起始地址为 0045A71C
线程 13E8 所在进程ID为 1594
线程 13E8 所在进程映象为 C:\Documents and Settings\Administrator\My Documents\RAD Studio\Projects\Project1.exe
线程 13E8 可执行代码所在模块为 \Device\HarddiskVolume1\Documents and Settings\Administrator\My Documents\RAD Studio\Projects\Project1.exe
线程 95C 的起始地址为 7C93E1FA
线程 95C 所在进程ID为 1594
线程 95C 所在进程映象为 C:\Documents and Settings\Administrator\My Documents\RAD Studio\Projects\Project1.exe
线程 95C 可执行代码所在模块为 \Device\HarddiskVolume1\WINDOWS\system32\ntdll.dll
线程 15FC 的起始地址为 10003F71
线程 15FC 所在进程ID为 1594
线程 15FC 所在进程映象为 C:\Documents and Settings\Administrator\My Documents\RAD Studio\Projects\Project1.exe
线程 15FC 可执行代码所在模块为 \Device\HarddiskVolume2\Program Files\Kingsoft\PowerWord Lite\CBSText.dll
线程 3E4 的起始地址为 10003F71
线程 3E4 所在进程ID为 1594
线程 3E4 所在进程映象为 C:\Documents and Settings\Administrator\My Documents\RAD Studio\Projects\Project1.exe
线程 3E4 可执行代码所在模块为 \Device\HarddiskVolume2\Program Files\Kingsoft\PowerWord Lite\CBSText.dll
我电脑一直有毒 但是C盘东西太多太乱太重要, 还不能重装系统,等以后吧~~~ 我用提权后就好使了!