From 57c26772569f64211641cc4751a76d8771690b72 Mon Sep 17 00:00:00 2001 From: xh321 Date: Tue, 29 Nov 2022 18:09:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 350 +++++++++++++++++++++++++++++++++++++++++ CefClassifier.cs | 204 ++++++++++++++++++++++++ CefDetector.Net.csproj | 14 ++ CefDetector.Net.sln | 25 +++ LICENSE | 21 +++ ProcessExecutor.cs | 126 +++++++++++++++ Program.cs | 26 +++ README.md | 36 +++++ screenshot.png | Bin 0 -> 40090 bytes 9 files changed, 802 insertions(+) create mode 100644 .gitignore create mode 100644 CefClassifier.cs create mode 100644 CefDetector.Net.csproj create mode 100644 CefDetector.Net.sln create mode 100644 LICENSE create mode 100644 ProcessExecutor.cs create mode 100644 Program.cs create mode 100644 README.md create mode 100644 screenshot.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f1229f --- /dev/null +++ b/.gitignore @@ -0,0 +1,350 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ \ No newline at end of file diff --git a/CefClassifier.cs b/CefClassifier.cs new file mode 100644 index 0000000..60f2317 --- /dev/null +++ b/CefClassifier.cs @@ -0,0 +1,204 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Security.AccessControl; +using Mono.Unix; + +namespace CefDetector.Net +{ + public enum CefType + { + UNKNOWN, + EDGE, + CHROME, + LIBCEF, + ELECTRON, + ELECTRON2, + CEF_SHARP, + NWJS, + MINI_ELECTRON, + MINI_BLINK + } + + public static class CefClassifier + { + public static List searchedDir = new(); + + public static Dictionary CefByteFingerprint = new() + { + { + CefType.LIBCEF, + Encoding.UTF8 + .GetBytes( "cef_string_utf8_to_utf16" ) + }, + { + CefType.ELECTRON, + Encoding.UTF8 + .GetBytes( "third_party/electron_node" ) + }, + { + CefType.ELECTRON2, + Encoding.UTF8 + .GetBytes( "register_atom_browser_web_contents" ) + }, + { + CefType.CEF_SHARP, + Encoding.UTF8 + .GetBytes( "CefSharp.Internals" ) + }, + { + CefType.NWJS, + Encoding.UTF8.GetBytes( "url-nwjs" ) + }, + { + CefType.MINI_ELECTRON, + Encoding.UTF8 + .GetBytes( "napi_create_buffer" ) + }, + { + CefType.MINI_BLINK, + Encoding.UTF8.GetBytes( "miniblink" ) + } + }; + + public static Dictionary> + CefBaseCheck = new() + { + { + CefType.EDGE, + ( dir ) => + { + var file = Path.Join( dir.FullName, "msedge" ); + return ( File.Exists( file ), file ); + } + }, + { + CefType.CHROME, + ( dir ) => + { + var file = Path.Join( dir.FullName, "chrome" ); + return ( File.Exists( file ), file ); + } + }, + }; + + private static bool FileByteContains( byte[] file, + byte[] search ) + { + return Parallel.For( 0, + file.Length - search.Length, + ( i, + loopState ) => + { + if ( file[ i ] == search[ 0 ] ) + { + byte[] localCache = new byte[ search.Length ]; + Array.Copy( file, i, localCache, 0, search.Length ); + if ( localCache.SequenceEqual( search ) ) + loopState.Stop(); + } + } ) + .IsCompleted == + false; + } + + public static List FilterExecuteBinaries( string[] files ) + { + List executeBinaries = new(); + foreach ( string file in files ) + { + Mono.Unix.UnixFileInfo ufi = new(file); + if ( ufi.FileAccessPermissions.HasFlag( FileAccessPermissions.UserExecute | + FileAccessPermissions.GroupExecute | + FileAccessPermissions.OtherExecute ) ) + { + executeBinaries.Add( file ); + } + } + + return executeBinaries; + } + + public static Dictionary CheckDirCefType( string dirPath ) + { + if ( !Directory.Exists( dirPath ) ) return new(); + + DirectoryInfo dir = new DirectoryInfo( dirPath ); + foreach ( var (type, checkFunc) in CefBaseCheck ) + { + var (isSucc, file) = checkFunc( dir ); + if ( isSucc ) + { + return new() + { + {file, type} + }; + } + } + + return new(); + } + + public static CefType CheckBinaryCefType( string filePath ) + { + if ( !File.Exists( filePath ) ) return CefType.UNKNOWN; + + byte[] fileContent = File.ReadAllBytes( filePath ); + CefType result = CefType.UNKNOWN; + + //浏览器文件字节检查 + foreach ( var (type, bytes) in CefByteFingerprint ) + { + if ( FileByteContains( fileContent, bytes ) ) + { + return type; + } + } + + return result; + } + + public static Dictionary SearchDir( string cefPath ) + { + if ( !File.Exists( cefPath ) ) return new(); + Dictionary cefBinaries = new(); + + var dir = new FileInfo( cefPath ).Directory!; + + //不搜索之前搜索过的目录 + if ( searchedDir.Contains( dir.FullName ) ) + { + return new(); + } + else + { + searchedDir.Add( dir.FullName ); + } + + //先根据目录检查 + var dirCheckResult = CheckDirCefType( dir.FullName ); + if ( dirCheckResult.Any() ) + { + return dirCheckResult; + } + + //再搜索目录内所有文件,检查字节 + var files = FilterExecuteBinaries( Directory.GetFiles( dir.FullName, "*", SearchOption.TopDirectoryOnly ) ); + foreach ( var file in files ) + { + if ( !cefBinaries.ContainsKey( file ) ) + { + var result = CheckBinaryCefType( file ); + if ( result != CefType.UNKNOWN ) + { + cefBinaries.Add( file, result ); + } + } + } + + return cefBinaries; + } + } +} diff --git a/CefDetector.Net.csproj b/CefDetector.Net.csproj new file mode 100644 index 0000000..e3dfc31 --- /dev/null +++ b/CefDetector.Net.csproj @@ -0,0 +1,14 @@ + + + + Exe + net7.0 + enable + enable + + + + + + + diff --git a/CefDetector.Net.sln b/CefDetector.Net.sln new file mode 100644 index 0000000..30f5ad1 --- /dev/null +++ b/CefDetector.Net.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33103.184 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CefDetector.Net", "CefDetector.Net.csproj", "{392FCB02-6127-49CF-8C7A-04C31AFA2128}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {392FCB02-6127-49CF-8C7A-04C31AFA2128}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {392FCB02-6127-49CF-8C7A-04C31AFA2128}.Debug|Any CPU.Build.0 = Debug|Any CPU + {392FCB02-6127-49CF-8C7A-04C31AFA2128}.Release|Any CPU.ActiveCfg = Release|Any CPU + {392FCB02-6127-49CF-8C7A-04C31AFA2128}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {93057F90-CA85-486C-92A2-A8A545536FAC} + EndGlobalSection +EndGlobal diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f74e4ab --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 XiaoHe321 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/ProcessExecutor.cs b/ProcessExecutor.cs new file mode 100644 index 0000000..4eff76c --- /dev/null +++ b/ProcessExecutor.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CefDetector.Net +{ + public class ProcessExecutor : IDisposable + { + public event EventHandler? OnExited; + + public event EventHandler? OnOutputDataReceived; + + public event EventHandler? OnErrorDataReceived; + + protected readonly Process _process; + + protected bool _started; + + public ProcessExecutor( string binPath ) : this( new ProcessStartInfo( binPath ) ) { } + + public ProcessExecutor( string binPath, + string arguments ) : this( new ProcessStartInfo( binPath, arguments ) ) { } + + public ProcessExecutor( ProcessStartInfo startInfo ) + { + _process = new Process() + { + StartInfo = startInfo, + EnableRaisingEvents = true, + }; + _process.StartInfo.UseShellExecute = false; + _process.StartInfo.CreateNoWindow = true; + _process.StartInfo.RedirectStandardOutput = true; + _process.StartInfo.RedirectStandardInput = true; + _process.StartInfo.RedirectStandardError = true; + } + + protected virtual void InitializeEvents() + { + _process.OutputDataReceived += ( sender, + args ) => + { + if ( args.Data != null ) + { + OnOutputDataReceived?.Invoke( sender, args.Data ); + } + }; + _process.ErrorDataReceived += ( sender, + args ) => + { + if ( args.Data != null ) + { + OnErrorDataReceived?.Invoke( sender, args.Data ); + } + }; + _process.Exited += ( sender, + args ) => + { + if ( sender is Process process ) + { + OnExited?.Invoke( sender, process.ExitCode ); + } + else + { + OnExited?.Invoke( sender, _process.ExitCode ); + } + }; + } + + protected virtual void Start() + { + if ( _started ) + { + return; + } + + _started = true; + + _process.Start(); + _process.BeginOutputReadLine(); + _process.BeginErrorReadLine(); + _process.WaitForExit(); + } + + public virtual async Task SendInput( string input ) + { + try + { + await _process.StandardInput.WriteAsync( input! ); + } + catch ( Exception e ) + { + OnErrorDataReceived?.Invoke( _process, e.ToString() ); + } + } + + public virtual int Execute() + { + InitializeEvents(); + Start(); + return _process.ExitCode; + } + + public virtual async Task ExecuteAsync() + { + InitializeEvents(); + return await Task.Run( () => + { + Start(); + return _process.ExitCode; + } ) + .ConfigureAwait( false ); + } + + public virtual void Dispose() + { + _process.Dispose(); + OnExited = null; + OnOutputDataReceived = null; + OnErrorDataReceived = null; + } + } +} diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..9eccdb4 --- /dev/null +++ b/Program.cs @@ -0,0 +1,26 @@ +using CefDetector.Net; + +Dictionary cefList = new(); + +Console.WriteLine("正在计算chrome内核个数,请等待,下面是列表:"); +using var executor = new ProcessExecutor( "find", " / -name *_percent.pak" ); +executor.OnOutputDataReceived += ( sender, + str ) => + { + var result = CefClassifier.SearchDir( str ); + foreach ( var (file, type) in result ) + { + if ( !cefList.ContainsKey( file ) ) + { + cefList.Add( file, type ); + Console.WriteLine( type + "|" + file ); + } + } + }; +executor.OnErrorDataReceived += ( sender, + str ) => + { + //Console.WriteLine( "ERR:" + str ); + }; +executor.Execute(); +Console.WriteLine($"喜报:您系统里总共有{cefList.Count}个chrome内核!(可能有重复计算)"); \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6211b1f --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +# CefDetector.Net - 检测你系统中包含多少个 Chromium 内核程序 + +Check how many CEFs are on your Linux. + +看看你系统 **(Linux)** 上有多少个 [CEF (Chromium Embedded Framework)](https://bitbucket.org/chromiumembedded/cef/). + +目前没有特别完善,可能还有很多情况没考虑到,欢迎发 issue ! + +(测试系统:Deepin 23 Alpha,Deepin上浏览器会存在重复检测的情况,看截图你就懂了) + +(也许可以起一个 Web 服务然后展示“喜报“,再说啦) + +> 目前仅支持Linux,Windows支持计划中... + +## 截屏 + +![Screenshot](./screenshot.png) + +## 使用 + +从 [Release](https://github.com/xh321/CefDetector.Net/releases) 页面下载最新的压缩包, 解压后给予 `CefDetector.Net` 执行权限后运行即可. + +## 特性 + +- 检测 CEF 的类型: 如 [libcef](https://bitbucket.org/chromiumembedded/cef/src/master/)、[Electron](https://www.electronjs.org/)、[NWJS](https://nwjs.io/)、[CefSharp](http://cefsharp.github.io/)、[Edge](https://www.microsoft.com/en-us/edge) 和 [Chrome](https://www.google.com/chrome/) +- 计算总数量 + +## 作者 + +xh321 + +创意来自 @ShirasawaSama 的 [CefDetector](https://github.com/ShirasawaSama/CefDetector) 项目。由于这个项目不支持Linux,所以我花一下午搓了一个功能差不多的。 + +## 协议 + +[MIT](./LICENSE) \ No newline at end of file diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a95517b2ccd2293bf66c3298030a34483c2c7fcf GIT binary patch literal 40090 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 literal 0 HcmV?d00001