-
20-09-2011, 03:07 PM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Lấy Threadid hoặc Process id từ Thread Handle?
Xin các bạn giúp mình cách chuyển từ Thread Handle sang Thread ID. Cảm ơn rất nhiều
View more random threads:
- Source inject DLL gồm cả DLL và exe. Lỗi làm sao sửa?
- Sử dụng hook trên ứng dụng không được focus như thế nào?
- Sử dụng WriteProcessMemory, báo lỗi cannot open process :((
- CreateFileMapping Trả về Lỗi = 5
- Làm sao để ẩn process chương trình trong task manage
- Dung lượng File sau khi MapViewOfFile
- Cách truyền hàm xử lí sự kiện cho Find dialogbox
- Làm sao để tích hợp DLL file vào executable file
- anti hidetoolz, ẩn luôn cả chương trình của mình. ai biết chỉnh giúp mình với
FindNextFile gọi đến hàm nào trong driver???
-
20-09-2011, 03:24 PM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Bạn dùng thanh ghi FS để tham chiếu đến offset 0x24 và 0x20 của TEB.
Đơn giản chỉ là :
Mã:__asm{ mov eax,fs:[24h] //lấy thread id push eax xor eax,eax mov eax,fs:[20h]// lấy procces id}
http://msdn.microsoft.com/en-us/library/ms633522.aspx
-
20-09-2011, 04:05 PM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Thread Handle có được do OpenThread đó bạn, vì thế chắc không dùng được GetWindowThreadProcessId rồi
mình hook hàm NTTerminateThread nên ThreadHandle lúc nào của là của OpenThread với tham số THREAD_TERMINATE(&H1). Do đó sử dụng NtQueryInformationThread + TEB đều không được,nó chỉ được khi ThreadHandle lấy từ OpenThread với tham số THREAD_QUERY_INFORMATION (&H40), bạn có cách khác không ? Cám ơn bạn
-
20-09-2011, 04:11 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Không có ThreadId làm sao bạn Open Thread được? ThreaId bạn phải có trước rồi mà sao cần phải tìm nữa?
Về kỹ thuật xử lý vấn đề của bạn, Kevin có một cách là sử dụng Undocumented API
Bạn sử dụng API NtQueryInformationThread với struct
Mã:typedef struct _THREAD_BASIC_INFORMATION { // Information Class 0 NTSTATUS ExitStatus; PVOID TebBaseAddress; CLIENT_ID ClientId; KAFFINITY AffinityMask; KPRIORITY Priority; KPRIORITY BasePriority;} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
-
21-09-2011, 09:21 AM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi Kevin Hoang
Gửi bởi zeroplus
Sau đó NtQueryInformationThread() để lấy Thread ID hoặc Process ID tùy bạn
-
21-09-2011, 09:31 AM #6Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Vậy thì dùng hàm API GetThreadId hoặc GetCurrentThreadId là được rồi?
-
21-09-2011, 03:27 PM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi Kevin Hoang
GetCurrentThreadId() => Chỉ lấy được thread id chạy module. Nhưng cái cần lấy là thread id của thread được truyền vào từ hàm NtTerminateThread() / ZwTerminateThread()
Mã:NTSYSAPI NTSTATUS NTAPI ZwTerminateThread ( IN HANDLE ThreadHandle, IN NTSTATUS ExitStatus )
-
22-09-2011, 09:11 AM #8Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Cám ơn Kevin Hoang,lttq và gianghoplus[IMG]images/smilies/biggrin.png[/IMG]
Sau khi làm theo hướng dẫn của gianghoplus, mình đã lấy được Process ID và Thread ID, rất đúng với yêu cầu của mình [IMG]images/smilies/clap_grin.gif[/IMG]
-
24-09-2011, 12:47 PM #9Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Bạn xem giúp mình đoạn code bên dưới có gì sai không mà nó hoạt động tốt với NtTerminateThread, NTSuspendThread nhưng với NTOpenThread thì hàm DuplicateHandle trả về False [IMG]images/smilies/Cry.gif[/IMG] . Mình để ý thấy NTTerminateThread là: HANDLE ThreadHandle . Còn NTTerminateThread là : PHANDLE ThreadHandle, mình nghĩ do HANDLE và PHANDLE khác nhau nên ko được. Còn với đoạn code đó mình viết trên VB 6 đều hoạt động tốt với nó, chắc do sử dụng kiểu long. Mọi người xem giúp mình với, cảm ơn rất nhiều
Mã:DWORD IDFromThreadHandle(HANDLE hThread,BOOL bMode){ if (hThread == NULL) return 0xffffffff; HANDLE hThreadDup; BOOL bRes=DuplicateHandle(GetCurrentProcess(), hThread, GetCurrentProcess(), &hThreadDup, THREAD_QUERY_INFORMATION, FALSE, 0); if (!bRes || hThreadDup == NULL) return 0xffffffff; NTQUERYINFORMATION NTINFOTHREAD=(NTQUERYINFORMATION)GetProcAddress(GetModuleHandle("ntdll.dll"), "ZwQueryInformationThread"); if (NTINFOTHREAD == NULL) return 0xffffffff; THREAD_BASIC_INFORMATION Tbi; ZeroMemory(&Tbi, sizeof(THREAD_BASIC_INFORMATION)); NTSTATUS lRes=NTINFOTHREAD(hThreadDup, 0, &Tbi, sizeof(THREAD_BASIC_INFORMATION), NULL); CloseHandle(hThreadDup); if (lRes == 0) { if (bMode==TRUE) { return (DWORD)Tbi.ClientId.UniqueProcess; } else { return (DWORD)Tbi.ClientId.UniqueThread; } } else { return 0xffffffff; } }
-
24-09-2011, 02:19 PM #10Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
PHANDLE đúng nghĩa để hiểu là "Point to HANDLE", thông thường vẫn gọi là "HANDLE Pointer". Khi bạn hỏi vấn đề này cho thấy bạn không đọc về 'Convention' của M$, hoặc là cơ bản về lập trình C bạn không vững (Nếu không phải trong 2 thì là bạn sử dụng Visual Studio chưa hiệu quả).
Trong hàm NTOpenThread: Khi đó Thread mới được mở, DuplicateHandle một cái còn chưa tồn tại sẽ thất bại là điều đương nhiên rồi! Để giải quyết vấn đề này, bạn hãy call hàm gốc trước khi thực hiện DuplicateHandle.
Ngọc Bích xanh bản chất thuộc dòng đá đá hoa (jade). Và cẩm thạch là tên gọi chung của ngọc bích. Vì thực chất chúng thuộc dòng đá đa khoáng được hình thành từ chất Silicat dưới dạng dioxy. Ngọc bích...
Chia sẻ Vòng tay ngọc bích xanh là...