Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - supernicky

Seiten: [1]
1
Lowlevel-Coding / Berechnung der Prüfsumme im TCP Header
« am: 17. October 2015, 14:08 »
Hallo zusammen,

ich beschäftige mich zur Zeit mit der Netzwerkprogrammierung und möchte (muss) zum senden von Packeten
die Prüfsumme berechnen. Die Wikipedia Artikel sind wirklich gut, jedoch verstehe ich den Satz
Zitat
Die Prüfsumme ist das 16-Bit-Einerkomplement der Einerkomplement-Summe aller 16-Bit-Wörter im Header und der Nutzdaten des unterliegenden Protokolls
nicht ganz...

Hier erstmal mein empfangenes Packet als Beispiel:

Zitat
Ethernet Frame (14 Byte)
Ziel Mac                  Quelle Mac              Type
44:94:FC:13:61:AE    00:1E:C9:5C:3B:FB   0800

Zitat
IP Header (20 Byte)
Version       IHL       Gesamtlänge
0x45          0x0       0x34:0x0
Ident.         Flags/Fragment
0x1D85       0x4000
TTL/Prot     Prüfsumme
0x80/0x06   0x4C23
QuellIP  A:10:A8:C0         
ZielIP   58:8C:11:34


Zitat
TCP Header (20 Byte)
s-port         d-port
0xC01Ch      0x0050h
seqnr          0xE64C007Ch
acknr          0x3830A282h
off/flag        window
0x80/0x10    0x00FE
checksum     u-pointer
0xB06A        0x0

Zitat
Nutzerdaten (32 Byte)
0x1    0x1   0x5    0xA   0x38  0x30  0xA2  0x6D
0x38  0x30  0xA2  0x82  0x8B  0x8   0x25  0xF3
0x30  0x39  0x3A  0x33  0x38  0xAA 0xF2  0x22
0xB4  0xAB  0x99  0xD4  0x30  0x31 0x39  0x30

Zur Berechnung der Prüfsumme benötige ich die fett markierten Daten (Pseudoheader)
QuellIP  A:10:A8:C0         
ZielIP    58:8C:11:34
Prot       0x006
Länge    0x3400
0x1    0x1   0x5    0xA   0x38  0x30  0xA2  0x6D
0x38  0x30  0xA2  0x82  0x8B  0x8   0x25  0xF3
0x30  0x39  0x3A  0x33  0x38  0xAA 0xF2  0x22
0xB4  0xAB  0x99  0xD4  0x30  0x31 0x39  0x30

Nun liegen alle Header Daten im BigEndian Format vor. Müssen die Header Daten vorher nach LittleEndian
umgewandelt werden? Wie verfahre ich dann weiter?

Gruß und Danke

Nicky

2
tyndur / Re: Download
« am: 28. January 2014, 10:37 »
Ich benötige erstmal nur den Code zum steuern des FDD.
Im Wiki ist nicht viel Code enthalten.

Gruß, Nicky
3
tyndur / Download
« am: 27. January 2014, 22:15 »
wo kann man sich denn Tyndur downloaden (Diskettenimage) ohne googlen zu müssen wie man das entpackt?

Nicky
4
Lowlevel-Coding / Re: Rückkehr aus Task mit IRET geht nicht
« am: 17. January 2014, 18:22 »
Hallo nochmal,

ich habe mein Programm mal in VirtualBox (Oracle) ausprobiert...
Wenn ich ein Task Gate in der IDT anlege und den Interrupt mit "int 33h" aufrufe, wird dieser ausgeführt und auch das NT-Bit wird gesetzt  :-o
Sogar der Rücksprung über IRET funktioniert tadellos  :-D

Wenn ich das selbe Task Gate jedoch auf den IRQ 33 (Tastatur lege) bekomme ich die Fehlermeldung "undef. Opcode" sobald ich eine Taste drücke  :?

Alles seltsam

Nicky

PS: ich nutze am Ende jeder Funktion ret 4... ret 8 usw... damit hatte ich noch nie Probleme.
5
Lowlevel-Coding / Re: Rückkehr aus Task mit IRET geht nicht
« am: 13. January 2014, 19:12 »
Hallo nochmal,

hat etwas gedauert da wir im Umzugsstreß sind...

Aufgerufen wird der IRQ13 (Allg. Schutzverletzung)

Im Anhang habe ich mal den Screenshot eingefügt.
Folgende Daten liegen auf dem Stack:

Fehlercode: 0x0
EIP: 0x8259
CS: 0x8
EFLAG: 0x46

Im Listing beginnt er bei Offset 0x0, es müssen aber 0x8000 addiert werden.

Was auch nicht funktioniert ist, wenn in der IDT ein TASK Gate verwendet wird.
Auch hier wird der IRQ 13 aufgerufen.

Gruß, Nicky
6
Lowlevel-Coding / Re: Rückkehr aus Task mit IRET geht nicht
« am: 09. January 2014, 19:52 »
Hallo zusammen,

ich schreibe mit NASM und mein System ist Virtual PC.
Wenn man mit Call einen Taskwechsel auslöst

JMP 0x18:123456

sollte das NT Bit im EFLAG Register gesetzt werden und im Backlink Feld der neuen Task wird das TSS des aufrufenden Task's abgelegt.
Somit ist es möglich mittels IRET (nicht RET) zum alten Task zurück zukehren.

http://www.fh-zwickau.de/doc/prmo/pmtutor/text/p_spez2.htm ebenfalls im Buch von Klaus-Dieter Thies Seite 375.

Auf eine IDT habe ich der Einfachheit halber verzichtet, da ich den Sprung mit Call/IRET durchführen möchte.

Mein Code ist recht einfach aufgebaut:
Das A21 Bit ist hier im Code nicht aufgeführt wird aber gemacht :)
org 0x8000
cpu 486
[Bits 16]


start:
cli ;Interrupts aus
;alle Register löschen
in al, 0x60 ;Tastaturbuffer leeren
xor ax, ax
xor bx, bx
xor cx, cx
xor dx, dx
xor di, di
xor si, si

lgdt [GDT] ;GDT laden

mov eax, cr0
or ax, 1
mov cr0, eax ;In den P-Mode wechseln

jmp 0x8:pmode
[Bits 32]
pmode:
;Selectoren setzen
xor eax, eax
mov ax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax

mov esp, 0x80000      ;Stack auf 512 KByte

mov ax, 32d
ltr ax ;OS Urtask erstellen

call getmemsize ;Speichergröße feststellen
mov [ram], eax ;und speichern


call createtables ;Paging aktivieren


call 0x28:0x123456 ;Userprogramm als Task aufrufen

push dword str_umbruch
call prints

jmp warteschleife
;######################################################
; ab hier nur ein Test ob alles geht!!!
;------------------------------------------------------------------------------------------------------------
%include "main.inc"



;#############################################
;------------------------------------------------------------------------------------------------------------
warteschleife:
nop
jmp warteschleife


meine GDT sieht so aus:
gdttabelle: ;0
dd 0
dd 0

CODE: ;8
dw 0xFFFF
dw 0                 
db 0                 
db 10011010b
db 11001111b ;DB und G Bit gesetzt
db 0


DATEN: ;16
dw 0xFFFF
dw 0
db 0                  
db 10010010b
db 11001111b ;DB und G Bit gesetzt
db 0
USER_TASK: ;24 ;Das USER TSS
dw 104d
dw TSS1
db 0
db 10001001b
db 10000000b
db 0
TMP_TSS: ;32 nur zur temporären Umschaltung des Tasks
dw 104d
dw tmptss
db 0
db 10001001b
db 10000000b
db 0
USER_GATE: ;40 Task Gate Userprogramm
dw 0
dw 24d
db 0
db 10000101b
dw 0

GDT:
gdt_limit dw $ - gdttabelle
gdt_base dd gdttabelle


Nachdem nun mit call 0x28:0x123456      ;Userprogramm als Task aufrufen in den neuen Task gewechselt wurde, werden ein paar Daten ausgegeben:
Das ist nichts großes..
user:

push dword crlf
call prints
push dword crlf
call prints
push dword crlf
call prints


mov ebx, 0x804f0
mov eax, [ebx]
push eax
call itoh
push eax
call prints
push dword crlf
call prints

mov ebx, 0x804f4
mov eax, [ebx]
push eax
call itoh
push eax
call prints
push dword crlf
call prints

mov ebx, 0x804f8
mov eax, [ebx]
push eax
call itoh
push eax
call prints
push dword crlf
call prints

mov ebx, 0x804fc
mov eax, [ebx]
push eax
call itoh
push eax
call prints
push dword crlf
call prints

push dword crlf
call prints

mov ebx, USER_TASK
add ebx, 5d
push ebx
xor eax, eax
mov al, byte [ebx]
push eax
call itoh
push eax
call prints
push dword crlf
call prints
pop ebx
add ebx, 8d
xor eax, eax
mov al, byte [ebx]
push eax
call itoh
push eax
call prints
push dword crlf
call prints

;iret
;jmp 0x20:0x123456

Falls noch von Interesse hier noch die beiden TSS
TSS1 ist für das aufgerufene Programm und tmptss ist nur zur temporären Speicherung der Urtask. (Da wird später nicht mehr zurückgesprungen)
TSS1:
dw 0 ;Backlinkfeld
dw 0 ;NULL
dd 0x80000 ;ESP0
dw 0x10 ;SS0
dw 0 ;NULL
dd 0 ;ESP1
dw 0 ;SS1
dw 0 ;NULL
dd 0 ;ESP2
dw 0 ;SS2
dw 0 ;NULL
dd 0x21000 ;Cr3 = 0x21000 = 135 KByte
.eip dd user ;EIP
.eflag dd 0x2 ;EFlag
;----- allgemeine Register
dd 0 ;EAX
dd 0 ;ECX
dd 0 ;EDX
dd 0 ;EBX
dd 0x80500 ;ESP
dd 0 ;EBP
dd 0 ;ESI
dd 0 ;EDI
;-------
dw 0x10 ;ES
dw 0 ;
dw 0x8 ;CS
dw 0 ;
dw 0x10 ;SS
dw 0 ;
dw 0x10 ;DS
dw 0 ;
dw 0x10 ;FS
dw 0 ;
dw 0x10 ;GS
dw 0 ;
dw 0 ;LDT Selektor
dw 0 ;NULL
dd 0 ;
;########################################################
tmptss:
times 104 db 0

Beide Tasks benutzen die selben Segmente (Flat 4GB) aber unterschiedliche Stackzeiger (ESP). Beide laufen in Ring 0.
Das Bit 14 (0-15) wird nicht gesetzt nach Call und in beiden Stacks werden auch keine Daten abgelegt.

Falls noch was fehlt, einfach melden...

Danke für die Hilfe

Nicky
7
Lowlevel-Coding / Rückkehr aus Task mit IRET geht nicht
« am: 08. January 2014, 21:18 »
Hallo Gemeinde,

ich versuche seit einiger Zeit den Taskswitch mittels IRET.
Mein Programm erstellt nur eine GDT, 2 TSS Segmente mit den Descriptoren.
Alles läuft außerdem in Ring 0.

Der Aufruf des Tasks mittels CALL funktioniert tadellos. Am Ende soll mit IRET wieder zurückgesprungen werden,
da streikt aber die CPU. (Prozessorfehler)

Beide Tasks nutzen die selben Segmente (CS, DS) nur ESP ist unterschiedlich.

Ich habe mich schon auf Fehlersuche begeben und die Stacks und die TSS Segmente untersucht.
Das Backlink Feld wird richtig gesetzt und das Busy-Bit wird auch gesetzt. Jedoch finde ich weder
auf den Stacks, im TSS noch im EFlag Register das gesetzte NT-Bit was dafür erforderlich ist.

Die CPU muss das doch irgendwo speichern oder?

Wenn ich anstatt Call, JMP benutze springt er fehlerfrei zwischen beiden Tasks hin und her.

ESP des ersten Task = 0x80000 beim zweiten ist ESP auf 0x80500

Ich weiß nicht mehr weiter

Nicky
Seiten: [1]

Einloggen