Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: Lấy Threadid hoặc Process id từ Thread Handle?

  1. #1
    Ngày gia nhập
    04 2011
    Bài viết
    61

    Question 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

  2. #2
    Ngày gia nhập
    08 2011
    Bài viết
    98

    Bạn dùng thanh ghi FS để tham chiếu đến offset 0x24 và 0x20 của TEB.

    Đơn giản chỉ là :

    C Code:
    1. __asm{
    2.          mov eax,fs:[24h] //lấy thread id
    3.          push eax
    4.          xor eax,eax
    5.          mov eax,fs:[20h]// lấy procces id
    6. }

    hoặc dùng GetWindowThreadProcessId :

    http://msdn.microsoft.com/en-us/library/ms633522.aspx
    Nghe Metal và dịch thơ
    lttqstudy.wordpress.com

  3. #3
    Ngày gia nhập
    04 2011
    Bài viết
    61

    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

  4. #4
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    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

    Visual C++ Code:
    1. typedef struct _THREAD_BASIC_INFORMATION { // Information Class 0
    2.     NTSTATUS ExitStatus;
    3.     PVOID TebBaseAddress;
    4.     CLIENT_ID ClientId;
    5.     KAFFINITY AffinityMask;
    6.     KPRIORITY Priority;
    7.     KPRIORITY BasePriority;
    8. } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  5. #5
    Ngày gia nhập
    09 2008
    Bài viết
    223

    Trích dẫn Nguyên bản được gửi bởi Kevin Hoang Xem bài viết
    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

    Visual C++ Code:
    1. typedef struct _THREAD_BASIC_INFORMATION { // Information Class 0
    2.     NTSTATUS ExitStatus;
    3.     PVOID TebBaseAddress;
    4.     CLIENT_ID ClientId;
    5.     KAFFINITY AffinityMask;
    6.     KPRIORITY Priority;
    7.     KPRIORITY BasePriority;
    8. } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
    Vì đang ở trong thread của hàm NtTerminateThread() nên chỉ có thread handle thôi, ko có thread id. Đúng ko zeroplus ?

    Trích dẫn Nguyên bản được gửi bởi zeroplus Xem bài viết
    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
    Hãy Duplicate cái Handle đó để có thêm 1 thread handle có quyền THREAD_QUERY_INFORMATION (sử dụng DuplicateHandle() )

    Sau đó NtQueryInformationThread() để lấy Thread ID hoặc Process ID tùy bạn
    Ân oán giang hồ nuôi tôi lớn
    Cuộc đời khốn nạn dạy tôi khôn
    Không đâm không chém đời không nể
    Không tiền không bạc gái không theo

    ----------------------
    Visit my blog: http://nova-soft.net/

  6. #6
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Mặc định Lấy Threadid hoặc Process id từ Thread Handle?

    Vậy thì dùng hàm API GetThreadId hoặc GetCurrentThreadId là được rồi?
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  7. #7
    Ngày gia nhập
    09 2008
    Bài viết
    223

    Trích dẫn Nguyên bản được gửi bởi Kevin Hoang Xem bài viết
    Vậy thì dùng hàm API GetThreadId hoặc GetCurrentThreadId là được rồi?
    GetThreadId)_ => Chỉ có từ Win Vista trở lên
    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()

    Code:
    NTSYSAPI NTSTATUS NTAPI ZwTerminateThread  ( IN HANDLE  ThreadHandle,  IN NTSTATUS  ExitStatus )
    Ân oán giang hồ nuôi tôi lớn
    Cuộc đời khốn nạn dạy tôi khôn
    Không đâm không chém đời không nể
    Không tiền không bạc gái không theo

    ----------------------
    Visit my blog: http://nova-soft.net/

  8. #8
    Ngày gia nhập
    04 2011
    Bài viết
    61

    Cám ơn Kevin Hoang,lttq và gianghoplus
    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

  9. #9
    Ngày gia nhập
    04 2011
    Bài viết
    61

    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 . 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

    Visual C++ Code:
    1. DWORD IDFromThreadHandle(HANDLE hThread,BOOL bMode)
    2. {
    3.     if (hThread == NULL) return 0xffffffff;
    4.     HANDLE hThreadDup;
    5.     BOOL bRes=DuplicateHandle(GetCurrentProcess(), hThread, GetCurrentProcess(), &hThreadDup, THREAD_QUERY_INFORMATION, FALSE, 0);
    6.     if (!bRes || hThreadDup == NULL) return 0xffffffff;
    7.     NTQUERYINFORMATION NTINFOTHREAD=(NTQUERYINFORMATION)GetProcAddress(GetModuleHandle("ntdll.dll"), "ZwQueryInformationThread");
    8.     if (NTINFOTHREAD == NULL) return 0xffffffff;
    9.     THREAD_BASIC_INFORMATION Tbi;
    10.     ZeroMemory(&Tbi, sizeof(THREAD_BASIC_INFORMATION));
    11.     NTSTATUS lRes=NTINFOTHREAD(hThreadDup, 0, &Tbi, sizeof(THREAD_BASIC_INFORMATION), NULL);
    12.     CloseHandle(hThreadDup);
    13.     if (lRes == 0)
    14.     {
    15.        
    16.         if (bMode==TRUE)
    17.         {
    18.             return (DWORD)Tbi.ClientId.UniqueProcess;
    19.         }
    20.         else
    21.         {
    22.             return (DWORD)Tbi.ClientId.UniqueThread;
    23.         }
    24.     }
    25.     else
    26.     {
    27.         return 0xffffffff;
    28.     }
    29.    
    30. }

  10. #10
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    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.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

Các đề tài tương tự

  1. Lấy Handle của Window(process) khi biết class ?
    Gửi bởi azurelonely trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 30-10-2011, 02:24 PM
  2. Thắc mắc Theo Dõi Process. Bắt một process mới hoạt động.
    Gửi bởi nguyengiaba trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 20
    Bài viết cuối: 09-11-2010, 11:28 PM
  3. Làm sao để lấy handle của 1 process
    Gửi bởi langman trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 3
    Bài viết cuối: 07-08-2010, 11:37 AM
  4. Kill Process bằng việc Kill toàn bộ thread của Process đó trên VC++ như thế nào?
    Gửi bởi AdminPro trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 22-05-2009, 05:44 PM
  5. Hàm API Lấy Pid của Process từ HANDLE của nó ???
    Gửi bởi trần trân trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 12-03-2009, 08:53 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn