
调试
文章平均质量分 63
Eugene800
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
探索Windows S3唤醒函数 (二)
在前面一篇文章中,已经定位到了变量HalpWakeVector,我也说过这是开启OS S3大门的钥匙,那这篇文章就应该是登堂入室了。1.从HalpWakeVector过度到HalpLowStubPhysicalAddress:hal模块对HalpWakeVector的引用不多,只有4处:但是现阶段只用到HalpSetupRealModeResume函数。.text:00000...原创 2020-04-14 13:31:13 · 795 阅读 · 0 评论 -
探索Windows S3唤醒函数 (一)
最近看UEFI中关于S3 Resume的实现,在Resume的最后阶段,UEFI通过SwitchStack执行OS的S3代码:UefiCpuPkg\Universal\Acpi\S3Resume2Pei\S3Resume.c:VOIDEFIAPIS3ResumeBootOs ( IN ACPI_S3_CONTEXT *AcpiS3Context, ...原创 2020-04-14 00:59:53 · 2126 阅读 · 0 评论 -
尝试绕过ptrace保护 不知道算不算成功
源码如下#include int main(){ int i=0; if(ptrace(PTRACE_TRACEME,0,0,0) { printf("failed\n"); return 0; } printf("succ\n"); i=1; return 0;}gcc原创 2014-11-04 20:55:07 · 7323 阅读 · 0 评论 -
仿照着写个bootloader (一)
前阵子找到本书,前半本是关于实模式下编程,后半本是保护模式下编程,正好最近在看linux中断相关的内容,索性就买了回来翻翻。 其实,于渊大神诺干年前也写过类似的书(现在再版叫 orange操作系统的实现),何奈,当时惰性较大,书买来后一直是压箱底状态,这回连这本书也一起找了出来,相互对照着看。 书中用的虚拟磁盘是vhd类型,书中用的是img类型。因为书中直接提供了vhd磁盘以及原创 2014-11-25 23:26:13 · 895 阅读 · 0 评论 -
仿照着写个bootloader (二)
第八章的内容大概是编写一个加载器,从磁盘加载前面写的程序,然后跳转到该程序中执行并输出hello world。咱不急,不跨这么大步子,先写个程序从磁盘上读数据吧~ 我把要读取的数据存放在磁盘第二个扇区,格式如下:前2个字节记录需要读取的数据长度,以字节计算,后面紧跟实际数据。 关于IDE接口寄存器的介绍,这里转一个连接,因为网上都转自博主的文章:http://blog.chinauni原创 2014-11-29 21:22:03 · 900 阅读 · 0 评论 -
堆栈平衡:估计这是最详细的讲解堆栈平衡的了 vc++6.0
#include #include #include #include int ShowEsp(int* arg1,int* arg2);/*引言 各种面试宝典上都会说 又说栈在进程空间的高地址部分,向下扩展; 堆在进程空间的低地址部分,堆向上扩展来验证一下是否正如所说这些变量在内存中如何分布?*/int main(){ //0) int i=0xABCDABCD;原创 2015-01-27 15:51:39 · 9509 阅读 · 0 评论 -
保护模式、实地址模式及V8086模式下的指令格式(下)
保护模式、实地址模式及V8086模式下的指令格式(下)本文转自:http://blog.csdn.net/misterliwei/article/details/5550467学习汇编语言时,我们都是从寻址方式开始的。所谓寻址方式就是指令中操作数是如何指定的。在16位时,寻址方式有:1.立即数寻址操作数直接存放在指令中,紧跟在操作码之后。2.寄存器寻址操作数在寄存器转载 2015-01-29 23:35:31 · 769 阅读 · 0 评论 -
保护模式、实地址模式及V8086模式下的指令格式(上)
保护模式、实地址模式及V8086模式下的指令格式(上)本文转自:http://blog.csdn.net/misterliwei/article/details/5550452本文译自《intel指令手册2.1节》,该手册地址为:http://www.intel.com/products/processor/manuals/index.htmIntel64和IA32架构转载 2015-01-29 23:34:10 · 1020 阅读 · 0 评论 -
仿照着写个bootloader(四) 中断向量
这是x86 bootloader的第四篇,实模式的最后一篇,后面就要开启A20线-分页内存等进入32bit保护模式。前阵子看到protues带有8086 CPU,琢磨着等这边bootloader结束了,尝试一下在protues上仿真。 8086 CPU在进入实模式前,中断表跟8051长的有点神似,从0x0000开始每4B为一个中断向量,4B空间肯定不够处理中断事件,于是,这4B空间被安排原创 2014-12-22 22:51:34 · 2131 阅读 · 0 评论 -
仿照着写个bootloader (三)
到第三篇了,对应第8章的内容。这次分两个代码:一个是加载器,复位后首先得到执行的程序,从磁盘读取用户程序,并为用户程序的执行初始化环境,最后跳转到用户程序;另一个是用户程序,无所事事的运行着,仅仅是证明加载器没出错。 两个程序最重要部分是用户程序的程序头,程序头就像是一份协议,用户程序告诉加载器关于整个程序的属性,加载器获得这些属性后,在指定内存位置加载。 首先,加载器在指定扇原创 2014-12-07 21:36:41 · 891 阅读 · 0 评论 -
仿照着写个bootloader (三-1)
DiskDataReg equ 0x01f0DiskErrReg equ 0x01f1DiskSectCntReg equ 0x01f2DiskLoLBAAddr equ 0x01f3DiskMeLBAAddr equ 0x01f4DiskHiLBAAddr equ 0x01f5DiskModReg equ原创 2014-12-11 00:17:32 · 642 阅读 · 0 评论 -
仿照着写个bootloader(6) 保护模式下修改代码段
标题让我想起win驱动中修改只读页的内容:新申请一个PTE指向该页,PTE中的权限改为读写,就能修改页面内容啦。 现在阶段我的bootloader还没有建立起分页机制,仅仅开启分段,因此,通过修改PTE啥的肯定不奏效,能做的只有修改段描述符了。 先看下我代码中的段描述表:mov dword [bx],0x00000000mov dword [bx+4],0x0000000原创 2015-03-12 00:08:38 · 1155 阅读 · 0 评论 -
用List和Map文件定位bug
#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[]){ char* ptr = NULL; *ptr = 'A'; return 0;}这段程序bug很显见,要定位bug也不难。但是,如果把这代码发布出去,直接运行会有这样的错误,最多看到汇编指令:这时怎么定位程序?首先0x00CA1378,这地址看着有点高,一原创 2015-05-21 23:56:57 · 1212 阅读 · 0 评论 -
调试LD_PRELOAD注入的代码
LD_PRELOAD提供了平民化的注入方式固然方便,同时也有不便:注入库出错后调试比较困难。我琢磨了几天找到了可行的调试方法,当然未必是最有效的办法。抛出陋文,希望引来美玉~ 首先,写一段代码作为普通的动态库,公开接口,供人调用,如下://true.cint fake(const char* s1,const char* s2){ return 0;}gcc -g3原创 2015-06-10 23:19:11 · 3534 阅读 · 0 评论 -
绕过__chkesp堆栈检查
前面很多注入相关的文章中都提到为了保证注入后原始程序能恢复正常的执行流,需要在编译器中关闭堆栈检查。作为解决问题,这是个好手段,但是不得不说这是回避问题,不是解决问题。本文旨在解决这个问题。 __chkesp,顾名思义,检查esp的值,检查失败就抱错。什么时候esp会出错?情况很多,如果排除缓冲区溢出的可能,那还有堆栈失衡的情况。比如不正常的退出函数方式。我经常遇到的不正常退出函数引原创 2015-06-23 23:36:04 · 2888 阅读 · 0 评论 -
TLS及TLS反调试
不得不说这个标题写的有点大,大到涉及到编译连接的内容,我还是努力把他写好吧。这里只讨论TLS静态存储,T不讨论TLS动态存储,毕竟跟反调试关系不大。 TLS设计的本意,是为了解决多线程程序中变量同步的问题,是Thread Local Storage的缩写,意为线程本地存储。线程本身有独立于其他线程的栈空间,因此线程中的局部变量不用考虑同步问题。多线程同步问题在于对全局变量的访问,TLS在原创 2015-07-06 09:18:53 · 5978 阅读 · 4 评论 -
2种基于异常机制的反调试方法
如题,一种是利用异常处理例程进行反调试:首先安装好一个异常处理例程,然后人为抛出异常在异常处理例程中通过IsDebuggerPresent来判断程序是否被调试;另一种是利用未处理异常进行反跟踪,其原理是:当异常发生时所有异常处理例程都不能处理异常,系统线程异常处理例程将起作用,它调用 ZwQueryInformationProcess 判断是否被调试, 如果没有调试并且程序中调用SetUnha原创 2015-08-24 15:33:51 · 3489 阅读 · 1 评论 -
利用SEH进行代码混淆
这几天在重看SEH机制,收获颇丰。随手写了一个用SEH进行跳转的代码贴于此处以作纪念。 当发生异常,并捕捉了异常,在OS的异常处理机制下,会进入异常过滤函数。过滤函数可以返回EXCEPTION_EXECUTE_HANDLER/EXCEPTION_CONTINUE_SEARCH/EXCEPTION_CONTINUE_EXECUTION三者之一,以此决定OS的后续操作。如果返回EXCEPTI原创 2015-07-30 00:37:07 · 1496 阅读 · 3 评论 -
vc++6对windows SEH扩展分析 一文拾遗
前一篇文章vc++6对windows SEH扩展分析 尚有遗漏,本篇加以补齐。 其实本文参考csdn上一篇名为,同时提出了一些质疑。 作者罗列了vc++6.0扩展的SEH节点的结构如下:struct _EXCEPTION_REGISTRATION { struct _EXCEPTION_REGISTRATION *prev; void (*handle原创 2015-08-12 20:44:39 · 1028 阅读 · 0 评论 -
DPL,RPL,CPL 之间的联系和区别
CPL是当前进程的权限级别(Current Privilege Level),是当前正在执行的代码所在的段的特权级,存在于cs寄存器的低两位。 RPL说明的是进程对段访问的请求权限(Request Privilege Level),是对于段选择子而言的,每个段选择子有自己的RPL,它说明的是进程对段访问的请求权限,有点像函数参数。而且RPL对每个段来说不是固定的,两次访问同一段时的RP转载 2016-06-02 20:09:37 · 615 阅读 · 0 评论 -
软件调试23章 堆管理器向内存管理器释放的疑惑
张银奎老师的第23章提到可以用windbg !heap -v HeapHandle来查看堆解除提交的粒度。我在win7 32bit机器上测试系统堆解除提交的情况,得到了不同的结果。 首先我的系统堆地址是0x360000:0:001> !heap -aIndex Address Name Debugging options enabled 1: 00360原创 2016-06-06 20:51:02 · 1064 阅读 · 0 评论 -
xp下GetLastError实现
大家对这个win32 API一定很熟悉了,那就来看下他的实现:0:001> x *!GetLastError //搜索符号地址7c830759 kernel32!GetLastError = 0:001> uf 7c830759 kernel32!GetLastError:7c830759 64a118000000 mov eax,dword ptr fs:[0000原创 2016-06-30 20:57:50 · 978 阅读 · 0 评论 -
调试HeapAlloc虚拟分配时的发现(xp sp3+vc++6)
第23章中提到:当请求分配的内存超过Heap!VirtualMemoryThreshold指定的阈值时,堆管理器会调用ZwAllocateVirtualMemory分配空间. 作者给出的样例HiHeap!TestVirtualAlloc会引起堆管理器做如此动作.不同的OS版本/不同的编译器Debug启动和Attach附加到程序对堆管理器的调试都有很大的差别,因此本文只讨论在Xp sp3下原创 2016-06-16 15:50:27 · 1683 阅读 · 0 评论 -
vs2012远程调试C#
不知道大家有没有遇到过这种情况,刚开发完的程序,明明在本机能够好好的运行,可是部署到服务器过分发给用户时,总是出现莫名其妙的错误。一时半会又看不出问题来,怎么办呢?难道只能在服务器或是客户电脑上装一个vs、跟一下代码吗?其实不用的,vs有一个远程调试的功能。这个功能是这样的,程序在其他的电脑上运行,但是我们可以在本地电脑上进行断点跟踪。下面以vs2012为例,为大家转载 2016-07-13 22:27:45 · 3221 阅读 · 0 评论 -
解读编码后的HEAP_ENTRY结构
转自http://advdbg.org/blogs/advdbg_system/articles/5152.aspx好久没有写博客了,很是惭愧。看到论坛上有朋友询问无法解读HEAP_ENTRY结构,觉得这个问题非常好,正好也略有空闲,就聊聊这个问题吧。事情还是源于“广被误解”的Vista,说起话来,已经是2006年前的事了,当年Vista团队不辞劳苦对NT做了很多大刀阔斧的改革转载 2016-07-04 21:12:38 · 1313 阅读 · 0 评论 -
WinDBG 设置条件断点
Conditional breakpoints can be veryuseful when you are trying to find bugs in your code. They cause a break tooccur only if a specific condition is satisfied.当你在尝试找到你代码中的bug时,条件断点非常有用。当某个特殊条件满足时它才转载 2016-07-26 20:37:14 · 1888 阅读 · 0 评论 -
windbg设置条件断点
一直以为windbg的bp断点只是简单的在某个地址上下断点,后来才发现bp断点功能很强大:除了可以设置条件断点还是windbg脚本的基础. 使用方法很简单:bp address ".if(condition){};.else{}" 具体例子形如:bp `4dbg.cpp:18` ".if(hFile>=0){};.else{gc;}"这里是对源文件中某一行下条件断点,如果句柄值大于等于0原创 2016-07-28 22:35:18 · 6597 阅读 · 0 评论 -
windbg 脚本简单入门
转自http://bbs.pediy.com/showthread.php?t=180879在Windows调试器这个圈子里,Windbg作为微软的亲儿子,其名气可谓无人不知,就算你没用过,那你肯定也听说过。Windbg的功能自然不必说,集内核调试,应用程序调试,远程调试,dump分析等于一身,真是杀人灭口必备利器。但是也由于其太过强大,命令太多,导致很多新手对windbg望而生畏,觉得Win转载 2016-07-28 23:24:12 · 1893 阅读 · 0 评论 -
46.windbg-条件断点(windbg script)
转自:http://blog.csdn.net/hgy413/article/details/9000994使用j命令的条件断点的基本语法如下:0:000> bp Address "j (Condition) 'OptionalCommands'; 'gc' "使用.if命令的条件断点的基本语法如下:0:000> bp Address ".if (Condi转载 2016-07-28 23:25:49 · 637 阅读 · 0 评论 -
解决win7/win8.1 驱动调试KdPrint不能输出的问题
转自:http://blog.csdn.net/mailbox2005/article/details/5422907 由于工作原因,需要在win7上调试PCI驱动。我使用的是双机调试方式,开始以为调试起来会很方便,环境很快搭好,但问题来了,另一台机器上的windbg 上怎么也打印不出来。后来通过查找资料,看到有人介绍修改注册表的办法来解决内核输出的问题。具体办法是在注册表HKE转载 2016-08-17 16:42:39 · 1926 阅读 · 0 评论 -
xp下调试堆溢出(上)--HeapAlloc分配堆块
题记:win10都开始推广了,我还在折腾xp,真low,不过总得有这个过程吧。 DWORD SHOOT的原理是利用Release版发布的程序在正常启动(非调试启动)情况下,使用Lookaside表(又称块表)管理程序中堆频繁的申请/释放操作。本文以堆溢出学习笔记和为基础,改进而来。 首先要明确Lookaside表是一个单链表原创 2016-07-06 22:04:43 · 1846 阅读 · 0 评论 -
xp下调试堆溢出(下)--利用快表
前一篇简单阐释了快表分配的原理,并在文章的结尾提到xp sp1以前的OS并不对分配出去的快表地址进行检查。本文简单演示利用这个漏洞。建议程序在win2k上以命令行运行#include #include int main(int argc,char* argv[]){ HLOCAL h1,h2,h3,h4; char* pi=NULL; HANDLE hp; char* str=原创 2016-07-07 22:27:24 · 935 阅读 · 0 评论 -
windbg .exepath命令:windbg调试kernel dump时需要指定image-path
遇到符号无法加载可以尝试以下步骤:1.检查sympath路径。0:075> .sympathSymbol search path is: SRV*E:\symbol\w7_fre*http://msdl.microsoft.com/download/symbols;.sympath的用法是:SRV*[本地符号目录]*符号服务器URL。以SRV开头,符号目录和符号服务器URL前面都以"原创 2016-11-05 01:27:59 · 2761 阅读 · 0 评论 -
[Win32]一个调试器的实现(八)单步执行
上回讲解了如何实现断点功能,这回讲解如何实现与断点紧密相关的单步执行功能。单步执行有三种类型:StepIn,StepOver和StepOut,它们的实现方式比较多样化,单独实现它们的话并不困难,但是将它们整合到一起就比较困难了,特别是加上断点功能之后,程序的逻辑更加难以理解。本文首先单独讲解每种单步执行的原理,最后讲解如何将它们整合到一起。这都是我个人的实现方法,大家可以用来参考。(注意:本文所讲转载 2016-09-30 11:55:08 · 2336 阅读 · 0 评论 -
[Win32]一个调试器的实现(九)符号模型
在接下来的文章中会讲解如何在调试器中显示局部变量和全局变量的类型和值。实现这个功能一定要有调试符号的支持,因为调试符号记录了每个变量的名称,类型,地址,长度等信息。这不是一件轻松的事情,因为你首先要对符号模型有一定的了解。所以本文的主要目的就是介绍DbgHelp中的符号模型。 符号模型这里所说的“符号模型”指的是各种符号之间的逻辑关系,虽然微软定义了各种不同格式的符号文件,但是它们使用转载 2016-09-30 13:19:19 · 1583 阅读 · 0 评论 -
[Win32]一个调试器的实现(十)显示变量
上回介绍了微软的符号模型,有了这个基础知识,这回我们向MiniDebugger中添加两个新功能,分别是显示变量列表和以指定类型显示内存内容。显示变量列表用于列出当前函数内的局部变量或者全局变量;以指定类型显示内存内容用于读取指定地址处的内存内容,然后将这些二进制数据按照类型的格式解析成可读的内容并显示出来。如下面的截图所示: 使用lv命令显示局部变量时,每一列从左到右分别是:类型,名称转载 2016-09-30 13:33:12 · 1549 阅读 · 0 评论 -
[Win32]一个调试器的实现(十一)显示函数调用栈
本文讲解如何在调试器中显示函数调用栈,如下图所示: 原理首先我们来看一下显示调用栈所依据的原理。每个线程都有一个栈结构,用来记录函数的调用过程,这个栈是由高地址向低地址增长的,即栈底的地址比栈顶的地址大。ESP寄存器的值是栈顶的地址,通过增加或减小ESP的值可以缩减或扩大栈的大小。上一篇文章已经简略地介绍过在调用函数时线程栈上会发生什么事情,现在我们再来详细地看看这个过程:转载 2016-09-30 13:37:37 · 1454 阅读 · 0 评论 -
WinDbg符号文件加载
WinDbgWinDbg符号文件加载skyworth2010-07-02, 15:13 下午pdb文件在d:\symcache根目录,但是始终无法加载,以下是windbg输出,为什么呢?iptsvr.pdb\8439F7A3C92A4014BCFD948DE875CD531\iptsvr.pdb 这个尤其奇怪,符号文件在symcache目录下0:034> .relo转载 2016-11-07 10:53:29 · 5232 阅读 · 0 评论 -
Paging – Virtual to Physical address translation
转自:http://blog.nandaka.io/paging-virtual-to-physical-address-translation/I will start by recalling the first part of the address translation ‘Segmentation‘ which we have already covered. This post转载 2016-11-08 14:31:02 · 1133 阅读 · 0 评论 -
Paging in PAE-mode – Virtual to Physical Address Translation
转自:http://blog.nandaka.io/paging-in-pae-mode-virtual-to-physical-address-translation/Please go through the Paging in non-PAE mode before continuing to PAE mode. Also, the address translation e转载 2016-11-08 14:38:52 · 1004 阅读 · 0 评论