胡焦24

You got a dream, you gotta to protect it!

站内搜索

选择搜索引擎,输入关键词开始搜索

Google
Bing
Yahoo
百度
💡 小贴士:选择不同的搜索引擎可能会得到不同的搜索结果

windbg添加调试符号

发布日期:2025-09-24 |文章分类: 逆向分析

windbg 下输入命令,开启日志记录到 c:\windbg.log 下面

0:040> .logopen c:\windbg.log
0:040> !sym noisy
0:040> .sympath SRV*c:\LocalSymbols*https://msdl.microsoft.com/download/symbols
0:040> .reload /f

直接下载发现无法正常下载,抓包显示会先进行一个重定向,之后重定向建立 tls 连接后,主动发起了一个 FIN 操作

通过 _NT_SYMBOL_PROXY 环境变量设置为宿主机的代理后, 重新进行下载操作结果也是一样的,在建立起来 tls 之后主动进行 FIN 操作

取日志打印的一些 url 记录,在宿主机以及虚拟机下的浏览器执行,发现都是可以正常下载的

SYMSRV:  c:\localsymbols\srvnet.pdb\9181DF0491B14051BAC74CBF85CC688E2\srvnet.pdb not found
SYMSRV:  https://msdl.microsoft.com/download/symbols/srvnet.pdb/9181DF0491B14051BAC74CBF85CC688E2/srvnet.pdb not found
DBGHELP: srvnet.pdb - file not found
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for \SystemRoot\System32\DRIVERS\srvnet.sys - 
DBGHELP: srvnet - export symbols

使用 python 手工下载然后再导入到 windbg 的符号路径下

第一次没留意下载然后直接放在 c:\localsymbols 目录下了,发现符号是有具体的子路径的,需要重新调整目录处理

这里要注意的是 shutil.copyfile 复制文件的时候,源和目的都必须指定文件名,不能指定路径的方式进行复制

#!/usr/bin/env python
import requests
import shutil
from urllib.parse import urljoin
import os

def download_file_by_curl(url, pdb_path, pdb_name):
    newpath =  './downloads/' + pdb_path
    os.makedirs(newpath, exist_ok=True)
    if os.path.exists('./package/' + pdb_name):
        print("File(%s) is Exist..." % pdb_name)
        if not os.path.exists(newpath + pdb_name):
            shutil.copyfile('./package/' + pdb_name, newpath + pdb_name)
    else:
        os.system('cd %s && curl -OL %s' % (newpath, url))

def main():
    filename = "windbg.log"
    outdir = './downloads/'
    main_url = 'https://msdl.microsoft.com/'
    with open(filename, 'r') as fp:
        content = fp.readlines()
        for rline in content:
            line = rline.strip()
            if line.startswith('SYMSRV:  https://msdl.microsoft.com/download/symbols/'):
                m = line.split(':  ')
                down_url = m[1][:-10]
                bpos = down_url.find('symbols/')
                epos = down_url.rfind('/')
                pdb_path = down_url[bpos+7:epos+1]
                pdb_name = down_url[epos+1:]
                print("start to download:", pdb_path, " ", pdb_name)
                download_file_by_curl(down_url, pdb_path, pdb_name)
if __name__ == '__main__':
    main()

python 在使用 os.path.join 的时候有一个坑,如果参数中某个部分是绝对路径,则绝对路径前的路径都将被丢弃,并从绝对路径部分开始连接

print(os.path.join('C:/Users/Administrator/Downloads', '/pictures/1.jpg'))  # C:/pictures/1.jpg

#正确用法应该是

print(os.path.join('C:/Users/Administrator/Downloads', '/pictures/1.jpg'.lstrip('/')))  # C:/Users/Administrator/Downloads\pictures/1.jpg

下载完后,设置环境变量 _NT_SYMBOL_PATH = srv*C:\LocalSymbols*http://msdl.microsoft.com/download/symbols,这样就不用每次手工加载符号了

重新启动 windbg ,使用 dt _DRIVER_OBJECT 查看符号信息,显示结果如下

参考
https://blog.csdn.net/counsellor/article/details/104721338
https://blog.csdn.net/lly1122334/article/details/113611250
https://docs.python.org/zh-cn/3/library/os.path.html#os.path.join