2013-02-25 9 views
5

Tôi muốn biết nếu nó có thể "chỉnh sửa" mã bên trong một DLL đã biên dịch chưa.Làm thế nào để sửa đổi một chức năng trong một biên dịch DLL

I.E. hãy tưởng tượng rằng có một hàm có tên là sum(a,b) bên trong Math.dll có thêm hai số ab

Giả sử tôi đã mất mã nguồn của DLL của mình. Vì vậy, điều duy nhất tôi có là tệp nhị phân DLL. Có cách nào tôi có thể mở tệp nhị phân đó, xác định vị trí của hàm của tôi và thay thế thường lệ sum(a,b), ví dụ, một thường trình trả về phép nhân ab (thay vì tổng)?

Tóm tắt, có thể chỉnh sửa các tệp mã nhị phân không?

có thể sử dụng các công cụ kỹ thuật đảo ngược như ollydbg?

+0

Dễ dàng thực hiện trong bộ nhớ nhiều hơn trên đĩa. Và hy vọng bạn không có bất cứ điều gì tương tự như [AuthentiCode] (http://msdn.microsoft.com/en-us/library/ms537359 (v = vs.85) .aspx) hoặc xác thực khác để đảm bảo on- hình ảnh đĩa không bị xáo trộn khi trình tải thông minh hợp lý đang chuẩn bị hình ảnh PE để tải. – WhozCraig

+0

Nếu bạn hoạt động được xuất trong dll, tại sao không chỉ quấn dll? –

+0

Tôi không chỉ nói về các hàm được xuất trong tệp DLL. Điều gì sẽ xảy ra nếu tổng (a, b) là một hàm riêng được sử dụng bên trong Dll? không được xuất khẩu để sử dụng công khai. là nó có thể xác định vị trí thói quen này và thay đổi chúng? – Herno

Trả lời

7

Có chắc chắn là có thể (miễn là tệp DLL không được ký mã hóa), nhưng nó là một thử thách. Bạn có thể làm điều đó với một trình soạn thảo Hex đơn giản, mặc dù tùy thuộc vào kích thước của DLL bạn có thể phải cập nhật rất nhiều phần. Đừng cố gắng để đọc nhị phân nguyên, nhưng thay vì chạy nó thông qua một disassembler.

Bên trong tệp nhị phân đã biên dịch, bạn sẽ thấy một loạt các byte bí truyền. Tất cả các opcodes thường được viết trong assembly như các lệnh như "call", "jmp," vv sẽ được dịch sang tương đương byte phụ thuộc vào kiến ​​trúc máy. Nếu bạn sử dụng bộ tách rời, bộ tách rời sẽ thay thế các giá trị nhị phân này bằng các hướng dẫn lắp ráp để dễ hiểu hơn những gì đang xảy ra.

Bên trong tệp nhị phân đã biên dịch, bạn cũng sẽ thấy nhiều tham chiếu đến các vị trí được mã hóa cứng. Ví dụ, thay vì nhìn thấy "call add()", nó sẽ là "call 0xFFFFF". Giá trị ở đây thường là một tham chiếu đến một lệnh đang ngồi ở một độ lệch cụ thể trong tệp. Thông thường đây là lệnh đầu tiên thuộc về hàm được gọi. Lần khác nó là thiết lập stack/mã dọn dẹp. Điều này thay đổi tùy theo trình biên dịch. Miễn phí

Miễn là các hướng dẫn bạn thay thế có cùng kích thước với hướng dẫn ban đầu, bù trừ của bạn vẫn sẽ chính xác và bạn sẽ không cần phải cập nhật phần còn lại của tệp. Tuy nhiên, nếu bạn thay đổi kích thước của các hướng dẫn bạn thay thế, bạn sẽ cần cập nhật tất cả các tham chiếu đến các vị trí theo cách thủ công (điều này thực sự là tẻ nhạt btw).

Gợi ý: Nếu hướng dẫn bạn thêm là nhỏ hơn so với những gì bạn đã thay thế, bạn có thể đệm phần còn lại bằng NOP để giữ vị trí không bị tắt.

Hy vọng rằng sẽ giúp, và hạnh phúc hack :-)

+0

Cảm ơn! Câu trả lời của bạn rất hữu ích và có nhiều thông tin! Tôi đã không nghĩ về các offsets và địa chỉ 'thay đổi có liên quan đến trực tiếp vá dll của tôi. – Herno

2

Detours, một thư viện để tùy chỉnh các chức năng Win32 trên máy x86. Detours chặn các hàm Win32 bằng cách viết lại các ảnh hàm chức năng đích. Gói Detours cũng chứa các tiện ích để đính kèm các DLL và phân đoạn dữ liệu tùy ý (được gọi là tải trọng) vào bất kỳ nhị phân Win32 nào. Download

1

Bạn có thể, tất nhiên, hex-chỉnh sửa các DLL với nội dung trái tim của bạn và làm tất cả các loại vật ưa thích. Nhưng câu hỏi đặt ra là tại sao đi đến tất cả những rắc rối đó nếu ý định của bạn là thay thế chức năng để bắt đầu?

Tạo DLL mới với chức năng mới và thay đổi mã gọi hàm chức năng trong DLL cũ để gọi hàm trong DLL mới.

Hay bạn cũng mất mã nguồn cho ứng dụng? ;)

+0

Điều đó nghe có vẻ giống như một giải pháp tốt thực sự :) – ppumkin