2010-02-19 23 views
5

Điều này thật kỳ lạ. Trước đó, chạy Windows 7 x64, tôi gặp sự cố khi gọi Win32 OpenProcess với các quy trình 64 bit. Googled xung quanh một chút, và đi đến kết luận chìm này sẽ không xảy ra.OpenProcess trên hình ảnh x64 từ ứng dụng Win32

Sau đó, một điều buồn cười đã xảy ra. Tôi đã thử nó với ID tiến trình cho explorer.exe, và cá chép thánh, nó đã hoạt động! Bắt đầu ném các ID quá trình khác vào nó, và nó chỉ là một crapshoot darned.

Khi nó quay ra, tôi có thể gọi OpenProcess chống lại một số lượng tốt của các quá trình x64 - nhà thám hiểm, itype, ipoint, taskhost, cmd, mstsc, ..., vv

Và những người khác bật số 5 (Quyền truy cập bị từ chối) - winlogon, csrss, services, svchost, mdm, ...

Tôi xác nhận ID "bitness" và quá trình sử dụng Process Explorer. Ngoài ra, việc gọi GetModuleFileNameEx trên các quy trình 64 bit luôn không thành công, do đó cung cấp kiểm tra kép cho 32/64.

Đây là mã:

' Get a handle to the process. 
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessID) 
If hProcess Then 
    ' Grab the filename for base module. 
    nChars = GetModuleFileNameEx(hProcess, 0, Buffer, Len(Buffer)) 
    ' If running in x64, http://winprogger.com/?p=26 
    If Err.LastDllError = ERROR_PARTIAL_COPY Then 
     nChars = GetProcessImageFileName(hProcess, Buffer, Len(Buffer)) 
    End If 
    ' Truncate and return buffer. 
    If nChars Then 
     GetProcessFileName = Left$(Buffer, nChars) 
    End If 
    Call CloseHandle(hProcess) 
Else 
    Debug.Print "LastDllError:"; Err.LastDllError 
End If 

Không có gì lạ mắt. Chỉ muốn truy vấn các quy trình cho những thứ như tên tệp hoặc thời gian xử lý. Bất cứ ai có bất kỳ ý tưởng gì khác biệt giữa những người tôi có thể mở và những người tôi không thể?

Thông tin bổ sung: Quy trình chạy với tư cách quản trị viên. Đã tắt UAC. Vâng, đó là ứng dụng 32 bit. Tôi không có kết quả tốt hơn bằng PROCESS_QUERY_LIMITED_INFORMATION.

Cảm ơn ... Karl

Trả lời

4

Quy trình bạn trích dẫn (winlogon, csrss, v.v) là các quy trình và dịch vụ hệ thống quan trọng. Chúng chạy dưới một tài khoản đặc quyền khác. Mặc dù bạn đang chạy với tư cách là quản trị viên, bạn không phải là chủ sở hữu của các quy trình đó và do đó bạn không được cấp bất kỳ quyền nào trong ACL của họ. Cố gắng mở sẽ dẫn đến truy cập bị từ chối.

Tuy nhiên, các thành viên của nhóm quản trị viên có SeDebugPrivilege. Điều này về cơ bản là một ghi đè trên OpenProcess và OpenThread sẽ cho phép bạn mở cho tất cả các truy cập, ngay cả khi bạn không được cấp bất kỳ sự cho phép nào trong ACL.

SeDebugPrivilege rõ ràng là một đặc quyền rất nguy hiểm để có - bạn có thể bỏ qua kiểm tra truy cập và sửa đổi/kiểm tra các quy trình của người dùng khác. Mặc dù nó hiện diện trong mã thông báo của quản trị viên theo mặc định nhưng nó không được kích hoạt theo mặc định. Bạn cần bật đặc quyền này trước khi gọi OpenProcess.

Điều này MSDN article cung cấp mã mẫu về cách bật và tắt đặc quyền trong mã thông báo của bạn.

+0

Ouch. Vâng, đó là nó, được rồi. Điều đó đã kích hoạt GetProcessTimes lần. Tôi thấy Process Explorer cũng đang chạy với cài đặt đó. Vì vậy, nếu tôi chạy nó dưới một tài khoản người dùng ít riêng tư, nó cũng không thể làm được điều này? Dù sao, cảm ơn! :-) –

+1

Vài nhóm có SeDebugPrivilege theo mặc định, về cơ bản chỉ là SYSTEM và nhóm quản trị viên. Người dùng đặc quyền ít nhất chắc chắn không. Nếu họ đã làm, nâng lên đặc quyền đầy đủ sẽ là tầm thường kể từ khi bạn có thể tiêm mã bạn muốn chạy vào một quá trình đặc quyền. – Michael

+0

Trước khi đến bài viết này, tôi nghĩ rằng tôi sẽ phải xây dựng riêng biệt trong kịch bản của tôi nhưng nhờ SeDebugPrivilege, bây giờ tôi có thể gọi openprocess từ một quá trình 32bit và tải một quá trình 64bit trong trường hợp của tôi im có thể tải lsass. – Syler

Các vấn đề liên quan