Der Beschleunigungsmesser - auch bekannt als G-Sensor - ist heute einer der am häufigsten verwendeten Sensoren. Sie können es in fast jedem modernen Gerät treffen. Der Beschleunigungsmesser führt eine ziemlich einfache Aufgabe aus - er misst die Beschleunigung des Geräts. Mal sehen, wie er es macht - analysieren wir die Mechanismen der Android-API-Sensoren am Beispiel der Aufgabe Nr. 7 aus der Online-Phase von NeoQUEST-2019.
Der Legende nach erhielten wir 2 Dateien:
7.apk und
7.txt . Die folgenden Schlussfolgerungen können aus dem Text der Aufgabe gezogen werden (und alle Aufgaben sind hier noch verfügbar):
7.apk - ein
Verschlüsselungsprogramm , das irgendwie die Beschleunigungsmessereinstellungen des Geräts verwendet;
7.txt - vom Encoder erzeugtes Kryptogramm. Folgendes steht darin geschrieben:
[1749054104147639] [2.07154922] [10.001905] [4.5387093] [1749056073889025] [5.7193284] [8.221763] [0.01391537] [1749058029180773] [4.684068] [12,05614] [0,0377285] [1749060105291613] [4,6900544] [6,9307165] [4,7094293] [1749062123327502 ] [4.4682417] [7.512769] [6.037215] [1749067640096818] [1.0396843] [8.798672] [4.9335976] [1749070016073380] [2.3173676] [10.180047] [4.948362] [1749072343679582] [126060] 2.48394698] [10.834006] [6.306282] [1749075827770391] [0.2795044] [13.279829] [0.19391555]Wir sehen, dass der Text eine sich wiederholende Gruppe von 4 Werten ist, von denen einer eine Ganzzahl ist und die restlichen 3 Gleitkommazahlen sind. Der Einfachheit halber setzen wir sie in separate Zeilen:
[- 1749054104147639] [- 2.07154922] [10.001905] [4.5387093]
[1749056073889025] [5.7193284] [8.221763] [0.01391537]
[1749058029180773] [- 4.684068] [12.05614] [0.0377285]
[1749060105291613] [4.6900544] [6.9307165] [- 4.7094293]
[1749062123327502] [4.4682417] [7.512769] [6.037215]
[1749067640096818] [1.0396843] [8.798672] [- 4.9335976]
[1749070016073380] [- 2.3173676] [10.180047] [4.948362]
[1749072343679582] [- 4.3660607] [12.218135] [0.5312999]
[1749073674459611] [- 2.48394698] [10.834006] [- 6.306282]
[1749075827770391] [0.2795044] [13.279829] [- 0.19391555]Das Kryptogrammformat wurde aussortiert, aber was diese Werte sind, ist nicht bekannt. Einige Parameter des Beschleunigungsmessers des Geräts, ohne Angaben. Gehen wir zur Android-Entwicklerseite und
sehen, was der Beschleunigungsmesser im Allgemeinen anzeigen kann.
Wir sehen die folgende Beschreibung:
Wir haben herausgefunden, wofür die Gleitkommaparameter verantwortlich sind - dies ist die Beschleunigung des Geräts entlang der X-, Y- und Z-Achse. Aber wie kann man verstehen, für welche Achse jeder von ihnen verantwortlich ist? Es ist Zeit, die Anwendung zu starten. Es sieht so aus:
Es gibt zwei Möglichkeiten, um das Anwendungsverhalten zu bestimmen: Dekompilieren von
.apk und Analysieren der resultierenden Werte. Als nächstes betrachten wir die zweite Methode und geben die Einfügung des dekompilierten Codes an, der für die betrachteten Aktionen der Anwendung verantwortlich ist.
Das Kryptogramm enthält positive und negative Werte (wir wissen, dass dies Beschleunigungen entlang verschiedener Achsen sind), sodass wir davon ausgehen können: Wenn die Neigungsvektoren des Geräts entlang der Achse entgegengesetzt sind, sind die Beschleunigungen im absoluten Wert ungefähr gleich, und die Differenz ist nur im Vorzeichen.
Das Folgende ist eine Codeliste zum Speichern von Beschleunigungsinformationen:
public class MotionSnapshot { public final float angle_alpha; public final float angle_beta; public final float angle_gamma; public final long event_time; ... }
Basierend auf diesen Überlegungen stehen wir vor folgenden Aufgaben:
- Bestimmen Sie, welcher Wert im Kryptogramm der Steigung des Geräts entspricht
- Abweichungsmuster definieren
- Jeder Ziffer wird ein Abweichungsmuster zur Entschlüsselung zugeordnet
Die ersten beiden Aufgaben werden parallel ausgeführt. Am Telefon können wir zwei Arten der Neigung testen:
- Von mir / zu mir
- Links / rechts
Der Code, der für die Behandlung von Ereignissen vom Beschleunigungsmesser verantwortlich ist public class SensorListener implements SensorEventListener { private MotionTrace Trace; public SensorListener(MotionTrace trace, MainActivity activity) { Trace = trace; } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override public void onSensorChanged(SensorEvent event) { Trace.addSnaphot(new MotionSnapshot(event.values, event.timestamp)); } }
Der Code, der für die Erzeugung der Steigung des Geräts auf Knopfdruck verantwortlich ist public class MotionTrace { private ArrayList<MotionSnapshot> Deltas; private long Length; private MotionSnapshot LastSnapshot; public MotionTrace(long len) { LastSnapshot = new MotionSnapshot(0,0,0,0); Deltas = new ArrayList<>(); Length = len; } public void addSnaphot(MotionSnapshot snapshot) { if (Deltas.size() >= Length) { Deltas.remove(0); } MotionSnapshot delta = new MotionSnapshot(0,0,0,0); if (Deltas.size() > 0) { delta = snapshot; } Deltas.add(delta); } public ArrayList<MotionSnapshot> getDeltas() { return new ArrayList<>(Deltas); } }
Der Code, der für die Erstellung des Kryptogramms verantwortlich ist public void SaveCiphertext() { Log.d(Config.MAIN_TAG, "SAVING - {{" + Ciphertext + "}}"); try { File root = new File(Environment.getExternalStorageDirectory(), Config.DIRNAME); if (!root.exists()) { Log.d(Config.MAIN_TAG, "Creating directory - [" + root + "]"); if (!root.mkdirs()) { Log.d(Config.MAIN_TAG, "Error creating directory"); } } File out_file = new File(root, Config.FILENAME); Log.d(Config.MAIN_TAG, "Out - [" + out_file + "]"); PrintWriter writer = new PrintWriter(out_file, "UTF-8"); writer.println(Ciphertext); writer.close(); Toast.makeText(this, "Saved to - [" + out_file + "]", Toast.LENGTH_LONG).show(); } catch (IOException ex) { Toast.makeText(this, "Error saving data", Toast.LENGTH_SHORT).show(); } Ciphertext = ""; }
Beginnen wir in der richtigen Reihenfolge. Um die Steigungen des ersten Typs zu testen, wählen wir die Zahlen 2 und 8. Klicken Sie mit zunehmendem Aufwand jeweils dreimal darauf. Wir erhalten folgendes Ergebnis:
[2687418463227102] [- 0,23700714] [10,764615] [- 0,9759079]
[2687419411042043] [- 3.5834892] [13.591138] [- 1.7036858]
[2687420383026907] [- 5.575793] [13.533228] [- 1.3104248]
[2687421461360546] [0.6850295] [6.0002656] [0.5568123]
[2687422317256542] [4.1720495] [1.8675026] [1.545407]
[2687423250514599] [7.9689393] [- 3.600097] [0.33846742]Nun, die Unterschiede im 2-Parameter sind mit bloßem Auge sichtbar. Beginnen wir mit dem Ausfüllen der Vorlage.
Wir stellen die Vorlage in Form von Wertebereichen der entsprechenden Felder in der Kryptogrammzeile dar. Wir markieren mit einem Fragezeichen, was wir noch nicht wissen.
[? ]]
[(<0) - Abweichung von sich selbst; (> 0) - Selbstzurückweisung]
[?]
[?]Ebenso werden wir Tests mit den Tasten 4 und 6 durchführen. Ergebnisse:
[2688019191605386] [1.7270225] [9.541045] [0.0397171]
[2688020247971353] [1.0615791] [9.794326] [4.9135437]
[2688021887957875] [1.0974716] [7.5535636] [7.8307548]
[2688023749896352] [1.3328063] [9.43923] [- 0.27600938]
[2688024849688832] [1.1357567] [9.9313135] [- 2.4410355]
[2688026002520864] [0.30400848] [6.4610033] [- 8.0956335]Aktualisieren Sie die Vorlage unter Berücksichtigung des untersuchten Musters:
[? ]]
[(<0) - Abweichung von sich selbst; (> 0) - Selbstzurückweisung]
[?]
[(<0) - Abweichung nach rechts; (> 0) - Abweichung nach links]Offensichtlich ist der dritte Wert die Auf- / Ab-Abweichung, da dies der einzige verbleibende Vektor ist. Und wir müssen es nicht wirklich überprüfen, da wir für die eindeutige Bestimmung des gedrückten Knopfes bereits die bekannte Vorlage haben.
Jetzt erstellen wir eine Vorlage für jede Ziffer auf der Tastatur, basierend auf der Position der Tasten und der entwickelten Vorlage (* - der Parameter interessiert uns nicht):
1 - [*] [<0] [*] [> 0]
2 - [*] [<0] [*] [nahe 0]
3 - [*] [<0] [*] [<0]
4 - [*] [] [*] []
5 - [*] [nahe 0] [*] [nahe 0]
6 - [*] [nahe 0] [*] [<0]
7 - [*] [> 0] [*] [> 0]
8 - [*] [> 0] [*] [nahe 0]
9 - [*] [> 0] [*] [<0]
0 - [*] [> 0] [*] [nahe 0]Wie aus der Abbildung ersichtlich, haben die Schaltflächen 8 und 0 dieselben Parameter, sodass ihre Entschlüsselung nicht eindeutig sein kann. Wenn Sie eine solche Kombination in einem Kryptogramm treffen, sollten Sie beide Optionen ausprobieren. Jetzt wenden wir die erhaltenen Vorlagen auf das Kryptogramm an und erhalten zwei Antworten: 1029761235 und 1829761235, von denen
1829761235 wahr ist . Auftrag abgeschlossen!
Sehr bald - am 26. Juni - findet der NeoQUEST 2019 Face-to-Face-Wettbewerb statt! Beeilen Sie
sich, um
sich auf der Event-Website
anzumelden . In naher Zukunft wird Habrastatya mit der Ankündigung des Programms veröffentlicht, nicht verpassen!