2011-12-05 45 views
7

Tôi đang tiêm một dylib vào một số ứng dụng cho một số hành vi mong muốn.Hooking C++ Phương pháp trên OSX?

Tôi có thể móc đúng C API chuẩn. Một khi tôi tiêm dylib, tôi nhìn ra trong bảng biểu tượng và cập nhật mục nhập của nó với địa chỉ hàm của tôi và lần lượt gọi bản gốc.

Vì vậy, tên biểu tượng trở nên quan trọng đối với tôi.

Vấn đề của tôi là với Tên C++ mangling. Làm thế nào chúng ta có thể móc một hàm C++ có tên đã bị xáo trộn. Tôi đọc một số nơi trên tràn ngăn xếp, có thể móc mã C++ với mach_override, nhưng không có ví dụ hoặc tham chiếu.

Một số có thể cho tôi ví dụ về cách đạt được sự kết hợp của C++?

Edit: tôi đã sử dụng $ c++filt -n _ZN10WindowData12GetCGContextEv như một ví dụ và đã đặt ra như WindowData::GetCGContext()

  1. là WindowData một lớp hoặc namespace?
  2. Làm cách nào tôi có thể móc nối? Tôi ma cần một số tờ khai về phía trước và externs để sử dụng WindowData :: GetCGContext() đúng cho hooking.

Something như thế này ...

typedef void* (*WindowData_GetCGContextProcPtr)(void* inObj); 
static WindowData_GetCGContextProcPtr gWindowDataGetCGContextProcPtr = NULL; 
void* try_WindowDataGetCGContextProcPtr(void* inObj) 
{ 
    printf("try_WindowDataGetCGContextProcPtr \n"); 

    return gWindowDataGetCGContextProcPtr(inObj); 
} 

Bây giờ, tôi muốn vá phương pháp này.

gWindowDataGetCGContextProcPtr = (WindowData_GetCGContextProcPtr)Patch((const void*)&WindowData::GetCGContext, (const void*)&try_WindowDataGetCGContextProcPtr); 

Bản vá này cung cấp lỗi biên dịch.

error: 'WindowData' has not been declared 
error: 'GetCGContext' was not declared in this scope 

Làm cách nào để khắc phục sự cố?

Trả lời

4

Bạn có thể sử dụng c++filt để giải mã xoài và thực hiện việc tiêm.

Nhưng phương pháp đó đều được sắp xếp bởi tôi ưu hoa sẽ không làm việc với phương pháp này

+0

Cảm ơn, tôi đã có thể loại bỏ tên phương thức. – MacGeek

0

Trên OS X, giả sử bạn đang sử dụng gcc, các abi::__cxa_demangle chức năng trong <cxxabi.h> có thể được sử dụng để demangle tên C++. Bạn không cần điều này để gán một con trỏ cho một phương thức khớp với chữ ký của: WindowData::GetCGContext. Tuy nhiên, đặc tả cho lớp này vẫn cần phải được cung cấp.