In the Linux kernel, there are a several ways to modify the kernel so that process hiding can work. Since this chapter is not meant to be an exegesis on all kernel rootkits, I will cover only the most commonly used method and then propose a way of detecting it, which is implemented in the taskverse program I made available in 2014.
In Linux, the process IDs are stored as directories within the /proc filesystem; each directory contains a plethora of information about the process. The /bin/ps program does a directory listing in /proc to see which pids are currently running on the system. A directory listing in Linux (such as with ps or ls) uses the sys_getdents64 system call and the filldir64 kernel function. Many kernel rootkits hijack one of these functions (depending on the kernel version) and then insert some code that skips over the directory entry containing the d_name of the hidden process. As a result, the /bin/ps program is unable to find the processes that the kernel rootkit deems hidden by skipping over them in the directory listing.
The taskverse program is a part of the kernel Voodoo package, but I released a more elementary version for free that uses only one technique to detect hidden processes; however, this technique is still very useful. As we were just discussing, rootkits commonly hide the pid-directories in /proc so that sys_getdents64 and filldir64 cannot see them. The most straightforward and obvious approach used to see these processes would be to bypass the /proc directory completely and follow the task list in the kernel memory to look at each process descriptor that is represented by a linked list of struct task_struct entries. The head of the list pointer can be found by looking up the init_task symbol. With this knowledge, a programmer with some skill can open up /proc/kcore and traverse the task list. The details of this code can be viewed in the project itself, which is available on my GitHub profile at https://github.com/elfmaster/taskverse.