Avatar billede hippien Nybegynder
21. juli 2003 - 03:12 Der er 6 kommentarer

Linux Assembly Sockets Fortsat

Fortsætter denne tråd her http://www.eksperten.dk/spm/375825:

Jeg har lavet et lille program der skulle connecte til localhost på port 4919, men det virker ikke... hvis der er en der kunne finde fejlen ville jeg være meget taknemmelig... her kommer min kildekode (nasm):

section .data
address db "127.0.0.1"
section .bss
s_args:
s_arg1 resd 1
s_arg2 resd 1
s_arg3 resd 1
s_arg4 resd 1
sockaddr:
c_arg1 resd 1
c_arg2 resd 1
c_arg3 resd 1
c_arg4 resd 1
c_args:
c_arg5 resd 1
c_arg6 resd 1
c_arg7 resd 1
c_arg8 resd 1
section .text
global _start

_start:
mov dword[s_arg1],0x02
mov dword[s_arg2],0x01
mov dword[s_arg3],0x00
mov eax,0x66
mov ebx,0x01
mov ecx,s_args
int 0x80

mov dword[c_arg1],0x02
mov dword[c_arg2],0x3713
mov dword[c_arg3],0x00
mov dword[c_arg4],eax
mov eax,sockaddr
mov dword[c_arg5],eax
mov dword[c_arg6],0x10
mov eax,0x66
mov ebx,0x03
mov ecx,c_args
int 0x80


mov ebx,0x00
mov eax,0x01
int 0x80
Avatar billede soreno Praktikant
21. juli 2003 - 15:04 #1
Har du et link til hvad de forskellige interrupt metoder gør ?
Avatar billede hippien Nybegynder
21. juli 2003 - 15:45 #2
well int 0x80 kalder kernen med funktionnnummeret eax indeholder... jeg har ikke noget link da mine kilder er meget spredte og der mangler i høj grad dokumentation til dette.
men 0x66 = sys_socketcall !
Avatar billede soreno Praktikant
21. juli 2003 - 17:39 #3
Umiddelbart ser dette interessant ud:
http://www.lxhp.in-berlin.de/lhpsyscal.html

Når du vil sende data over en socket skal du:
#1 initialisere en socket (dest_socket = socket(AF_INET, SOCK_STREAM, 0))
#2 connect til en serversocket (connect(dest_socket, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr))
#3 sende data (send(dest_socket, (char *)buffer, packet_size, 0); )


Jeg kan ikke lige gennemskue hvad du gør i din kode, men efter som du kun kalder 2 interrupts og exit tvivler jeg på at det er nok.. :-)

Har du stødt på dette i din søgen efter info:
http://world.std.com/~slanning/asm/daytime_cli.txt

Der er en guide til AT&T vs. Intel syntaks her:
http://linuxassembly.org/articles/linasm.html
http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html

Der findes også nogle converter programmer der konverterer mellem syntaks:
http://www.niksula.cs.hut.fi/~mtiihone/intel2gas/
http://www.multimania.com/~placr/a2i.html

Generelt ser:
http://linuxassembly.org/

Ud til at have en masse brugbart.

Prøv at kigge lidt på det og post din kode når du er kommet lidt videre (gerne med kommentarer)..
Avatar billede hippien Nybegynder
21. juli 2003 - 19:22 #4
Det med at sende data er jeg ikke nået til endnu, men det er den lette del... det er blot lige som at skrive/læse output til/fra skærmen/en fil.

Jeg har forstået hvordan man laver en socket. Men når jeg har lavet denne ved jeg ikke helt hvordan jeg kommer videre med f.eks. at få den til at connecte til en ip på en given port.
Avatar billede hippien Nybegynder
24. juli 2003 - 01:30 #5
%define PF_INET        2
%define SOCK_STREAM    1
%define SOCK_DGRAM      2
%define SOCK_RAW        3
%define IPPROTO_IP      0
%define IPPROTO_TCP    6
%define IPPROTO_UDP    17
%define IPPROTO_RAW    255
%define INADDR_ANY      0

%define socket          1
%define bind            2
%define connect        3
%define listen          4
%define accept          5
%define send            9
%define recv            10
%define setsockopt      14


section .text
global _start

_start:
sub esp,byte 0x20
mov ebp,esp
mov [ebp],PF_INET
mov [ebp+4],SOCK_STREAM
mov [ebp+8],IPPROTO_TCP
mov [ebp+12],esi
mov eax,0x66 ;syscall 102 (socketcall)
mov ecx,ebp
int 0x80 ;call kernel
lea esp,[ebp+0x20]


det her er lidt mere overskueligt med nogle konstanter :)
Jeg har lavet en socket her, og er helt blank mht hvordan man connecter.
Ikke at http://world.std.com/~slanning/asm/daytime_cli.txt ikke er brugbart, men jeg kan sgu ikke finde ud af hvad forskellen på big og little indian er og hvordan man konverterer imellem disse.
Avatar billede soreno Praktikant
24. juli 2003 - 15:31 #6
Data:
0x21 0x33 0x01 0x42

Lagring af data på et big endian system (sparc og motorola - så vidt jeg husker):
Memory[0] = 0x21
Memory[1] = 0x33
Memory[2] = 0x01
Memory[3] = 0x42

Lagring af data på et little endian system (intel):
Memory[0] = 0x42
Memory[1] = 0x01
Memory[2] = 0x33
Memory[3] = 0x21

Hvis du modtager et DWORD via en socket forbindelse skal du vide hvilket format det er sendt i for at være sikker på det giver mening.

Se. evt. dette for hjælp til "konvertering":
http://www.cs.umass.edu/~verts/cs32/endian.html
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester