在内核中hook注册表必须要使用转换后的路径,例如HKEY_LOCAL_MACHINE的路径对应的是“\Registry\Machine”,但是HKEY_CURRENT_USER相对比较特殊,因为它不是一个固定的值,需要你根据其他东西判断。因此本文给出几种获取HKEY_CURRENT_USER对应路径的方法。
方法一 根据注册表项获取
我最开始使用的获取HKEY_CURRENT_USER对应路径的方法就是这个。
具体大家可以参考这位博主:获取HKEY_CURRENT_USER方法一.
上面这篇博文讲得非常详细,我也实地使用过,确实能获取到相对应的路径。
但是存在几个比较大的问题:
1.主要判断依据就是注册表项中大于20个字节的项,但是太表面
2.无法应对存在多个用户的情况,结果不准确
3.该方法依赖的注册表项在win10中不存在
方法二 利用token获取sid
相较于方法一,通过token获取sid再拼接得到对应路径的方法更加稳定,并且不受用户多少的限制。
HKEY_CURRENT_USER对应路径本质上是\REGISTRY\USER+SID,因此获取对应路径可以等价于获取SID。
具体的方法思路可参照该博客:
获取HKEY_CURRENT_USER方法二.
获取SID总体来说在ring3比较容易,在ring0我目前还没有找到比较简便的途径,该博文有具体介绍:获取用户SID.
但目前我还停留在挂载当前进程上,而不能到指定进程如“explorer.exe”上,因此如果用当前进程用管理员权限打开,则获取的SID还是管理员的SID。
方法三 借助应用层
因为在ring3获取sid相对简单,大家可以通过内核和应用层的通信机制,从应用层获取了正确的SID后,传送到内核,再拼接得到对应的HKEY_CURRENT_USER路径。
如在cmd中输入 whoami /user就可以得到当前用户SID