引用自:
两年前,这个问题一直就这样挂起了,本着闲来无事找事的心态,把事情的前因后果从头分析了一遍
玩过VS的应该都知道,这样一来,不管是创建dll或者exe就不会生成pdb符号文件了
但是用WDK10创建驱动就不一定了,创建sys始终会生成pdb文件,那么问题来了,pdb符号文件是谁生成的呢?
可能有些人不知道,VS的开发工具里面有一个mspdbsrv.exe,看这个进程名字大概可以猜出来,就是它生成pdb符号文件的
那么继续反推,VS是如何调用这个进程的呢?
看到这里,link.exe有没有熟悉的感觉呢?没错,就是link调用的mspdbsrv,那就继续回溯,来看一下堆栈
link通过CreateProcess调用了mspdbsrv,有了这条线索,那么接下来就好办了,直接用OD附加link
根据上面的截图来对比分析,来到 link.exe + 0x30d60
也就是说,判断 cmp byte ptr ds:[0x6980F9],0x0 里面的值不为0,才会调用mspdbsrv
IDA可以发现这里面的初始值就是1,那意思就是,如果不生成pdb文件,就需要调用一段代码去把这里面的值写成0,继续回溯分析
如上截图,and byte ptr ds:[0x6980F9],al 写入了0,所以就不生成pdb文件
而前面生成驱动的时候,那个0x20000标记,就会跳过写入0
现在一切变得越来越清晰了
mov edx,dword ptr ss:[ebp-0x45C]
test dword ptr ds:[edx+0x150],0x20000
问题似乎就出在这个0x20000的标记上,但是哪里又写入了0x20000呢?接下来谜底该彻底揭开了
0056C861 68 44495100 push link.00514944 ; UNICODE "profile"
0056C866 FF37 push dword ptr ds:[edi]
0056C868 FF95 68DCFFFF call dword ptr ss:[ebp-0x2398]
0056C86E 59 pop ecx
0056C86F 59 pop ecx
0056C870 85C0 test eax,eax
0056C872 0F84 F2520500 je link.005C1B6A ; 跳过去
就来到
005C1B6A 818E 50010000 00000200 or dword ptr ds:[esi+0x150],0x20000 ; 给了0x20000
005C1B74 ^ E9 DEAFFAFF jmp link.0056CB57
"profile",是的,最终矛头就是指向配置文件,找一下链接器高级选项
改成否,VS创建驱动再也不会生成pdb符号文件了
exe或dll工程这个选项默认就是否,但是驱动却给了/PROFILE
很难想象,也很难注意到,这个选项居然跟pdb符号文件有关
原来如此,高级也并不高级,微软这么干,目的何在?