当前位置: 首页 > news >正文

软件调试相关


c++中vector的越界访问1.在vs或windbg中创建调试,可以提前拦截,获取调用栈2.在运行中断言出错后,再附加或创建dump文件进行调试,都无法获取调用栈
使用vs创建调试或直接运行.net程序,能够看到托管异常
注意,使用windbg进行创建调试时,进程创建即中断需执行继续命令,让进程运行起来,其会自动加载各种程序模块
调试.net程序时在程序加载完各种模块(module)后,需要加载扩展模块(.loadby sos clr)(辅助托管代码调试)一个示例流程如下创建调试,windbg executable增加参数-g,则会忽略初始化断点不增加参数,则会使用初始化断点,一般需配合g命令使用继续命令,g加载sos,可查看其帮助!help设置符号路径,支持下载和缓存.sympath cache*c:\Symbols;srv*https://msdl.microsoft.com/download/symbols或.sympath srv*c:\Symbols*https://msdl.microsoft.com/download/symbols注意本地路径一定要完全一致重新加载符号,.reload查看托管栈,!clrstack查看托管异常,!pe
Windows远程调试= 本地调试 + 网络通信 = [A1|B1] + [C]= 远程调试内核 + 通信服务器 + 通信客户端 + 本地调试外壳= [A1|] + [C] + [|B2]
vs远程调试remotedebugger功能,远程调试内核+通信服务器位置,msvs xx.x/common7/ide/remotedebugger注意使用管理员权限运行,以成功开启端口运行在调试目标所在系统vs功能,本地调试外壳+通信客户端运行在调试员所操作的系统
程序和符号版本同一程序或程序库的源码,可以编译出不同Debug版二进制和Release版二进制联系,两者都是二进制程序区别Debug版,以调试目的构建的Release版,以运行目的构建的符号的版本Private,含较多调试符号,一般用于内部调试Public,含较少调试符号,一般用于外部检查不生成或不提供,一般为了保护自身的知识产权注意每个版本的二进制程序,都有private和public两个版本符号文件程序模块间的版本依赖确保构建时使用的lib和运行时使用的dll,为同一版本注意debug版本程序的构建和运行,并非一定要使用debug版本的程序库而使用debug版本的程序库,主要是为了方便查到程序库中出现的bug
修改软件数据的外挂,可以调试器的方式实现
Windows调用约定win32(_stdcall),从右至左压栈,被调清栈native c++ method call(thiscall)继承win32,this放ecxcom(_stdcall for c++ method call)继承win32,this最后压栈,相当于首参_fastcall从右至左压栈,第二一参分别存入edx和ecx,被调清栈_cdel从右至左压栈,调者清栈会用于参数个数可变的函数
网络资料,关键词 debug tutorial part
visual studio pdb产生设置linker>debuggingoptimize for debugging(/DEBUG)
native api轻量级api用途进程启动早期使用Windows组件实现Windows api实现,kernel32.dll实现大多api实现在ntoskrnl.exe使用通过ntdll.dll暴露到用户态ntdll.dll的入口点是LdrInitializeThunk内核通过system service descriptor table(ssdt),处理api调用函数组c runtime functionsNt或Zw前缀定义在ntdll.dll和ntoskrnl.exe中的系统调用用户态(user mode,用户空间低权限)调用ntdll.dll先陷入内核态(kernel mode,内核空间高权限)后通过ssdt调用ntoskrnl.exe中的相同函数内核态直接调用ntoskrnl.exe中函数Zw variants确保在内核态,Nt variants不确保Zw前缀无确定代表Rtl前缀the (extended) c run-time library不需要内核支持Csr前缀client-server functions用于与win32子系统进程通信csrss.exe,client/server runtime sub-systemDbg前缀debugging functions如breakpointKi前缀用于事件的内核调用如APC DispatchingLdr前缀loader functionspe文件处理,启动新进程Nls前缀national languages support类似于code pagePfx前缀prefix handlingTp前缀threadpool handling其他api实现在user32.dll和gdi32.dll中,会陷入内核原不是Windows NT设计,因为硬件性能原因,才将图形子系统移入内核函数前缀为NtUser和NtGdi
vector越界情况分析_Debug_message若调试运行,发送断点调试事件,第一次机会进入break instruction exception - code 8000 0003若普通运行,则调用ucrtbased!CrtDbgReportW函数终会出现报错窗口,后退出此时出错时的调用栈不可观察_ASSERTE会出现断点调试事件_invalid_parameter若调试运行,发送调试事件,第二次机会进入stack buffer overflow - code c000 0409
内存泄漏检查基于crt的内存泄漏问检查通过重载内存申请和释放函数,记录未释放的内存基于windbg的内存泄漏检查定位堆和块堆条件,通过crt分配,堆中特征内存块AppVerifier工具_CrtDumpMemoryLeaks函数windbg查看分配时调用栈注意,需要启用pageheap一些选项使用gflags或pageheap设置调试选项操作使用管理员权限启动cmd,然后设置参考windbg帮助文档用途1内容,暴露内存泄漏方法,将内存分配在页尾,将相邻下页置为PAGE_NOACCESS内存泄漏检查例子gflags /p /enable executable,设置调试选项windbg,启动调试!heap -p,查看堆概况,需有COLLECT_STACK_TRACES查看堆创建时的调用栈!heap -p -h heap_address,查看堆详情dt ntdll!_DPH_HEAD_ROOT CreateStackTrace root_addressdps stack_trace_address!heap -stat -h 0,查看所有堆的统计信息!heap -flt s size,过滤内存块!heap -p -a address,查看内存块详情,含申请时的调用栈
ntsd,kd,cdb,windbg的关系使用相同的调试引擎和命令windbg,支持gui,支持用户态和内核态调试ntsd,kd,cdb支持clintsd,cdb支持用户态调试kd支持内核态调试
异常处理过程1.  有调试器且完成处理,则完成2.  应用程序有异常处理程序且完成处理,则完成3.1 有调试器且完成处理,则完成3.2 应用程序注册过回调(SetUhandledExceptionFilter)3.3 调用注册表中AeDebug指定的调试器4.  对于clr,会触发AppDomain的UnhandledException
在c/c++ debug中,可使用_CrtDbgReportf发送调试报告_CrtSetReportHook指定调试报告的处理函数,如自动创建dump文件弹窗等待手动创建dump文件,或附加调试器
AeDebug方式条件,管理员权限,run as Administrator手动设置注册表方式查找key为AeDebug的项export项到注册表文件备份和编辑注册表Debugger,指定调试器路径,初始化命令或脚本,可用于创建dump文件import注册表文件windbg命令行-I,设置尸检(postmortem)调试器
调试的方式新建调试附加调试AeDebug触发调试dump调试
进程模块dll,作为基层模块,无程序入口,可共享,载入位置一般不确定(以实际为准)exe,作为顶层模块,有程序入口,不会共享,载入位置一般确定(以实际为准)
Dll调用动态调用,由代码负责加载和卸载模块据实际加载位置动态获取符号地址静态调用,由编译器和加载器负责加载和卸载模块从只读段中,获取符号地址一般只读段中,地址变量的符号为_imp_xxx
DLL共享Dll中包含代码段、数据段、bss段代码段,所有进程间共享数据段、bss段,同一进程内所有模块间共享
调用windows API时,若中断入调试器在Debug版本程序中,调试器栈回溯异常,手动回溯正常在Release版本中正常
常用的call方式call address,相对寻址,e8指令码,eip+=addresscall (dword|qword),绝对间接寻址,ff15指令码,eip=[eip+address]
windbg中查看地址相关源码,.open -a address
在不同的层次和角度去观察同一事物,如程序的逻辑结构、程序物理结构、进程
地址程序中很常见很重要的一一类数据类别相对地址,指向不依赖于模块加载位置绝对地址,指向依赖于模块加载位置,又分为指向自身模块的绝对地址和指向外部模块的绝对地址问题由于模块加载位置不确定,绝对地址为了指向的有效性,需要动态调整方案绝对地址的变化度分离,符号和地址值以变量实现符号表示为相对地址,指向的地址变量地址值表示为地址变量中的变量值绝对地址变量组成的列表对内的表,由重定位表指向对外为IAT当模块及其依赖模块加载完成后,更新绝对地址变量表,设定地址数据只读
可执行文件COFF中,文件分头部、节头表(含段加载信息),节数据ELF中,文件分头部、程序头表(段加载信息)、节头表、节数据
可执行文件的加载测试了解PE format使用CFF explorer(支持pe)或dumpbin(支持pe和.lib)查看文件数据使用windbg查看进程数据
关于IAT.idata section中含import directory table及其相关附表可查看导入依赖的模块,每一个模块含一个lookup table和一个IATLookup table记录了外部模块导入项的查找方式(名称或序号)和查找参数(名称字符串或序号值)Import address table(IAT)PE中,为指向lookup table中导入项的相对当前模块的偏移地址内存中,会被替换为导入项的绝对地址
模块间依赖的变化度分离依赖例子,模块导出函数分离的角度,概念的接口与实现变化度分离,能够实现模块间的松耦合,降低变化传递能力静态直接常量,动态间接变量客户模块依赖实现模块的两种方式静态绑定不分离接口和实现,直接暴露和依赖实现,使用导出函数在实现模块中的相对地址实现模块中的任意变化都可能会传到客户模块中动态绑定,分离接口和实现,只暴露和依赖接口,使用导出函数的名称或序号实现模块的接口变化才可能会传到客户模块,如函数类型、函数的名称或序号
模块的接口存储服务接口,导出表,export table,.rdata节或.edata节中导出表含export directory table及其相关附表记录了模块实现的服务接口,包括服务接口的名称、序号、地址、调用约定等实现接口,导入表,import table,.idata节中
模块重定位一般而言,exe可指定程序入口地址,从而可影响加载位置,而dll不可使用时以实际加载位置为准当模块的实际加载位置和默认加载位置不一致时,需要使用到重定位表
关于重定位表.reloc节中,含重定位表记录了指向模块内部的绝对地址变量的相对于模块的偏移地址使用方法系统加载当前模块后遍历绝对地址变量,据加载偏差调整其指向模块的默认加载位置为image base,在PE optional header中变量偏移地址的记录方式思想,以页(1000h字节)为组,记录页内偏移,避免数据冗余方法.reloc节头中,记录了所有数据起止位置所有数据,分为多个块(block),一个块记录一页中的地址变量块数据组成页基址,RVA,相对虚拟地址块长度,字节数,4字节多个页内偏址项高4位为项类型低12位为页内偏址对齐项,2字节0,可选,块数据是四字节对齐的使用重定位表的场景需要静态获得模块内的绝对地址(VA),而非相对地址(RVA)绝对地址可动态获取则动态获取,避免重定位如函数中获取符号的地址,如全局变量,静态变量,函数,字符串常量等汇编代码实现为,对相对地址指向的目标位置取地址,以动态获取而非静态获取否则,静态获取后重定位,如初始化全局地址变量或静态地址变量Vector越界访问检查消息框出现后,手动创建dump文件根据messagebox函数,切换线程查看栈情况,可用则用,不可用则基于寄存器分析自动创建dump文件不易分析

 


http://www.taodudu.cc/news/show-4781402.html

相关文章:

  • TCP(1)
  • 【数据结构】栈和队列专题
  • PC小程序解密及反编译
  • C语言笔记15
  • 基于UDP协议Python通信网络程序(服务器端+客户端)及通信协议在自动驾驶场景应用示例
  • 【无标题】C++ 读写文件 不同方法总结
  • Bongiovi DPS for mac(音频增强工具)
  • DPS学习心得(一)
  • 中学数字化探究实验室建设要求和规范
  • 医药工业洁净厂房配电系统设计与节能应用
  • 浅谈医药工业洁净类厂房智能照明设计与选型
  • ds服务器没检测到有响应,设备或资源dns没检测到有响应 网络无法连接
  • EasyCVR调用录像回看接口报错“查询文件失败”排查过程及解决方式
  • 各种系统中密码文件的位置
  • Windbg查看死锁实例
  • Eclipse安装DSS会出现的一点问题
  • DSS源码分析
  • macOS系统_常用终端操作命令
  • java文件上传(tcp)
  • tomcat 7 最新版本 apache-tomcat-7.0.109
  • Windows Tomcat 下载安装
  • win10+tomcat7解压版安装小记
  • Mac下安装Tomcat7
  • tomcat下载不了
  • win7下安装配置Tomcat 7.0
  • “ORA-01017(:用户名/口令无效; 登录被拒绝)”解决办法
  • navicat连接出现ORA-01017: invalid username/password
  • 关于springboot项目连接oracle数据库报错 ORA01017的改正
  • Oracle ORA-01017: invalid username/password;logon denied问题解决
  • How to fix ORA-01017:用户名/口令无效 登录拒绝
  • Oracle不能用system用户 ORA-01017
  • ORA-01017:用户名/口令无效,登录被拒绝(ORA-01017: invalid username/password; logon denied)
  • 远程连接oracle01017,連接Oracle遠程數據庫錯誤:ORA-12541,ORA-12514,ORA-01017的解決方法!...
  • Oracle ORA-01017: invalid username/password;解决完一个12560又来一个
  • dbca asm ora 01017错误
  • 【毕业设计/Matlab系列】基于MATLAB语言的实时变声器系统