[HowTo] Arcadyan/o2 IAD 4421, IAD 6431 Konfiguration aus Flash auslesen

Ich habe doch geschrieben, dass ich den USB Adapter gekauft habe. Aber das war für die Stecker-Belegung eh nicht wichtig, von daher habe ich es einfach überlesen.
Und was das Datenauslesen an geht hatte ich wohl einfach zu viel Angst etwas kaputt zu machen. Es hat gerade eben super geklappt. Danke euch dafür.
 
Raspberry wird mit pyserial und brntool ausgestattet und mit
python brntool.py --serial /dev/ttyAMA0 --read=o2box6431.bin --addr=0xB0040000 --verbose --size=0x40000
der Download gestartet.

Nun die O2-Box angeschaltet und die Ausgabe kontrolliert: (etwas Geduld erforderlich)

Waiting for a prompt... Ok.
...........................

Hallo Putin,
kannst Du noch mal kurz beschreiben wie ich das brntool auf den Raspberry bekomme.
Verstehe ich das richtig, dass der Router ausgeschaltet mit dem Raspberry verbunden und dann der Download gestartet wird?
Warum dann anschließend den Router anschalten?
Danke im voraus,
Klaus
 
Zuletzt bearbeitet:
Hallo Leute,

kann mir keiner einen Tipp geben wie ich brntool auf den Raspberry bekomme? Es wäre dringend. Mr. Google gibt mir leider auch keine Antwort.

Grüße, Klaus
 
Muss es denn der Raspberry sein? Soll doch keine Dauerverbindung sein oder? Du willst doch nur ein Mal die Daten auslesen, richtig? Wie wär's denn mit der Alternative Windows-PC und dieser Adapter? http://www.ebay.de/itm/171527140541 Bist vermutlich schneller am Ziel...
 
Weil ich den Raspberry schon habe und mit Hilfe der Messingröhrchen die Verbindung durch den Lüftungsschlitz so einfach ist wie einen Stecker in die Steckdose zu stecken.
Ich finde jetzt auf die Schnelle das Bild nicht, das hier irgendwo geposted ist, aber das hat mich überzeugt.
Ich glaube ich habe auch die Lösung für meine Frage gefunden. Offensichtlich muss das Script nur auf den Raspberry kopiert und dann ausgeführt werden.
 
Und einen Windows-PC hast du nicht? Das Anstecken durch die Schlitze und auf der anderen Seite an den USB-TTL Adapter ist doch genau dasselbe. Ich habe es genau auf die Weise und mit dem phyton Skript sehr schnell hinbekommen.
o2Box Auslesen 1.jpg o2Box Auslesen 2.jpg o2Box Auslesen 3.jpg
 
Zuletzt bearbeitet:
Hello,

This is my first post on this forum.

1. I would like to thank hph for his decoder work and also would like to ask him to release the source code, so that others could learn from it and further improve it.

2. I also had troubles with the python script and thus decided to write my own tiny script to dump the configuration from the device. Its source code is available below. It is tested on a x86_64 GNU/Linux box with a 4.0.6 Kernel.

Compile it with DMD64 D Compiler v2.067 (http://dlang.org/download.html):
dmd brntool.d -m64 -O -release

3. Run ./brntool first and afterwards switch on the device. Once the dump is ready, you may switch off the device. The dump file is written in o2box6431.bin.

Have fun with your router of choice!

Code:
module brntool;

import core.sys.posix.unistd;
import core.sys.posix.fcntl;
import core.sys.linux.termios;
import core.sys.posix.sys.select;
import core.stdc.errno;
import core.stdc.string;
import std.algorithm: map;
import std.algorithm.searching;
import std.array;
import std.conv;
import std.format;
import std.stdio : File, stdout;

void main()
{
	auto device = "/dev/ttyUSB0";
	auto output = "o2box6431.bin";
	auto addr = 0xb0040000;
	auto size = 0x40000;
	auto count = 10000;

	auto tty_fd = open(device.ptr, O_RDWR | O_NONBLOCK | O_NOCTTY);
	scope(exit) close(tty_fd);

	//dump_config(tty_fd);
	set_config(tty_fd);
	//dump_config(tty_fd);
	stdout.writeln("ready");

	enter_administrator_mode(tty_fd);
	// read 0x40000 bytes from address 0xb0040000
	// and dump them into o2box6431.bin file
	auto f = File(output, "w");
	for (auto a = addr; a < addr + size;)
	{
		auto n = read_from_memory(tty_fd, f, a, count);
		// indicate progress
		stdout.write((count == n) ? "." : "!");
		stdout.flush();
		// advance the address
		a += n;
		if ((a + count) > (addr + size))
		{
			// adjust the required bytes count
			count = addr + size - a;
		}
	}
	stdout.writeln("");
	stdout.writeln("done");

	return;
}

void enter_administrator_mode(int fd)
{
	execute(fd, "Press Space Bar 3 times to enter command mode ...",
		[' ', ' ', ' ', '!']);
	return;
}

uint read_from_memory(int fd, File f, uint address, uint count = 10000)
{
	// request read mode
	execute(fd, "[DANUBE Boot]:", ['r']);
	// the start address for the read operation
	execute(fd, "Enter the Start Address to Read....0x",
		to!(char[])(format("%x", address)) ~ '\r');
	// request a single byte format
	execute(fd, "Data Length is (1) 4 Bytes (2) 2 Bytes (3) 1 Byte...", ['3']);
	// and finally ask the device to dump 'count' bytes
	execute(fd, "Enter the Count to Read....(Maximun 10000)",
		to!(char[])(count) ~ '\r');
	/*
----------------------------------------------------------
 Address   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
----------------------------------------------------------
0xB0040000 4F 42 43 36 1F B4 A4 95 2D 34 4C 44 14 F2 9A 74 
...
	*/
	uint result;
	char[64] data;
	auto n = read_line(fd, data);
	while ((n >= 0) && (result < count))
	{
		if (n > 0)
		{
			auto s = split(cast(string)data[0..n]);
			if (startsWith(s[0], "0x"))
			{
				auto b = s[1..$].map!(a => a.parse!ubyte(16)).array();
				// do write
				f.rawWrite(b);
				result += b.length;
			}
		}
		n = read_line(fd, data);
	}
	return result;
}

bool execute(int fd, string condition, char[] command)
{
	long i;
	char[512] buffer;
	for (auto c = read_char(fd); c != char.init; c = read_char(fd))
	{
		if ((c == '\r') || (c == '\n'))
		{
			// reset
			i = 0;
		}
		else
		{
			buffer[i++] = c;
		}
		if (cast(string)buffer[0..i] == condition)
		{
			auto n = write(fd, command.ptr, command.length);
			return true;
		}
	}
	return false;
}

long read_line(int fd, char[] buffer)
{
	long i;
	buffer[0..$] = 0;
	auto c = read_char(fd);
	while ((c != '\r') && (c != '\n'))
	{
		buffer[i++] = c;
		if (i > buffer.length)
		{
			return -1;
		}
		c = read_char(fd);
	}
	return i;
}

char read_char(int fd)
{
	char c;
	fd_set rset;
	FD_ZERO(&rset);
	FD_SET(fd, &rset);
	if (select(fd + 1, &rset, null, null, null) < 0)
	{
		throw new Error(format("select failed: %d : %s", errno, strerror(errno)));
	}
	if (FD_ISSET(fd, &rset))
	{
		long n;
		do
		{
			n = read(fd, &c, 1);
		}
		while ((n < 0) && (errno == EINTR));
		if (n == 0)
		{
			throw new Error("terminal closed");
		}
		else if (n < 0)
		{
			if ((errno != EAGAIN) && (errno != EWOULDBLOCK))
			{
				throw new Error(format("read failed: %d : %s", errno, strerror(errno)));
			}
		}
	}
	return c;
}

void set_config(int fd)
{
	termios tio;
	if (tcgetattr(fd, &tio) < 0)
	{
		throw new Error(format("tcgetattr failed: %d : %s", errno, strerror(errno)));
	}

	// set speed to 115200
	if (cfsetospeed(&tio, B115200) < 0)
	{
		throw new Error(format("cfsetospeed failed: %d : %s", errno, strerror(errno)));
	}
	if (cfsetispeed(&tio, B115200) < 0)
	{
		throw new Error(format("cfsetispeed failed: %d : %s", errno, strerror(errno)));
	}
	// set 8 databits
	tio.c_cflag &= (tio.c_cflag & ~CSIZE) | CS8;
	// set parity to none
	tio.c_cflag &= ~(PARENB | PARODD);
	// disable break processing
	tio.c_iflag &= ~IGNBRK;
	// no signaling chars, no echo, no canonical processing
	tio.c_lflag = 0;
	// no remapping, no delays
	tio.c_oflag = 0;
	// read doesn't block
	tio.c_cc[VMIN] = 0;
	// 0.5 seconds read timeout
	tio.c_cc[VTIME] = 5;
	// shut off xon/xoff ctrl
	tio.c_iflag &= ~(IXON | IXOFF | IXANY);
	// ignore modem controls, enable reading
	tio.c_cflag |= (CLOCAL | CREAD);
	// 1 stop bit
	tio.c_cflag &= ~CSTOPB;
	// disable hardware flow control
	tio.c_cflag &= ~CRTSCTS;

	if (tcsetattr(fd, TCSAFLUSH, &tio) < 0)
	{
		throw new Error(format("tcsetattr failed: %d : %s", errno, strerror(errno)));
	}
	return;
}

void dump_config(int fd)
{
	termios tio;
	if (tcgetattr(fd, &tio) < 0)
	{
		throw new Error(format("tcgetattr failed: %d : %s", errno, strerror(errno)));
	}
	stdout.writefln("c_iflag  = 0x%08X", tio.c_iflag);
	stdout.writefln("c_oflag  = 0x%08X", tio.c_oflag);
	stdout.writefln("c_cflag  = 0x%08X", tio.c_cflag);
	stdout.writefln("c_lflag  = 0x%08X", tio.c_lflag);
	stdout.writefln("c_line   = 0x%08X", tio.c_line);
	stdout.writefln("c_ispeed = %d", tio.c_ispeed);
	stdout.writefln("c_ospeed = %d", tio.c_ospeed);
	return;
}
 
Zuletzt bearbeitet von einem Moderator:
4421 durch 7330 ersetzen - DNS-Fehler für sip.alice-voip.de

Guten Abend.

Vor Urzeiten habe ich den 4421 ausgelesen und durch ne 7270 ersetzt. Nun soll die 7270 durch eine 7330 ersetzt werden. Die ausgelesenen Datei ist noch zur Hand und werden ausserdem auch im GUI der Fritzbox im Klartext angezeigt - bis auf die beiden Passwörter.

Leider bekomme ich auf der 7330 immer DNS Fehler:
19.07.15 22:27:25 Anmeldung der Internetrufnummer 494012345678 war nicht erfolgreich. Ursache: DNS-Fehler

Das abwarten von 60 Minuten und nichts tun hat bisher auch nichts geholfen.

Das auflösen von sip.alice-voip.de unter Linux auf der Bash mit dig oder nslookup bringt mich vmtl auch nicht zum Ziel. Wenn ich über den ersten PVC auflöse bekomme ich:
Code:
lupo@lupo-laptop:~$ dig @62.109.121.1 srv _sip._udp.sip.alice-voip.de

; <<>> DiG 9.7.0-P1 <<>> @62.109.121.1 srv _sip._udp.sip.alice-voip.de
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36090
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;_sip._udp.sip.alice-voip.de.	IN	SRV

;; ANSWER SECTION:
_sip._udp.sip.alice-voip.de. 41462 IN	SRV	0 0 5060 sip.alice-voip.de.

;; ADDITIONAL SECTION:
sip.alice-voip.de.	2930	IN	A	62.52.148.134

;; Query time: 120 msec
;; SERVER: 62.109.121.1#53(62.109.121.1)
;; WHEN: Sun Jul 19 21:08:45 2015
;; MSG SIZE  rcvd: 98

Wenn ich die 62.52.148.134 bei Registrar und Proxy in der Fritzbox eintrage erhalte ich anschliessend ein 404
19.07.15 22:10:37 Anmeldung der Internetrufnummer 494032845924 war nicht erfolgreich. Gegenstelle meldet Ursache 404

Ausserdem will ich ja für das VoIP den zweiten PVC nutzen, der ja erfolgreich aufgebaut wird und bin der Meinung dass die Auflösung mittels dig oder nslookup ebenfalls über den zweiten PVC sein muss, weil das Ergebnis wahrscheinlich ein anderes ist.
Internetverbindung (Telefonie) wurde erfolgreich hergestellt. IP-Adresse: 10.188.127.xxx, DNS-Server: 10.192.128.98 und 10.192.128.102, Gateway: 10.188.0.1

Irgendwleche Ideen was ich falsch machen könnte oder wie ich das Problem weiter eingrenzen kann?

Danke und Grüße,
lupoduplo
 
Warum hast du nicht die Einstellungen aus der 7270 expotiert und in die 7330 importiert?
 
Bei der Einrichtung der Rufnummern muss man natürlich ganz unten bei "Anmeldung immer über eine Internetverbindung" den Haken rausnehmen.
 
@thtomate12: Auf die einfach Sachen kommt man ja häufig nicht. Werde es testen!
@KunterBunter: Den Fehler habe ich nicht gemacht.

Habe gerade einen Paketmitschnitt gemacht und wundere mich ein bisschen über die DNS-Anfrage der Fritzbox. Eingetragen ist sip.alice-voip.de wieso wird ein Standard query nach sip.alice-\342\201\240voip.de geschickt?

lara-fritzbox-dns.png

Edit:
Ich habe jetzt zum Vergleich noch Mal nen Dig ausgeführt und den Paketmitschnitt verglichen.

Am wenigste verstehe ich was das in sip.alice-voip.de eingefügte "\342\201\240" soll.
Ausserdem frage ich mich warum nach dem NAPTR gefragt wird und nicht nach dem SRV für SIP.

Freue mich natürlich über sachdienliche Hinweise :)

Danke, ld
 
Zuletzt bearbeitet:
Lösche den Inhalt des Textfeldes, trag' einen falschen Server ein und speichere, dann wieder den richtigen Server ohne ihn von irgendwoher zu kopieren
 
Ein entschiedenes Hä von meiner Seite!
Ja, das hat funktioniert. Aber warum?
Ich hab natürlich vorher noch den Mitschnitt aktiviert. Dann den falschen server eingetragen und gespeichert.

Wenn ich dann den richtigen Server wieder eintrage und speichere macht die Fritzbox wieder als erstes eine NAPTR-Anfrage aber an sip.alice-voip.de (und nicht an sip.alice-\342\201\240voip.de ) bekommt ne Antwort, macht ne SRV-Abfrage für SIP und bekommt auch ne Antwort Addr: 10.192.253.23 .

War das nen Copy-Paste-Fehler, oder was war das?

DANKE!!!
 
Da waren nichtdruckbare (unsichtbar) Zeichen, die können überall herkommen
 
Super, riesen Dank noch Mal thtomate12 !

Ich hatte zunächst noch nen 401 - unauthorized. Nach dem ich User und Pass nach dem selben verfahren per Hand eingegeben habe, läuft es nun aber.
 
klappt gut, ich habe für die letzt Seite eine Briefmarkenpinzette benutzt
 
Hallo, erstmal Danke an alle für die gute Anleitung.
Hab bis jetzt nur einen Eintrag gelesen mit dem Auslesen über Arduino.
Funktioniert das? Das das noch jemand versucht?
 
Hallo, erstmal Danke an alle für die gute Anleitung.
Hab bis jetzt nur einen Eintrag gelesen mit dem Auslesen über Arduino.
Funktioniert das? Das das noch jemand versucht?

Habe den halben letzten Sonntag mit der modernen Variante rumgedoktert, ohne Erfolg, dass Auslesen funktionierte einfach nicht. Ich bekam nur Störmeldungen von dem Tool, schon während des Auslesens.

Die altmodische Variante mit Auslessn und dekodieren in verschiedenen Tools funktionierte in 5 min problemlos.

gottlob! War schon kurz davor O2 zu kündigen.
 
@ lance Danke für die Info, rettet mir den Abend :)
 
Erst einmal ganz herzlichen Dank an alle die sich hier so erfolgreich einbringen.
Ich habe eine O2 4421 beim Entrümpeln gefunden und mich aus Neugier mal etwas näher mit dem Gerät beschäftigt. Da ziemlich sicher keiner mehr nach dem Gerät schreien wird, habe ich mir auch Zugang zur seriellen Konsole verschafft - das Öffnen war jetzt auch kein Hexenwerk und es ist alles heile geblieben.

Ich hätte ja sogar einen sinnvollen Verwendungszweck für das Gerät, wenn da nicht dieses Branding und das Beschneiden der Funktionen wäre. Daher mal die Frage: Hat jemand Erfahrungen mit OpenWRT auf dem Gerät gesammelt?
Hier gibt es eine rudimentäre Anleitung, die habe ich mal bis zum Auslesen der Konfig und dem Anmelden an der Debugging-Console ausprobiert. Funktioniert alles soweit. Nur beim Auslesen und Kompilieren fehlt mir jegliche Erfahrung - vor allem wenn es um "signieren" und "verschlüsseln" geht.
Irgendwelche weiterführenden Hinweise sind herzlich willkommen - ggf. mach ich dazu auch mal nen eigenen Thread auf.
 

Zurzeit aktive Besucher

Neueste Beiträge

Statistik des Forums

Themen
244,872
Beiträge
2,219,897
Mitglieder
371,593
Neuestes Mitglied
Häuslebauer_BW
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.