2011-11-21 44 views
7

Làm thế nào chính xác RunDll32 gọi một hàm, mà không biết số/loại đối số mà hàm có thể thực hiện?RunDll32 hoạt động như thế nào?

Ứng dụng có trình biên dịch được tích hợp sẵn hay sắp xếp không?

Trả lời

11

RunDll32 là khá nhiều trình bao bọc mỏng gọi số LoadLibrary để tải DLL đã cho, gọi GetProcAddress để nhận địa chỉ hàm của hàm mong muốn và sau đó gọi hàm.

Nó không thể gọi bất kỳ chức năng chỉ xuất khẩu trong DLL, mặc dù nó-giả định rằng các chức năng có chức năng chữ ký rất cụ thể các nội dung sau:

void CALLBACK 
    EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow); 

nơi CALLBACK là macro mở rộng đến __stdcall quy ước gọi điện. Xem this knowledge base article để biết mô tả chi tiết hơn.

Nếu hàm DLL của bạn không có chữ ký hoặc quy ước gọi chính xác, rất nhiều lỗi sẽ xảy ra. Xem What can go wrong when you mismatch the calling convention? để biết nhiều chi tiết đẫm máu. May mắn thay (hoặc có lẽ không may), RunDll32 is written in such a way to ameliorate those types of errors, nhưng điều đó vẫn không có nghĩa đó là một ý tưởng hay. Không sử dụng RunDll32 để gọi các chức năng không có chữ ký chính xác. Nó chỉ là một quả bom đánh dấu thời gian chờ đợi để đi tắt trong phiên bản tiếp theo của Windows.

2

Nó không thể gọi bất kỳ chức năng nào, nó chỉ có thể gọi hàm specifically written to be called. Do đó, không có phép thuật.

+0

SwapMouseButton bên trong User32.dll là một ví dụ cho một hàm, trong đó "ma thuật" được tham gia. Loại ma thuật này được giải thích bên trong câu trả lời đó: http://stackoverflow.com/a/30285986/832220 –

+0

Tôi vừa tìm thấy SetSuspendState bên trong của PowrProf.dll là một ví dụ khác về loại ma thuật này. Chỉ cần thử lệnh sau đây để chứng minh loại ma thuật này: rundll32.exe PowrProf.dll, SetSuspendState –

+0

LockWorkStation trong User32.dll chỉ là một ví dụ khác cho các hàm có thể gọi bằng rundll32.exe. Dòng lệnh là: rundll32.exe User32.dll, LockWorkStation –

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