현재 장치의 데이터를 arp
개 얻으려고합니다. 나는이 예제를 수행하기 위해 온라인 예제 - http://rikiji.it/2011/04/17/Linux-kernel-programming-exercises-1.html을 따랐다. 이 예제는 arp 스푸핑을 식별하는 솔루션을 다룹니다.연결된 목록 데이터 검색/표시 문제
그러나 나는 ip
과 mac
과 같은 주소를 저장하는 데 필요한 함수를 사용했다. 내 문제는, 함수는 데이터를 얻지 만,이 정보를 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
,
storing
및
displaying
데이터를 구현하는 방법이 있으며, 사용되는
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.1
및 127.0.0.1
기능 및 인쇄 0.195.27.160
224.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;
}
}
구조의 primary_key [0]. 맞아?. 구조의 목록에있는 내용을 인쇄하려고합니다. 즉, 메모리 주소를 IP 주소 – Sasi
으로 인쇄하십시오. 전체 코드는 다음과 같습니다. https://github.com/rikiji/arpcheck/blob/master/arpcheck.c – Sasi
@Sasi는 답장을 보내 주셔서 감사합니다. 'primary_key [0]'은 IP 주소를 저장하는 곳입니다. 어떻게 해결할 수 있는지 알고 있습니까? 'neighbour.h' 헤더는 IP에'u8 primary_key [0]'을 사용하도록 제안합니다. 그렇습니다. 그리고 나는 전체 코드를 알고 있습니다. 이것은 다른 출력을 제공하는 코드입니다. :) –