2011-08-20 19 views
6

İşlevleri dışsal işlemlerde işlev ofsetleri aracılığıyla ayarlamıyorum. Hala ikili var ancak herhangi bir baskı yapmak doesnt i "DebugLog (Char ...)" fonksiyonunu bulduk ancak - - Bu im bugüne kadar çengel fonksiyonları için iyi çalışıyor buDetours "boş" işlev için harici işlemde kanca çalışmıyor

debugMessage proc near    ; 
      xor  eax, eax  ; Logical Exclusive OR 
      retn     ; Return Near from Procedure 
debugMessage endp 

benziyor o i basitçe zaten ikili benzer fonk (Char ..) içine kanca başardı olarak Şimdi ayıklama mesajı açıkça devre dışı bırakıldığı bu

push offset debugString ; "This is a debug message"... 
call debugMessage ; Call Procedure 

gibi denir, ben bu işe kanca istedi.

typedef void (__stdcall* DebugLog)(const char*); 
DebugLog Real_DebugLog = (DebugLog)(0xCAFEBABE); 

extern "C" 
{ 
static void __stdcall Hook_DebugLog(const char*); 
} 

void __stdcall Hook_DebugLog(const char* text) { 
MessageBox(NULL, text, "MyDebugLog", MB_OK); 
return Real_DebugLog(text); 
} 

// in dll main attach.. 
DetourTransactionBegin(); 
DetourUpdateThread(GetCurrentThread()); 
DetourAttach(&(PVOID&)Real_DebugLog, (PVOID)Hook_DebugLog); 

Benzer bir yaklaşım ı şimdiye kadar bu ikili girdiklerini diğer tüm fonksiyonlar için çalışır:

Bu

kodudur. Ayrıca debugMessage'ın bir hata ayıklayıcı ile çağrıldığından emin oldum.

Bu kanca neden hiç çalışmıyor? Belki de fonksiyonun değişkenleri olabilir mi? Ben zaten const char * ile çalıştı, ...).

cevap

2

İşlev muhtemelen kancalamayacak kadar küçüktür. Detours, çağrıları başka bir yere yönlendirmek için çengelli fonksiyonun bir iksirinin üzerine yazmalıdır, ancak Detours'un değiştirilmesinde hedeflenen bir JMP talimatı yazması için muhtemelen giriş günlüğünde yeterli yer yoktur.

+0

Teşekkürler - başka bir çözüm var mı? – Steve

+0

sadece başka bir şekilde tüm çağrı sitelerini dolaştırmak yerine – paulm

3

Bir "sapma" çalışması için en az 5 bayt (x86) gerektirir - debugMessage yalnızca 3 bayttır.

+0

özel bir cevap için teşekkür ederiz, başka bir çözüm biliyor musunuz? – Steve

+0

Yazılım veya donanım kesme noktalarını kullanabilirsiniz. Http://msdn.microsoft.com/en-us/library/ms679274(v=vs.85).aspx – Nop

+0

'a bir bakın. Evet, en azından yazılım kesme noktaları yardımcı olabilir. Bağlamak istediğiniz işlevin ilk baytının yerine 0xcc (int 3) koyabilirsiniz ve bir yakalama işleyicisi sağlayabilirsiniz. Vectored Exception Handling (VEH) Noergaard'ın atıfta bulunacağı burada yardımcı olabilir. – Eugene

İlgili konular