2013-04-29 30 views
14

Tôi đang làm với cái gọi là 'seh hooking'. Trên thực tế nó thay đổi sự cho phép của khu vực bộ nhớ và bắt ngoại lệ khi nó được truy cập, vì vậy nó có thể móc các chức năng.Đặt bẫy một bước có sẵn trên win 7 không?

Nó sử dụng bẫy bước duy nhất mà trông giống như:

info->ContextRecord->EFlags |= 0x100; 

để tiếp tục bảo vệ để PAGE_NOACCESS.

Ứng dụng chạy tốt trên win xp nhưng không phải là ngoại trừ trên win 7. Nó chỉ bị đóng băng trên win 7. Tôi rất nghi ngờ đó là vì 'thiết lập bước duy nhất bẫy' điều, nhưng tôi không chắc chắn.

Click here để liên kết tải xuống trực tiếp của gói nguồn

+3

Chỉ cần móc chức năng theo cách thông thường. Những loại kỹ thuật điên này có thể khiến mã của bạn bị gắn cờ là phần mềm độc hại. –

+0

Bạn có bắt đầu chương trình với tư cách là Quản trị viên không? Windows 7 cho biết thêm một mức độ khó chịu .. phiền toái cho phép chương trình. Bạn có thể yêu cầu quyền với thiết lập Linker-> Manifest File-> UAC mức độ thực thi-> requireAdmin – typ1232

Trả lời

11

Câu trả lời ngắn:

Có cờ bước duy nhất là một phần của achitecture x86 và cũng vẫn được thực hiện trong các cửa sổ 7 thông qua thành phần eflags của bộ xử lý bối cảnh.

Tôi đã quản lý để tải xuống dự án của bạn và mọi thứ hoạt động tốt mà không cần sửa đổi trên Windows 8 với UAC bị tắt. Vì vậy, nó cũng hoạt động trên Windows 7. Khi bắt đầu VEH Hooking Test.exe, nó sẽ hiển thị hai hộp thông báo, sau mỗi hộp tôi nhận được kết quả đầu ra giao diện điều khiển MessageBoxA, vì vậy móc hoạt động. Có thể thử bắt đầu chương trình với tư cách là quản trị viên trên Windows 7?


Long trả lời:

SEH là viết tắt của xử lý ngoại lệ có cấu trúc, nhưng những gì bạn đang mô tả âm thanh giống như VEH - vectored xử lý ngoại lệ.

VEH hooking là một phương pháp hooking thực sự rất chậm, vì vậy nó không thể thực sự được sử dụng trong móc quan trọng hiệu suất, như móc đồ họa ví dụ nơi móc của bạn chạm nhiều lần mỗi giây. Nó thường được sử dụng cho một móc thời gian. Mục đích của VEH hooking là thực sự tàng hình. Không có bộ nhớ nào được viết trong mã elses của ai đó và bạn không phải sử dụng thanh ghi gỡ lỗi.


Sau đây là cách tôi sẽ triển khai bằng C++.

Trước tiên, bạn phải đăng ký một ngoại trừ vector. Đây là một trình xử lý ngoại lệ toàn cục cho tiến trình. Mỗi ngoại lệ được ném mà không được giải quyết và sẽ rơi vào hệ điều hành sẽ bị bắt bởi trình xử lý này.

PVOID pExHandler = AddVectoredExceptionHandler(1, VectoredHandler); 

Sau này bạn nên đặt việc bảo vệ bộ nhớ của trang nơi HOOK_LOCATION của bạn (địa chỉ để treo) là trong. Việc bảo vệ mới Tôi đang sử dụng là PAGE_EXECUTE_READ|PAGE_GUARD. Một trang được bảo vệ sẽ gây ra một ngoại lệ khi truy cập và sẽ loại bỏ bảo vệ bảo vệ sau đó một cách tự động. Ngoại lệ này sẽ không được xử lý bởi bất cứ ai, vì vậy nó sẽ rơi vào xử lý vectơ của chúng tôi. Sau khi ngoại lệ được ném, trang có thể truy cập lại. (xem Creating Guard Pages)

Bộ nhớ chỉ có thể được bảo vệ trong các trang (thường dài 0x1000 byte). Đây là lý do tại sao chúng tôi không thể chỉ bảo vệ vị trí móc và có chi phí hoạt động lớn.

DWORD orgProt; 
VirtualProtect(HOOK_LOCATION, 1, PAGE_EXECUTE_READ|PAGE_GUARD, &orgProt); 

Bây giờ cho trình xử lý ngoại lệ của chúng tôi. Đây là cách nó có thể trông giống như:

LONG CALLBACK VectoredHandler(PEXCEPTION_POINTERS exc) 
{ 
    if (exc->ExceptionRecord->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION) 
    { 
     // guard page exeption occured. guard page protection is gone now 

     if (HOOK_LOCATION == reinterpret_cast<long*>(exc->ContextRecord->Eip)) { 
      // hook location was hit! call any hook callbacks here 
     } else { 
      // hook was not hit and has to be refreshed. set single-step flag 
      exc->ContextRecord->EFlags |= 0x100; 
     } 

     return EXCEPTION_CONTINUE_EXECUTION; 
    } 

    if (exc->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP) 
    { 
     // single-step exeption occured. single-step flag is cleared now 

     // set guard page protection 
     DWORD oldProt; 
     VirtualProtect(HOOK_LOCATION, 1, PAGE_EXECUTE_READ|PAGE_GUARD, &oldProt); 

     return EXCEPTION_CONTINUE_EXECUTION; 
    } 

    return EXCEPTION_CONTINUE_SEARCH; 
} 

Nếu mã chạy vào trang bộ nhớ được bảo vệ, nó sẽ ném vi phạm trang bảo vệ. Chúng tôi kiểm tra xem chúng tôi có ở vị trí móc hay không. Nếu chúng tôi là tất cả mọi thứ là tốt và chúng tôi có thể gọi móc gọi lại. Nếu chúng ta không ở đúng vị trí, bằng cách nào đó chúng ta cần phải bảo vệ mã, nhưng nếu chúng ta làm điều đó ngay bây giờ, chúng ta không thể tiến lên và luôn có ngoại lệ trên cùng một vị trí và bế tắc ứng dụng. Vì vậy, chúng tôi thiết lập cờ bước đơn vi xử lý.

Bây giờ khi nhận được ngoại lệ một bước, chúng tôi có thể đặt lại chế độ bảo vệ, bởi vì chúng tôi nâng cao bằng một lệnh. Đây là cách chúng tôi luôn có thể bảo vệ trang đích và không bỏ lỡ bất kỳ lần truy cập móc nào.

Chi phí là hai ngoại lệ và một bảo vệ trang cho mỗi lệnh được thực hiện trong trang đích. Đừng cố gắng làm điều này với một trình gỡ lỗi đính kèm. Nó sẽ phát điên.

Để triển khai thực tế, bạn có thể cần các đối tượng đồng bộ hóa để loại bỏ móc mà không làm rơi chương trình và quản lý móc tốt hơn.

Tôi thực sự thích cơ chế thông minh này và hy vọng một số người đã học được một chút về nó.

+0

Tôi không chắc chắn điều này trả lời câu hỏi OP, nhưng cảm ơn cho lời giải thích, tôi rất thích đọc nó! –

+0

@ dema80 cảm ơn phản hồi. tôi thực sự quản lý để đoán nơi để tải về các tập tin ngay bây giờ. Mọi thứ hoạt động tốt cho tôi trên windows 6.x – typ1232

+0

@ typ1232 Tôi đã sửa đổi câu hỏi của mình để thêm liên kết tải xuống trực tiếp vào nguồn, xin lỗi vì sự bất tiện –

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