add the daemon version
[ircbot:ircbot.git] / bot2.asm
1 ;;; compile with:  fasm bot2.asm
2 ;;; LICENSE:
3 ;;;  Do what you want to do, but never forget that I am the author.
4 ;;;  If you do some modifications, put your name.
5
6 PORT equ $0b1a                  ; 6667
7 HOST equ 2548022872             ; irc.hackerzvoice.net
8 HOST2 equ 830528449             ; 193.219.128.49 (irc.freenode.org)
9 CHAN equ "#real-asm"
10 NAME equ "botInAsm2"
11
12
13 format ELF executable 3         ;  ELF32  |  e_type: EXEC (executable)  |  OSABI: Linux (3)
14 entry start
15
16 segment readable executable     ; .text
17 start:
18
19         call socket
20         call connect
21         call init_irc
22         call join_chan
23         call rw_loop
24         
25
26
27 exit:   mov eax, 6              ; SYS_CLOSE = 6
28         mov ebx, esi            ; close fd of socket
29         int $80
30
31         mov eax, 1              ; SYS_EXIT = 1
32         xor ebx, ebx            ; exit(0)
33         int $80
34
35
36 fail_sock:
37         mov eax, 4
38         mov ebx, 2
39         mov ecx, err_sock
40         mov edx, 13
41         int $80
42         jmp exitf
43
44 fail_conn:
45         mov eax, 4
46         mov ebx, 2
47         mov ecx, err_conn
48         mov edx, 39
49         int $80
50         jmp exitf
51
52 exitf:
53         mov eax, 1              ; SYS_CLOSE = 1
54         mov ebx, -1             ; exit(-1)
55         int $80
56
57
58         ;; socket(PF_INET, SOCK_STREAM, 0)
59 socket:
60         push ebp
61         mov ebp, esp
62
63         push 0                  ; protocol = 0
64         push 1                  ; SOCK_STREAM = 1
65         push 2                  ; AF_INET = 2
66
67         mov eax, $66            ; SYS_SOCKETCALL = $66
68         mov ebx, 1              ; SYS_SOCKET = 1
69         mov ecx, esp
70         int $80                 ; eax contains a socket fd, or -1
71
72         cmp eax, -1             ; if ERROR
73         je fail_sock            ; then exit(-1)
74
75         mov esi, eax            ; save the fd
76
77         leave
78         ret
79
80         
81
82         ;; connect(fd, [AF_INET, port, IPv4], size)
83 connect:
84         push ebp
85         mov ebp, esp
86
87         ;; sockaddr strcuture
88         push dword 0
89         push dword 0
90         
91         push dword HOST               ; irc.hackerzvoice.net
92         push word PORT               ; port
93         push word 2             ; AF_INET = 2
94         mov ecx, esp
95
96         push 16                 ; size
97         push ecx                ; [AF_INET, port, IPv4]
98         push dword esi          ; fd of socket
99
100         mov eax, $66            ; SYS_SOCKETCALL
101         mov ebx, 3              ; SYS_CONNECT = 3
102         mov ecx, esp            ; connect(args)
103         int $80
104
105         cmp eax, -1
106         je fail_conn
107
108         leave
109         ret
110         
111
112 init_irc:
113         mov eax, 4
114         mov ebx, esi
115         mov ecx, init
116         mov edx, init.len
117         int $80
118
119         ret
120
121 join_chan:      
122         mov eax, 4
123         mov ebx, esi
124         mov ecx, join
125         mov edx, join.len
126         int $80
127
128         ret
129
130
131 rw_loop:
132         
133     .get_put:
134         mov eax, 3              ; SYS_READ = 3
135         mov ebx, esi
136         mov ecx, buff
137         mov edx, 1024
138         int $80
139
140         mov eax, 4
141         mov ebx, 1
142         mov ecx, buff
143         mov edx, 1024
144         int $80
145
146         call check
147         call bzero
148         call join_chan          ; c'est si jamais on se fait kick par des idiots
149
150         jmp .get_put
151
152
153 check:
154         push ebp
155         mov ebp, esp
156         
157         mov ebx, buff
158         
159         cmp dword [ebx], "PING"
160         je .send_pong
161
162         cmp dword [ebx], "ERRO" ; if ERROR, close the program pas comme un porc
163         je exit
164
165         leave
166         ret
167
168   .send_pong:
169
170         push $20
171         push "PONG"
172         mov eax, 4
173         mov ebx, esi
174         mov ecx, esp
175         mov edx, 5
176         int $80                 ; send "PONG "
177
178
179         mov ecx, buff           ; "PING :xxxx..."
180         add ecx, 5              ; "xxxxxxx\r\n" (buffer minus 5 firsts chars)
181
182         mov eax, 4
183         mov ebx, esi
184         ;; ecx is already set
185         mov edx, 512
186         int $80                 ; send ":xxxxx\r\n"
187
188
189         leave
190         ret
191
192
193 bzero:
194         mov ebx, buff
195         xor eax, eax
196         
197       .SET0:
198       
199         mov dword [ebx], 0
200         add ebx, 4
201         add eax, 4
202
203         cmp eax, 1024
204
205         jne .SET0
206
207         ret
208         
209
210
211
212 segment readable writable       ; .data
213         
214         
215 err_sock:  db "FAIL: socket", $a
216 err_conn:  db "FAIL: unable to connect to remote host", $a
217
218
219 init:   db "NICK ", NAME, $d, $a, "USER ", NAME, " 0 * :botinasm1", $d, $a
220 init.len = $-init
221
222 pong:   db "PONG "
223 pong.len = $-pong
224
225 join:   db "JOIN ", CHAN , $d, $a
226 join.len = $-join
227
228 buff:   rb 2048