Я большой поклонник сетевых протоколов и libnet, поэтому я пытался имитировать некоторые сетевые протоколы, которые не включены в libnet. Захват пакетов, имитация заголовков и т. Д. Пока работает. Теперь мне нужен способ записать эти точные пакеты на мою сетевую карту. Я пробовал libnet_adv_write_rawipv4 () и -link (), оба не будут работать. Я не могу отбросить заголовки с помощью libnet_adv_cull_header () из-за глупых ошибок и ошибок. Поэтому я решил, что проблему можно решить с помощью небольшой сборки: получить код сборки для фактического вызова libnet_build () и libnet_write (), изменить некоторые байты и вуаля: необработанные байты записываются на сетевую карту. Итак, я написал фиктивную программу:
#include <stdio.h>
#include <stdlib.h>
#include <libnet.h>
int main() {
libnet_t *l;
l = libnet_init(LIBNET_RAW4, 0, NULL);
libnet_build_tcp(2000, 450, 0, 1234, TH_SYN, 254, 0, NULL, LIBNET_TCP_H + 5,
"aaaaa", 5, l, 0);
libnet_build_ipv4(LIBNET_TCP_H + LIBNET_IPV4_H + 5, 0, 1, 0, 64, 6, 0,
2186848448, 22587584, NULL, 0, l, 0);
libnet_write(l);
return 0;
}
Пока работает. Теперь я получил сборочную версию программы, используя
gcc -o program program.c -S
И вот здесь начинается настоящая проблема:
.LC0:
.string "aaaaa"
.text
.globl main
.type main, @function
main:
.LFB2:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $0, %edx
movl $0, %esi
movl $1, %edi
call libnet_init
movq %rax, -8(%rbp)
subq $8, %rsp
pushq $0
pushq -8(%rbp)
pushq $5
pushq $.LC0
pushq $25
pushq $0
pushq $0
movl $254, %r9d
movl $2, %r8d
movl $1234, %ecx
movl $0, %edx
movl $450, %esi
movl $2000, %edi
call libnet_build_tcp
addq $64, %rsp
subq $8, %rsp
pushq $0
pushq -8(%rbp)
pushq $0
pushq $0
pushq $22587584
pushq $-2108118848
pushq $0
movl $6, %r9d
movl $64, %r8d
movl $0, %ecx
movl $1, %edx
movl $0, %esi
movl $45, %edi
call libnet_build_ipv4
addq $64, %rsp
movq -8(%rbp), %rax
movq %rax, %rdi
call libnet_write
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE2:
.size main, .-main
Видите это?
call libnet_build_ipv4
Я не могу скопировать ассемблерный код этих вызовов build () или write (), потому что там есть только ссылка на них. Теперь, где я могу найти ассемблерный код для этих предварительно написанных функций, включенный в libnet-functions.h (libnet_build_ipv4 (), libnet_build_tcp (), libnet_write ()) ?????