나는 procfs와 sysfs로부터 자신을 숨길 수 있는 LKM을 작성했습니다. 문제는 숨기기를 해제하려고 할 때 다음 오류가 발생한다는 것입니다 libkmod: ERROR ../libkmod/libkmod-module.c:1882 kmod_module_get_holders: could not open '/sys/module/my_module/holders': No such file or directory
. 나중에 모듈이 표시되지만 lsmod
상위 PID가 -2인 것을 볼 수 있습니다 . 모듈을 삭제하려고 하면 오류 메시지가 나타납니다 ERROR: Module my_module is builtin.
. 코드는 다음과 같습니다.
//HIDE
void hide(void) {
if(module_hidden) //is hidden
return;
module_prev = THIS_MODULE->list.prev;
list_del_init(&THIS_MODULE->list); //procfs view
kobject_prev = &THIS_MODULE->mkobj.kobj;
kobject_parent_prev = THIS_MODULE->mkobj.kobj.parent;
kobject_list_prev = THIS_MODULE->mkobj.kobj.entry.prev;
kobject_del(&THIS_MODULE->mkobj.kobj); //sysfs view
//list_del(&THIS_MODULE->mkobj.kobj.entry);
module_hidden = (unsigned int)0x1;
}
//SHOW
void unhide(void) {
if(!module_hidden) //is not hidden
return;
list_add(&THIS_MODULE->list, module_prev); //procfs view
//list_add(&THIS_MODULE->mkobj.kobj.entry, kobject_list_prev);
kobject_add(kobject_prev, kobject_parent_prev, "my_module");//sysfs view
module_hidden = (unsigned int)0x0;
}
무엇이 문제일까요?
감사해요.
답변1
당신의숨기기 해제모듈을 볼 때 기능이 완전히 복원되지 않습니다.kobject_del코드에서 우리는 그것이 호출되는 것을 볼 수 있습니다sysfs_remove_dir그러면 모든 하위 디렉터리와 파일이 삭제됩니다.
볼 때kobject_add우리 드디어 전화했어kobject_add_internal->디렉터리 생성->디렉토리 채우기, ktype 기본 속성에 대한 파일만 생성하지만 다음에서 사용할 수 있습니다.module_ktypeNULL이며, 호출 시 파일이 복원되지 않음을 나타냅니다.
따라서 refcnt,holdersdir,notesdir,sectdir 및 기타 모든 속성과 같은 그의 모든 하위 디렉터리와 파일을 수동으로 복원해야 합니다.&THIS_MODULE->modinfo_attrs(주석, 홀더 및 드라이버 모듈 kobject를 복원할 때 참조 횟수를 줄이는 것을 잊지 마십시오).
가장 좋은 방법은 작업 흐름을 이해하는 것입니다.mod_sysfs_settings를 참조하여 복원해야 할 항목에 대한 자세한 내용을 알아보세요.