2014-05-22 5 views
1

현재 장치의 데이터를 arp 개 얻으려고합니다. 나는이 예제를 수행하기 위해 온라인 예제 - http://rikiji.it/2011/04/17/Linux-kernel-programming-exercises-1.html을 따랐다. 이 예제는 arp 스푸핑을 식별하는 솔루션을 다룹니다.연결된 목록 데이터 검색/표시 문제

그러나 나는 ipmac과 같은 주소를 저장하는 데 필요한 함수를 사용했다. 내 문제는, 함수는 데이터를 얻지 만,이 정보를 list에 추가하고 트래버스하는 동안 데이터를 인쇄하면 위조 데이터가 표시됩니다. 내가 보관 한 것이 아닙니다.

나는 무슨 일이 일어나고 있는지 모르겠지만 해결할 수있는 모든 노력을했지만 운이 없었습니다.

다음

struct neigh_list_t { 
    unsigned char ha[ALIGN(MAX_ADDR_LEN, sizeof(unsigned long))]; 
    u8 primary_key[0]; 
    struct list_head list; 
} neigh_list; 

다음

initialization, storingdisplaying 데이터를 구현하는 방법이 있으며, 사용되는 struct이다. 는 IP 용

static struct workqueue_struct * workq; 
static DECLARE_DELAYED_WORK(work, arp_tbl_check); 

void neigh_print(struct neigh_list_t * n, void * null) 
{ 
    char tbuf[16], hbuffer[HBUFFERLEN]; 

    sprintf(tbuf, "%pI4", n->primary_key); 
    printk(KERN_ALERT "%-16s\n",tbuf); 
} 

void neigh_handler(struct neighbour * n, void * null) 
{ 
    struct neigh_list_t *tmp; 

    int found = 0; 
    char hbuffer[HBUFFERLEN]; 


    /* search */ 
    list_for_each_entry(tmp, &neigh_list.list, list) {  
     neigh_print(tmp, NULL); 
     if(memcmp(n->ha,tmp->ha,n->dev->addr_len)==0) { 
       format_hwaddr(n->ha, n->dev->addr_len, hbuffer); 
       printk(KERN_ALERT "duplicated entry: %s\n", hbuffer); 
       found = 1; 
      } 

    } 


    /* add an entry */ 
    if(!found) { 
     struct neigh_list_t * new_entry = (struct neigh_list_t *) kmalloc(sizeof(struct neigh_list_t), GFP_KERNEL); 
     memcpy(new_entry->ha,n->ha,n->dev->addr_len); 
     memcpy(new_entry->primary_key,n->primary_key,sizeof(u8 *)); 
     list_add(&(new_entry->list), &(neigh_list.list)); 
    } 
} 

void arp_tbl_check(struct work_struct * w) 
{ 


    struct list_head *pos, *q; 
    struct neigh_list_t * tmp; 

    neigh_for_each(&arp_tbl, neigh_handler, NULL); 

    /* empty list */ 
    list_for_each_safe(pos, q, &neigh_list.list){ 
      tmp= list_entry(pos, struct neigh_list_t, list); 
      list_del(pos); 
      kfree(tmp); 
    } 
    queue_delayed_work(workq, &work, HZ * 5); 

} 

static int arp_init(void) 
{ 

    INIT_LIST_HEAD(&neigh_list.list); 
    printk(KERN_ALERT "arpcheck init\n"); 

    workq = create_singlethread_workqueue("arp_tbl_check_wq"); 
    queue_delayed_work(workq, &work, HZ * 5); 
    return 0; 
} 

P.S

192.168.1.1127.0.0.1 기능 및 인쇄 0.195.27.160224.39.125.54 다룬다.

(memcpy)을 저장할 때 또는 데이터를 표시 할 때 문제가있는 것 같습니다. 이 문제를 어떻게 해결해야할지 모르겠습니다. 링크 된 목록의 내용을 -test-인쇄

편집, 당신의 printk 으로

struct neigh_list_t { 
    struct list_head list; 
    unsigned char ha[ALIGN(MAX_ADDR_LEN, sizeof(unsigned long))]; 
    u8 primary_key[0]; 
} neigh_list; 

O/P 아래에 언급 한 바와 같이

char tbuf[16];//newly added to print IP 

    /* search */ 
    list_for_each_entry(tmp, &neigh_list.list, list) { 

     sprintf(tbuf, "%pI4", tmp->primary_key);//newly added to print IP 
     printk(KERN_ALERT "-----IP - %-16s\n",tbuf);//newly added to print IP 

     if(memcmp(n->ha,tmp->ha,n->dev->addr_len)==0) { 
      format_hwaddr(n->ha, n->dev->addr_len, hbuffer); 
      printk(KERN_ALERT "duplicated entry: %s\n", hbuffer); 
      found = 1; 
     } 
    } 
+1

구조의 primary_key [0]. 맞아?. 구조의 목록에있는 내용을 인쇄하려고합니다. 즉, 메모리 주소를 IP 주소 – Sasi

+0

으로 인쇄하십시오. 전체 코드는 다음과 같습니다. https://github.com/rikiji/arpcheck/blob/master/arpcheck.c – Sasi

+0

@Sasi는 답장을 보내 주셔서 감사합니다. 'primary_key [0]'은 IP 주소를 저장하는 곳입니다. 어떻게 해결할 수 있는지 알고 있습니까? 'neighbour.h' 헤더는 IP에'u8 primary_key [0]'을 사용하도록 제안합니다. 그렇습니다. 그리고 나는 전체 코드를 알고 있습니다. 이것은 다른 출력을 제공하는 코드입니다. :) –

답변

1

구조 필드를 neigh_list_t 수정 ==== ============

[ 1456.124639] 192.168.1.1  4c:60:de:42:81:55 wlo1 
[ 1456.124652] -----IP - 192.168.1.1  
[ 1456.124658] 127.0.0.1  00:00:00:00:00:00 lo 
[ 1456.124661] -----IP - 127.0.0.1  
[ 1456.124665] -----IP - 192.168.1.1  
[ 1456.124669] 224.0.0.251  01:00:5e:00:00:fb wlo1 
[ 1456.124673] -----IP - 224.0.0.251  
[ 1456.124677] -----IP - 127.0.0.1  
[ 1456.124680] -----IP - 192.168.1.1  
[ 1456.124684] 224.0.0.22  01:00:5e:00:00:16 wlo1 
+0

화제 떨어져 다만 작은 질문. 'unsigned int' 변수와이'u8' 변수에 저장된 IP를 umpare하려고하면'memcmp'가 작동합니까? like -'unsigned int src_ip; memcpy (tmp-> primary_key, src_ip); ' –

+0

당신은 그렇게 할 수 없습니다. – Sasi

+0

ohhh i hv a 실수했다. unsigned int src_ip; memcmp (tmp-> primary_key, src_ip); ' –