摘要:
菜鸟一枚,有一段时间不搞内核了,分享一下以前学习的结果,有不对的地方请各位指点,大牛飘过~~在R0和R3时,FS段寄存器分别指向GDT中的不同段:在R3下,FS段寄存器的值是0x3B,在R0下,FS段寄存器的值是0x30。分别用OD和Windbg在R3和R0下查看寄存器(XP3),下图:FS寄存器的...
阅读全文
posted @ 2015-05-10 12:04
银河彼岸
阅读(1780)
推荐(0)
摘要:
注入版R3调试器实现科锐三阶段项目之一项目名称:R3Dbg.dll(调试器内核),Gravedigger.exe(调用示例)功能:实现硬件断点(访问,写入,执行),内存断点(读,写),软断点,单步步过,单步步入,寄存器,反汇编,内存,桟信息的显示。PE分析,CALL函数名提示等3环调试器的功能。特点...
阅读全文
posted @ 2015-05-10 11:58
银河彼岸
阅读(571)
推荐(0)
摘要:
1.相关函数相关结构,与主要成员//导出表结构struct ExportFunInfor { char szFunName[64]; //函数名称 int nExportNumber; ...
阅读全文
posted @ 2015-05-10 11:51
银河彼岸
阅读(312)
推荐(0)
摘要:
1.函数和结构//内存断点处理部分 public: //设置内存读写断点 void SetMemReadWriteBPoint(DWORD StartAddress,DWORD EndAddress); //查找指定的当前内存页 BOOL FindMemPage(DWOR...
阅读全文
posted @ 2015-05-10 11:50
银河彼岸
阅读(475)
推荐(0)
摘要:
1.相关函数,相关结构,与主要成员//硬件断点处理部分public: //硬件断点设置 void SetHardWarePoint(DWORD SetAddress, int DR, int PointType, int nLen = 1); //硬件DR0 void SetD...
阅读全文
posted @ 2015-05-10 11:48
银河彼岸
阅读(525)
推荐(0)
摘要:
1.相关函数与结构 //软中断处理部分public: //设置INT3断点 void Int3BreakPoint(DWORD BreakAddress); //设置INT3断点并保存首字节 BYTE SetBreakPoint(HANDLE hProcess,LPVOID pAdd, B...
阅读全文
posted @ 2015-05-10 11:46
银河彼岸
阅读(493)
推荐(0)
摘要:
一.CREATE_PROCESS_DEBUG_EVENT处理流程当创建调试进程时,进入此流程。在程序的入口点下一个INT3断点,作为单独的软中断处理,即这个断点不加入INT3断点列表。作用是调试程序时,使程序暂停执行于程序入口点。其断点原理参照软中断详细设计。二.LOAD_DLL_DEBUG_EVE...
阅读全文
posted @ 2015-05-10 11:44
银河彼岸
阅读(405)
推荐(0)
摘要:
1)在创建调试线程中添加异常事件信息调用过程PspCreateThread-->PspUserThreadStartup(初始化线程的参数)-->DbgkCreateThread(这里格式化ApiMsg作派发消息的参数)-->DbgkpSendApiMessage备注这里只关心的DbgkpSendA...
阅读全文
posted @ 2015-05-10 11:39
银河彼岸
阅读(319)
推荐(0)
摘要:
调试异常事件结构体:typedef struct _DEBUG_EVENT { //出自MSDN DWORD dwDebugEventCode; //异常代码 DWORD dwProcessId; //PID DWORD dwThreadId; un...
阅读全文
posted @ 2015-05-10 11:33
银河彼岸
阅读(605)
推荐(0)
摘要:
一:R3调试器流程基础知识:异常处理发生的处理大概过程如下:1)系统查看产生异常的进程是否正在被调试,是则向调试器发送Exception_Debug_Event事件;2)如果进程没有被调试或调试不处理此异常,那么系统检查异常所处的线程,并在这个线程的环境中查看FS:[0]来确定是否安装了SEH异常处...
阅读全文
posted @ 2015-05-10 11:28
银河彼岸
阅读(984)
推荐(0)
摘要:
标 题: 【原创】也来构建自己的调试器 作 者: wenboxu 时 间: 2015-01-09,22:46:11 链 接: http://bbs.pediy.com/showthread.php?t=196455 科锐...
阅读全文
posted @ 2015-05-10 11:19
银河彼岸
阅读(304)
推荐(0)
摘要:
5.1问题的提出与分析5.1.1问题的分析当初听到这个的时候,觉得无从下手,而且也想到了很多极端的问题,比如运行的时候不停的修改原来的指令来达到往下运行的效果。然后进到API里面去了,那个记录量是非常之大的,而且当时A1Pass的测试结果是每秒只能跑7条指令.于是花了很多时间在想着效率提升这块.后来...
阅读全文
posted @ 2015-05-10 11:11
银河彼岸
阅读(294)
推荐(0)
摘要:
4.1问题的提出与分析4.1.1问题的分析最初对于这个问题处理的想法就是分析被调试程序的导入表,后来和苏玉海讨论,发现这样不能解决问题,因为API里可能还调用了别的API,再跟进API的话,程序就不能正确解析函数名了!据说Windows有上万个API,如何组织这些数据,如果提高查询的效率、以及最大化...
阅读全文
posted @ 2015-05-10 11:09
银河彼岸
阅读(231)
推荐(0)
摘要:
PDF加了目录,可以快速的定位.附件pdf文档,以及用到的部分功能函数第三章int3断点与硬件断点3.1问题的提出与解决3.1.1问题提出如何实现软硬件断点?如何判断用户断点的正确性?如何提高效率?3.2问题的解决3.2.1Int3断点的实现8086/8088提供断点指令Int3和单步标志TF,调试...
阅读全文
posted @ 2015-05-10 11:07
银河彼岸
阅读(1494)
推荐(0)
摘要:
关于内存断点的设计与实现第二章内存断点92.1问题的提出与分析92.1.1问题提出92.2问题的解决92.2.1内断断点与内存分页的关系9同时附件为调试器的可执行程序(修复了一些小bug)第一章节与第二章节的内容以及pe解析部分的动态邻接表的源代码(我的代码写得很恶心,看的话做好心理准备,哈哈)多谢...
阅读全文
posted @ 2015-05-10 11:04
银河彼岸
阅读(826)
推荐(0)
摘要:
调试器设计第一章节的内容。因为这部分是刚刚新加的,比较急,文中必然有错漏之处,恳请读者不吝赐教。修改:EXCEPTION_SINGLE_STEP单步(硬件断点或单步)附件附第一章节的内容,以及当时项目答辩时用的一份PPT!同时发份帮助文档,昨天发的有错误,不记得修改了!不好意思!科锐五期班学员黄奇e...
阅读全文
posted @ 2015-05-10 11:00
银河彼岸
阅读(299)
推荐(0)
摘要:
标 题: 【原创】科锐第三阶段项目之一,调试器的设计(1、15、31、38、40、47、50楼更新)(源码.文档.使用说明,全都在一楼更新了) 作 者: EvilKnight 时 间: 2010-04-27,23:58:37 链 接: http://bbs.pediy.com/showthread....
阅读全文
posted @ 2015-05-10 10:55
银河彼岸
阅读(380)
推荐(0)
摘要:
前面几章基本上已经将调试器的基本功能及其实现过程讲述的差不多了。本章作为一个结束,将补充一些前面没有提到的细节性问题,并就调试器的功能扩展做一些探讨。单步步过的实现:单步步过对于非CALL的指令,其实和单步步入一样,遇到CALL指令的时候我的处理方式是在CALL之后的指令首地址设置一个一次性的INT...
阅读全文
posted @ 2015-05-10 10:43
银河彼岸
阅读(391)
推荐(0)
摘要:
因为在调试器的设计与实现中,很多关键性的操作都是在单步异常处理中完成的,故本章重点论述在单步异常中的处理。首先我们来看看会有哪些情况导致调试器进入单步异常。进入单步异常的原因: 1.用户输入了单步进入的命令,调试器需要设置单步,让被调试程序单步执行。2.用户所下的INT3断点被断下后,调试器会暂时恢...
阅读全文
posted @ 2015-05-10 10:41
银河彼岸
阅读(1362)
推荐(0)
摘要:
内存断点通过修改内存分页的属性,使被调试程序触发内存访问、写入异常而断下。多内存断点的数据关系:因为我设计的是多内存断点,即在同一个内存分页上可以下多个内存断点,同一个断点也可以跨分页下在几个内存分页上。所以从数据关系上来说断点和内存分页是多对多的关系。因此需要设计三个表:“内存断点信息表”,“内存...
阅读全文
posted @ 2015-05-10 10:39
银河彼岸
阅读(813)
推荐(0)
摘要:
一硬件断点介绍硬件断点,顾名思义是由硬件提供给我们的调试寄存器组,我们可以对这些硬件寄存器设置相应的值,然后让硬件帮我们断在需要下断点的地址。硬件断点是CPU提供的功能,所以要怎么做就得听CPU的硬件寄存器的了。先来看看关于硬件寄存器的说明。Intel80386以上的CPU提供了调试寄存器以用于软件...
阅读全文
posted @ 2015-05-10 10:36
银河彼岸
阅读(2836)
推荐(0)
摘要:
INT3断点,简单地说就是将你要断下的指令地址处的第一个字节设置为0xCC,软件执行到0xCC(对应汇编指令INT3)时,会触发异常代码为EXCEPTION_BREAKPOINT的异常。这样我们的调试程序就能够接收到这个异常,然后进行相应的处理。INT3断点的管理:在我的程序中,INT3断点的信息结...
阅读全文
posted @ 2015-05-10 10:34
银河彼岸
阅读(2433)
推荐(1)
摘要:
前言:作为一个软件逆向工程的研究者,必然会用到调试工具,如果能够掌握调试器工作的原理必然对软件调试会有更深入的了解。本文根据笔者自己实现一个完整的调试器的过程,结合OD在调试功能上的实现方法,详细讲述一个调试器其主要功能的实现步骤,及实现过程中需要注意的细节,力求在原理、方法上能让阅读者有所收获。由...
阅读全文
posted @ 2015-05-10 10:30
银河彼岸
阅读(829)
推荐(0)
摘要:
链 接: http://bbs.pediy.com/showthread.php?t=106745用google搜索了几天相关内容的资料,将所提到的逐一实现。哎,不禁感叹自己太菜了。居然用了几天的时间。没啥新思想、内容,只是总结,当然还有其他 方法没总结到。但经常提到的ring3下的快照、psapi...
阅读全文
posted @ 2015-05-10 10:11
银河彼岸
阅读(570)
推荐(1)
摘要:
NTSTATUS NTAPI ZwQuerySystemInformation( ULONG SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, ...
阅读全文
posted @ 2015-05-10 09:47
银河彼岸
阅读(776)
推荐(0)
摘要:
1.事件对象可以使用事件对象同步完成IRP,或者驱动线程间同步执行某些操作。首先调用KeInitializeEvent IoCreateNotificationEvent或IoCreateSynchronizationEvent初始化事件。流程:驱动的一个线程调用KeWaitForSingleObj...
阅读全文
posted @ 2015-01-22 22:57
银河彼岸
阅读(1535)
推荐(0)
摘要:
1.Ring3到Ring0 Event的处理用户层创建Event:HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //手动复位, 初始无法信号用户层等待Event:WaitForSingleObject(hEvent, INFINIT...
阅读全文
posted @ 2015-01-22 22:52
银河彼岸
阅读(552)
推荐(0)
摘要:
1.1 使用字符串结构常常使用传统C语言的程序员比较喜欢用如下的方法定义和使用字符串:char *str = { “my first string” }; // ansi字符串wchar_t *wstr = { L”my first string” }; // unicode字符...
阅读全文
posted @ 2015-01-22 17:34
银河彼岸
阅读(896)
推荐(0)
摘要:
设备读写的第三种方式是Neither方式,在PDevObj中不设置Flags.这种方式很少被用到。1.在Neither方式中,派遣函数直接读写应用程序提 供的缓冲区地址。你很可能看到有人这样说过:决不(或几乎从不)直接引用用户模式的内存地址。因为缓冲区内存是用户模式的内存地址,驱动程序如果直接引用 ...
阅读全文
posted @ 2015-01-22 17:13
银河彼岸
阅读(386)
推荐(0)
摘要:
上一节介绍了缓冲区方式读写,这一节咱们来看看直接方式读写设备。1.直接方式读写设备,操作系统会将用户模式下的缓冲区锁住,然后操作系统将这段缓冲区在内核模式地址再次映射一遍。这样,用户模式的缓冲区和内核模式的缓冲区指向的是同一区域的物理内存。无论操作系统如何切换进程,内核模式地址都保持不变。创建好设备...
阅读全文
posted @ 2015-01-22 16:59
银河彼岸
阅读(499)
推荐(0)
摘要:
1.设备对象一共有三种读写方式:缓冲区方式读写(Buffered方式);直接方式读写(Direct方式);Neither方式。这三种方式的Flags分别对应DO_BUFFERED_IO,DO_DIRECT_IO,0在buffered方式中,I/O管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲...
阅读全文
posted @ 2015-01-22 16:58
银河彼岸
阅读(1141)
推荐(0)
摘要:
在系统初始化的时候,决定驱动程序在什么时候被载入的信息保存在注册表中。最早的一批驱动是由ntldr载入内存的(仅仅是载入)第二批是由IO管理器载入内存的第三批是由 SCM(Service Control Manager) 载入的一个驱动在第几批中被载入是由 HKLM/SYSTEM/CurrentCo...
阅读全文
posted @ 2015-01-22 16:46
银河彼岸
阅读(453)
推荐(0)
摘要:
1.readfile和writefile可以实现应用程序与驱动程序通信,另外一个Win32 API 是DeviceIoControl。应用程序自定义一中IO控制码,然后调用 DeviceIoControl函数,IO管理器会产生一个MajorFunction 为IRP_MJ_DEVICE_CONTRO...
阅读全文
posted @ 2015-01-22 16:38
银河彼岸
阅读(609)
推荐(0)
摘要:
设备对象类型#define FILE_DEVICE_8042_PORT 0x00000027#define FILE_DEVICE_ACPI 0x00000032#define FILE_DEVICE_BATTERY 0x00...
阅读全文
posted @ 2015-01-22 16:31
银河彼岸
阅读(387)
推荐(0)