- 博客(45)
- 收藏
- 关注
转载 浅谈一下FS段寄存器在用户层和内核层的使用
菜鸟一枚,有一段时间不搞内核了,分享一下以前学习的结果,有不对的地方请各位指点,大牛飘过~~在R0和R3时,FS段寄存器分别指向GDT中的不同段:在R3下,FS段寄存器的值是0x3B,在R0下,FS段寄存器的值是0x30。分别用OD和Windbg在R3和R0下查看寄存器(XP3),下图:FS寄存器的改变是从R3进入R0后和从R0退回到R3前完成的,也就是说:都是在R0...
2015-05-10 12:04:00
324
转载 注入版R3调试器的实现
注入版R3调试器实现科锐三阶段项目之一项目名称:R3Dbg.dll(调试器内核),Gravedigger.exe(调用示例)功能:实现硬件断点(访问,写入,执行),内存断点(读,写),软断点,单步步过,单步步入,寄存器,反汇编,内存,桟信息的显示。PE分析,CALL函数名提示等3环调试器的功能。特点:1。逻辑与界面完全分离2。可将调试器内核注入到宿主进...
2015-05-10 11:58:00
260
转载 [调试器的实现<控制台版>]第五章 函数名称解析
1.相关函数相关结构,与主要成员//导出表结构struct ExportFunInfor { char szFunName[64]; //函数名称 int nExportNumber; //导出编号 DWORD ...
2015-05-10 11:51:00
148
转载 [调试器的实现<控制台版>]第四章 内存断点
1.函数和结构//内存断点处理部分 public: //设置内存读写断点 void SetMemReadWriteBPoint(DWORD StartAddress,DWORD EndAddress); //查找指定的当前内存页 BOOL FindMemPage(DWORD PageAddress, DWORD EndAddres...
2015-05-10 11:50:00
351
转载 [调试器的实现<控制台版>]第三章 硬件断点实现
1.相关函数,相关结构,与主要成员//硬件断点处理部分public: //硬件断点设置 void SetHardWarePoint(DWORD SetAddress, int DR, int PointType, int nLen = 1); //硬件DR0 void SetDR0HardWarePoint(int PointType, ...
2015-05-10 11:48:00
315
转载 [调试器的实现<控制台版>]第二章 软中断(CC)的实现
1.相关函数与结构 //软中断处理部分public: //设置INT3断点 void Int3BreakPoint(DWORD BreakAddress); //设置INT3断点并保存首字节 BYTE SetBreakPoint(HANDLE hProcess,LPVOID pAdd, BYTE code, BOOL bFlag = TRUE);...
2015-05-10 11:46:00
197
转载 [调试器的实现<控制台版>] 第一章 程序处理框架
一.CREATE_PROCESS_DEBUG_EVENT处理流程当创建调试进程时,进入此流程。在程序的入口点下一个INT3断点,作为单独的软中断处理,即这个断点不加入INT3断点列表。作用是调试程序时,使程序暂停执行于程序入口点。其断点原理参照软中断详细设计。二.LOAD_DLL_DEBUG_EVENT处理流程当CREATE_PROCESS_DEB...
2015-05-10 11:44:00
123
转载 [异常分发]三:R0下EventList又是什么时候添加的?
1)在创建调试线程中添加异常事件信息调用过程PspCreateThread-->PspUserThreadStartup(初始化线程的参数)-->DbgkCreateThread(这里格式化ApiMsg作派发消息的参数)-->DbgkpSendApiMessage备注这里只关心的DbgkpSendApiMeassage函数...
2015-05-10 11:39:00
121
转载 [异常分发]二:WaitForDebugEvnet哪里获取Debug_Evnet信息
调试异常事件结构体:typedef struct _DEBUG_EVENT { //出自MSDN DWORD dwDebugEventCode; //异常代码 DWORD dwProcessId; //PID DWORD dwThreadId; union { EXCEPTION_DEBUG_INF...
2015-05-10 11:33:00
189
转载 [异常分发]一:R3调试器流程
一:R3调试器流程基础知识:异常处理发生的处理大概过程如下:1)系统查看产生异常的进程是否正在被调试,是则向调试器发送Exception_Debug_Event事件;2)如果进程没有被调试或调试不处理此异常,那么系统检查异常所处的线程,并在这个线程的环境中查看FS:[0]来确定是否安装了SEH异常处理回调函数,有则调用;...
2015-05-10 11:28:00
240
转载 也来构建自己的调试器
标 题: 【原创】也来构建自己的调试器 作 者: wenboxu 时 间: 2015-01-09,22:46:11 链 接: http://bbs.pediy.com/showthread.php?t=196455 科锐两周的项目结束了,实现了一个简易的调试器原型,在这里与大伙分享...
2015-05-10 11:19:00
102
转载 [调试器的设计]第五章 指令记录
5.1问题的提出与分析5.1.1问题的分析当初听到这个的时候,觉得无从下手,而且也想到了很多极端的问题,比如运行的时候不停的修改原来的指令来达到往下运行的效果。然后进到API里面去了,那个记录量是非常之大的,而且当时A1Pass的测试结果是每秒只能跑7条指令.于是花了很多时间在想着效率提升这块.后来和岳磊讨论一下,他叫我学习一下OD的这个功能.5.2问题的解...
2015-05-10 11:11:00
98
转载 [调试器的设计]第四章 函数名的解析
4.1问题的提出与分析4.1.1问题的分析最初对于这个问题处理的想法就是分析被调试程序的导入表,后来和苏玉海讨论,发现这样不能解决问题,因为API里可能还调用了别的API,再跟进API的话,程序就不能正确解析函数名了!据说Windows有上万个API,如何组织这些数据,如果提高查询的效率、以及最大化的合理使用空间。4.2问题的解决4.2.1函数名与函数地址的组...
2015-05-10 11:09:00
105
转载 [调试器的设计]第三章 int3断点与硬件断点
PDF加了目录,可以快速的定位.附件pdf文档,以及用到的部分功能函数第三章int3断点与硬件断点3.1问题的提出与解决3.1.1问题提出如何实现软硬件断点?如何判断用户断点的正确性?如何提高效率?3.2问题的解决3.2.1Int3断点的实现8086/8088提供断点指令Int3和单步标志TF,调试工具利用它们可以设置断点和实现单步。从8...
2015-05-10 11:07:00
469
转载 [调试器的设计]第二章 内存断点
关于内存断点的设计与实现第二章内存断点92.1问题的提出与分析92.1.1问题提出92.2问题的解决92.2.1内断断点与内存分页的关系9同时附件为调试器的可执行程序(修复了一些小bug)第一章节与第二章节的内容以及pe解析部分的动态邻接表的源代码(我的代码写得很恶心,看的话做好心理准备,哈哈)多谢张文君(金山毒霸)...
2015-05-10 11:04:00
205
转载 [调试器的设计]第一章 调试器框架
调试器设计第一章节的内容。因为这部分是刚刚新加的,比较急,文中必然有错漏之处,恳请读者不吝赐教。修改:EXCEPTION_SINGLE_STEP单步(硬件断点或单步)附件附第一章节的内容,以及当时项目答辩时用的一份PPT!同时发份帮助文档,昨天发的有错误,不记得修改了!不好意思!...
2015-05-10 11:00:00
156
转载 [调试器的设计]前言
标 题: 【原创】科锐第三阶段项目之一,调试器的设计(1、15、31、38、40、47、50楼更新)(源码.文档.使用说明,全都在一楼更新了) 作 者: EvilKnight 时 间: 2010-04-27,23:58:37 链 接: http://bbs.pediy.com/showthread.php?t=111875注,附件已经更新,调试器修复了一些小bug!第一章节至...
2015-05-10 10:55:00
191
转载 [调试器实现]调试器实现(第六章) 功能扩展
前面几章基本上已经将调试器的基本功能及其实现过程讲述的差不多了。本章作为一个结束,将补充一些前面没有提到的细节性问题,并就调试器的功能扩展做一些探讨。单步步过的实现:单步步过对于非CALL的指令,其实和单步步入一样,遇到CALL指令的时候我的处理方式是在CALL之后的指令首地址设置一个一次性的INT3断点,这一点和OllyDbg略有差异。OllyDbg的...
2015-05-10 10:43:00
198
转载 [调试器实现]第五章 单步异常的处理
因为在调试器的设计与实现中,很多关键性的操作都是在单步异常处理中完成的,故本章重点论述在单步异常中的处理。首先我们来看看会有哪些情况导致调试器进入单步异常。进入单步异常的原因: 1.用户输入了单步进入的命令,调试器需要设置单步,让被调试程序单步执行。2.用户所下的INT3断点被断下后,调试器会暂时恢复INT3断点处的字节为原有的字节,并让被调试线程的EIP减...
2015-05-10 10:41:00
665
转载 [调试器实现]第四章 多内存断点
内存断点通过修改内存分页的属性,使被调试程序触发内存访问、写入异常而断下。多内存断点的数据关系:因为我设计的是多内存断点,即在同一个内存分页上可以下多个内存断点,同一个断点也可以跨分页下在几个内存分页上。所以从数据关系上来说断点和内存分页是多对多的关系。因此需要设计三个表:“内存断点信息表”,“内存分页属性表”,以及中间表“内存断点-分页对照表”。在用户下内存...
2015-05-10 10:39:00
329
转载 [调试器实现]第三章 硬件断点
一硬件断点介绍硬件断点,顾名思义是由硬件提供给我们的调试寄存器组,我们可以对这些硬件寄存器设置相应的值,然后让硬件帮我们断在需要下断点的地址。硬件断点是CPU提供的功能,所以要怎么做就得听CPU的硬件寄存器的了。先来看看关于硬件寄存器的说明。Intel80386以上的CPU提供了调试寄存器以用于软件调试。386和486拥有6个(另外两个保留...
2015-05-10 10:36:00
648
转载 [调试器实现]第二章 INT3断点
INT3断点,简单地说就是将你要断下的指令地址处的第一个字节设置为0xCC,软件执行到0xCC(对应汇编指令INT3)时,会触发异常代码为EXCEPTION_BREAKPOINT的异常。这样我们的调试程序就能够接收到这个异常,然后进行相应的处理。INT3断点的管理:在我的程序中,INT3断点的信息结构体如下:structstuPointInfo{Point...
2015-05-10 10:34:00
588
转载 [调试器实现]第一章 调试器框架流程、用户输入处理及三种断点介绍
前言:作为一个软件逆向工程的研究者,必然会用到调试工具,如果能够掌握调试器工作的原理必然对软件调试会有更深入的了解。本文根据笔者自己实现一个完整的调试器的过程,结合OD在调试功能上的实现方法,详细讲述一个调试器其主要功能的实现步骤,及实现过程中需要注意的细节,力求在原理、方法上能让阅读者有所收获。由于本人能力有限,文中必然有错漏之处,恳请读者不吝赐教。第一章调试...
2015-05-10 10:30:00
176
转载 枚举进程:ring3->ring0
链 接: http://bbs.pediy.com/showthread.php?t=106745用google搜索了几天相关内容的资料,将所提到的逐一实现。哎,不禁感叹自己太菜了。居然用了几天的时间。没啥新思想、内容,只是总结,当然还有其他 方法没总结到。但经常提到的ring3下的快照、psapi的EnumProcesses、暴力OpenProcess;ring0下 的ZwQuer...
2015-05-10 10:11:00
187
转载 ZwQuerySystemInformation 5号功能 : SystemProcessesAndThreadsInformation
NTSTATUS NTAPI ZwQuerySystemInformation( ULONG SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength);第一个参...
2015-05-10 09:47:00
363
转载 获取CPU每个核心的IDT信息
0x00 简介记得2008年看保护模式的教程时,痛苦与那些众多的位信息等复杂的结构。 后来入这行,干了几年的驱动。 这是才对这些CPU基本的知识有点了解。IDT,中断描述符表,这个基本的东西,岂能不会。 IDT HOOK的东西已经很多了,不过这里不是搞这个的(因为64位windows上是不建议的,除非...),而是检测IDT HOOK,向处理器虚拟化进军的。...
2015-05-08 19:29:00
905
转载 VC++内联汇编(MSDN相关内容完整翻译)
【一】.在 __asm block中使用汇编语言1.关键字__asm调用内联汇编语句有三种方式可用(1)__asm block 形式例子:// asm_overview.cpp// processor: x86void __declspec(naked) main(){ // Naked functions must provide their own ...
2015-02-10 19:44:00
200
转载 内核同步技术
1.事件对象可以使用事件对象同步完成IRP,或者驱动线程间同步执行某些操作。首先调用KeInitializeEvent IoCreateNotificationEvent或IoCreateSynchronizationEvent初始化事件。流程:驱动的一个线程调用KeWaitForSingleObject等待已初始化的事件当操作完成后,该事件被置信号(调用KeSetE...
2015-01-22 22:57:00
131
转载 Event事件处理(Ring3到Ring0, Ring0到Ring3)
1.Ring3到Ring0 Event的处理用户层创建Event:HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //手动复位, 初始无法信号用户层等待Event:WaitForSingleObject(hEvent, INFINITE);用户层向内核层传入Event:DWORD...
2015-01-22 22:52:00
171
转载 内核中使用 字符串
1.1 使用字符串结构常常使用传统C语言的程序员比较喜欢用如下的方法定义和使用字符串:char *str = { “my first string” }; // ansi字符串wchar_t *wstr = { L”my first string” }; // unicode字符串size_t len = strlen(str); ...
2015-01-22 17:34:00
348
转载 设备读写方式:Neither方式
设备读写的第三种方式是Neither方式,在PDevObj中不设置Flags.这种方式很少被用到。1.在Neither方式中,派遣函数直接读写应用程序提 供的缓冲区地址。你很可能看到有人这样说过:决不(或几乎从不)直接引用用户模式的内存地址。因为缓冲区内存是用户模式的内存地址,驱动程序如果直接引用 这段内存是十分危险的。原因是windows操作系统是多任务的,它可能随时切换到别的进程...
2015-01-22 17:13:00
51
转载 设备读写方式:直接方式
上一节介绍了缓冲区方式读写,这一节咱们来看看直接方式读写设备。1.直接方式读写设备,操作系统会将用户模式下的缓冲区锁住,然后操作系统将这段缓冲区在内核模式地址再次映射一遍。这样,用户模式的缓冲区和内核模式的缓冲区指向的是同一区域的物理内存。无论操作系统如何切换进程,内核模式地址都保持不变。创建好设备IoCreateDevice后,需要设置DO_DIRECT_IO, pDev...
2015-01-22 16:59:00
92
转载 设备读写方式:缓冲区方式
1.设备对象一共有三种读写方式:缓冲区方式读写(Buffered方式);直接方式读写(Direct方式);Neither方式。这三种方式的Flags分别对应DO_BUFFERED_IO,DO_DIRECT_IO,0在buffered方式中,I/O管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区。而你的驱动程序将使用这个系统缓冲区工作。I/O管理器负责在系统缓冲区和用户模式...
2015-01-22 16:58:00
218
转载 驱动加载的次序
在系统初始化的时候,决定驱动程序在什么时候被载入的信息保存在注册表中。最早的一批驱动是由ntldr载入内存的(仅仅是载入)第二批是由IO管理器载入内存的第三批是由 SCM(Service Control Manager) 载入的一个驱动在第几批中被载入是由 HKLM/SYSTEM/CurrentControlSet/Services/驱动名/Start 的值来决定。该...
2015-01-22 16:46:00
131
转载 用DeviceIoControl实现应用程序与驱动程序通信
1.readfile和writefile可以实现应用程序与驱动程序通信,另外一个Win32 API 是DeviceIoControl。应用程序自定义一中IO控制码,然后调用 DeviceIoControl函数,IO管理器会产生一个MajorFunction 为IRP_MJ_DEVICE_CONTROL,MinorFunction 为自己定义的控制码的IRP,系统就调用相应的处理I...
2015-01-22 16:38:00
110
转载 CTL_CODE 参数 DeviceType
设备对象类型#define FILE_DEVICE_8042_PORT 0x00000027#define FILE_DEVICE_ACPI 0x00000032#define FILE_DEVICE_BATTERY 0x00000029#define FILE_DEVICE_BEEP ...
2015-01-22 16:31:00
176
转载 win32内核程序中进程的pid,handle,eprocess之间相互转换的方法
在win32内核程序开发中,我们常常需要取得某进程的pid或句柄,或者需要检索进程的eprocess结构,很多API函数需要的参数也不同,所以掌握pid<->handle<->eprocess相互转换的方法会大大提高我们的开发效率。以下就是我自己在实际开发中总结出来的转换方法,在此记录下来,以供需要的朋友参考。1、pid->handle...
2015-01-22 16:09:00
139
转载 在win32驱动程序中使用事件实现内核层与用户层的同步
在驱动程序中常常需要与用户层程序进行同步,但是由于ring0与ring3之间的天然壁障,导致它们不能使用通常的方法。比如在用户层CreateEvent得到的句柄无法在内核之中使用。然而EVENT对象生来就是为了进行同步使用的,只不过要想在内核层和用户层之间共享同一个EVENT对象的话,需要一点小小的技巧。 1、在用户空间建立事件对象,获取事件句柄,然后使用DeviceIoC...
2015-01-22 16:00:00
219
转载 #include <ntifs.h>出现PEPROCESS redefinition问题处理
如果在自己的程序中,即包含ntddk.h和ntifs.h的时候,编译的时候会出现如下编译错误:7600.16385.0\inc\ddk\ntifs.h(85) : error C2371: 'PEPROCESS' : redefinition; different basic types,7600.16385.0\inc\ddk\wdm.h(79) : see declaration...
2015-01-22 13:29:00
357
转载 METHOD_OUT_DIRECT 缓冲输入直接输出I/O
使用CTL_CODE宏定义来定义一个控制码:#define MY_PORT CTL_CODE(\ FILE_DEVICE_UNKNOWN, \ 0x801, \ METHOD_OUT_DIRECT, \ FILE_ANY_ACCESS)//向内核传递一个用户的等待事件#define IOCTL_SET_EVENT CTL_CODE(...
2015-01-19 23:01:00
553
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人