前言
上回实现了自动生成sln中各project依赖图,可以分析一个VS solution里面每个project的依赖关系,但是这个太弱了。我需要exe、dll之间依赖图,所以只能继续想办法了。
思路
- 获取该软件目录下所有模块(exe和dll)
- 通过vs自带的dumpbin命令得到每个模块文件的依赖
- 画出graphviz的dot脚本
- graphviz绘图
使用方法
代码已经写好,放在https://github.com/CodeJuan/pe_dependency
先说怎么用
- 安装graphviz2.38http://www.graphviz.org/Download_windows.php到D盘program files
- 安装VS2010到到D盘program files
1
powershell .\dependency.ps1 -sw_path "软件的路径"
比如说我要分析腾讯TM,那么powershell .\dependency.ps1 -sw_path "D:\Program Files\Tencent\TM"
就OK啦
代码
获取目录下所有PE
1 | $get_pe_cmd = "dir /S /B /a-d-h-s `"$sw_path`" | findstr /I `".dll .exe`" > files.txt" |
其中findstr /I
表示忽略大小写
拷贝mspdb100.dll
由于无法直接调用vs2010 command prompt,所以没有设置环境变量,在使用dumpbin的时候会提示缺少mspdb100.dll
,这就需要把mspdb100.dll
拷贝到dumpbin.exe所在的vc_bin
目录下1
2$vs_path="D:\Program Files\Microsoft Visual Studio 10.0"
copy-item "$vs_path\Common7\IDE\mspdb100.dll" "$vc_bin" -Force
我的测试机是x86 32位
,如果路径有变化,修改$vs_path
即可
graphviz画图
1 | $graph_dot="D:\Program Files\Graphviz2.38\bin\dot.exe" |
我的graphviz装在D盘,如果有变化,修改$graph_dot
即可
通过dumpbin获取依赖
1 | $dump_cmd = "`"$dumpbin`" /dependents `"$line`" | findstr /I .dll | findstr /I /vi `"dump of file`" > $deptxt" |
把依赖关系写入dot
1 | append "`"$pename`"[shape=box,fontname=consolas];" |
graphviz画图
1 | $draw = "`"$graph_dot`" $graphtxt -Tpng > dependency_graph.png" |
效果图
分析了一下腾讯TM
本博客欢迎转发,但请保留原作者信息
github:codejuan
博客地址:http://blog.decbug.com/