调试技术
文章平均质量分 76
swartz_lubel
这个作者很懒,什么都没留下…
展开
-
111
系统相关的限制参数cat /proc/sys/fs/file-max -> 1606896 系统的总句柄数 Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不用修改,除非打开的文件句柄数超过此值。 一定要大于等于/etc/security/limits.conf所设置的soft nofile和soft nofile值 ...转载 2018-07-26 11:01:24 · 490 阅读 · 0 评论 -
七种寻址方式(寄存器相对寻址方式)
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和。其有效地址的计算公式如公式所示。在不使用段超越前缀的情况下,有下列规定: 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS; 若有效地址用BP来指定,则其缺省的段寄存器为SS。 指令中给出的8位/16位转载 2018-01-22 19:12:33 · 15885 阅读 · 0 评论 -
七种寻址方式(寄存器间接寻址方式)
操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。该寻址方式物理地址的计算方法如下:寄存器间接寻址方式读取存储单元的原理如图所示。在不使用段超越前缀的情况下,有下列规定:若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈转载 2018-01-22 19:12:09 · 13756 阅读 · 0 评论 -
七种寻址方式(直接寻址方式)
指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。例:假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,B转载 2018-01-22 19:10:39 · 4283 阅读 · 0 评论 -
七种寻址方式(立即寻址、寄存器寻址)
一、立即寻址方式操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。立即数可以是8位、16位或32位,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。例如:MOV AH, 80H ADD AX, 1234H MOV ECX, 123456HMOV B1, 12H MOV转载 2018-01-22 19:09:56 · 7609 阅读 · 0 评论 -
GDB动态库搜索路径
笔记:当GDB无法显示so动态库的信息或者显示信息有误时,通常是由于库搜索路径错误导致的,可使用set sysroot、set solib-absolute-prefix、set solib-search-path来指定库搜索路径。1. set sysroot 与 set solib-absolute-prefix 是同一条命令,实际上,set sysroot是set solib-转载 2017-11-29 16:04:03 · 441 阅读 · 0 评论 -
Clumsy网络模拟工具
笔者最近因为需要在局域网内模拟一个实际情况(即存在丢包、延迟等情况)。网上搜了很多工具,大多基于linux。后来好不容易在网上搜索到一款2014年出现的网络模拟工具----Clumsy。(参考了http://jagt.github.io/clumsy/)Clumsy是基于C语言开发的一款开源网络模拟工具。它能在Windows平台下人工造成不稳定的网络状态,应用它转载 2017-10-13 15:15:16 · 1174 阅读 · 0 评论 -
.lastevent、!analyze(dump分析、异常错误码查询)
.lastevent.lastevent 命令显示最近一次发生的异常或事件。[cpp] view plain copy0:000> .lastevent Last event: 1534.f4c: Break instruction exception - code 80000003 (first chance) debugger转载 2017-09-13 00:07:38 · 1018 阅读 · 0 评论 -
.windbg-k*实例分析(查看调用栈分析)
[cpp] view plain copy#include "stdafx.h" int fun0(int i) { return i; }; int fun1(int i) { return fun0(i); } int _tmain(int argc, _TCHAR*转载 2017-09-12 22:43:24 · 492 阅读 · 0 评论 -
windbg-获取结构体大小(常用的两种方式)
两种方式:dt -v:详细输出。这会输出结构的总大小和字段数量这样的附加信息。当它和-y选项一起使用时,所有的符号都会被显示出来,即使他们没有任何关联的类型信息。[cpp] view plain copy0:000> dt -v _image_nt_headers OGame!_IMAGE_NT_HEADERS struct _I转载 2017-09-12 22:39:07 · 862 阅读 · 0 评论 -
windbg-!address、!vadump、!vprot(读取内存状态)
!address!address 扩展显示目标进程或目标机使用的内存信息这个学习起来比较简单:我们直接使用!address -?就可以找到它的使用说明:[cpp] view plain copy0:000> !address -? !address - prints information o转载 2017-09-12 21:00:35 · 680 阅读 · 0 评论 -
windbg-内存破坏实例分析
以下实例来自AWD代码:[cpp] view plain copy/*++ Copyright (c) Advanced Windows Debugging (ISBN 0321374460) from Addison-Wesley Professional. All rights reserved. THIS CODE转载 2017-09-12 00:26:04 · 903 阅读 · 0 评论 -
x86常用寄存器
80386的寄存器资料 省的我看汇编的时候都不知道寄存器咋个用~ 寄存器都是32-bits宽。 A、通用寄存器 下面介绍通用寄存器及其习惯用法。顾名思义,通用寄存器是那些你可以根据自己的意愿使用的寄存器,修改他们的值通常不会对计算机的运行造成很大的影响。通用寄存器最多的用途是计算。 EAX(accumulator):通用寄存器。相对其他寄存器,在进行运算方面比较常用。转载 2017-09-11 23:46:25 · 781 阅读 · 0 评论 -
七种寻址方式(基址加变址寻址方式)
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。其有效地址的计算公式如公式所示。在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。例:假设指令:MOV BX, [BX+SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H转载 2018-01-22 19:13:08 · 11621 阅读 · 0 评论 -
七种寻址方式(相对基址加变址寻址方式)
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。其有效地址的计算公式如公式所示。 在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则其缺省的段寄存器为SS;否则,其缺省的段寄存器为DS。指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所转载 2018-01-22 19:13:34 · 2263 阅读 · 0 评论 -
七种寻址方式(32位地址的寻址方式)
在32位微机系统中,除了支持前面的七种寻址方式外,又提供了一种更灵活、方便,但也更复杂的内存寻址方式,从而使内存地址的寻址范围得到了进一步扩大。在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来作为地址偏移量的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可转载 2018-01-22 19:13:58 · 1987 阅读 · 0 评论 -
dump 分析模式之 INCORRECT STACK TRACE
dump 分析模式之 INCORRECT STACK TRACE 翻译自 MDA-Anthology Page288 初学者常犯的错误是认为 WinDbg 的 !analyze 和 kv 给出的信息是准确的. WinDbg 只是一个工具, 有时候会缺少一些必要的信息来得到正确的栈信息, 因此我们需要自己明辨正确的与错误的栈信息. 我称之为 Incorrect Stack Trace, 它通常有以下...转载 2018-06-11 10:41:34 · 452 阅读 · 0 评论 -
缓冲区溢出学习
一、寄存器ESP、EBP、EIPCPU的ESP寄存器存放当前线程的栈顶指针,EBP寄存器中保存当前线程的栈底指针。CPU的EIP寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行二、函数调用模式堆栈由逻辑堆栈帧组成。当调用函数时逻辑堆栈帧被压入栈中,当函数返回时逻辑堆栈帧被从栈中弹出。堆栈帧包括函数的参数,函数地局部变量,以...转载 2018-06-01 10:59:02 · 1035 阅读 · 0 评论 -
/proc/sys/vm虚拟内存参数
1.admin_reserve_kbytes 给有cap_sys_admin权限的用户保留的内存数量,默认值是min(free pages * 3%, 8MB)。这些内存是为了给管理员登录和杀死进程恢复系统提供足够的内存。2.block_dump 如果设置的是非零值,则会启用块I/O调试。更多的关于块I/O调试的信息可以参见Documentation/laptops/laptop-mod...转载 2018-06-06 15:05:44 · 463 阅读 · 0 评论 -
Linux下x86_64进程地址空间布局
在x86_64下和i386下是类似的,本文主要关注vm.legacy_va_layout以及kernel.randomize_va_space参数影响下的进程空间内存宏观布局,以及vDSO和多线程下的堆和栈分布。情形一:vm_legacy_va_layout=1kernel.randomize_va_space=0此种情况下采用传统内存布局方式,不开启随机化,程序的内存布局可以看出: 代码段:0x...转载 2018-06-06 14:54:16 · 1895 阅读 · 0 评论 -
Linux下C程序进程地址空间布局
我们在学习C程序开发时经常会遇到一些概念:代码段、数据段、BSS段(Block Started by Symbol) 、堆(heap)和栈(stack)。先看一张教材上的示意图(来源,《UNIX环境高级编程》一书),显示了进程地址空间中典型的存储区域分配情况。 从图中可以看出:从低地址到高地址分别为:代码段、(初始化)数据段、(未初始化)数据段(BSS)、堆、栈、命令行参数和环...转载 2018-06-06 14:52:32 · 326 阅读 · 0 评论 -
coredump_filter的设置
coredump是抓取进程空间内的内存并保存到文件上,并不是所有内存都需要保存的,你可以通过设置/proc/$pid/coredump_filter参数过滤,只抓取部分内存。该参数是一个值,每个bit位都有对应的含义用来表示是否抓取这部分内:bit0: 私有匿名 bit1: 共享匿名 bit2: 有底层文件的私有映射 bit3: 有底层文件共享映射 bit4: ELF头 bit5: 私有大尺寸页 ...转载 2018-06-11 19:31:50 · 4929 阅读 · 2 评论 -
x64 结构体系下的内存寻址
转载请注明出处:http://www.cnblogs.com/lanrenxinxin/p/4735027.html在阅读NewBluePill源码的时候,看内存的那一块简直头疼,全是x64下的寻址,之前根本就没有接触过x64的内存寻址上的内容,看的晕头转向,决定先把x64下的寻址给弄明白了再回过头来看NewBluePill的源码,然后在网上一顿找,居然没有找到关于x64寻址的博客或者文章,简直痛...转载 2018-06-11 16:32:23 · 1024 阅读 · 0 评论 -
使用 dpu 检视 dump 中的字符串.
翻译自 MDA-Anthology1 page167, WINDBG TIPS AND TRICKS. WinDbg中有一些很好的命令像dpu (检视unicode字符串)和dpa (检视ASCII字符串)以及其它 d 开头的命令如dpp. 我们可以使用这些命令来看看栈上是否有指针指向了字符串. 例如: 0:143> !tebTEB at 7ff2b000 ... StackBase: 05...转载 2018-06-11 14:31:47 · 266 阅读 · 0 评论 -
Dll注入经典方法完整版
总结一下基本的注入过程,分注入和卸载注入Dll:1,OpenProcess获得要注入进程的句柄2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1;3,WriteProcessMemory将Dll的名字写入第二步开辟出的内存中。4,CreateRemoteThread将LoadLibraryA作为线程函数,参数为Dll的名称,创建新线程5,Close...转载 2018-05-12 23:33:31 · 332 阅读 · 0 评论 -
VirtualAllocEx 跨进程读写数据 代码注入
VirtualAllocEx 函数的作用是在指定进程的虚拟空间保留或提交内存区域,除非指定MEM_RESET参数,否则将该内存区域置0。 LPVOID VirtualAllocEx( HANDLE hProcess, // 申请内存所在的进程句柄 LPVOID lpAddress, // 保留页面的内存地址;一般用NULL自动分配 SIZE_T dwSize, // 欲分配的内存大小,字节单位;注...转载 2018-05-12 23:25:37 · 5196 阅读 · 1 评论 -
关于Windows消息钩子的理解与测试项目
前奏近来一直在自学Windows Hook相关的知识,已经尝试多种注入方式。尤其对消息钩子方式很感兴趣,因为看到Spy++能够截获系统中绝大多数应用的消息流,就很想知道它的工作原理,打算制作属于自己的Spy++。消息钩子简介消息钩子简言之就是Windows处理消息的一个平台,用户可以在此平台获取或过滤所需应用的消息(例如某鼠标位置,键盘击下等),这些被监控的消息都会在目标窗口处理函数之前被截获。系...转载 2018-02-11 16:47:10 · 2153 阅读 · 0 评论 -
汇编指令速查
指令功能AAA调整加AAD调整除AAM调整乘AAS调整减ADC进位加ADD加AND与ARPL调整优先级BOUND检查数组BSF位右扫描BSR位左扫描BSWAP交换字节BT位测试转载 2018-01-22 19:14:38 · 385 阅读 · 0 评论 -
windbg调试HEAP
HEAP的概念堆栈堆栈,在操作系统内存中有两种存储空间,一个是堆,一个是栈。堆主要用于存储用户动态分配的变量,而栈呢,则是存储我们程序过程中的临时变量。当然栈的作用远不止用作存储变量,但这不是我们这篇文章的讨论内容。堆(HEAP)的分配,使用,回收都是通过微软的API来管理的,最常见的API是malloc和new。在往底层走一点呢,这两个函数都会调用HeapAlloc(RtlAllocat转载 2017-09-11 16:23:48 · 1302 阅读 · 0 评论 -
PEB结构块解析
peb结构块解析: 项目需要获取程序运行的一些状态,目前只能获取寄存器信息,故采用fs寄存器获取peb信息,本文主要探索peb中可以获得的进程信息。 windbg信息如下:win xp 下,和win7不一样,下面为xp环境0:000> !pebPEB at 7ffdd000 InheritedAddressSpace: No ReadImageFileExecO转载 2017-09-11 16:13:09 · 2163 阅读 · 0 评论 -
windbg-调试技巧(定长、不定长参数thiscall平衡堆栈方式不同)
C++程序的成员函数默认使用的调用约定是thiscall,这种约定是把this指针放到ECX寄存器中.This调用协定也是要求被调用函数负责清理栈,因此不支持可变数时的参数,当我们在C++类中定义了可变数量参数的成员函数时,偏译器会自动改为使用C调用约定,当这种调用时,编译器会将所有参数压入栈中,再将this指针压入栈:关键两点:1.this时,是被调用函灵敏清理栈 2.如果可变参数,则使用C转载 2017-09-11 09:32:27 · 390 阅读 · 0 评论 -
栈溢出笔记1.3 准备Shellcode
经过1.1和1.2节的讲述,我们已经知道了如何更改EIP的值。程序执行函数之后将跳转到我们设定的位置开始执行,因此,我们需要准备一个自己的程序,接手后面的工作。这是一个什么样的程序?是一个C语言编写的代码?是一个可直接调用的exe?肯定不是,因为EIP所指的地址保存的内容为指令的操作码,CPU读取该操作码执行相应的操作。所以我们要准备的程序也应该是一段“操作码”。继续写1.1中的Hello转载 2017-09-09 21:19:33 · 314 阅读 · 0 评论 -
栈溢出笔记1.2 覆盖EIP
1.1节中我们说到可以利用栈溢出来破坏栈中原有的内容,这一节中,我们就来看看如何争夺到返回地址(EIP),使得我们可以随意控制它的值,这样我们就可以控制程序。来看一个经典的程序:这个程序的get_print函数中定义了一个大小为11个字节的数组,正常情况下我们的输入应该最多为10个字符(还有一个\0结束符),而gets函数没有明确定义输入的大小,因此,我们可以输入超过10个字符,从转载 2017-09-09 21:18:36 · 708 阅读 · 0 评论 -
栈溢出笔记1.1 函数调用过程
选择从栈溢出开始学习Shellcode的编写,是因为在没有保护机制(栈Cookie,ASLR,DEP,SafeSEH)的系统中使用栈溢出是一件很简单的事情。栈区随着函数调用动态变化,每个函数调用时在栈上占用的空间称为栈帧。用一个示例来说明栈上保存的内容及动态变化的过程。 下面是一个程序,生成一个对话框显示一条“Hello World!”消息。下面是该程序的C代码: 在VS2008中用转载 2017-09-09 21:04:40 · 414 阅读 · 0 评论 -
WinDBG技巧:this指针的常见误区 (ECX寄存器存放this指针)
用Windbg 调试Win32程序的时候我们经常会输入命令 dt -b this 来查看类的成员变量值。Windbg 默认会用寄存器ECX 里面的值作为this 指针地址,然后打印出类里面的所有成员变量。 其实这样是有时候是错误的。虽然this指针多数时候都会被存在寄存器ECX, 有些C++编译器在做代码优化之后会把 this指针放在其他寄存器里面,比如ESI。 所以在调试的时候还需转载 2017-09-07 21:38:54 · 1008 阅读 · 0 评论 -
gbd info
(gdb) help infoGeneric command for showing things about the program being debugged.List of info subcommands:info address -- Describe where symbol SYM is storedinfo all-registers -- Lis原创 2017-09-14 23:21:33 · 331 阅读 · 0 评论 -
使用 GDB 恢复堆栈信息
用 C/C++ 编写的程序, 如果遇到 Segmentation Fault 则可以通过生成 coredump 来进行调试, 根据记录的信息定位到出错代码行. 但很多时候可能用 gdb 打开 coredump 文件查看堆栈时, 却出现一堆问号, 无法直接定位到出错代码行. 本文介绍另一种方法来还原错乱的堆栈信息.例如, 下图是 coredump 后用 gdb 看到的堆栈信息, 可以看到这些转载 2017-09-13 23:08:43 · 4005 阅读 · 0 评论 -
dbgview OutputDebugString输出函数
OutputDebugString 使用只能输入一个参数,在实际使用中带来很大的不便,下面改造后的函数就很好了,想怎么输出自己定。void OutputDebugPrintf(const char * strOutputString,...){ char strBuffer[4096]={0}; va_list vlArgs; va_start(vlArgs,原创 2017-05-27 23:01:48 · 1127 阅读 · 0 评论 -
windbg 常用查看锁以及互斥量
操作系统对死锁的描述如下:所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 那么为什么会产生死锁呢?1.因为系统资源不足。2.进程运行推进的顺序不合适。 3.资源分配不当。 而产生死锁的条件有四个:1.互斥条件:所谓互斥就是进程在某一时间内独占资源。2原创 2017-02-10 10:57:26 · 2942 阅读 · 0 评论 -
windbg命令集合
调试会话.create :创建新的进程并调试 例子 .create notepad.exe.attach:附加到指定进程 例子 .attach 2568.restart:让调试目标重新运行 例子 .restart 或者.restart /f.crash:强制目标系统崩溃(内核态) 例子 .crash.reboot:重启目标系统(内核态) 例子 .reboot原创 2017-03-11 16:43:15 · 1044 阅读 · 0 评论