自动生成软件中模块依赖图

前言

上回实现了自动生成sln中各project依赖图,可以分析一个VS solution里面每个project的依赖关系,但是这个太弱了。我需要exe、dll之间依赖图,所以只能继续想办法了。

思路

  1. 获取该软件目录下所有模块(exe和dll)
  2. 通过vs自带的dumpbin命令得到每个模块文件的依赖
  3. 画出graphviz的dot脚本
  4. graphviz绘图

使用方法

代码已经写好,放在https://github.com/CodeJuan/pe_dependency
先说怎么用

  1. 安装graphviz2.38http://www.graphviz.org/Download_windows.php到D盘program files
  2. 安装VS2010到到D盘program files
    1
    powershell .\dependency.ps1 -sw_path "软件的路径"

比如说我要分析腾讯TM,那么powershell .\dependency.ps1 -sw_path "D:\Program Files\Tencent\TM"就OK啦

代码

获取目录下所有PE

1
2
$get_pe_cmd = "dir /S /B /a-d-h-s `"$sw_path`" | findstr /I `".dll .exe`" > files.txt"
cmd /c "$get_pe_cmd"

其中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
2
3
$graph_dot="D:\Program Files\Graphviz2.38\bin\dot.exe"
$draw = "`"$graph_dot`" -Tpng graph.txt > graph.png"
cmd /c "$draw"

我的graphviz装在D盘,如果有变化,修改$graph_dot即可

通过dumpbin获取依赖

1
2
$dump_cmd = "`"$dumpbin`" /dependents `"$line`" | findstr /I .dll | findstr /I /vi `"dump of file`" > $deptxt"
cmd /c "`"$dump_cmd`""

把依赖关系写入dot

1
2
3
4
5
6
7
append "`"$pename`"[shape=box,fontname=consolas];"
append "`"$pename`"->{"
if ($bFound -eq 1)
{
append "`"$depen`";"
}
append "};"

graphviz画图

1
2
3
4
5
$draw = "`"$graph_dot`" $graphtxt -Tpng  > dependency_graph.png" 
write-host $draw
cmd /c "$draw"

`

效果图

分析了一下腾讯TM


本博客欢迎转发,但请保留原作者信息
github:codejuan
博客地址:http://blog.decbug.com/