리눅스 커널에서 숨겨진 모듈 숨기기 해제

리눅스 커널에서 숨겨진 모듈 숨기기 해제

나는 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를 참조하여 복원해야 할 항목에 대한 자세한 내용을 알아보세요.

관련 정보