微软的公共符号服务器地址:Symbol information
1. deferred: 延迟加载,现在还不需要使用这个模块的符号,将在后面需要的时候加载
2. no symbols: 没有找到相应的符号文件
3. export: 没有找到symbols,但是可以使用导出接口作为符号
4. public: 一般指使用服务器上的共有符号
5. private: 一般指使用本地的私有符号
1. 设置符号加载路径,`d:\symbolslocal`是符号服务器的缓存地址;`D:\my_private_symbols_path`是我们自己代码的符号地址
# 下面的命令一共分为两部分
# ;分号前的一部分指定了微软符号服务器的网络地址和缓存地址
# 后面一部分是我们自己的模块的pdb的地址
.sympath srv*d:\symbolslocal*http://msdl.microsoft.com/download/symbols;D:\my_private_symbols_path
2. 增加符号加载路径
.sympath+ d:\localSymbols
3. 列出已经设置的符号加载路径
.sympath
4. 加载符号
.reload /f
5. 检查某一个模块的符号是否成功加载
!chksym ntdll.dll
6. 单独加载某一个模块的符号
.reload /f ntdll.dll
7. 查看所有模块的符号加载情况
lm
8. 公共符号路径写错了或者忘记了微软符号服务器的地址可以使用下面的命令
.symfix
访问微软的符号服务器可能需要梯子,注意用梯子的方式,要使用全局模式。
9. 查看某一帧的局部变量
# 帧号一般是从01开始的
.frame 16进制的帧号 #切换到某一帧
.dv #查看当前帧的局部变量
10. 忽略二进制文件和pdb的时间差异
.symopt + 0x40
11. 查看模块的符号
# 从某一个模块中查找某一个符号
x notepad!func1
# 可以使用通配符
x notepad!Get*
# 没有导出的符号不能使用通配符,一般被优化了,我们也找不到符号
# vs2017 编译出来的debug版本,使用x命令的通配符模式无效,原因不明
# 可以选择使用源码来调试
# 也可以自己补全符号名 bu MyKernel64!FileSys::My_Z_NtWriteFile
12. 查看程序入口
# 正则匹配main
x notepad!*main*
13. 知道符号之后我们就可以加断点了
# 对某一个模块的某一个符号下断点
# bu 模块名!符号名
bu notepad!GetName # GetName 是我瞎写的名字
14. 在源代码上设置断点
bp `myDLL!mySourceFile.cpp:XXX`
15. 反汇编
u HelloDDK!__security_init_cookie+0x1b
16. 查看内存地址
d 95745000
17. 程序运行时,自动加载windbg
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\my_test_1.exe]
"Debugger"="C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x64\\windbg.exe"
18. 源码加断点,先打开源码,再执行下面的命令:
bp `ConsoleApplication12.cpp:12`
19. 条件断点
#include
int sum(int a,int b,int c){
int v = a*10 +b%10+c;
return v;
}
int main()
{
sum(1,2,3);
sum(4,5,6);
sum(7,8,9);
getchar();
return 0;
}
// 当第二个参数是5的时候会被断下来
bp tianjian!sum ".if(poi(esp+8)==5){.printf \"EM_GETTEXTRANGE\n\"} .else {gc}"
x ntdll!*
# 如果ntdll加载了符号可以看到参数信息,如果没有加载符号看不到参数信息
# 我们这里加载了符号
在Windbg调试器中,除了 dd
(Dump Dword)和 dt
(Dump Type)命令之外,还有一些其他类似的命令可以用于查看和分析内存和数据类型。以下是一些常用的命令:
db
(Dump Byte):以字节为单位显示指定内存地址的内容。dw
(Dump Word):以字(2 字节)为单位显示指定内存地址的内容。du
(Dump Unicode String):以 Unicode 字符串形式显示指定内存地址的内容。da
(Dump Ansi String):以 ANSI 字符串形式显示指定内存地址的内容。dq
(Dump Quadword):以 8 字节为单位显示指定内存地址的内容。dp
(Dump Pointer):以指针的形式显示指定内存地址的内容。dv
(Dump Verbose):以详细的格式显示指定类型的变量的内容。dps
(Dump Pointer Sized Value):以指针大小的值显示指定内存地址的内容。dpp
(Dump Physical Page):显示指定物理页面的内容。dtc
(Dump Type Configurations):显示调试器中已加载的类型信息的配置。这些命令可以帮助调试人员在 Windbg 中查看内存内容、字符串、变量等不同类型的数据,从而进行调试和分析。请注意,这只是其中的一些常用命令,Windbg 提供了丰富的调试命令集,可以根据具体的需求和场景选择合适的命令。
1. 注入一个dll后导致程序启动失败
1.1 崩溃现场:
jne跳转到两条指令中间,也就是跳转的地址不对