2011-12-05 9 views
7

Bazı uygulamalarda istenen bazı davranışlar için bir dylib enjekte ediyorum.OSX'te Hoover C++ Yöntemleri?

Düz C API'lerini düzgün şekilde takabiliyorum. Dylib enjekte ettikten sonra, sembol tablosuna bakıyorum ve girişimi fonksiyon adresimle güncelledim ve daha sonra orijinali çağırıyorum. Bu nedenle sembol isimleri benim için önemli hale geliyor.

Sorunum C++ ad mangling ile ilgilidir. Adına mandallanan bir C++ işlevini nasıl çağırabiliriz. Yığın taşmasıyla ilgili bazı yerleri okuyorum, C++ kodunu mach_override ile kancalamak mümkün, ancak örnek veya referans yok.

Bazıları, C++ 'nun nasıl takılacağı konusunda bana örnek verebilir mi?

Düzenleme: Bir örnek olarak $ c++filt -n _ZN10WindowData12GetCGContextEv kullanılan ve dışarı WindowData::GetCGContext()

  1. bir sınıf veya ad alanı WindowData mı olarak koymak lazım?
  2. Nasıl takabilirim? WindowData :: GetCGContext() 'i çengel için uygun şekilde kullanmak için bazı ileri bildirimlere ve örneklere ihtiyacım var.

Böyle bir şey ...

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

    return gWindowDataGetCGContextProcPtr(inObj); 
} 

Şimdi, bu yöntemi yama istiyorum.

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

Bu düzeltme eki, düzeltme hatası verir.

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

Nasıl düzeltebilirim?

cevap

4

Manganlamayı çözmek ve enjeksiyonu yapmak için c++filt'u kullanabilirsiniz.

Ama iyileştirici tarafından inlined yöntemler gcc kullandığınız varsayılarak OS X'te bu yaklaşımın

+0

Teşekkürler, yöntem isminin çözümünü yapabiliyordum. – MacGeek

0

ile çalışmaz, <cxxabi.h> içinde abi::__cxa_demangle işlev C++ adları demangle için kullanılabilir. WindowData::GetCGContext imzasıyla eşleşen bir yönteme bir işaretçi atamak için buna ihtiyacınız yoktur. Bununla birlikte, bu sınıfa yönelik şartname hala sağlanmalıdır.