>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Systemy wbudowane Bezpieczeństwo
Java

Jak działa WaEnhancer X i dlaczego przepisać hooki WhatsApp w czystym Java

Korzystanie z oficjalnego klienta WhatsApp to dziwne doświadczenie. Messenger nieustannie gromadzi natrętny Meta AI, traci wygodne ustawienia lub ogranicza wyświetlanie mediów. Wcześniej entuzjaści rozwiązywali takie problemy za pomocą modyfikacji innych firm, takich jak WhatsApp Plus, ale Meta szybko blokuje konta za uruchamianie zmodyfikowanych plików APK. Na Androidzie jest jednak inna droga: modyfikowanie zachowania aplikacji bezpośrednio w RAM przy użyciu frameworka LSPosed.

Na GitHub natknąłem się na repozytorium WaEnhancer X. To fork oryginalnego projektu WaEnhancer, podążający interesującą ścieżką inżynieryjną. Gdy autorzy oryginalnego modułu zaczęli przepisywać kod w Kotlinie i przenosić ustawienia na zewnętrzne ekrany, deweloper WaEnhancer X zrobił krok wstecz — do czystego Javy i natywnej integracji bezpośrednio w interfejsie WhatsApp.

Co w środku: od blokowania AI po bezpośrednią pracę z SQLite

Główne zadanie modułu polega na przechwytywaniu wywołań metod wewnątrz oryginalnego klienta WhatsApp i zmienianiu ich logiki. Oto kilka przykładów tego, jak jest to robione z perspektywy technicznej:

  • Niszczenie natrętnego interfejsu użytkownika. WhatsApp nieustannie próbuje przemycać banery Meta AI poprzez flagi serwera. WaEnhancer X przechwytuje tworzenie tych elementów UI i wymusza ustawienie ich na status View.GONE przed wyrenderowaniem na ekranie.
  • Bezpośrednie zapytania SQL zamiast czekania na animacje UI. Gdy usuwasz status lub wiadomość, standardowy klient uruchamia łańcuch animacji i okien dialogowych. Moduł omija tę warstwę i uzyskuje dostęp do lokalnej bazy danych SQLite message oraz magazynu plików przez MediaProvider bezpośrednio, wykonując operację natychmiast.
  • Obejście ograniczeń czasowych. Pliki multimedialne jednorazowe (View Once) blokują zrzuty ekranu i ponowne odtwarzanie. Hook w kodzie aplikacji podstawia flagi dostępu, czyniąc podgląd trwałym i umożliwiając zapisanie pliku do galerii.
  • Integracja z Tasker. Moduł może odbierać Android Intents z zewnętrznych narzędzi automatyzacji, umożliwiając automatyzację trybu prywatnego na podstawie lokalizacji lub harmonogramu.

Sztuczki architektoniczne: jak połączyć GPL i kod własnościowy

Najciekawsza część repozytorium ukryta jest w strukturze modułu i licencjonowaniu. Projekt jest ściśle podzielony na trzy niezależne komponenty:

+-------------------------------------------------------+
|                   Helper Plugin APK                   |
|           (Закрытый код / Дополнительные фичи)        |
+-------------------------------------------------------+
                           |
                           v  (Compile-Time Dependency)
+-------------------------------------------------------+
|                     :api Module                       |
|          Лицензия Apache-2.0 / Интерфейсы и DTO       |
+-------------------------------------------------------+
                           ^
                           |  (Shared API Dependency)
+-------------------------------------------------------+
|                     :app Module                       |
|           Лицензия GPL-3.0 / Основной фреймворк       |
+-------------------------------------------------------+

Dlaczego potrzebna jest taka złożoność? Aby uniknąć naruszenia warunków GNU GPL v3. Główny moduł hooków (:app) jest dystrybuowany na licencji GPL-3.0. Gdyby został skompilowany razem z zamkniętymi komponentami, skutkowałoby to naruszeniem licencji.

Autor przeniósł wszystkie interfejsy interakcji do osobnego modułu :api na permisyjnej licencji Apache-2.0. Podczas działania otwarty host wykrywa pomocniczy APK przez ContentProvider i dynamicznie ładuje go przez własny ClassLoader. W rezultacie zamknięta wtyczka wykonuje się wewnątrz procesu WhatsApp przez interfejsy :api, nie mając bezpośrednich zależności binarnych z kodem hosta na licencji GPL.

Dlaczego 100% Java zamiast Kotlin

Współczesny rozwój Androida prawie całkowicie przeszedł na Kotlin, ale dla modułów Xposed Java nadal ma swoje zalety. Przy ciągłej pracy z niskopoziomowym odbiciem (reflection) (FeatureLoader), czyste Java zapewnia kilka korzyści:

  1. Przewidywalny bytecode. Brak magii kompilatora Kotlina (funkcje inline, metody syntetyczne i generowanie metadanych) upraszcza debugowanie hooków.
  2. Zero narzutu. Biblioteka standardowa Kotlina nie jest ładowana do procesu WhatsApp, co zmniejsza ryzyko konfliktów wersji, jeśli WhatsApp sam używa innych wersji biblioteki.
  3. Stabilność przy aktualizacjach. Podejście przechwytywania metod rzadziej się psuje, gdy struktura klas WhatsApp zmienia się wraz z nowym wydaniem.

Ekran ustawień modułu również nie został zbudowany przy użyciu Jetpack Compose. Deweloper użył standardowego PreferenceFragmentCompat, osadzając menu modułu bezpośrednio w ustawieniach WhatsApp. Wygląda jak natywna sekcja aplikacji, a dla wygodnej nawigacji napisano klasę FeatureCatalog, która indeksuje przełączniki i wyszukuje żądaną funkcję używając zlokalizowanych ciągów znaków.

Jak wypróbować moduł na swoim urządzeniu

Uruchomienie WaEnhancer X wymaga przygotowanego smartfona:

  1. Urządzenie musi mieć dostęp do Roota i zainstalowane LSPosed (wersja Zygisk lub Riru).
  2. Pobierz gotowy plik APK z repozytorium GitHub i zainstaluj go.
  3. Otwórz aplikację LSPosed Manager i aktywuj moduł WaEnhancer X.
  4. Na liście aplikacji (Scope) wybierz WhatsApp.
  5. Zatrzymaj WhatsApp przez menu systemowe ("Zatrzymaj" / Wymuś zatrzymanie) i uruchom ponownie messenger.

Po tym w ustawieniach WhatsApp pojawi się nowa sekcja z opcjami modułu.

Dlaczego warto śledzić projekt

WaEnhancer X to wyraźny przykład tego, jak właściwe rozdzielenie modułów pomaga ominąć ograniczenia licencyjne przy tworzeniu dodatków do Androida. Projekt będzie przydatny dla deweloperów studiujących odbicie (reflection), architekturę hooków LSPosed oraz wstrzykiwanie kodu do aplikacji stron trzecich.

Podstawowa część kodu jest otwarta, wolna od zewnętrznych trackerów i wyraźnie demonstruje, jak modyfikować zachowanie zamkniętego messengera bez tworzenia wątpliwych kompilacji stron trzecich.

Powiązane projekty