C Утечка памяти с разъемом Packagesender

1

Привет, ребята, я пытаюсь написать IP Spoofing, использующую общую библиотеку пакетов для приложения SIP с использованием JNI. Когда я попытался запустить приложение и вызвал собственные методы, вначале не было никаких проблем, но через некоторое время я думаю, что утечка памяти произошла с нет следа и разбился JVM, мой код C (ниже) сильно зависит от этого, и вот мой метод, который я вызывал с JNI, может кто-нибудь помочь мне найти утечку?

int send_message(const char * sip_msg, const char * dest_ip, int dest_port, const char * spoofed_ip, unsigned int source_port){
unsigned int source_ip = 0;
srand(time(0));
if(source_port == 0){
    source_port = rand() % 65535;
}
//unsigned int source_port = 0;
struct ip *ip;
struct udphdr *udp;
unsigned char packet[65535];
int len;
unsigned int msg_len =strlen(sip_msg);

struct sockaddr_in serv_addr;

int sockfd;
if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
    printf("\n Error : Could not create socket \n");
    return 1;
}

const int on = 1;
if (setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) == -1) {
    perror("\n Error : Set Sock Opt \n");
    return 1;
}

serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(dest_port);
serv_addr.sin_addr.s_addr = inet_addr(dest_ip);

len = sizeof(struct ip) + sizeof(struct udphdr) + msg_len;

if (len > sizeof(packet)) {
    printf("Failed to send1!\n");
    return -2;
}

ip = (struct ip*) packet;
udp = (struct udphdr *) (packet + sizeof(struct ip));
memcpy(packet+sizeof(struct ip)+sizeof(struct udphdr),sip_msg,msg_len);


ip->ip_v = 4;
ip->ip_hl = sizeof(struct ip) / 4; // no options
ip->ip_tos = 0;
ip->ip_len = htons(len);
ip->ip_id = 23;
ip->ip_off = 0;
ip->ip_ttl = 69;
ip->ip_p = 17;
ip->ip_src.s_addr = inet_addr(spoofed_ip);
ip->ip_dst.s_addr = inet_addr(dest_ip);

ip->ip_sum = checksum((unsigned char *) ip, sizeof(struct ip));

/*if (source_port == 0) {
    source_port = 5060;
}*/

udp->source = htons(source_port);
udp->dest = serv_addr.sin_port;
udp->len = htons((unsigned short) sizeof(struct udphdr) + msg_len);
udp->check = 0;

if (sendto(sockfd, packet, len, 0, (struct sockaddr *) (&serv_addr),
        sizeof(struct sockaddr_in)) == -1) {
    return -2;
    printf("Failed to send!\n");
}

    close(sockfd);


return 0;}
  • 0
    Вы пробовали библиотеку оболочки libpcap, такую как jnetpcap.com ? Вы можете сделать это, используя библиотеку без написания кода низкого уровня. т.е. код C не требуется.
  • 0
    @PeterLawrey Я слышал это раньше, но никогда не использовал :) Можете ли вы выслать мне несколько примеров UDP с этой библиотекой?
Показать ещё 1 комментарий
Теги:
sockets
memory-leaks
jni

1 ответ

1

Да, я могу найти утечку, не обязательно утечку.

Подумайте, что произойдет, если, например, sendto не удается. Сокет был открыт с помощью socket(), но вы не закрываете его. Вам действительно нужно close сокет для всех путей кода, которые можно выполнить. Это, кстати, случай, когда использование goto может быть хорошей идеей.

  • 0
    Так что, я полагаю, вы говорите, что когда sendto терпит неудачу, сокет остается в открытом состоянии, когда сверхурочно, если происходит слишком много sendto сбоя, сокеты остаются открытыми, и это вызывает утечку памяти. Я прав?
  • 0
    Да, именно это я и говорю. Не то чтобы я был уверен, что это твоя утечка, но это все еще проблема, которую ты должен исправить. Исправьте также другие пути кода в дополнение к sendto .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню