win32系统调用
win32 API只是Windows在ring3提供的编程接口,ring0的实现接口并未暴露给用户,3到0的调用过程也并未文档化,所以需要自己反汇编来学习如何实现。这里以CreateFile为例,学习win32的系统调用。
写一个简单的win32程序,创建/打开一个文件:
Ma' in wojel ba'ax ka lelo' u k'áat u ya'al
win32 API只是Windows在ring3提供的编程接口,ring0的实现接口并未暴露给用户,3到0的调用过程也并未文档化,所以需要自己反汇编来学习如何实现。这里以CreateFile为例,学习win32的系统调用。
写一个简单的win32程序,创建/打开一个文件:
周五没事可做,搞了个脚本跑一下百度可免费下载的歌曲,然后看看WRK。今天看了一下KeAttachProcess。
KeAttachProcess将当前线程加载到特定进程空间。如果进程已经在内存中,那就直接进入进程空间执行代码;否则需要把当前执行线程插入进程的ReadList链表,并进行线程切换。其中涉及到不少中断级的限制和同步操作资源获取,与线程相关的操作则大部分与APC有关。
MmGetSystemRoutineAddress 只能查找HAL.dll 和 ntoskrnl.exe导出的函数。查找过程很简单,遍历PsLoadedModuleList链表,找到每一个节点对应的KLDR_DATA_TABLE_ENTRY结构,找到BaseDllName = hal.dll 和 ntoskrnl.exe 的基址,最后查找导出表。
WRK中这两个函数的实现:
Rootkit的最大用处之一就是用来隐藏自己的某些东西,比如文件、进程、dll等。功能模块往往写Ring3的应用程序,Ring0用来实现隐藏,防止被查出来。这才是合理的搭配。常见的有文件隐藏、进程隐藏、Dll隐藏、注册表隐藏、端口隐藏等。
文件隐藏是最基本的隐藏技术,因为后门等往往是以文件形式存放在目标机。方法也有很多。
将进程的页目录写入CR3,变相的进行了进程切换,所以就可以直接读取其他进程的地址空间了。
两年前的昨天,八点半下课(一般人不明白这个点下课对我们意味着什么),我穿着拖鞋和强子在小操场散步,扯了扯人生和未来,虽然我们以前扯过很多次,但那一次心情是不一样的。过了一会儿我们回寝室睡觉,我睡着了,强子一晚上没睡。
第二天早上我跟王迪还有老白等人安慰强子,说没事,不困就好,然后领了早餐来吃,没怎么吃饱。我一点都不紧张,也一点都不兴奋,出我意料的平静,不带着一点期待,也不带着一丝逃离的幸福。那两天几乎是我那三年里最平静的两天,躺在床上一闭上眼睛就可以睡着,准时醒过来一点儿都不困。英语考试收卷后,我旁边的同学满脸解脱的冲我笑了笑,我也报以同样状态的笑。
看雪上看到一篇老文章,六年半前的。关于动态修改可执行文件路径和参数。
PspCidTable是一个全局句柄表,关于句柄表的信息可以参考我前面一篇文章。它基本符合进程句柄表的所有特质,除了它的成员是对象,而不是对象头。PspCidTable存放的是系统线程和进程对象,包括已经退出的,它的索引就是PID或TID,所以存活的进程和线程的PID和TID是不会重合的。
写shadow ssdt hook的时候出现一个比较奇怪的错误,看下面的代码: