Como pesquisar arquivos pelo ícone do arquivo

1

Eu tenho um arquivo EXE com um ícone associado a ele. Eu quero pesquisar vários sistemas para o mesmo ícone.

O nome do EXE pode ser diferente em cada sistema (é uma string aleatória de 12 caracteres). Mas o ícone parece permanecer o mesmo.

Como eu procuraria todos os arquivos com esse ícone específico?

    
por mcgyver5 05.12.2014 / 23:05

1 resposta

4

É possível

Use uma combinação de PowerShell, IconsExtract e ConsoleImageComparison .

  1. Extraia todos os ícones de todos os arquivos EXE em uma determinada pasta e suas subpastas usando o IconsExtract
  2. Compare cada ícone extraído com o ícone de referência original usando o ConsoleImageComparison
    Compara graficamente duas imagens e retorna uma porcentagem de quão alta é a diferença.
  3. Por fim, classifique todos os resultados por porcentagem de diferença e salve-os em um CSV para ver as melhores correspondências primeiro

Exemplo de saída

Aqui eu procurei pelo antigo ícone do Opera. Vejo que há 3 arquivos contendo meu ícone porque eles têm uma diferença de 0% em nosso ícone de referência. Além do nome do ícone extraído, também obtive o caminho onde o arquivo de origem reside.

IconsExtract

Usamos IconsExtract da Nirsoft para escanear um determinado arquivo e extrair cada ícone possível. Lembre-se, um único EXE ou DLL pode ter vários ícones nele. A opção -icons diz ao programa para extrair apenas arquivos ICO e deixar de fora arquivos PNG ou de cursor.

iconsext.exe /save "source file" "save folder" [-icons] [-cursors] [-asico]

Nós extraímos todos os ícones para uma pasta temporária e fazemos uma iteração em cada ícone e os comparamos. Depois disso, esvaziamos a pasta temporária e extraímos o próximo arquivo EXE na mesma pasta temporária. Então, estamos fazendo muita criação e exclusão de arquivos pequenos.

Um problema é que ícones visualmente idênticos podem ter várias versões de tamanho (32x32 vs. 255x255) e nossa comparação detectará grandes diferenças. Esse é um problema para a ferramenta comparar o ImageMagick , por exemplo.

Outro problema são cabeçalhos de imagem diferentes. Mesmo se a extensão for ICO, o tipo de imagem real é identificado usando alguns bytes exclusivos do conteúdo do arquivo. Extensão e conteúdo podem ser diferentes. Este é um problema para GraphicsMagick , um fork do ImageMagick.

ConsoleImageComparison

Por sorte, depois de algumas horas, encontrei o ConsoleImageComparison no www.codeproject.com. Usamos a habilidade de linha de comando, mas também tem uma GUI.

ImageComparisonConsole.exe [image1 path] [image2 path] 

PowerShell

Agoravemapartedifícil.Temosquejuntartodasessaspeças.JáquevocêestánoWindows,euprefirooPowerShell.ClaroquevocêpodeusarqualqueroutralinguagemdescriptcomooLinuxbashouoWindows,sevocêquiser

Porcomparação,vocêobtémumastringcomoDifferenceis80%.UsamosopadrãoRegExem(?<=Differenceis)\d+paraextrairovalornuméricoeadicioná-loaumarray.Apartirdaí,apenasordenamosoarrayeoenviamosparaumCSVdelimitadoportabulação.Nadaextravagante.

$folder = "D:\Browser\Internet\Browser" $icon = "C:\Users\Nixda\Desktop\Opera.ico" $scriptFolder = Split-Path $MyInvocation.MyCommand.Path $iconExt = "$scriptFolder\iconsext.exe" $CIC = "$scriptFolder\ConsoleImageComparison.exe" $results = @() get-childitem -path $folder -recurse -include @("*.exe") | foreach { & $iconExt /save $_.Fullname "$scriptFolder\temp" -icons |out-null $file = $_.fullname get-childitem -path "$scriptFolder\temp" | foreach { $percent = & $CIC $icon $_.Fullname | Select-String '(?<=Difference is )\d+' | % { $_.Matches } | % { $_.Value } $results += ,@([int]$percent, $_.Name, $file) } remove-item "$scriptFolder\temp" -recurse | out-null } $results | sort-object @{Expression={$_[0]}; Ascending=$true} | % { $_ -join "'t" } | out-File "$scriptFolder\result.csv" & "$scriptFolder\result.csv"

Como usar

  1. Faça o download de IconsExtract e ConsoleImageComparison e salve-os em uma pasta
  2. Abra um novo arquivo de texto, cole o código acima e salve-o como SearchByIcon.ps1 na mesma pasta. Agora você deve ter três arquivos em uma pasta
  3. Altere a variável $folder para sua pasta raiz, onde o script deve começar a pesquisar. Eu olho em todas as subpastas, mas apenas para arquivos EXE. Você pode mudar esse comportamento
  4. Altere a variável $icon para seu ícone de referência, que deve ser pesquisado por
  5. Clique com o botão direito do mouse em SearchByIcon.ps1 e selecione Executar com o PowerShell . Dependendo de quantos arquivos EXE você possui, o programa leva um tempo para terminar

Isso é tudo. Divirta-se.

Recebi alguns erros de falta de memória do ConsoleImageComparison. Mas parece não afetar o resultado ou abortar o programa

    
por 07.12.2014 / 02:17

Tags