2009-05-15 33 views
29

Vì vậy, các ngày khác, tôi thấy điều này:Làm thế nào để ngăn chặn DLL tiêm

http://www.edgeofnowhere.cc/viewtopic.php?p=2483118

và nó đi qua ba phương pháp khác nhau của tiêm DLL. Làm cách nào để ngăn chặn chúng khỏi quá trình này? Hoặc ở mức tối thiểu, làm thế nào để ngăn chặn cái đầu tiên?

Tôi đã nghĩ có lẽ một người lái xe Vòng 0 có thể là cách duy nhất để ngăn chặn cả ba, nhưng tôi muốn xem cộng đồng nghĩ gì.

Trả lời

27

Các giải pháp kỹ thuật tốt nhất là nên làm điều gì đó gây ra các mã nạp để không thể chạy đúng cách sau khi quá trình của bạn khởi. Một cách để làm điều này là bằng cách lấy khóa bộ nạp NT, sẽ ngăn chặn hiệu quả bất kỳ hành động nào của trình nạp. Các tùy chọn khác bao gồm vá mã bộ nạp trực tiếp trong bộ nhớ để thực hiện cuộc gọi tới LoadLibrary không thành công cho kẻ tấn công (ví dụ: chèn điểm ngắt int3 và tự gỡ lỗi để xử lý các trường hợp dự kiến). trang web bạn đã liên kết đến, trên thực tế), bạn sẽ không bao giờ ngăn mọi người lấy mã vào quy trình của bạn, theo cách này hay cách khác. LoadLibrary chỉ xảy ra là một phím tắt tiện dụng, nhưng có rất nhiều cách khác nhau để tải mã bằng tay mà bạn không bao giờ có thể hy vọng dừng lại hoàn toàn, ngắn của một số mã ring0 cực kỳ tham gia. Và ngay cả khi bạn đi đến ring0, các tin tặc sẽ ở ngay bên cạnh bạn.

Ngoài ra, có rất nhiều cách sử dụng hợp pháp để tiêm DLL. Các chương trình chủ đề, công cụ trợ năng và các chương trình khác nhau mở rộng chức năng hệ điều hành có thể tất cả có khả năng sử dụng tính năng chèn DLL để cung cấp chức năng bổ sung cho bất kỳ chương trình nào.

+0

Mặc dù đúng là nó sẽ không thể ngăn chặn TẤT CẢ tin tặc, tôi chỉ muốn ngăn chặn ba kỹ thuật được liệt kê đó. Đây là những lệnh nhất, và kỹ thuật một là sử dụng gần như độc quyền nhưng phần lớn các leechers và kịch bản kiddies. Chỉ cần FYI, mã nằm trong một dll được tiêm, vì vậy tất cả những gì tôi muốn làm là đảm bảo rằng khi tôi ở trong, không ai khác có thể vào được. –

+8

Hãy nhớ bạn, Khóa tải là một nguồn tài nguyên toàn cầu, và nắm bắt nó (là | phải là) cơ sở để chấm dứt ngay lập tức. – MSalters

+0

"tất cả đều có khả năng sử dụng DLL injection để cung cấp chức năng bổ sung cho bất kỳ chương trình nào" - và, thường xuyên hơn không, để làm hỏng nó (với chương trình đang được tiêm vào, bị đổ lỗi cho sự cố bởi người dùng không nghi ngờ). –

6

Cách tốt nhất là đảm bảo không có quá trình không đáng tin cậy nào được quyền truy cập của Quản trị viên hoặc chạy dưới dạng tài khoản người dùng giống như ứng dụng của bạn. Nếu không có quyền truy cập này, việc tiêm mã vào ứng dụng của bạn là không thể; và một khi quá trình như vậy được truy cập, nó có thể gây ra tất cả các loại nghịch ngợm mà không cần phải tiêm chính nó vào một quá trình khác - việc tiêm chỉ làm cho nó dễ dàng hơn để ẩn.

+1

Vâng ... điều đó không hữu ích. Làm thế nào tôi có thể đặt quá trình theo một tài khoản người dùng mới từ bên trong tiến trình? –

1

Tại sao bạn muốn ngăn chặn điều này? Đây có phải là nhu cầu 'kinh doanh' thực sự hay bạn chỉ quan tâm đến 'hack' để phản đối 'hack'

Nếu quyền của người dùng cho phép điều này, theo thiết kế - hệ điều hành cung cấp cơ sở cho tất cả người dùng bạn, quản trị viên của hệ thống đã chỉ định cho các tài khoản mà họ chạy.

Raymond Chen sẽ được liên kết ở đây sớm ...

+7

DLL Injection là thực tế phổ biến trong trò chơi hack. Tôi chỉ đang chơi với những cách để ngăn chặn nó. Và, lần lượt, cách để có được những thứ đó. Làm thế nào về chúng tôi ngừng đặt câu hỏi về đạo đức của câu hỏi và trả lời nó thay thế? –

+2

Không nghi ngờ đạo đức chút nào. Các thông tin có sẵn trên cả hai mặt của phương trình hte, thì càng tốt. Quan điểm của tôi là cơ sở này là một tính năng hệ điều hành được cung cấp có chủ ý, và do đó không thực sự là cái gì đó "không phải xảy ra". Bất kỳ nỗ lực để ngăn chặn nó là như vậy nhiều hơn một 'hack' hơn 'circumventing' ở nơi đầu tiên. Nhưng mục tiêu chính của tôi là xác nhận rằng người ta đang tìm cách tham gia cuộc đua vũ trang và nghĩ rằng đây là thứ mà người ta thường điều chỉnh ở cấp độ ứng dụng. Rõ ràng bạn đang có, do đó, đó là làm rõ ... –

+0

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, hãy để lại nhận xét bên dưới bài đăng của họ. – Kcvin

0

Tôi không quen thuộc với các API Windows, nhưng tôi có thể cung cấp cho bạn một số gợi ý tổng quát hơn:

  1. Xem nếu bạn có thể sử dụng Windows Data Execution Prevention (DPE). Nó có thể sẽ không hoạt động cho tất cả các tình huống (đọc: hầu hết), bởi vì quá trình được nêu trong liên kết của bạn là một quá trình hợp lệ từ quan điểm của hệ điều hành. Quốc phòng sâu mặc dù

  2. Đảm bảo rằng phương pháp quá trình của bạn khẳng định điều khoản bảo mật trong suốt ứng dụng

  3. tĩnh phân bổ không gian bộ nhớ của bạn để cho bất kỳ chủ đề mới sinh ra vào nó sẽ hoặc là thất bại hay ghi đè lên không gian bộ nhớ hiện có; bạn sẽ cần có lẽ một đoạn rất lớn của logic để phát hiện và sửa chữa cho điều này mặc dù.

  4. Đưa mã của bạn vào trình điều khiển thiết bị hoặc một số quy trình loại cấp thấp khác mà bạn có thể được bảo vệ trong ô Bảo vệ tệp của Windows.

Chỉ cần thấy câu trả lời (tên đẹp, btw!) Cthulon và tôi sợ anh có thể là đúng: bất cứ ai muốn thực hiện tiêm mã trên ứng dụng của bạn sẽ tìm thấy một cách để làm như vậy. Các bước trên có thể làm cho nó khó hơn một chút.

Hope this helps

1

suy nghĩ Chỉ cần ngắn gọn để thảo luận :)

Sử dụng một cái hang mã để tiêm một CRC kiểm tra vào mã riêng của bạn có lẽ sẽ làm chậm người khác sử dụng hang động mã khác.

Bỏ qua danh sách mô-đun quy trình để biết dữ liệu không xác định đang được tải có thể giúp làm chậm người chỉ cần tiêm bất kỳ thứ gì cũ bằng móc gắn và móc tin nhắn.

+1

Tham khảo: "Bỏ phiếu danh sách mô-đun quá trình cho dll không xác định". Tôi cảm thấy như tôi đang trốn trong bụi cây khi bạn đi qua. Tôi mã tiêm nhưng không tiêm DLL, do đó bạn không thấy gì ở đó. – Joshua

2

Bạn đang tìm giải pháp Ring3? Nếu vậy, bạn đang muốn xây dựng thêm chức năng vào hệ thống hiện không phải là (ít nhất là kiến ​​thức của tôi) được cung cấp ngoài hộp, vì vậy nó sẽ đòi hỏi một chút công việc. Ngoài ra, điều này là có thể từ một trình điều khiển, trên thực tế phần lớn phần mềm AV của bạn thực hiện loại hoạt động này thường xuyên.

Để dừng các phương thức trên khỏi chế độ người dùng, nó sẽ phức tạp hơn một chút vì bạn không thể đăng ký chính mình như một cuộc gọi trở lại quá trình tạo hoặc tải DLL. Bạn có thể, tuy nhiên, nếu bạn cho rằng quá trình của bạn đã bắt đầu trước khi chúng, hãy móc CreateRemoteThread và các hàm tương tự trên toàn cầu và thực hiện kiểu kiểm tra này.

Vì vậy, có hiệu lực bạn muốn kiểm tra nơi CreateRemoteThread muốn tạo chuỗi và trả lại lỗi nếu bạn không hài lòng với nó.

Điều này sẽ phủ nhận hai phương pháp đầu tiên. Đối với phương pháp thứ ba, nếu bạn có băm hợp lệ của chương trình gốc trên đĩa, thì bạn luôn có thể kiểm tra băm trước khi tải nó. Nếu bạn không có băm, bạn có thể ít nhất chỉ cần kiểm tra một số địa điểm đơn giản mà ai đó sẽ thêm loại mã đó và tìm các tệp DLL bạn không mong đợi ở đó (ví dụ: IAT hoặc chuỗi chạy).

Nó không phải là chống lừa đảo, nhưng nó dường như cung cấp cho các chức năng bạn yêu cầu.

11

Làm thế nào để bảo vệ chống lại những 3 kỹ thuật:

CreateRemoteThread

Bạn có thể ngăn các kỹ thuật đầu tiên (CreateRemoteThread trong đó kêu gọi LoadLibrary) bằng cách hooking LoadLibrary. Trong hook của bạn, bạn kiểm tra danh sách các tên DLL mà bạn biết là một phần của quá trình và có thể được tải, hoặc bạn có thể kiểm tra danh sách các DLL đã biết mà bạn không muốn tải.

Khi bạn tìm thấy một DLL bạn không muốn tải SetLastError (ERROR_ACCESS_DENIED), sau đó trả về NULL. Tôi đặt lỗi cuối cùng để những người viết mã tìm kiếm mã lỗi có được một lỗi. Điều này dường như hoạt động, có lẽ một mã khác có thể phù hợp hơn.

Điều đó sẽ ngăn không cho DLL tải.

SetWindowsHookEx

Tôi nghĩ rằng kỹ thuật tương tự cho CreateRemoteThread chặn sẽ làm việc cho SetWindowsHookEx, nhưng chỉ khi bạn có thể móc của bạn được cài đặt trước khi kỹ thuật SetWindowsHookEx đã bắt đầu nạp mã của nó (mà thường là khi cửa sổ đầu tiên được tạo ra trong một ứng dụng - quá sớm trong cuộc đời của nó).

Mã Cave

Kỹ thuật hay. Không thấy trước đó. Bạn có thể bảo vệ chống lại điều này, nhưng bạn sẽ phải móc điểm nhập LoadLibrary (không phải bảng IAT) vì Code Cave gọi LoadLibrary trực tiếp.

Là tác giả của bài viết đã nhận xét - có nhiều cách bạn có thể bị tấn công và có thể bạn sẽ gặp khó khăn trong việc đánh bại tất cả chúng. Nhưng thường bạn chỉ muốn bảo vệ chống lại tải DLL nhất định (chẳng hạn như một DLL bên thứ 3 cụ thể không tương thích với phần mềm của bạn vì DLL của bên thứ ba không được viết đúng để chứa thực tế là móc khác cũng có thể có mặt, vì vậy bạn chặn nó từ tải).

+1

Tôi viết móc bằng cách sử dụng CreateRemoteThread. Hooking LoadLibrary là không phòng thủ như tôi không gọi LoadLibrary. Tôi thực hiện các bản sao nội bộ của địa chỉ FindLibrary và GetProcedure trong phần khai báo. – Joshua

4

Vì áp phích này ám chỉ rằng anh ấy đang đầu tư chống hack trò chơi, hãy để tôi làm sáng tỏ những gì tôi nghĩ. Như một kẻ lừa đảo cũ.

Chỉ là con trỏ về trò chơi chống hack.

Cách tốt nhất là để máy chủ chạy logic trò chơi lõi. ví dụ. Trong game bắn súng người đầu tiên, theo dõi chuyển động mà khách hàng gửi đến máy chủ. Không cho phép họ di chuyển xung quanh một cách ngẫu nhiên. Cho phép máy chủ thông báo cho khách hàng biết mỗi người chơi dựa trên logic riêng của mình. Đừng bao giờ chỉ chuyển tiếp các lệnh. Chúng có thể là không có thật.

Ai quan tâm nếu hacker tấn công ứng dụng khách của riêng mình? chỉ từ chối nó trên những cái khác và tất cả đều tốt. Đối với bản đồ starcraft, giải pháp rất đơn giản. Đừng đưa ra trò chơi cho các khu vực không được biết đến. Nó cũng tiết kiệm băng thông.

Tôi là một kẻ lừa đảo lớn ở Delta Force (một trò chơi cũ). Bí quyết chính mà tôi sử dụng là làm cong bất cứ nơi nào trong game bằng cách thay đổi trực tiếp bộ nhớ của quá trình. Không yêu cầu DLL!

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