03
31

kernel module memory detector-抓出有害的kernel module

之前的文章有提到想用kallsyms_lookup做出kernel module memory detector,剛好今天有空抽點時間做出來,不過在實做的過程中發現,要改動的地方還真多阿,在hack的過程中,絕大部份都是苦工,剪剪貼貼一大堆,不過講到這邊,我突然想到我去年有一次寫程式寫到睡著,因為從頭到尾都剪貼,又一堆fopen, fread,fclose,說老實話,這種程式寫久了會頭暈想吐…

搭配kallsyms_lookup,我們除了可以抓出function name之外,還可以抓出module name,所以我把kallsyms_lookup埋在kmalloc呼叫中,但是,kmalloc被定義為inline function,所以不可能從__builtin_return_address拉出caller address,必需把kmalloc改為非inline function,所以我把kmalloc拉到slab.c,並加入以下幾行

  1. /*inline*/ void *kmalloc(size_t size, gfp_t flags) 
  2. { 
  3. char *modname=NULL;
  4. const char *name=NULL;
  5. unsigned long kaoffset, kasize;
  6. char namebuf[KSYM_NAME_LEN];
  7.  
  8. unsigned long caller = (unsigned long) __builtin_return_address(0);
  9. name = kallsyms_lookup(caller, &kasize, &kaoffset, &modname, namebuf);
  10. if (modname) 
  11. { 
  12. printk("modname %s\n",modname);
  13. addElement(modname,size,0);
  14. }

addElement是我們自己寫的函式,主要是在收集由kmalloc攔截到的資訊,有興趣的朋友可以自己寫自己的hook function

在kfree function內也擺上hook function,大概如下,記得要把obj_size-20,因為kmalloc會多佔20bytes空間於memory heap

  1. void kfree(const void *objp) 
  2. { 
  3. struct kmem_cache *c;
  4. unsigned long flags;
  5. //hack
  6. char *modname=NULL;
  7. const char *name=NULL;
  8. unsigned long kaoffset, kasize;
  9. char namebuf[KSYM_NAME_LEN];
  10.  
  11.  
  12. if (unlikely(ZERO_OR_NULL_PTR(objp))) 
  13. return;
  14. local_irq_save(flags);
  15. kfree_debugcheck(objp);
  16. c = virt_to_cache(objp);
  17. //hack
  18. unsigned long caller = (unsigned long) __builtin_return_address(0);
  19. name = kallsyms_lookup(caller, &kasize, &kaoffset, &modname, namebuf);
  20. if (modname) 
  21. { 
  22. printk("modname %s\n",modname);
  23. addElement(modname,0,obj_size(c)-20);
  24. } 
  25. //hack end
  26. debug_check_no_locks_freed(objp, obj_size(c));
  27. debug_check_no_obj_freed(objp, obj_size(c));
  28. __cache_free(c, (void *)objp);
  29. local_irq_restore(flags);
  30. }

試著去跑某隻會kmalloc的kernel module,會得到如下圖的資訊

標籤: linux
評論: 0 | 引用: 0 | 閱讀: 7845
發表評論
暱 稱: 密 碼:
網 址: E - mail:
驗證碼: 驗證碼圖片 選 項:
頭 像:
內 容: