Analizator stosu doczekał się czegoś co można określić betą. Czyli u mnie działa i robi to co ma robić, ale nie został jeszcze należycie przetestowany i nie doczekał się wdrożenia. Wrzuciłbym cały kod, ale jest go nieco za dużo, więc tylko najciekawsze fragmenty.
Radzi sobie zarówno ze zwykłymi funkcjami jak i wywołaniami wirtualnymi.
Wymogiem jest aby ramka stosu była skonstruowana zgodnie z tym co opisałem wcześniej.
Wynikiem działania są kolejne adresy powrotne.
Wydobycie aktualnego BP i adresu powrotnego:
void GetCurrentFrame(void * basepointer, void * retaddr)
{
__asm
{
mov eax, ebp
mov eax, [eax]
mov basepointer, eax
mov eax, ebp
add eax, 0x4
mov eax, [eax]
mov retaddr, eax
}
}
Wydobycie kolejnej ramki:
bool GetNextFrame(void * basepointer, void * retaddr)
if (0 == *(unsigned int *)basepointer)
{
return false;
}
else
{
__asm
{
mov eax, basepointer
add eax, 0x4
mov eax, [eax]
mov retaddr, eax
mov eax, basepointer
mov eax, [eax]
mov basepointer, eax
}
return true;
}
}
Wydobycie adresu bazowego (o tym już pisałem wcześniej):
void GetBaseAddress(unsigned int & baseAddr)
{
HMODULE proces = GetModuleHandleA(0);
baseAddr = (unsigned int)proces;
}
Na początku należy wywołać GetCurrentFrame, potem w pętli GetNextFrame. Adres bazowy można wyciągnąć w dowolnym momencie.
Osobiście ubrałem to sobie w klasy, a ten kod (jak wspomniałem) jest tak na szybko uproszczony, żeby się go dało zaprezentować na tym blogu.
Na koniec chciałbym życzyć wszystkim aby rok 2010 okazał się owocniejszy od wszystkich minionych.
PS.
Właśnie odkryłem, że blogger zapisuje sobie datę utworzenia posta, a nie publikacji. Data publikacji 01.01.2010.