             Laurent Constantin's network library (lcrzo)


            ----------------------------------------------
            |               LCRZO 's CHANGELOG           |
            ----------------------------------------------

---------------------------------------------------------------------
Version 4.04 - 3-february-2002
 ++ bugs fixed ++
  - Function lcrzo_hs_init_etha was not converting to lcrzo_hs.
  - Under Windows, function lcrzo_dir_exist was not returning a
    correct value if the directory name finished with "/".

 ++ major evolutions ++
  - Port to Linux under ia64 (Intel Itanium 64 bits).
  - Type lcrzo_bool is defined as unsigned char.
  - Every function having an integer as parameter now have a 
    lcrzo_int16. Exceptions : file descriptor and error numbers.

 ++ minor evolutions ++
  - Creation of lcrzo_ipa_init_ipa, lcrzo_etha_init_etha.
  - Function lcrzo_ipl_init_iprange now accepts a range of hostnames.
  - In functions lcrzo_file_open_write and lcrzo_dir_create,
    parent directories are created if they do not exists.
  - Several hundred spelling corrections.
  - When TCP packets are printed in synthetic printtype, bits are
    now displayed : 's'==syn, 'a'==ack, etc.
  - Creation of functions lcrzo_bool_init_text, lcrzo_bool_init_rand
    and lcrzo_bool_init_stdin.
  - Creation or rewrite of several lcrzo_xxx_init_stdin functions.
  - Rewrite of lcrzo_ipa_init_ips, lcrzo_ipl_init_ips and 
    lcrzo_etha_init_eths. They used strtok function which is not
    thread safe.


---------------------------------------------------------------------
Version 4.03 - 13-january-2002
 ++ bugs corrected ++
  - Detection of end of flow for lcrzo_ipc and lcrzo_sock was 
    incorrect. When we were waiting for one event only (ie using 
    lcrzo_ipc_readm_line, and not lcrzo_wait_wait2(&waitipc, 
    &waitfile, etc.), the ending message was not recognized, and the
    function continued to loop.

 ++ major evolutions ++
    none in this version

 ++ minor evolutions ++
  - Under Unix, child processes are now killed when the father exits.
  - In functions lcrzo_file_offset_get, lcrzo_file_size, 
    lcrzo_filename_size and lcrzo_filename_read, we return error
    LCRZO_ERR_SPFILE2G when file size is greater than 2 Giga bytes.


---------------------------------------------------------------------
Version 4.02 - 26-december-2001
 ++ bugs corrected ++
  - Windows 9x : simultaneous access to the network adapter could 
    crash the system. Every call to PacketOpenAdapter is now enclosed
    between exclusives locks : simultaneous calls by different 
    threads are now forbidden.

 ++ major evolutions ++
  - Algorithm retrieving Windows' configuration was rewritten in 
    order to use several methods, and to combine them to choose the 
    best solution.
  - Port to Windows 2000.
  - Port to Windows Me.

 ++ minor evolutions ++
  - Creation of lcrzo_conf_debug_fprint to display configuration
    information for debugging purposes.
  - Creation of the following types : lcrzo_consths, lcrzo_constips 
    lcrzo_constipa, lcrzo_consteths, lcrzo_constetha, 
    lcrzo_constdevice, lcrzo_consthexa, lcrzo_constmixed, 
    lcrzo_constbase64, lcrzo_consttime, lcrzo_hexa, lcrzo_mixed, 
    lcrzo_base64.
  - The configuration update period is now 60 seconds (before, it
    was 5 seconds, which was too frequent).


---------------------------------------------------------------------
Version 4.01 - 25-november-2001
 ++ bugs corrected ++
  - Memory leak in lcrzo_priv_storeddata_extract_fixed. This function
    is used by lcrzo_ipc_read_line, lcrzo_file_read_line, etc.
  - In virtual clients and servers, a warning was incorrectly 
    printed when a child process terminated with the error
    LCRZO_ERR_OKPROCESSABRUPTTERM.
  - In lcrzo_dir_exist, a debugging message was printed.
  - Memory leak in TCP virtual socket during transition from 
    FINWAIT1 to FINWAIT2 state.
  - Under Windows, if user entered a newline in lcrzo_stdin_char,
    only the \r (go back to the beginning) was printed. So the
    next line overwrote the current line.
  - Under Windows, the backspace character was incorrectly added
    in data stream, instead of removing previous character.

 ++ major evolutions ++
  - Port to Windows 95
  - Port to Windows 98

 ++ minor evolutions ++
  - It is now possible to call lcrzo_init or lcrzo_close several
    times.
  - Creation of two defines LCRZODEF_SYSTEMVERS and 
    LCRZODEF_SYSTEMARCH.
  - Creation of function lcrzo_windows_getsystemversion.


---------------------------------------------------------------------
Version 4.00 - 12-november-2001
 ++ bugs corrected ++
  - In lcrzo_string_initm_ethlist, lcrzo_iprange was used instead of
    lcrzo_ethrange.

 ++ major evolutions ++
  - This version is a major rewrite.
  - Windows NT 4.0 is now supported.
  - New modules :
      lcrzo_process : to create and deal with processes
      lcrzo_wait : to wait for events (data available, process end, 
      etc.)
  - Major rewrite of modules :
      lcrzo_conf : system and user conf are now separated
      lcrzo_file : a new type is available
      lcrzo_global : processes and threads are supported
  - Functions dealing with example presentation are moved in lcrzoex.
  - Functions initializing data with a fixed size array are removed.

 ++ minor evolutions ++
  - Several hundreds.


---------------------------------------------------------------------
Version 3.15 - 28-july-2001
 <>
 ++ bugs in lcrzo ++
    none in this version
  
 ++ major evolutions of liblcrzo ++
  - Creation of lcrzo_portlist, lcrzo_iplist and lcrzo_ethlist.
    They allow to use lists of port, ip addresses and Ethernet 
    addresses. For example "1-20,22-79,!50", 
    "1.2.3.4,2.2.2/24,!2.2.2.45",
    "aa:bb:cc:dd:ee:ff-aa:bb:cc:ff:ff:ff,11:11:11:11:11".
  - Rewrite of the module lcrzo_time.
  - Creation of functions lcrzo_process_xxx to deal with processes.
  - Creation of functions lcrzo_xx_get_fd to obtain file descriptors
    for lcrzo_fd, lcrzo_stream, lcrzo_ipc, lcrzo_sniff, lcrzo_spoof
    and lcrzo_sock.
  - Creation of lcrzo_device_init_noalias to convert "eth0:2"
    to "eth0" for example.
  - In lcrzo_sniff_init and lcrzo_spoof_eth, if an aliased device
    is used (eth0:2), it is converted to an unaliased device (eth0).
  - Creation of functions lcrzo_fd_select_readx to wait for data 
    ready to be read from file descriptors.

 ++ minor evolutions of liblcrzo ++
  - In lcrzo_portrange_init_port, upper port is now printed, because
    the range of port "5-65535" is easier to understand than "5-".
  - Doesn't print a newline after the synthetic display of an
    ARP packet.
  - The printtype LCRZO_PRINTTYPE_PTEXT displays characters upper
    than 127 (ascii-8 bits) (before they were printed as '.').
  - Under FreeBSD and OpenBSD, use of BIOCIMMEDIATE on pcap file 
    descriptor to have sniffed data immediately.
  - Under Solaris, use of SBIOCSTIME and SBIOCSCHUNK on pcap file
    descriptor to have sniffed data immediately.

 <>
 ++ bugs in lcrzoex ++
  - In tools 202 and 203 (http brute force), user and password were
    reverted : Basic authentication was never sent.

 ++ major evolutions of lcrzoex ++
  - Creation of module shared_telnet to implement telnet protocol.
  - Tool 268 : brute force FTP.
  - Tool 269 : simulate open TCP ports (nmap finds everything open). 
  - Tools 270..273 : telnet client (execute commands, interactive,
    and brute force)

 ++ minor evolutions of lcrzoex ++
    none in this version


---------------------------------------------------------------------
Version 3.14 - 01-july-2001
 ++ bugs ++
  - In lcrzo_err_print, stdout wasn't flushed after error displaying.
    In some cases (immediat exit of child process), error message
    wasn't displayed.
  - Under Solaris 2.8, in lcrzo_spoof_ip, the field totlen of IP 
    headers had to be recomputed if the packet contains IP options.
  - In lcrzo_data_initm_int, the check for correct format was too
    strict : a '0' wasn't allowed ("%9d" and "%11d" were allowed, 
    but not "%10d").
 
 ++ major evolutions of liblcrzo ++
  - Port to OpenBSD (2.9) by Jean Philippe Luiggi.
  - Creation of functions lcrzo_record_recfile_init_pcapfile and
    lcrzo_record_pcapfile_init_recfile to convert a libpcap/tcpdump
    packet file to a record file.
  - Creation of functions lcrzo_filename_clean, 
    lcrzo_filename_parentdir and lcrzo_filename_lastfile, to clean a
    path, obtain the parent directory and obtain the file name.

 ++ minor evolutions of liblcrzo ++
  - Creation of lcrzo_global_[sg]et_data_regexp_casesensitive to
    select if regular expressions have to be treated as case 
    sensitive.
  - Creation of lcrzo_string_initm_icmptypecode to create a string
    containing the explanation of an icmp type and code.

 ++ major evolutions of lcrzoex ++
  - Creation of tool 260 : backdoor web server to execute
    commands remotely
  - Creation of shared functions for nntp.
  - Tool 261, 262 : send mail with attachment.
  - Tool 263 : send news with attachment.
  - Tool 264 : verify if a mail server allows relaying.
  - Tool 265 : list all newsgroups on a news server
  - Tool 266 : download one newsgroup message
  - Tool 267 : download messages of a newsgroup

 ++ minor evolutions of lcrzoex ++
  - Update of web client tools (96..99, 190..203) : basic proxy
    authorization is now supported.
  - Update of shared functions for smtp.
  - Update of smtp and nntp clients (162, 163 and 165) to support 
    subjects containing accents (special characters).


---------------------------------------------------------------------
Version 3.13 - 13-june-2001
 ++ bugs ++
  - In functions lcrzo_packet_decodem_xxx, negative sizes weren't
    forbidden : they were converted to big positive numbers. So, a 
    segmentation fault appeared when a negative parameter was used.

 ++ major evolutions of liblcrzo ++
  - Creation of lcrzo_icmp module. This module can create and
    decode various kinds of ICMP packets (rfc 792).
  - When converting ip addresses to Ethernet addresses, default
    spoofed addresses are the addresses of the local computer
    (a new type is created : LCRZO_INTSPOOF_TYPE_CONF).
    This can be reverted to old behavior using :
      lcrzo_global_set_intspoof_ip_type(LCRZO_INTSPOOF_TYPE_COMP);
    With the old behavior, problems appeared because some systems
    keep in mind the false adresses used in ARP requests ; then
    communicating with these systems were temporarily not possible 
    for other computers (the spoofed one).

 ++ minor evolutions of liblcrzo ++
  - Type of ICMP packets is displayed by lcrzo_hdrlicmp_fprint.
  - The libpcap package modified by RedHat is detected by
    genemake, and the variable LCRZODEF_LIBPCAPFROMREDHAT is
    defined. In the module lcrzo_sniff, this special package
    is now treated separately.
  - The special device "any" is supported in lcrzo_mtu_init_device
    and lcrzo_ipl_init_device. It allows to sniff on all
    devices of the computer.
  - Update of sniff functions to sniff on all devices with "any".
  - Installation on RedHat is easier because pcap.h is searched
    in /usr/include/pcap/.
  - Creation of lcrzo-config which permits to compile easily :
      gcc -o fich fich.c `lcrzo-config -cl`
  - The function pcap_freecode is now called (this function wasn't
    available in versions of libpcap previous to 0.6).

 ++ major evolutions of lcrzoex ++
  - Rewrite of tools 138 and 172 : tcp traceroute.
  - Tools 244..247 : udp and icmp traceroute.
  - Tools 248 and 249 : icmp ping.
  - Tools 250 and 251 : tcp ping.
  - Tools 252 and 253 : tcp port scanner.
  - Tools 254 and 255 : udp port scanner.
  - Tools 256 and 257 : icmp scanner.

 ++ minor evolutions of lcrzoex ++
  - Creation of lcrzoex__0000i.c to separate lcrzoex.c in smaller
    and faster to compile files.


---------------------------------------------------------------------
Version 3.12 - 27-may-2001
 ++ bugs ++
    none in this version

 ++ major evolutions of liblcrzo ++
  - Creation of functions lcrzo_hdrlxxx_update, to easily modify
    an header.
  - The pinfos parameter used in loop and search function 
    is no more a const pointer : a subfunction can update its
    state.

 ++ minor evolutions of liblcrzo ++
  - Creation of functions lcrzo_list_searchelem_range and
    lcrzo_list_searchelem_all to search through a chained list
    when data is entirely stored in the saved element.
  - Addition of device types :
     LCRZO_DEVICE_TYPE_LOOPBACK which match only loopback device
     LCRZO_DEVICE_TYPE_UP which match up devices
     LCRZO_DEVICE_TYPE_ALIAS which match aliases
  - Sniff functions now contain an header for data sniffed on 
    loopback.

 ++ major evolutions of lcrzoex ++
  - Tool 208 : ARP ping using ARP request/reply.
  - Tools 209 and 210 : sniff network and deduce the Ethernet
    addresses associated to an IP address.
  - Tool 211 : sniff and print listening TCP/UDP servers
    on the LAN.
  - Tool 212 : sniff and print statistics about network usage.
  - Toosl 213 and 214 : routers forwarding and masquerading packets. 
    Data is fragmented as 16 bytes packets when sent on the external 
    interface.
  - Tool 215 : flood a switch with ARP replies.
  - Tools 216..220 : tcp backdoor to exec, get and put files.
  - Tools 221..243 : replay data saved in records.

 ++ minor evolutions of lcrzoex ++
  - Tools 23, 28, 36 47 and 64 were rewritten.


---------------------------------------------------------------------
Version 3.11 - 13-may-2001
 ++ bugs ++
    none in this version

 ++ major evolutions of liblcrzo ++
  - Parameters for lcrzo_ipc, lcrzo_list, lcrzo_sock, lcrzo_spoof 
    and lcrzo_time are now pointers. Like this, it's homogeneous for
    users, and it allows me to update functions which may need to
    save their state.
  - Virtual servers and clients were totally rewritten, in order 
    to improve their performances and to be closer RFC 768&793.
  - Simplification of several functions of lcrzo_address module,
    because parameters' verification was sometimes done twice 
    (in the current function, and in its subfunctions).
  - Error diagnostic between reading and writing functions is now
    more homogeneous for 'file descriptor', 'FILE *', lcrzo_ipc and
    lcrzo_sock :
     - writing on a closed device : LCRZO_ERR_BUWRITECLOSED
       Exception : for 'FILE *', it's not possible because
       there is a seg fault in (g)libc.
       Warning : for lcrzo_ipc, we must use lcrzo_ipc_close_read
       previously (in the same process).
     - reading on a closed device : LCRZO_ERR_OKDATAEND
       Warning : for lcrzo_ipc, we must use lcrzo_ipc_close_write
       previously (in the same process).
     - reading without been blocking (O_NONBLOCK), and temporarily
       no data : LCRZO_ERR_OKTEMPDATAEND
     - reading, and end of data reached : LCRZO_ERR_OKDATAEND
       Warning : for lcrzo_ipc, we must use lcrzo_ipc_close_write
       previously (in the same process).

 ++ minor evolutions of liblcrzo ++
  - Creation of functions lcrzo_ipc_close_read and 
    lcrzo_ipc_close_write to close an ending point of a lcrzo_ipc 
    (for example, a child process may close writing, and its father 
    may close reading).
  - Module lcrzo_cliser is renamed to lcrzo_sock.
  - In lcrzo_data_print and lcrzo_data_fprint, stdout is flushed.
    Like this, data is printed as soon as it is available.
  - Creation of functions lcrzo_sock_ipopt_set and 
    lcrzo_sock_ipopt_get to set and get ip options associated with 
    a socket.
  - Functions lcrzo_spoofeasy_iptcp and lcrzo_spoofeasy_ethiptcp
    now contain a parameter for a fin bit.
  - Creation of functions lcrzo_xintxx_init_text to convert 
    a string to an integer (equivalent to atoi, atol, strtoul, 
    but errors are dealt by lcrzo).

 ++ major evolutions of lcrzoex ++
    none in this version

 ++ minor evolutions of lcrzoex ++
  - Creation of example 203 doing a brute force HTTP authentication
    using virtual tcp clients.
  - Creation of examples 204, 205, 206, and 207 to spoof TCP packets.


---------------------------------------------------------------------
Version 3.10 - 29-april-2001
 ++ bugs ++
    none in this version

 ++ major evolutions of liblcrzo ++
    none in this version

 ++ minor evolutions of liblcrzo ++
  - In functions lcrzo_data_xx_hexa_stdin, lcrzo_data_xx_mixed_stdin
    and lcrzo_data_xx_base64_stdin, if the user enter something
    equivalent to an empty array, we do not ask to choose between
    Empty and Default. These functions are now easier to use.

 ++ major evolutions of lcrzoex ++
  - Creation of several modules grouping examples by themes.
  - Creation of functions implementing http GET, HEAD, POST,
    PUT and DELETE. Moreover, basic authentification is supported.

 ++ minor evolutions of lcrzoex ++
  - Improvement of clients using udp syslog (example 88, 89, 90 and 
    91).


---------------------------------------------------------------------
Version 3.09 - 16-april-2001
 ++ bugs ++
    none in this version

 ++ major evolutions of liblcrzo ++
  - Rewrite of most of the file/IPC/socket functions dealing with 
    reading and writing data. These functions are now homogeneous.

 ++ minor evolutions of liblcrzo ++
  - Creation of functions lcrzo_fd_write_msg and 
    lcrzo_stream_write_msg. These functions write their data in one 
    step only.

 ++ major evolutions of lcrzoex ++
    none in this version

 ++ minor evolutions of lcrzoex ++
  - Creation of examples 178 to 189 showing client and servers using
    stdin to communicate.


---------------------------------------------------------------------
Version 3.08 - 08-april-2001
 ++ bugs ++
  - In virtual servers, the device was not set for socket
    information (lcrzo_sock_get_infos).

 ++ major evolutions of liblcrzo ++
    none in this version

 ++ minor evolutions of liblcrzo ++
  - In functions lcrzo_ips_init and lcrzo_eths_init, we now
    check for correct IP/Ethernet address before copying it.
  - In lcrzo_conf_route_to_host, we set the known values even
    if there is an error.
  - Creation of two functions to decide if we want virtual
    clients/servers to answer arp/rarp/ping requests :
     lcrzo_global_set_cliser_virt_answeralive
     lcrzo_global_get_cliser_virt_answeralive

 ++ major evolutions of lcrzoex ++
  - In examples 2, 3, 4 and 5, conversion functions are now used,
    to show their usage.
  - Creation of examples 173, 174 and 175 displaying informations
    about the local computer (devices, arp cache, and routing table).
  - Creation of example 176 showing header's values to use
    to reach a host.
  - Every example now shows parameters to use. This helps new users.

 ++ minor evolutions of lcrzoex ++
  - An useless space was displayed in the function 
    lcrzoex_title_print.
  - Example 161 (IP range computing) prints "..." and the end.


---------------------------------------------------------------------
Version 3.07 - 25-march-2001
 ++ bugs ++
  - In examples 84, 108 and 168, we should _exit after sending
    an interruption request. Instead, we were continuing.

 ++ major evolutions of liblcrzo ++
  - Creation of lcrzo_file module dealing with files, file 
    descriptors streams and directories. Writing and reading large 
    data chunks is now done by lcrzo (thanks Kerline Doucet).
  - Creation of functions reading a fixed size or a line from 
    an ipc or a socket :
      lcrzo_ipc_read_flow_fixed
      lcrzo_ipc_readm_flow_fixed
      lcrzo_ipc_read_flow_line
      lcrzo_ipc_readm_flow_line
      lcrzo_sock_read_fixed
      lcrzo_sock_readm_fixed
      lcrzo_sock_read_line
      lcrzo_sock_readm_line

 ++ minor evolutions of liblcrzo ++
  - The manual page is splitted in several small manpages.

 ++ major evolutions of lcrzoex ++
  - Creation of categorie A containing simple examples.

 ++ minor evolutions of lcrzoex ++
  - Creation of example 172, a simple tcp traceroute.
  - Use of lcrzo_file functions in examples 162 and 163.
 

---------------------------------------------------------------------
Version 3.06 - 11-march-2001
 ++ bugs ++
    none in this version

 ++ major evolutions of liblcrzo ++
  - Creation of functions to allocate and reallocate memory data.

 ++ minor evolutions of liblcrzo ++
    none in this version

 ++ major evolutions of lcrzoex ++
    none in this version

 ++ minor evolutions of lcrzoex ++
  - Example 162(send email) can now deal with server answers on 
    several lines.
  - Creation of example 166 sending a spoofed mail.
  - Creation of example 167 : tcp client with loose source routing.
  - In examples 44 and 72 (fragmented spoof) data size is
    now greater than 100 bytes.
  - Creation of examples 168, 169, 170 and 171, which are other
    clients using stdin.
 

---------------------------------------------------------------------
Version 3.05 - 04-march-2001
 ++ bugs ++
  - In example 162, a SMTP helo was done with '@domain.fr' instead
    of 'domain.fr'.
  - Help for examples 74 (icmp with lsrr option) and 75 (icmp with 
    ssrr option) was switched.

 ++ major evolutions of liblcrzo ++
    none in this version

 ++ minor evolutions of liblcrzo ++
  - Sometimes, hostnames resolution takes longer than 30 seconds
    to return "unknown host". Functions 
    lcrzo_global_set_resolver_timeout and 
    lcrzo_global_get_resolver_timeout help users to select a shorter 
    timeout value (by default, it is 4 seconds).

 ++ major evolutions of lcrzoex ++
  - Creation of example 165 recursively putting files on a ftp 
    server.
  - The example 161 (IP/ranges computing) prints all surrounding
    ranges.

 ++ minor evolutions of lcrzoex ++
  - In example 133 (tcp prediction), the difference was printed
    as unsigned (%lu) instead of signed (%ld).
  - Various improvements of examples 162(send email) and 163(send
    news).


---------------------------------------------------------------------
Version 3.04 - 25-february-2001
 ++ bugs ++
  - In lcrzo_uint32_stdin, memory was freed too soon. As a 
    consequence, correct user's values were rejected.
  - The functions lcrzo_int32_stdin, lcrzo_int16_stdin and
    lcrzo_int8_stdin were not conceived for negative integers.
  - The function lcrzo_uint32_rand didn't verify if the
    minimum value was inferior to the maximum value.

 ++ major evolutions of liblcrzo ++
  - Creation of lcrzo_conf_route_to_host, which determines the
    router and the Ethernet addresses to use to send an IP
    packet. This function looks at the routing table to obtain
    these informations.
  - If the user wants to spoof an IP packet at Ethernet level, 
    but doesn't want to bother with Ethernet addresses and 
    device, the new function lcrzo_spoof_set_useethforip can
    help him. This is very useful on systems like Solaris
    which modify IP header values.

 ++ minor evolutions of liblcrzo ++
  - Functions lcrzo_uint32_rand, lcrzo_int32_rand, lcrzo_uint16_rand,
    lcrzo_int16_rand, lcrzo_uint8_rand and lcrzo_int8_rand
    initialize the random generator only once.

 ++ major evolutions of lcrzoex ++
  - In examples 37, 40, 48, and 51, allow user to specify a port
    number equal to zero(0). The minimal value was 1.
  - In examples 65 and 68, allow user to specify icmp types and
    icmp codes of zero(0). The minimal value was 1.
  - Creation of example 162 sending an email using SMTP.
  - Creation of example 163 sending a news message using NNTP.
  - Creation of example 164 sending an IP packet and showing
    how to use lcrzo_spoof_set_useethforip.

 ++ minor evolutions of lcrzoex ++
    none in this version


---------------------------------------------------------------------
Version 3.03 - 18-february-2001
 ++ bugs ++
  - In example 144, the help printed "octal_number" instead of
    "IP_address".

 ++ major evolutions of liblcrzo ++
  - Creation of the module lcrzo_sysdep containing all the system
    dependant functions. 
  - Creation of the module lcrzo_conf to obtain and change network
    configuration : device configuration, arp cache and ip routes.
    The changes are not made on the computer, but on a virtual layer
    allowing users to dynamically configure network functionnalities.
    All network functions of lcrzo now use this configuration module.

 ++ minor evolutions of liblcrzo ++
    none in this version

 ++ major evolutions of lcrzoex ++
  - Creation of examples 157, ... 160 printing the configuration 
    of the local computer. These examples uses new functionnalities
    provided by lcrzo_conf.
  - Creation of example 161 converting IP ranges. This is useful
    to compute network masks.

 ++ minor evolutions of lcrzoex ++
  - In example 133 (tcp prediction), there is a now a pause 
    to ensure the destination host is not synflooded.
    Furthermore, the difference is printed.
  - The example number 158 supersedes example 6.


---------------------------------------------------------------------
Version 3.02 - 04-february-2001
 ++ bugs ++
    none in this version

 ++ major evolutions of liblcrzo ++
    none in this version

 ++ minor evolutions of liblcrzo ++
  - Update of the document presenting lcrzo.
  - Addition of configuration functions allowing to specify Ethernet
    and IP addresses for internal spoofing. These addresses can
    also be computed to match the local network. These functions
    are now used for internal arp and rarp spoofing, in addresses
    conversion functions.

 ++ major evolutions of lcrzoex ++
    none in this version

 ++ minor evolutions of lcrzoex ++
  - Creation of a manual page for lcrzoex.
  - Creation of exemple 156, obtaining informations about a hostname
    with random ARP spoofing.


---------------------------------------------------------------------
Version 3.01 - 28-january-2001
 ++ bugs ++
  - In lcrzo_etha_stdin, lcrzo_etha_init_hs was used instead of
    lcrzo_etha_init_eths, so it was not possible to enter
    a valid Ethernet address.
  - In lcrzo_uint32_stdin, the default value was printed in
    signed integer ("%ld"), instead of unsigned integer ("%lu").

 ++ major evolutions of liblcrzo ++
    none in this version

 ++ minor evolutions of liblcrzo ++
  - In order to be able to use the libpcap package of RedHat, I had
    to circumvent its usage in lcrzo_sniff.c. So, it's now possible
    to use the libpcap package modified by RedHat.
  - Several low level functions of lcrzo 3.x are not implemented in
    libnet. So, using libnet doesn't help a lot on unsupported
    systems. In the configuration file, I removed the choice to
    compile with libnet. The use of libnet is still possible,
    but from now on it's not proposed as a solution for unsupported
    systems.

 ++ major evolutions of lcrzoex ++
    none in this version

 ++ minor evolutions of lcrzoex ++
  - The example 22 (Ethernet packet printing) is added in the
    sniff category.
  - In examples 48 to 53 (TCP spoof), the seqnum and acknum 
    parameters are added.


---------------------------------------------------------------------
Version 3.00 - 21-january-2001
 - Translation of most of the library from French to English.
 - Most of the functions were remade, so the changelog for this 
   version is far from being complete : I put only the major changes.
 - Standardization of error codes. An error string is now also 
   available to explain error to users.
 - Creation of a private module containing all the private function
   which may be used by several functions in the library, but which
   are not sufficiently interesting to be proposed as public 
   functions.
 - Add a boolean type (lcrzo_bool), and use it in all the functions
 - Creation of private functions allowing to open files securely
   (no symlink race, no privilege escalation, etc.).
   Use of theses functions in lcrzo_record module.
 - In lcrzo_sniff module, the number of function has been decreased
   because they were redondant.
 - The function doing the checksum returns now the checksum as an
   argument.
 - Optimization of all functions in lcrzo_list module. Creation of
   new functions in this module. For example it's now possible to
   directly insert a packet in a list, without using an intermediary
   structure.
 - Creation of new functions to deal with device, and to access them
   specifying which device type we want.
 - Homogenization of functions dealing with lcrzo_printtype and
   lcrzo_printprofile.
 - All the functions dealing with access of data within a range
   of possible values have now the following names :
    xx_count : count the number of elements
    xx_value_pos : get value at a position
    xx_value_first : get value at first position
    xx_value_last : get value at last position
    xx_loop_range : call a function for each value in the range
    xx_loop_all : call a function for every value
 - In the function decoding ARP packets, the arp header was set
   even if it was a NULL pointer.
 - In all the functions, in all the modules, a NULL pointer can now 
   be used for all the optional parameters.
 - In few functions, input pointers were not const pointers.
 - Creation of global parameters allowing users to specify some
   internal functionnalities for the library : for "real" hackers
   only.
 - All the function parameters are verified before been used.
 - Creation of the type lcrzo_spoof allowing an easy configuration
   of spoof functions : printprofile, fragment size, etc.
 - Creation of new print types and reorganization of lcrzo_print.c.
 - New module : lcrzo_data to perform all the data manipulation.
   The module lcrzo_string is now based on lcrzo_data.
   A lot of functions, working on data, was remade.
 - All the return values of close() or fclose() are tested.
 - All the examples were remade.

---------------------------------------------------------------------
Below, lcrzo was in French, so the changelog is in French.
Version 2.08 - 01/10/2000
 - Ajout d'un exemple de synflood spoofant au niveau ethernet.
 - Ajout d'exemples permettant de compter les paquets.
 - Lorsque l'on spoofe au niveau IP, sur une machine puissante, le
   systeme se met a saturer (cf. bug_connus.txt). Ajout d'une parade
   temporaire dans lcrzo_sendraw_ip.
 - Creation du module lcrzo_temps comportant toutes les fonctions
   de gestion de temps.
 - Ajout du message d'erreur fourni par libpcap lorsqu'une erreur
   de pcap est affichee.
 - Creation du module lcrzo_string comportant les fonctions de
   traitement de chaines de caracteres : creation, recherche,
   expressions regulieres, etc.
 - Ajout d'un module lcrzo_global. Pour le moment, ce module 
   n'a pas a etre employe par les utilisateurs. Ce module permettra
   de gerer la configuration de certaines fonctionnalites.
 - Ajout de fonctions permettant de creer des serveurs tcp 
   multiclients :
     lcrzo_initsertcp_reelmulti
     lcrzo_initsertcp_reeloipmulti
     lcrzo_initsertcp_reelmultiinfos 
     lcrzo_initsertcp_reeloipmultiinfos
 - Ajout d'un exemple analysant succinctement, a l'aide d'expressions
   regulieres, les bannieres des serveurs. 

---------------------------------------------------------------------
Version 2.07 - 17/09/2000
 - Ajout d'un fichier vide dans le repertoire d'exemple afin de 
   faciliter la creation du premier exemple par l'utilisateur
   (ex1.c). Complement du Makefile du repertoire d'exemple afin de 
   pouvoir compiler rapidement n'importe quel fichier c : par 
   exemple, pour compiler toto.c, il faut taper "make toto".
 - Ajout de trois types de plages :
     lcrzo_plageeth  : plage d'adresses ethernet
     lcrzo_plageip   : plage d'adresses ip
     lcrzo_plageport : plage d'adresses de ports
   Ces plages ont la syntaxe :
     lcrzo_plageeth  :
       a:b:c:d:e:f
       1:2:3:4:5:6-a:b:c:d:e:f
       1:2:3:4:5:0/FF:FF:FF:FF:FF:0
       1:2:3:4:5:0/40
       1:2:3:4:5/FF:FF:FF:FF:FF:0
       1:2:3:4:5/40
       1:2:3:4:5:0%FF:FF:FF:FF:FF:0
       1:2:3:4:5:0%40
       1:2:3:4:5%FF:FF:FF:FF:FF:0
       1:2:3:4:5%40
     lcrzo_plageip   :
       1.2.3.4
       1.2.3.4-5.6.7.8
       1.2.3.0/255.255.255.0
       1.2.3.0/24
       1.2.3/255.255.255.0
       1.2.3/24
       1.2.3.0%255.255.255.O
       1.2.3.0%24
       1.2.3%255.255.255.O
       1.2.3%24
     lcrzo_plageport :
       23
       23-25
       23-
       0-21
       1-21
       -21
       -
   Ajout des fonctions de conversions correspondantes.
 - Complement de genemake afin que le test du bug de ether_hostton
   soit automatiquement mene. Un warning s'affiche alors a 
   l'utilisateur pour qu'il puisse, si il le desire, faire la
   modification de son fichier /etc/ethers.
 - Ajout des fonctions :
    - lcrzo_initcliudp_reelloc
    - lcrzo_initcliudp_reellocoip
    - lcrzo_initclitcp_reelloc
    - lcrzo_initclitcp_reellocoip
   Ces fonctions permettent de specifier un numero de port source
   pour les clients udp/tcp (il n'y a plus besoin d'utiliser les
   clients virtuels pour cela).
 - Reorganisation des noms des fonctions d'initialisation des 
   clients et serveurs udp/tcp. 

---------------------------------------------------------------------
Version 2.06 - 10/09/2000
 - Dans les fonctions de conversion d'adresse lcrzo_ipt2etht et 
   lcrzo_etht2ipt, on interroge aussi :
    - le cache arp/rarp par le biais des procfs /proc/net/arp et
      /proc/net/rarp sous Linux.
    - "netstat -pn" sous Solaris.
 - Ajout des fonctions lcrzo_time_xxx gerant des mesures de temps,
   des pauses, etc.
 - Creation de lcrzo_optip et lcrzo_opttcp pour gerer les options.
   Mise a jour de toutes les fonctions et de tous les exemples 
   utilisant des options.
 - Dans les fonctions lcrzo_get_etht et lcrzo_get_ipl, Solaris ne
   reconnaissait pas le device loopback "lo0", et l'adresse 
   127.0.0.1 ne lui etait pas associee.
 - Ajout d'un exemple de traceroute TCP.
 - Resolution d'un bug de libpcap. Ci-dessous, dans la modification
   de la "Version 1.12 - 01/05/2000", j'avais ecrit :
   "L'exemple 6 affichait "linux socket: Too many open files" apres
    avoir resolu plus de 240 adresses. Le probleme semble lie
    au processus fils de sniff des reponses arp. En utilisant 
    _exit() au lieu de exit(), j'ai resolu le probleme, mais je 
    sais pas pourquoi...".
   Apres avoir pris le temps d'analyser ce bug, il s'avere que la 
   fonction "linux_restore_ifr" de "pcap-linux.c" (libpcap-0-5rel2)
   ne ferme pas le fd qu'elle ouvre :
    void linux_restore_ifr(void)
    { register int fd;
      fd = socket(PF_INET, SOCK_PACKET, htons(0x0003));
      if (fd < 0)
        fprintf(stderr, "linux socket: %s", pcap_strerror(errno));
      else if (ioctl(fd, SIOCSIFFLAGS, &saved_ifr) < 0)
        fprintf(stderr, "linux SIOCSIFFLAGS: %s", 
                pcap_strerror(errno));
      /*et ici, il n'y avait pas de close*/
      close(fd); /*rajoute par Laurent dans libpcap.*/
    }
   J'ai rajoute la section correspondante dans bugs_connus.txt,
   car ce bug ne peut etre corrige qu'en patchant libpcap.
 - L'affichage des bits reserves de l'entete TCP etait fait dans
   le sens inverse dans la fonction lcrzo_ecrit_hdrltcp.
 - Modification du module de liste afin de pouvoir passer des 
   informations complementaires aux fonctions travaillant sur
   les elements.
 - Ajout des fonctions lcrzo_record_lit_boucleinfos,
   lcrzo_sniff_bouclefiltreinfos et lcrzo_sniff_boucleinfos 
   permettant de passer des informations complementaires aux
   fonctions travaillant sur les elements.
 - Ajout de lcrzo_randinit permettant d'initialiser le generateur
   aleatoire avec /dev/random, /dev/urandom ou time^pids. 
   Utilisation de lcrzo_randinit dans lcrzo_rand.
 - Dans lcrzo_sniff_init et lcrzo_sniff_initfiltre, la taille a
   passer a pcap_open_live devait aussi inclure la taille de
   l'entete ethernet.
 - Modification du module de sniff :
    - les fonctions peuvent etre bloquantes ou non
    - il y a trois type de sniff :
        LCRZO_TYPESNIFFNORMAL  fournit tous les paquets sniffes,
			       sans les modifier
	LCRZO_TYPESNIFFREASIP  reassemble les fragments IP,
		               et supprime les doublons IP
        LCRZO_TYPESNIFFREORTCP reassemble les fragments IP,
                               supprime les doublons IP, et 
                               reordonne les paquets TCP
 - Utilisation des nouvelles fonctionnalites de sniff dans la gestion
   des clients/serveurs virtuels. 

---------------------------------------------------------------------
Version 2.05 - 20/08/2000
 - Dans lcrzo_sendraw_ip, il y avait :
     retour=sendto(sock, paquet, nboctpaquet, 0,
		   (struct sockaddr*)&soin, sizeof(soin));
   au lieu de :
		   (struct sockaddr*)&soin, sizeof(struct sockaddr));
   Ca n'a jamais pose de souci, mais c'est plus logique.
 - Delocalisation de la parade contre le bug de Solaris 2.4, 2.5 et
   2.5.1 de la fonction lcrzo_initpaquet_ipopttcpoptdata vers 
   lcrzo_sendraw_ip. De plus, je me suis rendu compte que le probleme
   existe aussi pour le checksum des paquets udp. En resume, 
   j'utilise maintenant :
     hdrltcp.check=hdrltcp.doff<<2;
     hdrludp.check=hdrludp.len;
   Si on met une valeur differente de celles calculees ci-dessus, le
   noyau Solaris envoie un checksum incorrect sur le reseau.
   Par contre, en lui envoyant la valeur ci-dessus, il calcule 
   correctement le checksum.
   C'est un bug assez ennuyeux car il nous empeche d'envoyer un
   checksum falsifie : il faut utiliser pour cela lcrzo_sendraw_eth.
 - Ajout des fonctions lcrzo_sockoptip_xxx permettant de specifier 
   des options IP pour des connexions udp ou tcp (client ou serveur).
 - Ajout d'exemples de clients tcp utilisant les fonctions 
   lcrzo_sockoptip_xxx.
 - Renommage des fonctions :
    lcrzo_initoptip_time_time en lcrzo_initoptip_time
    lcrzo_initoptip_time_iptime en lcrzo_initoptip_timeip
    lcrzo_initoptip_time_ipptime en lcrzo_initoptip_timeipp
    lcrzo_decodeoptip_time_time en lcrzo_decodeoptip_time
    lcrzo_decodeoptip_time_iptime en lcrzo_decodeoptip_timeip
    lcrzo_decodeoptip_time_ipptime en lcrzo_decodeoptip_timeipp
   Cela permet de raccourcir et simplifier le nom des fonctions.
 - On peut maintenant utiliser lcrzo_initserveur_tcp pour ouvrir des
   ports identiques, sans avoir a attendre le "TIME_WAIT".
 - Dans l'exemple verifiant les checksum, on verifie aussi maintenant
   le checksum des fragments IP.
 - Ajout d'autres exemples permettant de construire des paquets
   en direct.
 - Lorsque des paquets tcp ou udp sont routes par la source (source
   routing), le calcul du checksum tcp/udp doit aussi se faire selon
   le contenu de l'option IP (et pas seulement selon l'adresse IP
   destination). C'est maintenant fait.
 - Dans les fonctions lcrzo_initpaquet_ipoptdata et 
   lcrzo_initpaquet_ipopttcpoptdata, on verifie maintenant que la 
   taille des options (ip et tcp) soit un multiple de 4.
 - Dans lcrzo_sendraw_ip, sous Solaris, les options ip
   ne passaient pas : il faut utiliser setsockopt.
 - Creation de structures contenant les entetes logiques.
   Toutes les fonctions de lcrzo utilisent ces entetes logiques.
   Il y a donc :
    - les entetes "logiques" : ce sont les entetes au format machine
    - les entetes "physiques" : ce sont les entetes au format reseau
   Par exemple, pour affecter le port source :
    - d'un entete UDP "logique", il faut faire
         hdrludp.sport=80;
    - d'un entete UDP "physique", il faut faire
         hdrpudp.sport=lcrzo_htons(80);
   Par exemple, pour lire le port source :
    - d'un entete UDP "logique", il faut faire
          valeur = hdrludp.sport;
    - d'un entete UDP "physique", il faut faire
         valeur = lcrzo_ntohs(hdrpudp.sport);
   Comme on peut le voir, les entetes logiques sont beaucoup plus
   simples a utiliser. D'un autre cote, les entetes physiques
   correspondent exactement a ce qui transite sur le reseau.
   Toutes les fonctions de lcrzo ont pour interface des entetes
   logiques, ce qui les rend simples d'emploi.
   Des entetes physiques sont aussi proposees, si vous desirez 
   pouvoir acceder directement a des paquets reseau, sans utiliser
   des fonctions de lcrzo.
 - Suppression du parametre "data" dans toutes les fonctions traitant
   d'ARP. En effet, ce champ avait une utilisation "theorique", mais
   il ne sert a rien en pratique.
   Les fonctions :
      lcrzo_initpaquet_etharpdata
      lcrzo_decodepaquet_arpdata
      lcrzo_decodepaquet_etharpdata
      lcrzo_sendpaquet_etharpdata
   on donc ete renommees en :
      lcrzo_initpaquet_etharp
      lcrzo_decodepaquet_arp
      lcrzo_decodepaquet_etharp
      lcrzo_sendpaquet_etharp
 - Dans le programme contenant les exemples, le device par defaut 
   correspond au systeme : eth0, le0, elx0, etc.
 - Ajout du module lcrzo_ipc. Les fonctions presentes dans ce module
   permettent de communiquer des donnees entre deux processus.
   Par exemple, on peut concevoir un programme ou un processus
   serait charge de sniffer le reseau, puis de passer les donnees
   interessantes a un autre processus, charge de spoofer des 
   reponses.
 - Fusion des modules lcrzo_cliser et lcrzo_virtuel. Ces fonctions
   ont maintenant le meme interface. Ecriture/reecriture de
   nombreuses fonctions de ces modules. Reorganisation/reecriture
   des exemples correspondants.
 - Ajout de la fonction lcrzo_stdin_ipl permettant d'obtenir un ipl
   a partir de l'entree d'un utilisateur.
 - Ajout des informations demandees lors de l'affichage synthetique
   de requete/reponse arp/rarp.

---------------------------------------------------------------------
Version 2.04 - 29/07/2000
 - Creation des fonctions lcrzo_decodeoptip_xxx permettant de decoder
   des options IP.
 - Utilisation des fonctions lcrzo_decodeoptip_xxx dans la fonction
   d'affichage d'un entete IP.
 - Lorsque l'on fragmente des paquets IP contenant des options IP,
   ces options peuvent etre envoyees dans tous les paquets, ou 
   seulement dans le premier paquet. Avant, dans les fonctions 
   lcrzo_sendpaqfrag_xxx, j'utilisais une liste predeterminee pour
   savoir comment traiter les options.
   Maintenant, afin d'avoir un code generique, j'utilise la valeur
   du bit de poids fort du type d'option (rfc 791).
 - Ajout de fonctions traitant l'encodage base64 :
    Initialisation :
     lcrzo_initpaquet_base64("Ym9uam91cg==", donnees, &nboct);
    Affichage :
     lcrzo_affpaquet_data(donnees, nboct, LCRZO_TYPEAFF_BASE64);
 - Simplification de l'affichage des fonctions lcrzo_ecritinfos_xxx
   (ces fonctions avaient ete crees dans le but de deboguer lcrzo,
   mais maintenant elles ne servent plus a ca).
 - Ajout dans la fonction lcrzo_initclientvirtuel_tcp, du reset des
   connexions IDENT initiees par le serveur : on n'a plus a attendre
   le timeout de certains serveurs.
 - Ajout des fonctions lcrzo_sendpaqsimple_xxx. Ces fonctions
   envoient des paquets simples. En effet, dans la majorite des cas,
   on ne veut pas specifier l'id, la window, le type eth, etc.
   Ces fonctions permettent donc d'envoyer des paquets "classiques".
 - Utilisation des fonctions lcrzo_sendpaqsimple_xxx dans les
   exemples classiques.
 - Dans la fonction lcrzo_hs2ipt, on essaie d'abord d'utiliser
   lcrzo_ips2ipt avant de convertir de hs en ipt (car il y avait un
   timeout ennuyant sur certaines machines).
 - Modification de lcrzo_initpaquet_ipopttcpoptdata afin de
   contourner un bug du noyau Solaris 2.4, 2.5 et 2.5.1 qui apparait
   lorsque l'on envoie un paquet tcp avec un checksum different de
   20 (c'est une erreur qui a ete corrigee a partir de la version 2.6
   de Solaris).

---------------------------------------------------------------------
Version 2.03 - 17/07/2000
 - En utilisant des valeurs NULL pour les pointeurs de 
   lcrzo_decodepaquet_xxx, les parametres correspondant ne sont pas
   affectes. Par exemple :
     lcrzo_decodepaquet_ipoptdata(paquet, nboctpaquet,
                             	  &hdrip,
				  NULL, NULL,
				  data, &nboctdata);
   n'affecte pas les options IP (ainsi, si on ne s'en sert pas, on
   n'a plus besoin de les declarer).
 - Simplification de toutes les fonctions utilisant
   lcrzo_decodepaquet_xxx en passant "NULL" pour les parametres
   inutilises.
 - Erreur dans lcrzo_initpaquet_ipopttcpoptdata pour le calcul du
   checksum TCP : lorsqu'il y avait des options TCP, le calcul n'en 
   tenait pas compte.

---------------------------------------------------------------------
Version 2.02 - 14/07/2000
 - Ajout de l'inclusion de <ctype.h> dans lcrzo_spoof.c lorsque l'on
   compile sous Solaris Intel. Un warning s'affichait.
 - Suppression de la definition du "lcrzo_hdrpseudo" dans lcrzo.h,
   car on ne s'en sert que pour les fonctions privees.
 - Creation de lcrzo_coderr.h contenant les codes d'erreur des 
   fonctions de la bibliotheque (avant, ils etaient dans lcrzo.h).
 - Ajout du module lcrzo_ipopt permettant de creer des options IP :
     - lcrzo_initipopt_noop "no operation"
     - lcrzo_initipopt_lsrr "strict source routing and record route"
     - lcrzo_initipopt_ssrr "strict source routing and record route"
     - lcrzo_initipopt_rr "record route"
     - lcrzo_initipopt_time_time "timestamp type 0"
     - lcrzo_initipopt_time_iptime "timestamp type 1"
     - lcrzo_initipopt_time_ipptime "timestamp type 3"
 - Le ttl cree par lcrzo_initdefaut_hdrip est maintenant de 128 au
   lieu de 64.
 - Afin de faciliter la creation de paquets d'attaque, on ne 
   recalcule, dans les fonctions lcrzo_initpaquet_xxx, les champs
   suivants que si leur valeur est differente de la valeur par 
   defaut. Ainsi, 
     - si l'utilisateur ne touche pas a la valeur, la valeur sera
       calculee pour lui
     - si l'utilisateur utilise une valeur autre que la valeur par
       defaut, on laisse cette valeur dans le paquet : cela permet
       de creer des paquets frauduleux.
   Les variables concernees sont (suivies de leur valeur par 
   defaut) :
       hdreth.type    0
       hdrip.totlen   lcrzo_htons(20)
       hdrip.ihl      5
       hdrip.check    0
       hdrip.protocol 0
       hdrudp.len     lcrzo_htons(8)
       hdrudp.check   0
       hdrtcp.doff    5
       hdrtcp.check   0
       hdricmp.check  0
   Les autres variables des entetes ne sont pas du tout modifiees
   par la bibliotheque : la valeur entree par l'utilisateur est
   mise dans le paquet.
 - Ajout de fonctions permettant de creer des paquets fragmentes :
     lcrzo_sendpaqfrag_ipoptdata
     lcrzo_sendpaqfrag_ipoptudpdata
     lcrzo_sendpaqfrag_ipopttcpoptdata
     lcrzo_sendpaqfrag_ipopticmpdata
     lcrzo_sendpaqfrag_ethipoptdata
     lcrzo_sendpaqfrag_ethipoptudpdata
     lcrzo_sendpaqfrag_ethipopttcpoptdata
     lcrzo_sendpaqfrag_ethipopticmpdata
 - Initialisation de hs a "" si lcrzo_get_hs retourne une erreur.
   (ce n'etait pas fait dans le cas ou lcrzo_get_ipl retourne
   != LCRZO_ERR_OK).
 - Modification de lcrzo_stdin_paquet afin qu'elle en demande pas
   "Voulez-vous la chaine Vide ou la chaine par Defaut ?" si la
   chaine par defaut est vide.
 - Au lieu de laisser le noyau calculer le checksum IP dans 
   lcrzo_initpaquet_ipoptdata, on le calcule. Cela permet de voir 
   les valeurs contenues dans les paquets que l'on envoie (au lieu
   de voir "0000").
 - Remise a plat de tous les exemples de lcrzoex.c.
 - Modification des fonctions lcrzo_strxxx afin qu'elles retournent
   un "int" et non un "void".
 - Restriction du format autorise pour lcrzo_strinit_ent et
   lcrzo_strappend_ent. Avant, une simple verification de contenu
   etait faite. Maintenant, le format doit correspondre a 
   l'expression reguliere : 
     "%[0+-.]{0,1}[1-9]{0,2}[l]{0,1}[douxX]"
 - La fonction lcrzo_checksum() retourne maintenant un checksum
   au format host (et non network). Il faut donc utiliser
   lcrzo_htons(resu) afin de mettre resu dans un paquet. C'est 
   ainsi coherent avec le reste de la bibliotheque.

---------------------------------------------------------------------
Version 2.01 - 14/06/2000
 - Le programme de generation des "Makefile" a ete renomme en
   "genemake". L'ancien nom "configure" pouvait faire croire que
   tout se configurait selon le systeme : et non, il faut editer
   config.dat. J'en ai profite pour completer les tests effectues
   dans genemake. L'execution de genemake s'arrete des qu'un souci
   potentiel a ete rencontre. Un message explicatif indique ce qui
   ne va pas.
 - Prise en compte des systemes sur lesquels libnet est installe.
   Dans ce cas l'utilisateur peut choisir d'utiliser libnet : c'est
   cette bibliotheque qui sera utilisee pour les fonctions bas
   niveau.
   Cela peut aussi servir pour installer liblcrzo sur un systeme
   sur lequel elle n'a pas ete portee: HP-UX, etc.
 - Modification de lcrzo_spoof.c. Remplacement de :
      sock=socket(AF_INET, SOCK_PACKET, IPPROTO_RAW);
   Par :
      sock=socket(AF_INET, SOCK_PACKET, lcrzo_htons(ETH_P_ALL));
   Dans la fonction lcrzo_sendraw_eth.
 - Modification des variables de preprocesseur concernant
   l'endianness
     Avant :
       #define LCRZODEF_ENDIAN "Big"
       mais, comme LCRZODEF_ENDIAN_Little n'etait pas defini ce
       n'etait pas pratique de l'employer directement dans du C.
     Maintenant :
       #define LCRZODEF_ENDIANLITTLE 0
       #define LCRZODEF_ENDIANBIG 1
       On peut donc utiliser LCRZODEF_ENDIANxxx pour des tests
       au niveau du preprocesseur, mais aussi dans du C :
        if (LCRZODEF_ENDIANLITTLE) ...
 - Reorganisation des fonctions lcrzo_snprintf, lcrzo_strnapp,
   lcrzo_strncat, lcrzo_strncpy. J'avais, entre-autres, des soucis
   de portabilite avec vsnprintf.
   Les fonctions de remplacement sont :
     lcrzo_strappend_str  : ajout d'une chaine
     lcrzo_strinit_str    : initialisation par une chaine
     lcrzo_strappend_car  : ajout d'un caractere
     lcrzo_strinit_car    : initialisation par un caractere
     lcrzo_strappend_ent  : ajout d'un entier
     lcrzo_strinit_ent    : initialisation par un entier
 - Modification de lcrzo_checksum afin que la fonction travaille
   sur un pointeur de caracteres et non un pointeur de word.
 - Remplacement de LCRZODEF_VERMAJ.LCRZODEF_VERMIN par 
   LCRZODEF_VERSION.
 - Realignement de divers pointeurs.

---------------------------------------------------------------------
Version 2.00 - 27/05/2000
 - Comme la version 1.12 semble stable, je passe en version 2.00, et
   je commence a porter la bibliotheque.
   J'en profite aussi pour renommer la bibliotheque de rlc en lcrzo
   (qui signifie Laurent Constantin Reseau (RZO)). En effet, une 
   recherche de RLC sur internet fournit beaucoup trop de resultats.
 - Portage sous FreeBSD effectue.
 - Portage sous Debian effectue.
 - Portage sous Solaris Intel effectue.
 - Modification de la procedure de generation des Makefile: creation
   de config.dat.
 - Deplacement de lcrzotest.c et modification de ce programme afin
   de pouvoir tester un intervalle.
 - Divers remaniement de repertoires et programmes.


---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
Version 1.12 - 01/05/2000
 - Ajout du module rlc_liste.c permettant de creer des listes
   chainees.
 - L'exemple 6 affichait "linux socket: Too many open files" apres
   avoir resolu plus de 240 adresses. Le probleme semble lie
   au processus fils de sniff des reponses arp. En utilisant _exit()
   au lieu de exit(), j'ai resolu le probleme, mais je sais pas
   pourquoi... D'apres la page d'aide, la seule difference est
   que exit() flushe les filedescriptors avant de les fermer. Si vous
   avez l'explication du pourquoi de ce bug, merci de me l'indiquer. 
 - Ajout de l'exemple numero 7 qui ecoute ce qui passe sur le reseau
   et en deduit ou se trouvent les serveurs, les clients, etc. Lors
   de l'appui sur control-C, un resume de tous les paquets sniffes 
   s'affiche. Cet exemple utilise les listes chainees pour stocker
   les informations.
 - Ajout des fonctions rlc_cmp_... permettant de comparer des
   adresses.

---------------------------------------------------------------------
Version 1.11 - 24/04/2000
 - Ajout des fonctions :
    void rlc_strncpy(char *dest, const char *src, rlc_uint32 taille);
    void rlc_strncat(char *dest, const char *src, rlc_uint32 taille);
    void rlc_strnapp(char *dest, rlc_uint32 taille, const char *src);
    void rlc_snprintf(char *dest, rlc_uint32 taille,
	   	      const char *format, ...);
   Ces fonctions servent de substitut aux fonctions systeme qui ne
   sont pas homogenes et/ou adaptees a la securite (strncpy ne copie
   pas forcement le '\0' en fin, snprintf compte le '\0'
   contrairement aux strxxx, etc.).
 - Utilisation des fonctions ci-dessus dans toute la bibliotheque.
 - Amelioration des fonctions de conversion d'adresse eth<->ip
   Maintenant, on envoie aussi des requetes arp/rarp sur le reseau 
   et on sniffe la reponse. De plus, on regarde si les adresses a 
   resoudre sont celles de la machine locale.
 - Ajout d'un exemple permettant d'obtenir toutes les adresses
   ethernet d'un reseau.
 - Ajout d'un appel manquant a la fonction close dans rlc_ipt2etht
   et rlc_etht2ipt.
 - Ajout d'un exemple permettant de voir les numeros de sequence
   d'un serveur.

---------------------------------------------------------------------
Version 1.10 - 17/04/2000
 - Suppression d'un message de warning apparaissant en compilant
   avec gcc2.91 : j'avais "static faitsrand" au lieu de "static int 
   faitsrand".
 - Creation du fichier src/INSTALL afin de separer la procedure
   d'install du blabla contenu dans le README.
 - Ajout d'une section "Problemes rencontres" dans le fichier 
   INSTALL.

---------------------------------------------------------------------
Version 1.9 - 08/04/2000
 - Simplification de l'arborescence du serveur. Maintenant, je
   propose n versions tar_gzippees :
    rlcsrc-1.9.tgz : sources de la bibliotheque
    rlcdist.Linuxi386-1.9.tgz : version precompilee pour Linuxi386
    rlcdist.FreeBSDi386-1.9.tgz : version precompilee pour FreeBSD
 - Creation d'une fonction privee pour remplacer les appels a fgets 
   dans rlc_stdin.c. En effet, la fonction fgets n'a pas le meme
   fonctionnement sur les differentes versions de RedHat (un '\0'
   n'est pas ajoute en fin de chaine comme ecrit dans la page d'aide
   de la RedHat 5.0...).
 - Ajout des fonctions :
     rlc_initsniff
     rlc_initsnifffiltre
     rlc_sniff_suivant
     rlc_sniff_ferme
   Ces fonctions servent a initialiser un contexte de sniff, a 
   obtenir les paquets du reseau et a fermer le contexte.
   Un exemple typique d'utilisation est :
    rlc_er(rlc_initsniff("eth0", 1500, &cs));
    while(rlc_sniff_suivant(&cs, paquet, &nboct)==RLC_ERR_OK)
    { afficher_ce_paquet(paquet, nboct);
    }
    rlc_er(rlc_sniff_ferme(&cs));
 - Ajout du type ethernet IP dans les fonctions rlc_initpaquet_eth...
   Cet ajout ne se fait que si le type n'etait pas deja defini :
    if (hdreth.type==0)
      hdreth.type=rlc_htons(RLC_ETHPROTO_IP);
 - Ajout de la prise en compte des options tcp. Ce parametre a ete
   ajoute aux fonctions :
	rlc_initpaquet_ipopttcpoptdata
	rlc_initpaquet_ethipopttcpoptdata
	rlc_decodepaquet_tcpoptdata
 	rlc_decodepaquet_ipopttcpoptdata
 	rlc_decodepaquet_ethipopttcpoptdata
 	rlc_sendpaquet_ipopttcpoptdata
 	rlc_sendpaquet_ethipopttcpoptdata
 - Creation du module rlc_virtuel.c. Ce module permet de creer des 
   machines virtuelles :
    - simule une machine presente en repondant aux arp/rarp/ping
    - client udp virtuel
    - serveur udp virtuel
    - client tcp virtuel
    - serveur tcp virtuel
   Ces fonctions n'implementent pas des piles IP parfaites. Par 
   exemple, le nombre de paquets ip recus dans le desordre ne doit
   pas exceder 10. De plus, la gestion des paquets fragmentes n'est
   pas encore assuree. Cependant, ces fonctions permettent de creer
   des machines virtuelles fonctionnant dans la majorite des cas.
   Par exemple, si un wrapper tcp est installe sur un serveur et que
   seules les machines de 192.168.10/24 sont autorisees a se 
   connecter, il est possible de spoofer une connexion tcp en se
   faisant passer pour 192.168.10.56
 - Ajout d'un autre exemple de machine repondant aux requetes
 - Lors du decodage de paquets IP ou ARP/RARP, on supprime les
   octets de bourrage en fin de paquet sniffes. Ces octets pouvaient
   tromper un utilisateur non averti. On etait oblige de regarder
   hdrip.totlen pour distinguer les octets du paquet des octets
   de bourrage. Maintenant, on ne voit plus les octets de bourrage.

---------------------------------------------------------------------
Version 1.8 - 25/03/2000
 - Uniformisation de l'affichage des donnees sous forme de tableaux :
              "0_1_2_3_.0_1_2_3_:0_1_2_3_.0_1_2_3_|..."
    1 bit :   "b " en binaire
    4 bits :  "   dd   " en decimal
              "   Hh   " en hexa
              " dd=Hh  " en decimal et hexa
    8 bits :  "       ddd       " en decimal
              "       HHh       " en hexa
              "        c        " en caractere affichable ('.' sinon)
              "     ddd=HHh     " en decimal et hexa
              "    ddd=HHh=c   " en decimal, hexa et carac affichable
    16 bits : ...
   Ainsi, une entete TCP est maintenant affichee comme suit :
    TCP___________________________________________________________...
    |            port source            |         port destination...
    |____________0455h= 1109____________|____________0017h=   23__...
    |                                seq num                      ...
    |_________________________42193EA3h=1108950691________________...
    |                                ack num                      ...
    |_________________________9738B667h=2537076327________________...
    |dataoff |         . . UrAk PuRsSyFi|               window    ...
    |___ 5___|___ 0____0_0_0_1__0_0_0_0_|____________7D78h=32120__...
    |             checksum              |          pointeur urgent...
    |____________CA3Eh=51774____________|____________0000h=    0__...
   Cette modification permettra d'ecrire ulterieurement un algorithme
   pouvant relire ce format.
 - Ajout de la conversion de nombres binaires dans l'exemple 101.

---------------------------------------------------------------------
Version 1.7 - 18/03/2000
 - Ajout de la fonction rlc_get_mtu permettant de connaitre le mtu
   associe a une interface reseau.
 - Ajout de rlc_purgeblanc dans les fonctions du module rlc_config.c
   afin d'accepter des parametres pouvant contenir des espaces.
 - Utilisation de rlc_get_mtu dans les fonctions de sniff de 
   l'exemple afin de ne plus avoir besoin de specifier la taille
   des donnees a sniffer.
 - Ajout d'un appel a la fonction close dans rlc_sendraw_eth et 
   rlc_sendraw_ip. Cela empechait d'envoyer plus de 
   nbmaxfiledescriptors paquets par programme.
 - Ajout d'un exemple de synflood.

---------------------------------------------------------------------
Version 1.6 - 12/03/2000
 - Homogeneisation du nom des fonctions.
 - Ajout de diverses fonctions au module config.c.
 - Ajout de rlc_ecritinfos_device.
 - Homogeneisation de l'ordre des parametres :
    filedesc_io, entree, parametres, valeurs_par_defaut, sortie
 - Homogeneisation des noms de parametre :
    pxx            pointeur
    paquet         tableau de donnees
    nboctpaquet    nombre d'octets
    sock           socket
    xxdefaut       valeur par defaut
    ...

---------------------------------------------------------------------
Version 1.5 - 06/03/2000
 - Au lieu de definir le device en dur dans le programme d'exemple,
   on le demande maintenant sur la ligne de commande. Cela permet 
   donc de sniffer sur eth1 a l'aide de l'exemple.
 - Utilisation d'un fichier temporaire pour l'option 104 de 
   l'exemple (conversion unix_dos). Cela permet d'ecraser le fichier
   en entree avec par exemple :
    ./rlcex 104 1 nomfichier nomfichier

---------------------------------------------------------------------
Version 1.4 - 01/03/2000
 - Modification de rlc_stdin_presse et rlc_stdin_carac pour utiliser
   tcgetattr et ne plus avoir besoin d'appuyer sur entree pour saisir
   une touche.
 - Compilation de la bibliotheque avec -Wtraditional -Wshadow 
    -Wid-clash-32 -Wpointer-arith -Wcast-qual -Wcast-align
    -Wwrite-strings -Wstrict-prototypes -Wnested-externs
    -Wmissing-prototypes -Wmissing-declarations -Werror
   Cette option de compilation n'est accessible que pour le 
   developpeur de la bibliotheque. Les utilisateurs normaux 
   compilent simplement avec -Wall (defini automatiquement par 
   le ./configure).
   Diverses modifications ont donc ete apportees aux fonctions pour
   pouvoir compiler avec ces options strictes. Principalement, cela
   a consiste a ajouter des "const" pour tous les parametres non
   modifies. 
 - Correction d'un bug dans l'exemple rlcex. Il y avait :
      nomprog=malloc(strlen(argv[0]+10));
   au lieu de malloc(strlen(argv[0])+10);
   J'ai remplace ca par :
    nomprog=malloc(strlen(argv[0])+1+strlen(argv[1])+1);
 - Correction d'un bug dans l'exemple rlcex. Il y avait 
   "if (argc==1)" au lieu de "if (argc==2)" pour l'option 61.
 - Ajout d'une notice en tete du fichier d'exemple :
    "Les programmes ci-dessous sont donnes en guise d'exemple et
     n'ont donc pas fait l'objet d'une conception ou d'un
     developpement approfondis. Des bugs sont peut etre presents."
 - Suppression des messages d'erreur des fonctions rlc_ecritadinfos
   Au lieu d'afficher l'erreur, on affiche maintenant l'adresse
   vide (ex : "0.0.0.0"). C'est plus joli.
 - Ajout du module rlc_device permettant de gerer des devices.
 - Ajout du module rlc_config permettant d'obtenir des informations
   sur la configuration de la machine: cartes reseau, hostname, etc.
 - Ajout de divers exemples : affichage de la configuration, 
   conversion de fichier dos<->unix, etc.
 - Ajout de fonctions de comparaison d'adresse.
 - Ajout de la fonction rlc_purgeblanc qui permet de supprimer les 
   espaces, tabulation, 0x0D et 0X0A et debut et en fin de chaine.
 - Utilisation de la fonction rlc_purgeblanc dans diverses autres
   fonctions.

---------------------------------------------------------------------
Version 1.3 - 23/02/2000
 - Correction d'un bug dans rlc_snifffiltre car la fonction pcap_next
   retourne NULL pour chaque paquet non matche. Cela empechait
   la fonction rlc_snifffiltre de fonctionner. Ce bug etait apparu
   dans la version 1.2.
 - Suppression de l'inclusion de libpcap.a dans librlc.a.
   Cela oblige maintenant a specifier "-lpcap -lrlc" sur la ligne de
   commande de gcc. Cependant, on obtient une structure plus
   standard.
 - Menage dans les differents fichiers makefile et configure : 
   suppression des cas d'erreur, creation automatique pour une 
   livraison, etc.
 - Modification interne des fonctions rlc_ecritpaquet_xxx afin 
   d'uniformiser la procedure de fin d'affichage des paquets.

---------------------------------------------------------------------
Version 1.2 - 20/02/2000
 - Ajout du module rlc_paquet. Ce module permet de :
    - creer des paquets a l'aide d'entetes et de donnees
      (exemple : convertit entete_eth+entete_ip+entete_tcp+donnees
      en un tableau representant tout cela)
    - decomposer des paquets afin d'extraire les entetes et les 
      donnees (exemple : convertit un tableau representant un paquet
      en entete_eth+donnees_eth)
 - Renommage des modules et relocalisation des fonctions :
    rlc_adconv -> rlc_adresse et rlc_ecrit
    rlc_paquet
    rlc_spoof
    rlc_sniff
    rlc_affpaq -> rlc_ecrit
    rlc_cliser
    rlc_stdin
    rlc_fich   -> rlc_record
 - Creation des fonctions rlc_initpaquet_xxx permettant d'initialiser
   des paquets a l'aide de donnees aleatoires, hexa, texte ou mixtes
 - Modification de la syntaxe des chaines mixtes. Avant on avait :
     "bonjour" 04d F5a "cou""cou"
   Maintenant, il faut taper:
     'bonjour' 04d F5a 'cou''cou'
   En effet, utiliser le ' au lieu du " presente deux avantages :
    - en C, c'est plus simple d'ecrire
       "'bonjour' 04d F5a 'cou''cou'"
      que
       "\"bonjour\" 04d F5a \"cou\"\"cou\""
    - en ecrivant 'z', on comprend que l'on ecrit le caractere z
      Mais, en ecrivant "z", on pouvait mal comprendre, et croire
      que l'on voulait 'z' suivi de '\0' pour terminer le string
 - La fonction rlc_initheader_tcp met le bit "syn" a 0 et non
   plus a 1.
 - Les fonctions rlc_initpaquet_ipoptudpdata, ipopttcpdata, 
   ipopticmpdata ont ete modifiees. Le checksum n'est calcule que si
   le checksum vaut zero, c'est a dire si il n'a jamais ete calcule. 
   Cela peut servir pour envoyer sur le reseau des paquets dont le 
   checksum serait incorrect.
 - Utilisation des fonctions de decodage du module rlc_paquet
   dans les fonctions rlc_ecritpaquet_xxx 
 - Creation des types d'affichage et des profils d'affichage.
   Utilisation de ceux-ci en tant que parametre des fonctions
   affichant des donnees.
 - Creation des fonctions rlc_fich_litnumero et rlc_fich_litboucle
   qui permettent d'acceder a un paquet particulier du fichier de
   donnees ou de tous les parcourir.
 - Les fragments IP d'offset>0 sont affiches en tant que donnees
   (et non plus comme entete udp/tcp/icmp+donnees_udp/tcp/icmp)
 - Ajout du calcul automatique du checksumIP pour les fonctions
   rlc_initpaquet_ethip... car le noyau ne peut pas le faire.
   Le checksum n'est calcule que si il vaut zero.
 - Ajout de divers exemples.

---------------------------------------------------------------------
Version 1.1 - 06/02/2000
 - Ajout des messages d'erreur (errno et h_errno) dans la fonction
   rlc_ecriterr() afin d'indiquer la cause de l'erreur.
 - Ajout du commentaire suivant pour les fonctions rlc_sendraw_eth()
   et rlc_sendraw_ip() :
    Si le noyau est compile avec l'IP firewalling, la machine refuse
    d'emettre des paquets malformes (par exemple, tentative 
    d'ecrasement de l'entete tcp a l'aide de fragments). On obtient 
    alors une erreur lors de l'appel a la fonction sendto(). Il faut
    recompiler le noyau sans l'IP firewalling pour pouvoir emettre
    des paquets malformes.
 - Modification de la fonction d'affichage en dump afin de supprimer
   les '.' et '-' qui servaient de separateur. Ils ont ete remplaces 
   par deux espaces. Avant, on avait :
    72 6C 63 74.68 2C 20 32-2C 2C 30 78.00 2B 2B     rlcth, 2,,0x.++ 
   Maintenant, on a :
    72 6C 63 74  68 2C 20 32  2C 2C 30 78  00 2B 2B  rlcth, 2,,0x.++ 
   Cela va permettre de faciliter les copier-coller, car il n'y a 
   plus besoin de supprimer les '.' ou '-' pour passer les donnees
   a rlc_initpaquet_hexa() par exemple.
 - Ajout du module rlc_stdin. Ce module comporte des fonctions
   permettant de gerer les saisies clavier des utilisateurs :
   pression sur une touche, entier, caractere, chaine, chaine hexa,
   adresse ipt, adresse etht
 - Modification de rlc_sock_read() et rlc_sock_write() pour que les
   tailles soient du rlc_uint32 et non du rlc_uint16.
 - Creation des fonctions :
    rlc_verifbof_hs()
    rlc_verifbof_ips()
    rlc_verifbof_eths()
    rlc_verifbof_device()
    rlc_verifbof_paquet()
   Ces fonctions permettent de verifier les buffer overflow dans 
   les variables de type rlc_hs, rlc_ips, rlc_eths, rlc_device et
   rlc_paquet.
 - Utilisation des fonctions rlc_verifbof_xxx dans la librairie.
   Toutes les fonctions de la bibliotheque devraient etre protegees
   contre les buffer overflow. Les programmes corrects, crees avec
   la bibliotheque rlc, peuvent donc etre suid root.
   Note : ce n'est pas encore le cas pour les programmes rlcex
          et rlctest, car ceux-ci n'ont pas ete ecrits afin que tous
          leurs parametres soient verifies : ce ne sont que des 
          exemple d'utilisation de la bib. Il ne faut pas les 
          mettre suid root. 
 - Modification du programme de test et des exemples afin de
   prendre en compte les modifications ci-dessus.

---------------------------------------------------------------------
Version 1.0 - 30/01/2000
 Premiere version publique.
