IDA,WinDbg - 无法单步调试EXE的一种可能性 - WinSDK版本不对

IDA,WinDbg - 无法单步调试EXE的一种可能性 - WinSDK版本不对

概述

试验环境

win10 + vs2019社区版 + IDAx(7.x, 8.x, 9.x)

遇到的问题

自己随便写个控制台程序,编译好,将源码目录改名,将exe拷贝到单独目录被IDA调试。
发现IDA无论选什么调试器,都无法对exe进行有效的单步调试(单步调试不动/跑飞了, 程序直接运行起来了,断点断不住)。

解决思路

试错法

先说结论

根据 windows的版本,本机装的VS版本,这2个因素,必须选择安装对应的windowsSDK,否则IDA是不能正常用的。
即使是IDA选择本地windows调试器,其实也选的是windbg。
windbg包含在windowsSDK中,如果windowsSDK版本下载安装错了,就会导致IDA不能单步调试程序。
IDA不能正常单步调试程序时,会出多种不常见的报错提示。如果遇到IDA莫名报错,首先要去检查windows版本 + VS版本对应的winSDK是否安装了,如果未安装或者版本错了,就会出各种不常见的报错提示。

如果本机没装windbg(e.g. 机器因为某种原因(硬件升级, OS所在硬盘升级了容量)重新装了windows,本地又没有winSDK的合适版本的存货),去MS官方站点下载,默认是最新的winSDK, 只适用于win11 + VS2022. 下了这个版本,安装好,无论用哪个版本的IDA,都不能正常选择调试器去单步本地的exe.

报错提示举例

设置好断点时,按F7/F8时,程序直接跑起来,根本断不住。
设置好断点时,按F7/F8时,IDA提示,有未解决的问题,无法调试程序。导致无法单步调试到下一条语句.

笔记

排错过程

我的计算机重新装win10之前,都是可以正常用IDA单步调试exe的。
因为要升级主硬盘,将win10重装了。
重装之后,都是需要啥就装啥,本地都有存货。也就没有特别注意IDA是否能正常单步调试EXE的问题。
直到昨天,想看看install4j注册码判断的问题,才想起用IDA单步调试。
发现各种奇葩问题,反正就是不能正常用IDA正常单步调试exe, 这还咋玩?
那只能用试错法,看看是哪里的问题,花了4个小时,才将问题搞定,此时才发现是winSDK装错版本的问题。

问题 - 运行exe或者用IDA单步调试exe后,exe自删除了

确定是360的问题,一旦这个目标程序不是正常的程序,360直接静默删除这个文件,导致调试有错觉。
解决方法1 - 将360关了。这并不好。因为win10本身也有杀毒软件。
解决方法2 - 将调试程序所在目录加入信任区,将360恢复区的程序恢复出来,选择下次信任。

将目录加入360信任区

在这里插入图片描述

将被360删除的文件恢复后,选择下次信任

在这里插入图片描述

在这里插入图片描述

如果发现文件自删除了,去360恢复区看看

如果直接运行exe, 或者exe在IDA中跑起来后消失了。
这时先别怀疑是程序本身有自删除的操作,这种可能行很小。
先去360恢复区看看,是否因为该exe被误杀。

问题 - 权限设置

如果IDA启动时,没有用管理员权限。或者是目标目录有特殊的权限设置,可能会引起IDA访问文件权限的问题。
可以直接将相关目录的权限设置为user用户可以操作一切。
右击文件或者文件夹,选择属性。
在这里插入图片描述
在这里插入图片描述
将文件或文件夹的只读属性去掉。
在这里插入图片描述

但是有时只读属性去不掉,不管了。应该影响不大。
在这里插入图片描述

看看winsdk版本没有或者不对时,IDA的报错和行为

如果装了winsdk, 查找windbg.exe, 可以看到,都在winsdk的安装后的目录中
在这里插入图片描述

没装winsdk

为了模拟,卸载winSDK, 然后用不同版本的IDA单步调试exe.

IDA7

在没有windbg的前提下(无论是选windbg还是本地调试器),IDA7(太老旧,没有从头配置,可能DBGTOOLS没配置)中下了断点,根本断不住,程序直接跑起来了。

IDA8

如果配置了cfg/IDA.cfg中的 DBGTOOLS, 会弹框说找不到windbg
在这里插入图片描述
这时,就可以知道没装windbg.
此步试错到此位置,通过试错,已经知道了没有装windbg。
通过查资料,知道要装windbg, 最好是安装winsdk, 将windbg选上,然后安装

装了winsdk,但是版本不对

假设我不知道要装对应版本的winSDK, 直接去MS官方下载安装最新的winSDK. 当前此版本为 26100.2454.241115-1734.ge_release_svc_prod3_WindowsSDK.iso

此版本为win11 + vs2022才能正常用的winsdk版本。
将此版本装上,就符合 "装了winsdk,但是版本不对"的情况,也就是IDA单步有报错提示的场景。

IDA8

下的断点在main(), 跑起来后,可以断下来。
单步也可以。
和我昨天遇到的情况不同。
这时,有可能是同时装了不同版本的winSDK, 将名字叫Kit的软件找到,都卸载。
然后再安装不好使的winSDK版本做试验,用于重新IDA的古怪提示。
在这里插入图片描述

选了windbg,配置了DBGTOOLS

在这里插入图片描述
这时去 C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\ 中看,可以看到,大部分东西都被卸载掉了。所以会出这个提示。
在这里插入图片描述

选了windbg,没有配置DBGTOOLS

也可以单步调试。
昨天报错的情况复现不出来了,估计是本机设置过正确的参数后,哪个地方有记录。
不追究了。
反正IDA不能单步调试EXE, 和装了不正确的WINSDK版本有关系。

下载正确版本winSDK

https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/

不要下载最新的版本,因为最新版本是配合win11和VS2022的版本,装上之后,可能不好使。
往下翻
在这里插入图片描述
https://developer.microsoft.com/en-us/windows/downloads/sdk-archive
在这里插入图片描述
https://go.microsoft.com/fwlink/?linkid=2164360
在这里插入图片描述
我昨天试验的是10.0.19041.0 这个版本,且是下载的exe, 用exe去下载winsdk.
反正对于win10, 就试验这2个版本,哪个行就用哪个。
这个下载页面,并没有对VS做出说明。我昨天看的资料,并不是这个页面,有对VS做出的说明。

备注

如果自己IDA单步调试时,如果出现各种怪现象。
最好看一下 , 是否配置了cfg/IDA.cfg中的 DBGTOOLS, 是否设置了windbg的符号路径。

IDA.cfg中的DBGTOOLS设置

//
// Location of Microsoft Debugging Engine Library (dbgeng.dll)
// This value is used by both the windmp (dump file loader) and the windbg
// debugger module.
// Only use this setting in case of a non-standard install location.
// (note: make sure there is a semicolon at the end)

DBGTOOLS = "C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x64\\";

windbg中的符号路径设置

SRV*D:\WinDbgSysSymbolsWin10*https://msdl.microsoft.com/download/symbols/;

打开对应版本的windbg看一下符号路径,如果为空,就自己填上。
要确保自己本地指定符号缓存路径和远程路径,这样用的次数多了,有些符号本地就有了,就可以减少去远程下载符号的流量。
在这里插入图片描述
在这里插入图片描述

然后确认一下windbg所属的winsdk是否和自己的windows和VS相适配。

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值