文章分类 - kenerl
摘要:当设备驱动需要同时支持不同版本内核时,在编译阶段,内核模块需要知道当前使用的内核源码的版本,从而使用相应的内核 API。2.4 与 2.6 内核下,源码头文件 linux/version.h 定义有:LINUX_VERSION_CODE ― 内核版本的二进制表示,主、从、修订版本号各对应一个字节;KERNEL_VERSION(major, minor, release) - 由主、从、修订版本号构造二进制版本号。在同时支持2.4与2.6 内核的设备驱动程序中,经常可以看到以下代码段:#define LINUX_VERSION_CODE 132639#define KERNEL_VERSION(
阅读全文
摘要:主机:Windows7旗舰版,VMware7.1.2,Fedora9编译环境:arm-linux-gcc4.4.3Linux版本:linux-2.6.32.2busybox版本:busybox-1.19.4目标板:友善之臂micro2440编译使用内核模块的方法:编写一个简单的Linux内核模块HelloWorld,hello.c内容如下:点击(此处)折叠或打开#include<linux/init.h>#include<linux/module.h>MODULE_LICENSE("Dual BSD/GPL");staticinthello_init
阅读全文
摘要:1)ASCII字符串和宽字符串在应用程序中使用两种字符:a) char型字符串,负责记录ANSI字符集,它是指向一个char数组的指针,每个char型变量大小是一个字节,字符串是以0标志字符串结束的;b) wchar_t型的宽字符串,负责描述unicode字符集,它是指向一个wchar_t数组的指针,wchar_t字符大小为两个字节,字符串以0标志字符串结束。例:ANSI字符构造如下:char *str1= "ASCE";UNICODE字符构造如下:wchar_t *str2 = L"ASCE";注:在构造字符串时使用关键字“L”,编译器会自动生成所需要
阅读全文
摘要:操作系统和驱动程序将关于驱动程序和设备的信息存储在注册表中。总的来说,驱动程序应使用注册表存储机器重启动后仍必须维护的数据。此外,驱动程序可以访问注册表以获得系统或者其他程序或者驱动程序存储在其中的信息。更多的关于注册表的信息,参见平台 SDK 文档。以下的注册表中的树是驱动程序开发者特别感兴趣的(这里 HKLM 代表 HKEY_LOCAL_MACHINE):·HKLM\SYSTEM\CurrentControlSet\Services·HKLM\SYSTEM\CurrentControlSet\Control·HKLM\SYSTEM\CurrentControl
阅读全文
摘要:21.1.6 Ring3/Ring0的四种通信方式21.1.5节中提到了Ring3/Ring0通信的四种内存访问方式分别为:METHOD_BUFFERED、METHOD_IN_DIRECT、METHOD_OUT_DIRECT和METHOD_NEITHER。METHOD_BUFFERED可称为"缓冲方式",是指Ring3指定的输入、输出缓冲区的内存读和写都是经过系统的"缓冲",具体过程如图21.1.12所示。这种方式下,首先系统会将Ring3下指定的输入缓冲区(UserInputBuffer)数据,按指定的输入长度(InputBufferLen)复制到Ri
阅读全文
摘要:在写驱动程序时,我们发现对于Windows的不同版本,其对应的内核数据结构是不同的,所以在具体操作时同样要根据Windows的不同版本进行不同的操作,那么怎样获取Windows的版本,并且Windows的不同版本的结构模式应如何区别,这是下面要解决的问题。MSDN上提到PsGetVersion是已经过时的函数版本,如果要在XP或以后的版本上获取Windows的版本号,就用RtlGetVersion。所以这两个函数对应的版本还是有所不同的,那么怎样区别性的对待这两种不同的函数呢?下面是一个博客上提供的一种方法,就是用试探式区分:用RtlGetVersion获取版本号,如果成功,则认为当前版本是X
阅读全文
摘要:1. 命令行前数字的含义用户调试模式下,如2:005, 2表示进程ID,005表示线程ID内核调试模式下,将显示kd>, 如果是多核处理器将显示0: kd> 0:表示当前运行在哪核处理器上。2. 命令输入时,支持UP,DOWN,TAB键联想,可以使用TAB键进行通配符的联想。3. Enter键,在命令行没有命令输入时,执行上一条命令。4. Ctrl+C 终止一段长时间执行的命令5. .cls 清除命令行的显示结果。6. WinDbg启动时增加-Q参数,在WinDbg退出后将不提示保存当前的工作环境的对话框。如果使用-QY将在退出WinDbg后,自动保存当前的配置环境。7. 调试命令
阅读全文
摘要:1. 通过 pid 获取目标进程的 EPROCESS (PsLookupProcessByProcessId)。如果当前进程不是目标进程,那么我们切换当前进程,方法当然是通过 KeAttachProcess 或者 KeStackAttachProcess 啦。接下来我们就可以从 _PEB结构中随心所欲的获取目标路径,命令行,啥滴东西了。最后别忘了 Detach(如果你没有 Attach 那么这一步不需要)。2. 通过 pid 获取目标 EPROCESS。然后那,我们用 ObOpenObjectByPointer 函数,记得把 ObjectType置为 *PsProcessType (置空也行啦
阅读全文
摘要:最近要做一个进程监控的程序,功能很简单,就是创建和退出进程的时候,能触发我们的事件。首先的第一想法,是Hook ZwCreateProcess,结果调试的时候发现,很多创建进程的动作,并没有通过这个API执行,所以自然就是没办法监控进程的创建,于是回到本质,从创建进程的动作过程来分析,创建新的进程,其大致要经历以下步骤:(1)打开可执行文件,以FILE_EXECUTE权限打开;(2)将可执行文件加载到内存空间;(3)进程的活动结构将被创建,如(EPROCESS,KPROCESS和PEB结构);(4)为新创建的进程分配地址空间;(5)为进程的主线程创建线程活动结构,如(ETHREAD,KTHRE
阅读全文
摘要:潘爱民,2010.9.24在《Windows内核原理与实现》一书,我曾经详细地解析了Windows应用程序发出的系统调用,经过ntdll.dll中的stub函数,再通过sysenter/syscall或int 2eh指令,调用到内核的完整过程。图8.5中有一个错误(感谢读者liucy指出这一错误),正确的图应该如下所示。图中红色文字是改正之后的函数名称。这里实际上把通过sysenter或int 2eh两种情形的系统调用流程画在一起,所以显得较为复杂。如果拆开来,画成两个图,可能会更加容易理解。下面是按照sysenter/sysexit指令的系统调用流程:而按照int 2eh来进入内核的流程更加
阅读全文
摘要:Posted by李马on 2007 年 07 月 05 日 From:http://blog.titilima.com/ssdt.html引子2006年,中国互联网上的斗争硝烟弥漫。这时的战场上,先前颇为流行的窗口挂钩、API挂钩、进程注入等技术已然成为昨日黄花,大有逐渐淡出之势;取而代之的,则是更狠毒、更为赤裸裸的词汇:驱动、隐藏进程、Rootkit……前不久,我不经意翻出自己2005年9月写下的一篇文章《DLL的远程注入技术》,在下面看到了一位名叫L4bm0s的网友说这种技术已经过时了。虽然我也曾想过拟出若干辩解之词聊作应对,不过最终还是作罢了——毕竟,拿出些新的、有技术含量的东西才是王
阅读全文

浙公网安备 33010602011771号