Donnerstag, 3. Januar 2008

Happy new Year 2008 und arm-elf-flthdr !!!

So wieder ein grosses Stück weiter !
Ich habe den inetd-Prozess übersetzt und lauffähig gemacht.

Doch der Reihe nach !

Zu erst habe ich das Tool arm-elf-flthdr schätzen und kennen gelernt.
Sieht man sich nämlich ein für die original binary des IP-Drives an, so fällt einem
im Hexeditor auf, dass man keine ASCII Zeichenketten findet. Dies fand ich komisch.
Aber mit arm-elf-flthdr bin auch auf die Spur gekommen !
Ein arm-elf-flthdr -p helloworld unserer helloworld-Anwendung liefert:
helloworld
Magic: bFLT
Rev: 4
Build Date: Thu Jan 3 20:49:40 2008
Entry: 0x50
Data Start: 0x6340
Data End: 0x7390
BSS End: 0x7640
Stack Size: 0x1000
Reloc Start: 0x7390
Reloc Count: 0x83
Flags: 0x1 ( Load-to-Ram )

Mache ich den gleichen Aufruf mit einem original Binary, z.B. mount aus /bin:
mount
Magic: bFLT
Rev: 4
Build Date: not specified
Entry: 0x40
Data Start: 0xba50
Data End: 0xe810
BSS End: 0xfb9c
Stack Size: 0x1000
Reloc Start: 0xe810
Reloc Count: 0x2d2
Flags: 0x5 ( Load-to-Ram Gzip-Compressed )

Die Files auf dem IP-Drive sind also gezipet !!!

mit "arm-elf-flthdr -z datei" zipped man die Files und mit -Z unzippet man sie wieder !

Ich habe also ein unzip aus sysinit (unser erster Prozess !) gemacht und dort so einiges gefunden !!!!
sysinit liest die system.conf und ruft ifconfig auf und startet danach den inetd-Prozess.

inetd selber liest normaler weise die inetd.conf ein, aber diese Version ist gepached und hat hart
einkodiert, dass es die Prozesse
/mnt/kbipd/bin/ftpd
/mnt/kbipd/bin/swat
/mnt/kbipd/bin/nmbd
/mnt/kbipd/bin/smbd
und die das in der Distribution nicht enthaltene
/mnt/kbipd/bin/telnetd

Nachdem das bekannt war, habe ich aus der ucLinux Distribution nach dem Helloworld Beispiel
das Makefile für inetd erstellt.
Leider sind da noch ein paar Fallstricke drin ! z.B. wird in inetd.c die Funktion getservbyname() aufgerufen. Diese liefert normalerweise die services aus /etc/services !
Leider exisitiert diese Datei im romfs des IPO-Drive nicht und auch sonst gibht es keine Defautls.
Ich musste die Funktion selber schreiben (bzw. aus bestehenden Implem,entierungen kopieren.
Nachdem ich dies getan hatte, konnte ich über die inted.conf die oben (ausser telnetd) beschriebenen Prozesse starten !
Sobald ich alle Debugmeldungen wieder entfernt habe, stelle ich die Sourcen an dieser Stelle und auch das Makefile bereit !

Gruß
Fossi

Sonntag, 30. Dezember 2007

One small step for arm, but ...

Der Durchbruch ist gelungen !

Nachdem ich mich mehrere Tage mit dem Erstellen und compilieren der Toolchain
geärgert habe, habe ich ine unter OpenSuse 10.3 lauffähige fertige Kompilierung
gefunden, bei uCLinux. Wenn man dort das File arm-elf-tools-20030314.sh herunterlädt und ausführt, bekommt man alle notwendigen Tools (gcc, binutils, newlib, elf2flt) die man für eine Entwicklung benötigt.

Also:
1. OpenSuse 10.3 installieren (geht bestimmt auch mit anderen Distributionen)
2. Toolchain herunterladen und ausführen als root mit sh ./arm-elf-tools-20030314.sh
3. ein kleines "Helloworld" mit Makefile schreiben:

helloworld.c:
#include
void main(int argc, char **argv)
{
FILE* pFile=NULL;
int i=0;

pFile=fopen("/mnt/kbipd/tmp/helloworld.txt","wa+");
for (i=0;i<1000;i++)
{
fprintf(pFile,"Hello World!!\n");
}
fclose(pFile);
}

Makefile:
EXEC = helloworld
OBJS = helloworld.o
SOURCE = helloworld.c
CC = arm-elf-gcc
CFLAGS =
LDFLAGS= -Wl,-elf2flt
LDLIBS= -lc


all: $(EXEC)

$(EXEC): $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

$(OBJS): $(SOURCE)
$(CC) $(CFLAGS) -c $(SOURCE)


clean:
-rm -f $(EXEC) *.gdb *.o

4. mit "make" alles bauen. Sieht dann so aus:
# make
arm-elf-gcc -c helloworld.c
helloworld.c: In function `main':
helloworld.c:3: warning: return type of `main' is not `int'
arm-elf-gcc -Wl,-elf2flt -o helloworld helloworld.o -lc
#

5. das helloworld als Ersatz über das ftpd auf dem Flash schreiben, also nach
...\kbipd\bin\ftpd
6. Flashkarte in das IPDrive einsetzen und starten.
7. Ein ftp auf das IPDrive probieren (sollte nicht gehen !)
und dann IOPDrive wieder ausschalten
8. Auf dem Flash sollte nun im Verzeichnis
"/kbipd/tmp/" eine helloworld.txt
zu finden sein mit 1000 mal "Hello World !" drin.

Ich wünsche allen eine guten Rutsch ins Jahr 2008 !

Fossi


Dienstag, 25. Dezember 2007

Leider noch nichts neues ...

Leider habe ich noch keine neuen Fortschritte gemacht.
Mangels anderer Anwedungen, als der auf dem IP-Drive,
kann ich leider nicht prüfen, ob ich einen HOOK mit dem sysinit
gefunden habe.

Ich werde mich jetzt mal ein wenig mit gnuarm und der Tool-Chain beschäftigen
und versuchen eine "HelloWorld" Anwendung zu schreiben, welche eine File
(als Beweis) auf die Flashdiesk schreibt und dann sysinit aufruft.

Wünscht mir Glück ;-)

Fossi

Jetzt geht die Lucy ab !!!!

Habe so eben den Zugriff auf root hinbekommen (lesend) !
Einafch in der smb.conf den Eintrag
[Root]
comment = For Administrator only
path = /
valid users = root
read only = No

ändern ! Vorher stand beim Parameter path =/mnt !!!

Nun kann man über Windows oder SMB-Share auf root des IPDrive zugreifen.
Auch das proc Verzeichnis ist lesbar !

Viele Infos !!!!!!

z.B. Linux
Linux version 2.4.20-uc0 (max@localhost.localdomain) (gcc version 3.0) #403 Thu Nov 10 16:20:56 CST 2005

Speicher:
total: used: free: shared: buffers: cached:
Mem: 30490624 19066880 11423744 0 303104 2375680
Swap: 0 0 0
MemTotal: 29776 kB
MemFree: 11156 kB
MemShared: 0 kB
Buffers: 296 kB
Cached: 2320 kB
SwapCached: 0 kB
Active: 1920 kB
Inactive: 696 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 29776 kB
LowFree: 11156 kB
SwapTotal: 0 kB
SwapFree: 0 kB

CPU:
Processor : Winbond W90N740 rev 1 (v3l)
BogoMIPS : 39.83
Hardware : W90N740
Revision : 0000
Serial : 0000000000000000


Auch den Einstige habe ich nun gefunden:
/bin/inittab:
mount -t proc none /proc
mount -t vfat /dev/hda1 /mnt
/mnt/kbipd/bin/sysinit
sh


Jetzt wird es lustig !!

Software Anlayse

So, nachdem Weihnachten hinter uns liegt, alle Geschenke ausgepackt sind,
kann ich nun fortfahren.

Die SW-Analyse erweißt sich als einfach und doch schwierig. Warum ?
Einfach, weil es nur wenige Dateien gibt und schwierig, weil die nicht so laufen,
wie man es von einem Linux gewöhnt wäre.

Hier die Datei-Liste und Verzeichnis-Liste die auf der Flashdisk/Platte installiert werden:
kbipd
kbipd\bin
kbipd\bin\dhcpcd
kbipd\bin\ftpd
kbipd\bin\gwadd
kbipd\bin\hdstand
kbipd\bin\hkd
kbipd\bin\ifconfig
kbipd\bin\inetd
kbipd\bin\nmbd
kbipd\bin\rdate
kbipd\bin\remount
kbipd\bin\smbd
kbipd\bin\swat
kbipd\bin\sysboot
kbipd\bin\sysinit
kbipd\etc
kbipd\etc\config
kbipd\etc\dhcpc
kbipd\etc\group
kbipd\etc\lang
kbipd\etc\passwd
kbipd\etc\smb.conf
kbipd\etc\sysfile
kbipd\etc\system.conf
kbipd\home
kbipd\share
kbipd\share\public
kbipd\tmp
kbipd\usr
kbipd\usr\local
kbipd\usr\local\samba
kbipd\usr\local\samba\lib
kbipd\usr\local\samba\private
kbipd\usr\local\samba\private\smbpasswd
kbipd\usr\local\samba\sbin
kbipd\usr\local\samba\swat
kbipd\usr\local\samba\swat\help
kbipd\usr\local\samba\swat\help\welc-cs.html
kbipd\usr\local\samba\swat\help\welc-cs1.html
kbipd\usr\local\samba\swat\help\welc-ct.html
kbipd\usr\local\samba\swat\help\welc-ct1.html
kbipd\usr\local\samba\swat\help\welc-fr.html
kbipd\usr\local\samba\swat\help\welc-fr1.html
kbipd\usr\local\samba\swat\help\welc-ger.html
kbipd\usr\local\samba\swat\help\welc-ger1.html
kbipd\usr\local\samba\swat\help\welc-jp.html
kbipd\usr\local\samba\swat\help\welc-jp1.html
kbipd\usr\local\samba\swat\help\welc-kr.html
kbipd\usr\local\samba\swat\help\welc-kr1.html
kbipd\usr\local\samba\swat\help\welcome.html
kbipd\usr\local\samba\swat\help\welcome1.html
kbipd\usr\local\samba\swat\include
kbipd\usr\local\samba\swat\include\footer.html
kbipd\usr\local\samba\swat\include\header-cs.html
kbipd\usr\local\samba\swat\include\header-ct.html
kbipd\usr\local\samba\swat\include\header-fr.html
kbipd\usr\local\samba\swat\include\header-ger.html
kbipd\usr\local\samba\swat\include\header-jp.html
kbipd\usr\local\samba\swat\include\header-kr.html
kbipd\usr\local\samba\swat\include\header.html
kbipd\usr\local\samba\swat\include\images
kbipd\usr\local\samba\swat\include\images\lang.jpg
kbipd\usr\local\samba\swat\include\images\logo.jpg
kbipd\usr\local\samba\swat\include\sysscript.html
kbipd\usr\local\samba\swat\photo
kbipd\usr\local\samba\swat\photo\photo.html
kbipd\usr\local\samba\swat\photo\photo1.html
kbipd\usr\local\samba\swat\photo\photo2.html
kbipd\usr\local\samba\var
kbipd\usr\local\samba\var\locks
kbipd\var
kbipd\var\run

Die Dateien sind fett markiert. Alles andere sind nur Verzeichnisnamen !

Dreh und Angelpunkt für die Standardkonfiguration sind die Dateien system.conf und smb.conf.
smb.conf ist die Konfigurationsdatei für den SAMBA Server:
# Samba config file created using SWAT
# from 192.168.0.223 (192.168.0.223)
# Date: 1970/01/01 00:13:48

# Global parameters
[global]
dos charset = ISO-8859-1
unix charset = ISO-8859-1
display charset = ISO-8859-1
netbios name = KBIPD
server string = IP Drive
security = SHARE
show add printer wizard = No
local master = No
domain master = No
oplocks = No
level2 oplocks = No

[homes]
valid users = %S
read only = No
browseable = No

[Root]
comment = For Administrator only
path = /mnt
valid users = root
read only = No

[Public]
comment = public share folder
path = /mnt/kbipd/share/public
read only = No
guest ok = Yes

Wie man hier schon erkennen kann, ist das auf der Platte installierte System nicht das eigentliche Linux-System, denn root wird hier mit /mnt angegeben. Eine Recherche ergab, dass es üblich ist auf einem ARM erst aus einem ROMFS zu booten und dann das eigentliche root
bzw. Ergänzungen hinzu zu mounten. Was wir also auf der Platte sehen, ist
nur das hinzu gemaoutete System. Wie sieht wohl das echte aus ?

Die system.conf enthält:
[User]
granted users = 5

[Network]
dhcp enable = yes
fixed ip = yes
ip address = 192.168.0.100
network mask = 255.255.0.0
gateway address =

[Timer]
manual setting = yes
time server = yes
ip address = 129.6.15.29

und damit die Systemeinstellungen des Netzwerks und der Uhrzeit.

system.conf ist keine mir bekannte Konfigurationsdatei. Lets google !

CU Fossi

Samstag, 22. Dezember 2007

CF Card als Festplatte läuft ! Ziel Nr 1 erreicht

Habe das einfachste Ziel erreicht.

Habe mir beim Conrad eine 1GB Flashcard von Sandisk geholt und ein CF-Card nach IDE Adapter. Wenn man die CF-Karte neu mit einem Festplattentool (z.B. von Acronis) als Primäre FAT Parttition (nur eine) einrichtet und die IP-Drive Software in das Verzeichnis kbipd aufspielt,
bootet das IPDrive brav auch von der CF-Karte.

Das sieht dann so aus:


bzw.



So nun erstmal ein bisschen spielen ;-)

Fossi

Ahh, ein ARM7

Ha, ein bisschen googlen hat den ersehnten Hinweis gegeben.
In einem Forum habe ich folgenden Hinweis gefunden:
Prozessor: W90N470 von Winbond, also eine 32Bit ARM7TDMI-based MCU

Und die Analyse der beigefügten Software ergabe ausserdem, das ein uCLinux eingesetzt wurde.
Version 2.4.20-uc0

Na dann mal ran an die SW !
Fossi