Shellbefehle aus apk ausführen (sqlite3)

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von assenda, 15.07.2011.

  1. assenda, 15.07.2011 #1
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    Hallo ;)

    Ich bräuchte paar Tipps bei meiner SMS app :)

    ..> zum versenden von sms über eine Webseite

    (Die app funktioniert an sich schon, aber leider stoppt sie, sobald die grenze von 100 SMS/ Stunde überschritten wird)

    Deshalb muss ich den schutz umgehen, wofür ich bei android 2.1 noch die app infititeSMS remover benutz habe...

    Leider funktioniert das jetzt nicht mehr (nicht kompatible mit android 2.3)
    und die kompatible App sms remover kann ich nicht kaufen, da ich keine Kreditkarte hab :(

    SMS Limit Remover - Android

    Also dachte ich mir, ich baue standardmaßig das umgehen in meine app ein...

    Dazu habe ich folgende sql befehle (für die Konsole):

    NarkTwo: Android SMS Limit - 1.6, 2.1 now 2.2!

    Jetzt muss ich es jedoch hinbekommen, von Java diese Shellbefehle auszuführen...

    Könnt ihr mir einige Tipps geben?! (ich weiß nicht genau, wonach ich suchen muss!)

    danke
     
  2. assenda, 15.07.2011 #2
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    Wieso?! wenn ich das für mich nutze?! wo ist das Problem?! meinst du jetzt das umgehen der sms begrenzung oder das versenden der sms über eine I-netseite?!
     
  3. DieGoldeneMitte, 15.07.2011 #3
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    (Nagut, dann eben doch)

    Wenn dir eine Seite nur erlaubt, eine bestimmte Menge SMSe zu versenden, und du umgehst das, dann ist das illegal.

    ADD: Ich sag nicht dass das kriminell wäre...
     
  4. assenda, 15.07.2011 #4
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    Oh ich glaube, du hast das etwas missverstanden...
    Also die App als auch die Webseite wurde von mir gebastelt...
    sobald auf meiner Webseite ein Eintrag gemacht wurde, wird ein Eintrag in die Datenbank gemacht.

    Die smsApp ist auf einem Handy installiert, das zuhause liegt.
    Sie ist dafür zuständig, alle paar sekunden zu prüfen, ob neue nachrichten vorhanden sind.

    Sind welche da, werde ich benachrichtigt (2.Handy) ;)

    Bei meinem Problem geht es nur darum, die 100SMS einschränkung von meinem gerooteteten Handy zu umgehen - genauso, wie es die SMS LIMIT REMOVER APP macht...
    Und dafür muss ich in der app Shellbefehle ausführen können ...
    Nur weiß ich eben nicht, wie ich das angehen muss....
     
  5. DieGoldeneMitte, 15.07.2011 #5
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Achsoo. Was im Handy selbst. Naja, das ist wohl eher eine Grenze zu deinem eigenen Schutz. :D

    Naja, du musst kein Script starten, Du kannst SQL Befehle auch direkt von Java aus absetzen (android.database.sqlite). Brauchst halt nur die Root rechte. Da kenne ich mich allerdings nicht mit aus :)
     
  6. assenda, 15.07.2011 #6
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    :) ist ja kein ding xD habs halt am anfang schlecht beschrieben :)

    also wenn ichs in der console eingebe,
    die Superuser rechte hat, muss ich folgendes eingeben (ohne #):
    # su
    --> dann kommt ne benachrichtigun, dass ich su rechte hab...
    dann kann ich
    # sqlite INSERT ...
    eingeben...

    Hast du evtl einen Link zu einer Webseite, damit ich ungefähr weiß, wonach ich suchen muss?!

    also einfach nur die Grundlegende Schnittstelle..
    den rest kann ich mir selber erarbeiten..weiß halt nur nicht wie ich einsteigen muss...
    danke ;)

    PS: ich habe schon mit sqlite gearbeitet..aber nur eigene db erstellt..
    weiß nur nicht wie ich auf systemtabellen zugreifen kann..
     
    Zuletzt bearbeitet: 15.07.2011
  7. Fr4gg0r, 15.07.2011 #7
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    Process p = Runtime.getRuntime().exec("su -c /data/data/deinpackage/files/sqlite3");
    DataOutputStream out = new DataOutputStream(p.getOutputStream());
    out.writeBytes("INSERT INTO gservices (name, value) VALUES ('sms_outgoing_check_interval_ms', 0\n");
    out.writeBytes("exit\nexit\n");
    p.waitFor();
    out.close();

    würd ich mal versuchen ;)
    Ich glaube nicht alle Geräte haben das sqlite3 binary im Path.. würde daher einmal die armv5 und die armv7 in die app packen und das entsprechende starten.
    Evtl. muss da auch noch nen out.flush() hin^^
     
    assenda bedankt sich.
  8. assenda, 15.07.2011 #8
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    wow :) hab nur um paar Tipps gebeten und hier kommt gleich ne lösung xD

    Herzlichen Dank!!!

    werd das testen und mich melden wenns klappt ;)

    :thumbup:
     
  9. assenda, 15.07.2011 #9
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    Hm :( wäre wohl zu schön gewesen, wenns auf sofort geklappt hätte...

    Es liegt wohl daran, dass die Befehle für Andoid 2.2 (Frojo) und nicht für 2.3 gelten...
    Der Code an sich dürfte vermutlich richtig sein..zumindest sind keine Fehler aufgetreten...

    (auf der Console wird "ist gerootet" ausgegeben)

    müsste dann mal die Werte erstmal auslesen^^

    Hab jetzt leider keine Zeit mehr, werde vermutlich am WE weitersuchen...

    Code:
    public class rooted extends Activity {
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            try {
                
                Process p = Runtime.getRuntime().exec("su -c /data/data/com.android.providers.settings/files/sqlite3");
                DataOutputStream os = new DataOutputStream(p.getOutputStream());
            
                os.writeBytes("INSERT INTO gservices (name, value) VALUES ('sms_outgoing_check_max_count', 999999999)");
                os.writeBytes("INSERT INTO secure (name, value) VALUES ('sms_outgoing_check_max_count', 999999999)");
                os.writeBytes("INSERT INTO gservices (name, value) VALUES ('sms_outgoing_check_interval_ms', 0)");
                os.writeBytes("INSERT INTO secure (name, value) VALUES ('sms_outgoing_check_interval_ms', 0)");
                
                os.writeBytes("exit\n");
                os.flush();
                try {
                    p.waitFor();
                    if (p.exitValue() != 255) {
                        Log.d("d", "Ist gerootet");
                        os.close();
                    } else {
                        Log.d("d", "Fehler beim Ausführen");
                    }
                } catch (InterruptedException e) {
                    Log.d("d", "InterrupedException");
                }
            } catch (IOException e) {
                Log.d("d", "IOException");
            }
    
        }
    }
    Trotzdem Danke :)

    Edit: Hier ist ne Anleitung für Android 2.2...
    http://dylantaylor.wordpress.com/2010/10/19/closer-to-a-proper-froyo-limit-removal-fix/
    Wie gesagt gucke ichs mir am WE an
     
    Zuletzt bearbeitet: 17.07.2011
  10. assenda, 17.07.2011 #10
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    So :)
    hab mich mal wieder hingesetzt und erstmal über es erstmal geschaft über die Console den Schutz mit folgenden Befehlen aufzuheben :) -->Android 2.3

    1) adb shell
    2) sqlite3 /data/data/com.android.providers.settings/databases/settings.db
    3) INSERT INTO secure (name, value) VALUES (‘sms_outgoing_check_max_count’, 999999999);
    4) INSERT INTO secure (name, value) VALUES (‘sms_outgoing_check_interval_ms’, 0);

    (SU wird anscheinend nicht dafür benötigt)
    Anschließend zur Überprüfung über die Console abgefragt:

    1) adb shell
    2) sqlite3 /data/data/com.android.providers.settings/databases/settings.db
    3) Select * from secure where name = 'sms_outgoing_check_max_count'; Ergebnis: 999999999
    4) Select * from secure where name = 'sms_outgoing_check_interval_ms'; Erebnis: 0

    Nach einem Neustart war die Einschränkung von 100sms/h nicht mehr da

    Also hab ich versucht, mit diesen Informationen die App zu überarbeiten:

    Code:
    Process p;
            try {
                p = Runtime.getRuntime().exec("sqlite3 /data/data/com.android.providers.settings/databases/settings.db\n");
                DataOutputStream os = new DataOutputStream(p.getOutputStream());
                os.writeBytes("INSERT INTO secure (name, value) VALUES ('sms_outgoing_check_max_count', [B]111111111[/B])\n");
                os.writeBytes("INSERT INTO secure (name, value) VALUES ('sms_outgoing_check_interval_ms', 0)\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
    Der Code wird ohne Probleme ausgeführt...allerdings erhalte ich über die Console den alten Wert: 999999999

    Also werden die Befehle nicht so angenommen...

    Was mache ich falsch?!
     
  11. Fr4gg0r, 18.07.2011 #11
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    Du brauchst in jedem fall root. Der obige Code konnte garnicht klappen :D, fehlte ja auch der Parameter welche Database du öffnen möchtest.
    Wie wärs mit
    p = Runtime.getRuntime().exec("su");
    os.writeBytes("sqlite3 data/data/com.android.providers.settings/databases/settings.db\n");
     
  12. assenda, 18.07.2011 #12
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    Ja ist mir beim ersten code auch später aufgefallen^^

    beim exec("su\n");
    bekomme ich zumindest die meldung auf dem Handy, dass ich su rechte bekommen hab.

    nur merkwürdigerweise werden die sql befehle nicht akzeptiert...
    (hab vorher noch das ; vergessen...aber auch so geht das nicht

    Aber so funktioniert das leider auch nicht :(
    (ich frage das über die console ab, aber der Wert bleibt (999999999))

    Code:
            Process p;
            try {
                p = Runtime.getRuntime().exec("su\n");
                DataOutputStream os = new DataOutputStream(p.getOutputStream());
    
                os.writeBytes("sqlite3 data/data/com.android.providers.settings/databases/settings.db\n");
                os.writeBytes("INSERT INTO secure (name, value) VALUES ('sms_outgoing_check_max_count', 111111111);\n");
                os.writeBytes("INSERT INTO secure (name, value) VALUES ('sms_outgoing_check_interval_ms', 0);\n");
        
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    PS: kann es sein, dass p.waitFor() oder p.flush() irgendeine rolle spielen?! damit erstmal auf die su rechte gewartet wird? habs bei einem beispiel vorher verwendet, um zu prüfen ob ich su rechte überhaupt habe...aber hier haut das iwie nicht hin :(
     
    Zuletzt bearbeitet: 18.07.2011
  13. Fr4gg0r, 18.07.2011 #13
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    hauptsache da kommt irgendwann ein flush.. ^^
     
  14. assenda, 18.07.2011 #14
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    hm ja..das hab ich ganz am ende..also nach dem catch...

    trotzdem packen die zeilen mit insert nicht...
    (der Code wird sicher ausgeführt! hab da n log zwischengesetzt und der geht durch)

    gibt es iwelche möglichkeiten zu prüfen? fehlermeldungen abzufangen etc.?

    ich weiß nicht wie ich da einen fehler finden kann!

    --> die Insertbefehle sind auch sicher korrekt...
    hab die direkt in die shell kopiert dann funktioniert alles ohne probleme!
     
  15. assenda, 18.07.2011 #15
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    bidde leute!!!

    ich komm einfach nicht weiter :( hab schon (fast) alles mögliche ausprobiert^^

    Code:
    Process p;
            try {
                p = Runtime.getRuntime().exec("su\n");
                DataOutputStream os = new DataOutputStream(p.getOutputStream());
                
                String SQL = "INSERT INTO secure (name, value) VALUES ('sms_outgoing_check_max_count', 999999999);\n"
                    +"INSERT INTO secure (name, value) VALUES ('sms_outgoing_check_interval_ms', 0);\n"
                    +".quit\n";
                    os.writeBytes("sqlite3 /data/data/com.android.providers.settings/databases/settings.db\n");
                    os.writeBytes(SQL);
                    os.writeBytes("exit\n");
                    os.flush();
                    p.waitFor();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
     
  16. Fr4gg0r, 18.07.2011 #16
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    was geht denn nicht..
    hol dir doch den shell output (stdout und stderr) mit
    BufferdReader br = new BufferedReader(new InputStreamReader(p.getInpuStream/p.getErrorStream()));
    ..
    p.waitFor();
    while(br.ready()){
    Log.e("bla", br.readLine());
    }
     
  17. assenda, 18.07.2011 #17
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    Hm ne so wird das nichts :(
    mit folgendem code wird nur der log ausgegeben (ohne getErrorInput()):

    Durch while wird gar nichts ausgegeben. Nachdem ich das ausgeklammert habe, kommt nur bla - asd

    bei verwendung von getInputStream() wird nichtmal das bla-asd ausgegeben ...

    Was nicht geht:
    wenn ich diese Befehle direkt über die console (adb shell von eclipse) eingebe, funktioniert das alles ohne probleme - die werte werden sofort geändert.
    Durch mein Programm jedoch ändert sich GAR NICHTS - bis dass auf dem handy nach dem Aufruf von su\n steht, dass ich su rechte habe...:(

    Code:
    Process p;
            try {
                p = Runtime.getRuntime().exec("su\n");
                DataOutputStream os = new DataOutputStream(p.getOutputStream());
                
                String SQL = "INSERT INTO secure (name, value) VALUES ('sms_outgoing_check_max_count', 999999999);\n"
                    +"INSERT INTO secure (name, value) VALUES ('sms_outgoing_check_interval_ms', 0);\n"
                    +".quit\n";
                    os.writeBytes("sqlite3 /data/data/com.android.providers.settings/databases/settings.db\n");
                    os.writeBytes(SQL);
                    
    
    //-> hab den buffertReader auch schon direkt nach os.flush() gesetzt...dann kommt //aber auch keine ausgabe :(
                    BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
                    
                    os.writeBytes("exit\n");
                    os.flush();
                        //p.waitFor(); --> lässt den prozess einfrieren
                    //while(br.ready()){
                        Log.d("bla", "asd"+ br.readLine());
                    //    } 
            } catch (IOException e) {
                e.printStackTrace();
            } 
    
     
  18. Fr4gg0r, 18.07.2011 #18
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    wenn p.waitFor() deine App einfriert, dann ist irgendwas falsch in den shell befehlen, sodass der linux prozess nicht beendet wird.
    Denkbar wäre z.B. dass sqlite3 nicht verlassen wird, sollte jedoch eig hinhauen mit dem ".quit"..
    Gibt das denn in der adb shell nen output?
    Wenn ja würde ich den BufferedReader mal vor os.writeBytes() einhängen, dann steht der Stream vermutlich auf auto flush.
     
  19. Fr4gg0r, 01.08.2011 #19
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    flup

    Jetzt bekomme ich mit sqlite3 grade selber Probleme (gmail update lässt grüßen ;) ).
    Hat sonstwer mit sqlite3 in einer root shell programmatisch genutzt außer assenda der mir bisher nicht auf pn geantwortet hat?
     

Diese Seite empfehlen