2008-09-18 24 views
7

Tôi quan tâm đến việc sử dụng tính năng gián điệp/chiếm đoạt API để triển khai một số tính năng cốt lõi của dự án mà tôi đang thực hiện. Nó đã được đề cập in this question là tốt, nhưng đó không thực sự về chủ đề vì vậy tôi figured nó muốn được tốt hơn với một câu hỏi của riêng mình cho việc này.,Kỹ thuật gián điệp/tấn công Windows API

Tôi muốn thu thập càng nhiều thông tin càng tốt về điều này , các kỹ thuật/thư viện khác nhau (MS Detours, IAT patching) hoặc các đề xuất khác. Ngoài ra, nó sẽ đặc biệt thú vị nếu biết ai đó có bất kỳ kinh nghiệm sản xuất thực tế của việc sử dụng các kỹ thuật như vậy - họ có thể được thực hiện đủ ổn định cho mã sản xuất hoặc đây có phải là kỹ thuật nghiên cứu nghiêm túc không? Không. Nó hoạt động đúng trên nhiều phiên bản của cửa sổ? Làm thế nào dễ bị lỗi là nó?

Trải nghiệm cá nhân và liên kết bên ngoài đều được đánh giá cao.

Trả lời

3

Tôi đã triển khai syringe.dll (L-GPL) thay vì MS Detours (chúng tôi không thích yêu cầu giấy phép hoặc khoản thanh toán khổng lồ để hỗ trợ x64) hoạt động tốt, tôi đã chuyển từ Win32 sang Win64, các ứng dụng thương mại off-the-self trong khoảng 2 năm nay.

Chúng tôi sử dụng lý do rất đơn giản để cung cấp khung trình bày để đóng gói lại, tái xây dựng thương hiệu cùng một ứng dụng được biên dịch thành nhiều sản phẩm khác nhau, chúng tôi lọc và thay thế chung cho chuỗi, tài nguyên chung, thanh công cụ, và các menu.

Là L-GPL, chúng tôi cung cấp nguồn, bản quyền, v.v và chỉ liên kết động với thư viện.

2

Hooking tiêu chuẩn Các chức năng WinAPI tương đối an toàn vì chúng sẽ không thay đổi nhiều trong tương lai gần, nếu có, vì Microsoft thực hiện tốt nhất là để giữ cho WinAPI tương thích ngược giữa các phiên bản. Tiêu chuẩn WinAPI hooking, tôi muốn nói, nói chung là ổn định và an toàn.

Hooking bất cứ điều gì khác, như trong nội bộ của chương trình đích, là một câu chuyện khác. Bất kể chương trình đích nào, bản thân hooking thường là một thực hành vững chắc. Liên kết yếu nhất của quy trình thường tìm đúng vị trí, và treo vào đó.

Thay đổi nhỏ nhất trong ứng dụng có thể và sẽ thay đổi địa chỉ của hàm, chưa kể đến thư viện động và v.v.

Trong gamehacking, nơi hooking là tiêu chuẩn thực hành, điều này đã bị đánh bại ở mức độ nào đó với "sigscanning", một kỹ thuật đầu tiên được phát triển bởi LanceVorgin trên các bảng MPC phần nào khét tiếng. Nó hoạt động bằng cách quét hình ảnh thực thi cho các phần tĩnh của một hàm, các byte lệnh thực tế sẽ không thay đổi trừ khi hành động của hàm được sửa đổi. Sigscanning rõ ràng là tốt hơn so với sử dụng bảng địa chỉ tĩnh, nhưng nó cũng sẽ thất bại cuối cùng, khi ứng dụng đích được thay đổi đủ.

Triển khai ví dụ về sigscanning trong C++ có thể được tìm thấy here.

1

Tôi đã sử dụng các kỹ thuật hăm tiêu chuẩn IAT trong vài năm nay và nó hoạt động tốt đẹp và ổn định và được chuyển đến x64 mà không gặp vấn đề gì. Các vấn đề chính mà tôi đã phải làm nhiều hơn với cách tôi tiêm các móc ở vị trí đầu tiên, phải mất một thời gian để tìm ra cách tốt nhất để tạm dừng các quy trình được quản lý tại điểm 'đúng' khi khởi động để tiêm đáng tin cậy và đủ sớm cho tôi.Injector của tôi sử dụng API gỡ lỗi Win32 và trong khi điều này làm cho nó dễ dàng để đình chỉ quá trình không được quản lý phải mất một chút thử và sai để có được quy trình quản lý bị đình chỉ tại một thời điểm thích hợp.

sử dụng của tôi cho IAT đã chủ yếu là cho các công cụ viết bài kiểm tra, tôi có một chương trình bế tắc phát hiện được trình bày chi tiết ở đây: http://www.lenholgate.com/blog/2006/04/deadlock-detection-tool-updates.html, một GetTickCount() kiểm soát chương trình trong đó có sẵn để tải về từ đây http://www.lenholgate.com/blog/2006/04/tickshifter-v02.html và một ứng dụng thời gian chuyển mà vẫn đang được phát triển.

1

Điều gì đó mà nhiều người quên là dll của cửa sổ được biên dịch là hot-patchable images (MSDN).

Bản vá nóng là cách tốt nhất để thực hiện các đường vòng WinAPI, vì nó sạch sẽ và đơn giản, đồng thời giữ nguyên chức năng ban đầu, nghĩa là không cần lắp ráp nội tuyến.

Hướng dẫn vá nóng nhỏ có thể được tìm thấy here.