2009-01-07 27 views
5

Điều này có vẻ giống như một câu hỏi lạ, nhưng tôi muốn biết cách tôi có thể chạy một hàm trong một .dll từ bộ nhớ 'chữ ký'. Tôi không hiểu nhiều về cách nó thực sự hoạt động, nhưng tôi rất cần nó. Đó là một cách để chạy các chức năng không được báo cáo từ bên trong một .dll, nếu bạn biết chữ ký bộ nhớ và địa chỉ của nó. Ví dụ, tôi có những:Chạy hàm unexported .dll với python

respawn_f "_ZN9CCSPlayer12RoundRespawnEv" 
respawn_sig "568BF18B06FF90B80400008B86E80D00" 
respawn_mask "xxxxx?xxx??xxxx?" 

Và sử dụng một số khá tiện lợi C++ bạn có thể sử dụng chức năng này để chạy từ bên trong một .dll.

Dưới đây là một bài viết giải thích tốt trên nó: http://wiki.alliedmods.net/Signature_Scanning

Vì vậy, là nó có thể sử dụng ctypes hoặc bất kỳ cách nào khác để làm python bên này?

Trả lời

2

Nếu bạn có thể chạy chúng bằng cách sử dụng C++ thì bạn có thể thử dùng SWIG để tạo trình bao bọc python cho mã C++ mà bạn đã viết làm cho nó có thể gọi được từ python.

http://www.swig.org/

Hãy cẩn thận mà tôi đã tìm thấy bằng SWIG:

Uống một lân ngước lên loại dựa trên một giá trị chuỗi. Ví dụ: một loại số nguyên trong Python (int) sẽ xem xét để đảm bảo rằng loại cpp là "int" nếu không, swig sẽ khiếu nại về loại không phù hợp. Không có chuyển đổi tự động.

Sao chép nguyên bản mã nguồn sao chép do đó ngay cả đối tượng trong cùng một không gian tên sẽ cần phải đủ điều kiện để tệp cxx sẽ biên dịch đúng cách.

Hy vọng điều đó sẽ hữu ích.

0

Bạn đã nói bạn đang cố gọi một hàm không được xuất; theo như tôi biết, điều đó là không thể từ Python. Tuy nhiên, vấn đề của bạn dường như chỉ đơn thuần là cái tên bị xé.

Bạn có thể gọi xuất khẩu tùy ý bằng cách sử dụng ctypes. Vì tên bị xé, và không phải là một mã định danh Python hợp lệ, bạn có thể sử dụng getattr().

Một cách tiếp cận khác nếu bạn có thông tin chính xác là tìm xuất khẩu theo thứ tự, bạn phải làm gì nếu không có tên nào được xuất khẩu. Một cách để có được thứ tự sẽ sử dụng dumpbin.exe, được bao gồm trong nhiều ngôn ngữ biên dịch Windows. Nó thực sự là một front-end cho mối liên kết, vì vậy nếu bạn có MS LinK.exe, bạn cũng có thể sử dụng nó với các công tắc dòng lệnh thích hợp.

Để có được tài liệu tham khảo chức năng (mà là một "chức năng-con trỏ" đối tượng liên kết với địa chỉ của nó), bạn có thể sử dụng một cái gì đó như:

ctypes nhập khẩu func = getattr (ctypes.windll.msvcrt, "@@ myfunc") retval = func (Không)

Đương nhiên, bạn sẽ thay thế 'msvcrt' bằng dll bạn đặc biệt muốn gọi.

Những gì tôi không hiển thị ở đây là cách hủy bỏ tên để lấy được chữ ký gọi, và do đó các đối số cần thiết. Việc đó sẽ yêu cầu một trình gỡ rối, và chúng rất cụ thể đối với thương hiệu AND VERSION của trình biên dịch C++ được sử dụng để tạo DLL.

Có một số lỗi nhất định kiểm tra xem chức năng có phải là stdcall hay không, vì vậy đôi khi bạn có thể giải quyết mọi thứ cho đến khi bạn nhận được đúng. Nhưng nếu chức năng là cdecl, thì không có cách nào để tự động kiểm tra. Tương tự như vậy bạn phải nhớ bao gồm thêm tham số này nếu thích hợp.

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