[ASM]Zmienne adresy funkcji w 32bit programie działającym na 64bit Windows 7

0

Witam,

jestem bardzo zielony jeśli chodzi o temat, przerabiałem sobie tego oto tutoriala: http://www.codeproject.com/KB/cpp/funccaller.aspx .
Jak zaznaczyłem w temacie, mój system operacyjny to 64bitowy windows 7.

Mój problem polega na tym, że kiedy uruchamiam 32bitową aplikację na moim 64bitowym OSie, za każdym uruchomieniem adresy funkcji (offsety) w pamięci są inne (tak mi się przynajmniej wydaje). Nie muszę chyba tłumaczyć że napisanie DLLki która wywołuje funkcję programu znajdującą się np. pod adresem 0x004113A0 (bo pod takim funkcja znajduje się w rzeczywistości) oraz injectowanie jej do działającego programu kończy się crashem aplikacji.

Moje pytanie brzmi: w jaki sposób przydzielane są te adresy i w jaki sposób wyłuskać aktualny adres funkcji? Czy np. są gdzieś w pamięci zapisane jakieś pointery?

Niestety, google mi w tej kwestii nie pomogło, nigdzie nie mogłem znaleźć odpowiedzi. Będę baaardzo wdzięczny za jakiekolwiek naprowadzenie mnie na właściwy trop.

Edit: Aha, korzystam z OllyDBG i to w nim zauważyłem różnicę w adresach przy każdym uruchomieniu.

1

ASLR, kochany. O GetModuleHandle ew. czymś z PSAPI nie słyszałeś? Z opisu niewiele wynika, podaj konkretnie co to za aplikacja.

0

Nie słyszałem, napisałem że jestem zielony. Dziękuję za szybką odpowiedź.
Konkretnie aplikacja to skompilowany przeze mnie programik z tamtego tutoriala.

1

Moje pytanie brzmi: w jaki sposób przydzielane są te adresy
W sposób zależny od miliarda różnych czynników, i nie da się tego przewidzieć.

0

Dzięki za zainteresowanie. Oczywiście niekoniecznie interesuje mnie przewidzenie tego jaki akurat tym razem zostanie przydzielony adres. Interesuje mnie po prostu znalezienie go w aktualnie uruchomionej aplikacji. W tym momencie dostałem już słowo kluczowe w postaci GetModuleHandle() więc mam jakiś punkt zaczepienia. Poszukam, powęszę, jeśli ktoś ma jeszcze jakieś rady odnośnie tego to będę śledził temat.

Edit:
a = GetModuleHandle("nazwa");
printf("%x", a);

teraz wystarczy dodać do zmiennej a adres funkcji i jesteśmy w domu. Dziękuję bardzo za pomoc :)

Edit2:

Oto rozwiązanie fragmentu tutoriala z własnym skompilowanym programem dla windowsa 7 x64 oraz Visual Studio 2010 (zarówno program jak i injectowany .dll są 32-bitowe):

zamiast:

pFunctionAddress pMySecretFunction = (pFunctionAddress)(0x004113C0);

dajemy:

pFunctionAddress pMySecretFunction = (pFunctionAddress)((int)GetModuleHandle(0)+(int)0x113A0); 
/* 113A0 to MÓJ adres funkcji minus 400000 (ponieważ GetModuleHandle zwraca nam początek aplikacji który zazwyczaj siedzi właśnie w 400000) */

1 użytkowników online, w tym zalogowanych: 0, gości: 1