Korzystanie z funkcji innej aplikacji oraz OllyDbg

0

Witam,
jest to pytanie czysto teoretyczne i ciągle się zastanawiam jak coś takiego zrobić. Pisałem w Delphi, mogę pisać też w C++. Patrzę na różne boty do gier internetowych online i widać, że wykorzystywane są tam metody typu przechwycenie połączenia i wysyłanie pakietów (co udało mi się zrobić), skanowanie pamięci (co w sumie jest podstawą i jest śmiesznie proste) oraz modyfikacja programu "w locie", aby zmienić jego sposób działania (a więc podmiana instrukcji ASM).
Zastanawiam się jednak, że jest to droga bardzo na około. Tak więc w jaki sposób mogę korzystać z funkcji w tej aplikacji znając jej adres? Zamiast przechwytywać połączenie i wysyłać pakiety np. przejścia do danej pozycji można po prostu wywołać funkcję już tam wbudowaną. Tak samo zamiast przechwytywać połączenie, zmodyfikować callbacka tak, aby wskazywał na naszą funkcję która później by zwracała sterowanie do programu.
Aby korzystać z przestrzeni pamięci tego programu wydaje mi się, że należy użyć DLL Injection. Wtedy w locie mogę zmienić tok działania i zmusić aplikację do skoku pod adres funkcji z "wciśniętego" DLLa.
Problemem dla mnie jednak jest wywołanie już istniejącej funkcji i za bardzo nie wiem jak miałbym to zrobić. Czy oznacza to konieczność stosowania assemblera do wywołania? Tj. wrzucenie parametrów funkcji na stos, wpisanie adresu powrotnego do EIP oraz skok pod adres funkcji? Byłbym wdzięczny za linki do jakichś artykułów, które to obrazują bo samemu nie byłem w stanie takich znaleźć.

Druga rzecz, to obsługa OllyDbg... Pewnie prosta sprawa, ale nie doszukałem się żadnego szczegółowego manuala. Włączam z poziomu debuggera aplikację, która już leci własnym życiem... W jaki sposób mam sprawdzić pod jaki adres dokonywany jest skok gdy naciskam jakiś przycisk w aplikacji?

Z góry dzięki za pomoc.

0

EIP to rejestr wskazujacy pozycje kursora w kodzie i nic do niego nie wrzucasz ;)

Wywołanie obcej funkcji to bardzo prosta sprawa.

Jedyne co musisz zrobić, to mieć swój kod w programie, w którym chcesz wywołać funkcję, a w nim instrukcje, które wrzucą odpowiednie parametry na stos i skoczy do wskazanej funkcji.

Do tego polecałbym Ci zrobić kawałek kodu służący do wstrzykiwania do innego procesu, który na przykład poprzez potok będzie odbierał adres funkcji i parametry, a następnie skakał gdzie trzeba. Jeżeli użyjesz instrukcji CALL, to nie musisz się martwić o adres powrotny :)

0

Hmm, czyli z tego co rozumiem wynika, że po prostu robię bibliotekę dll zawierającą powiedzmy aliasy nazw tych funkcji (które je wywołają oraz zwrócą wynik), wstrzykuje to do aplikacji a później po prostu korzystam z funkcji dlla (importując je sobie do aplikacji)?

Co do EIP to najwidoczniej pomyliłem z rejestrem zawierającym adres powrotu :)

0

Adres powrotu znajduje się na stosie :) Co do biblioteki, to tak jak napisałeś. Ładujesz ją do aplikacji "ofiary" i uruchamiasz co trzeba.

0

Dzięki, już wszystko mi pięknie działa :) Nie trzeba było aż tak kombinować - wystarczy DLL Injection a w DLLu np. taka definicja funkcji

typedef void _EnterGame();
static _EnterGame *EnterGame = (_EnterGame*)0x4569E1;
0

a czy w podobny sposób się omija zabezpieczenia gier/programów?(chodzi o numery seryjne, czy jakieś aktywacje mailowe), (ustawiamy "start" programu gdzieś dalej w ASM i mamy za free program)?

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