Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 13
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

  2. #2
    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}
    hoặc dùng GetWindowThreadProcessId :

    http://msdn.microsoft.com/en-us/library/ms633522.aspx

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

  4. #4
    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;

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Kevin Hoang
    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;
    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 Gửi bởi zeroplus
    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

  6. #6
    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?

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Kevin Hoang
    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()

    Mã:
    NTSYSAPI NTSTATUS NTAPI ZwTerminateThread  ( IN HANDLE  ThreadHandle,  IN NTSTATUS  ExitStatus )

  8. #8
    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]

  9. #9
    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;    }    }

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

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •