WPF界面反编译神器Snoop使用介绍
Events Tab页下可以列出程序的所有路由事件,这样我们就可以查看这些事件是如何路由的,以及这些事件是否被处理,被处理的路由事件会标识为绿色。利用Snoop可以看一下界面是如何布局的,控件样式是怎么样的,还可以查看某个界面对应的ViewModel叫什么,并定位到dll文件。可以将属性进行过滤,例如,我想查看颜色相关的属性,就切换为Color,想查看布局相关的属性,就切换为Layout。但是WP
Snoop介绍
Snoop 是一款开源的 WPF 监视工具,它能够监视或浏览任何正在运行的 WPF 应用程序的可视化、逻辑和自动化树(无需调试器),还可以更改属性值、查看触发器、在属性更改时设置断点等。
项目地址:GitHub - snoopwpf/snoopwpf: Snoop - The WPF Spy Utility
下载运行
可以到github release下载已经编译的二进制文件。
不同的snoop版本对应不同的.NET/.Net Framework版本,根据自己的需求下载对应的版本使用
Snoop | .NET Framework | .NET |
---|---|---|
3.0 | 4.0 | 3.0 |
4.0 | 4.5.1 | 3.0 |
5.0 | 4.5.2 | 3.1 |
6.0 | 4.6.2 | 6.0 |
也可以直接导入代码编译。
注意,这里有一个限制:不支持自包含的单个文件应用程序,因为没有可靠的方法来获取 .NET 运行时的句柄
软件原理
关于软件原理,我没有仔细的去读软件的源码,最近也比较忙。
当我用Snoop spy一个WPF程序时,在ProcessMonitor里查看进程模块时,会看到Snoop.Core.dll,如下 所示:
所以我猜想也是利用注入的原理。
在win32里,可以通过SetWindowHookEx/注入+HookApi之类的方式捕获调用进行spy。
但是WPF没有句柄,所以这里确实是有点强大了,不知道内部是如何实现的,等后面有时间的时候再去深入了解原理。
软件界面介绍
如何Spy WPF程序
我们这里以开源软件WindowsX为例
首先我们运行ScreenToGif和Snoop,然后通过上图6的按钮(或者在下列列表选中,再单击上图5的按钮),将鼠标光标拖动到WindowsX的界面上
Snoop的主界面主要由如下几部分组成
左边是树列表,可以切换显示Visual Tree/LogicalTree
右边上半部分是控件的一些参数,包括属性/数据上下文/事件/触发器等。
右边下半部分可以看到诊断日志和控件预览。
如何快速定位到控件
例如在WindowsX界面上有一个按钮,我们想快速定位到它,并查看相关参数。
我们只需要按住Ctrl+Shift键,然后移动鼠标到控件上即可,Snoop的可视化树会自动选中对应的控件
如何查看/保存控件缩略图
把鼠标放在可视化树上,可以看到控件的缩略图
如果我们想保存缩略图,在可视化树上选中后,在右下角的Preview页,单击【保存】按钮即可
查看/编辑控件属性
在左侧的可视化树中选择后,在右边的Properties Tab页可以看到控件的属性
搜索栏可以快速搜索属性
属性过滤可以将属性进行过滤,例如,我想查看颜色相关的属性,就切换为Color,想查看布局相关的属性,就切换为Layout。
还可以自己创建属性过滤器
选中属性后,可以对属性值进行编辑,编辑后界面会实时更新。
右键菜单选择Delve/或者双击可以查看属性详细值。
通过这个小三角按钮可以返回上一级
查看控件DataContext
在DataContext Tab页,可以看到当前在左侧选中控件绑定的DataContext,
使用MVVM模式开发的WPF程序,在这个标签页可以快速查看ViewModel中的属性和命令等。
可以通过上面的链接定位到ViewModel类所在的文件,再借用ILSpy/.Net Reflector之类的反编译工具,可以查看ViewModel代码
右键选择Delve或者双击属性,可以查看属性值
例如这里的StudentList是一个ObservableCollection<T>类型,我们用delve功能,可以看到集合内部的数据
还可以对这些值进行编辑,编辑后,界面会实时更新
查看控件事件
Events Tab页下可以列出程序的所有路由事件,这样我们就可以查看这些事件是如何路由的,以及这些事件是否被处理,被处理的路由事件会标识为绿色。
注意:这个标签页是针对整个应用程序的,你无法单独查看某个控件的事件。
g
查看控件触发器
在Triggers页,可以查看当前选中控件的触发器,如下所示
这里只能查看,不能修改
查看控件的行为
这里指的是使用了Microsoft.Xaml.Behaviors.Wpf包里的Behaviour相关的功能。
例如窗口XAML如下
1 <Window x:Class="WpfApp1.MainWindow" ... 2 xmlns:behaviour="http://schemas.microsoft.com/xaml/behaviors" 4 mc:Ignorable="d" 5 Title="MainWindow" Height="450" Width="800"> 6 <behaviour:Interaction.Behaviors> 7 <behaviour:MouseDragElementBehavior></behaviour:MouseDragElementBehavior> 8 </behaviour:Interaction.Behaviors> 9 <Grid> 10 </Grid>
在Snoop里面spy后,在Behaviours标签页显示如下
如果不了解WPF的行为,可以查看Home · microsoft/XamlBehaviors Wiki · GitHub
XAML Behaviors 是一种简单易用的方法,能以最少的代码为应用程序添加常用和可重复使用的交互性。
调用函数
Methods标签页允许你快速调用当前选中的控件的函数,例如,可以调用Hide()函数,隐藏当前窗口。
或者调用RaiseEvent()手动触发事件
总结
当我们在网上看到一个好看的WPF程序,想学习而没有源码时,就可以用到Snoop。
利用Snoop可以看一下界面是如何布局的,控件样式是怎么样的,还可以查看某个界面对应的ViewModel叫什么,并定位到dll文件。
最后再借助反编译工具,可以直接提取WPF里的资源,包括XAML和图片等。
Snoop最初是由 Pete Blois 创建,现在交由 Bastian Schmidt 维护,感谢两位大佬贡献这么强大的项目。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)