Temat nie dotyczy stricte Delphi, ale aplikacja, którą chcę zmodyfikować jest napisana w Delphi i ja też (szumnie brzmiąco) mogę się nazywać programistą Delphi. Okej - to tytułem wstępu.
Sytuacja wygląda tak:
Jest aplikacja, która łączy się z serwerem PostgreSQL 9.0. Aplikacja i serwer bazy danych to jedna paczka - to znaczy biblioteka libpq.dll jest zmodyfikowana przez producenta aplikacji, podobnie jak dostępne metody uwierzytelniania (nie ma metody trust) oraz zmodyfikowany jest mechanizm zapisu nagłówka strony. Stąd większość ścieżek dostępu do serwera bazy danych jest zamknięta.
Owszem istnieje pewien sposób, żeby się tam dostać, ale prawdopodobnie i on niedługo zostanie uszczelniony.
Niestety - życie jest życiem i swoje trzeba robić (serwisować aplikację). Dlatego szukam już teraz alternatywnej ścieżki nadawania sobie uprawnień do bazy danych - tak, żeby dało się do niej zapiąć np. pgAdminem lub innym podobnym narzędziem i móc zrobić cokolwiek (w układzie jak teraz baza danych klienta musi trafić do producenta, a ten realizuje zgłoszenia serwisowe wg kolejności napływania. Czas oczekiwania na serwis to nierzadko ponad dwa tygodnie - w tym czasie moi klienci wydrapią mi oczy).
Pytanie brzmi:
Czy da się jakoś zatrzymać aplikację w ściśle ustalonym momencie (np. kliknięcia konkretnego przycisku i wywołania procedury zdarzeniowej, zmodyfikować stos (dokładniej stringa z SQLem zbudowanego przez aplikację) i puścić dalej, żeby wykonał nasze zapytanie SQL w zamian za to co miał wykonac pierwotnie.
Na pierwszą część wiem, że jest odpowiedź twierdząca: zatrzymać aplikację potrafi zrobić np. Cheat Engine. Potrafi też zmodyfikować zawartość pamięci - więc jest dość blisko, ale: zatrzymanie aplikacji następuje ręcznie - ja muszę nadisić guziora "Pause" i bankowo nie zrobię tego w odpowiednim momencie. Poza tym w momencie kiedy wyszukuję w pamięci określonych ciągów po zatrzymaniu aplikacji - najczęścieściej trafiam w śmieci - pozostałości po zwolnionych i nie wyczyszczonych obszarach (np. zarezerwowano dla zmiennej string obszar pamięci o długości odpowiadającej 20 znakom, po czym w ten sam obszar pamięci wpisano stronga 5 znakowego. 6 znak jest pusty a potem śmieci, akurat takie, które pasują do mojej frazy).
Chciałbym zrobić coś na zasadzie debuggera - ustawiam breakpointa w odpowiednim miejscu, podglądam stos, widzę zmienne i co się z nimi dzieje, po czym step-by-step dochodze do momentu, gdzie pojawia się kompletne zapytanie - tuż przed wykonaniem. Modyfikuję i puszczam aplikację dalej.
Da się tak ?
Sytuacja wygląda tak:
Jest aplikacja, która łączy się z serwerem PostgreSQL 9.0. Aplikacja i serwer bazy danych to jedna paczka - to znaczy biblioteka libpq.dll jest zmodyfikowana przez producenta aplikacji, podobnie jak dostępne metody uwierzytelniania (nie ma metody trust) oraz zmodyfikowany jest mechanizm zapisu nagłówka strony. Stąd większość ścieżek dostępu do serwera bazy danych jest zamknięta.
Owszem istnieje pewien sposób, żeby się tam dostać, ale prawdopodobnie i on niedługo zostanie uszczelniony.
Niestety - życie jest życiem i swoje trzeba robić (serwisować aplikację). Dlatego szukam już teraz alternatywnej ścieżki nadawania sobie uprawnień do bazy danych - tak, żeby dało się do niej zapiąć np. pgAdminem lub innym podobnym narzędziem i móc zrobić cokolwiek (w układzie jak teraz baza danych klienta musi trafić do producenta, a ten realizuje zgłoszenia serwisowe wg kolejności napływania. Czas oczekiwania na serwis to nierzadko ponad dwa tygodnie - w tym czasie moi klienci wydrapią mi oczy).
Pytanie brzmi:
Czy da się jakoś zatrzymać aplikację w ściśle ustalonym momencie (np. kliknięcia konkretnego przycisku i wywołania procedury zdarzeniowej, zmodyfikować stos (dokładniej stringa z SQLem zbudowanego przez aplikację) i puścić dalej, żeby wykonał nasze zapytanie SQL w zamian za to co miał wykonac pierwotnie.
Na pierwszą część wiem, że jest odpowiedź twierdząca: zatrzymać aplikację potrafi zrobić np. Cheat Engine. Potrafi też zmodyfikować zawartość pamięci - więc jest dość blisko, ale: zatrzymanie aplikacji następuje ręcznie - ja muszę nadisić guziora "Pause" i bankowo nie zrobię tego w odpowiednim momencie. Poza tym w momencie kiedy wyszukuję w pamięci określonych ciągów po zatrzymaniu aplikacji - najczęścieściej trafiam w śmieci - pozostałości po zwolnionych i nie wyczyszczonych obszarach (np. zarezerwowano dla zmiennej string obszar pamięci o długości odpowiadającej 20 znakom, po czym w ten sam obszar pamięci wpisano stronga 5 znakowego. 6 znak jest pusty a potem śmieci, akurat takie, które pasują do mojej frazy).
Chciałbym zrobić coś na zasadzie debuggera - ustawiam breakpointa w odpowiednim miejscu, podglądam stos, widzę zmienne i co się z nimi dzieje, po czym step-by-step dochodze do momentu, gdzie pojawia się kompletne zapytanie - tuż przed wykonaniem. Modyfikuję i puszczam aplikację dalej.
Da się tak ?
Ostatnio edytowane przez moderatora: