Windows DLL 버전을 덤프하는 명령 줄 도구?
bash 스크립트 (Cygwin)를 통해 처리 할 수 있도록 표준 Windows DLL 버전 정보를 덤프하는 명령 줄 도구가 필요합니다.
Java 개발자로서 저는 Microsoft 개발 도구에 익숙하지 않습니다 (Microsoft Visual Embedded C ++ 4.0 및 Microsoft Visual Basic 6.0에 대해 약간의 경험이 있지만).
적절한 도구는 SO에 명시된 것처럼 mt.exe 인 것 같습니다 . 그러나이 작은 응용 프로그램을 얻을 수있는 유일한 기회는 Windows Server 2008 및 .NET Framework 용 Windows SDK 의 1.29GB ISO를 다운로드하는 것 입니다. 이것이 유일한 방법이라는 것을 믿을 수 없습니다.
또한 인터넷에서 PEView 라는 작은 응용 프로그램을 찾았 지만 너무 많은 (내 경우에는 쓸모없는) 정보를 표시하고 명령 줄 응용 프로그램이 아닙니다.
Cygwin에 번들로 제공되는 표준 objdump 도 DLL 파일에 대한 일부 정보를 덤프 할 수 있지만 DLL 버전 덤프 옵션을 볼 수 없습니다. 이 도구에서 덤프 한 MajorImageVersion, MinorImageVersion 및 기타 필드 (-p 옵션 사용)는 자체 DLL 버전과 관련이 없습니다.
해야 할 일에 대한 대안이 있습니까? 중요한 objdump 옵션을 놓쳤을까요? mt.exe가 유일한 선택입니까? 이 경우 Windows SDK와 별도로 구할 수 있습니까?
Windows XP SP2 지원 도구 패키지의 일부로 다운로드 할 수있는 filever.exe도 볼 수 있습니다. 다운로드 용량은 4.7MB에 불과합니다.
PowerShell을 사용하여 원하는 정보를 얻을 수 있습니다.
(Get-Item C:\Path\To\MyFile.dll).VersionInfo
기본적으로 ProductVersion 및 FileVersion이 표시 되지만 전체 VERSIONINFO 를 사용할 수 있습니다. 즉 댓글을 반환하려면
(Get-Item C:\Path\To\MyFile.dll).VersionInfo.Comments
Microsoft Sysinternals Sigcheck를 사용하십시오 . 이 샘플은 다음 버전 만 출력합니다.
sigcheck -q -n foo.dll
압축을 푼 sigcheck.exe는 228KB에 불과합니다.
VBScript 스크립트를 작성하여 파일 버전 정보를 얻을 수 있습니다.
VersionInfo.vbs
set args = WScript.Arguments
Set fso = CreateObject("Scripting.FileSystemObject")
WScript.Echo fso.GetFileVersion(args(0))
Wscript.Quit
다음과 같이 명령 줄에서이를 호출 할 수 있습니다.
cscript //nologo VersionInfo.vbs C:\Path\To\MyFile.dll
또는 직접 만들 수 있습니다. VS를 열고 새 콘솔 응용 프로그램을 만듭니다. ATL 또는 MFC 지원이없는 간단한 프로젝트를 만들고 stdafx 옵션을 선택한 상태로두고 '빈 프로젝트'를 선택하지 말고 VersionInfo라고합니다.
VersionInfo.cpp 및 VersionInfo.h의 두 파일이있는 간단한 프로젝트가 생성됩니다.
cpp 파일을 열고 다음을 붙여 넣은 다음 컴파일하십시오. 실행할 수 있습니다. 첫 번째 인수는 전체 파일 이름이며 버전 리소스 블록을 기반으로 "제품 : 5.6.7.8 파일 : 1.2.3.4" 를 출력합니다. 버전 리소스가 없으면 -1을 반환하고 그렇지 않으면 0을 반환합니다.
모든 것이 정적으로 링크 된 dll CRT, 60k를 사용하여 8k 바이너리로 컴파일합니다 (C ++ 옵션에서 설정, "코드 생성 페이지, 런타임 옵션"을 "/ MT"로 변경).
HTH.
추신. Visual Studio를 사용하지 않으려는 경우에도 C ++ 컴파일러 (손가락 교차)를 사용하여 컴파일되지만 거의 확실하게 #pragma를 변경해야합니다. 대신 링커 설정에서 해당 lib를 지정하고 pragma의 해당 라이브러리와 자동으로 연결하는 약어입니다.
// VersionInfo.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#pragma comment(lib, "version.lib")
int _tmain(int argc, _TCHAR* argv[])
{
DWORD handle = 0;
DWORD size = GetFileVersionInfoSize(argv[1], &handle);
BYTE* versionInfo = new BYTE[size];
if (!GetFileVersionInfo(argv[1], handle, size, versionInfo))
{
delete[] versionInfo;
return -1;
}
// we have version information
UINT len = 0;
VS_FIXEDFILEINFO* vsfi = NULL;
VerQueryValue(versionInfo, L"\\", (void**)&vsfi, &len);
WORD fVersion[4], pVersion[4];
fVersion[0] = HIWORD(vsfi->dwFileVersionMS);
fVersion[1] = LOWORD(vsfi->dwFileVersionMS);
fVersion[2] = HIWORD(vsfi->dwFileVersionLS);
fVersion[3] = LOWORD(vsfi->dwFileVersionLS);
pVersion[0] = HIWORD(vsfi->dwProductVersionMS);
pVersion[1] = LOWORD(vsfi->dwProductVersionMS);
pVersion[2] = HIWORD(vsfi->dwProductVersionLS);
pVersion[3] = LOWORD(vsfi->dwProductVersionLS);
printf("Product: %d.%d.%d.%d File: %d.%d.%d.%d\n",
pVersion[0], pVersion[1],
pVersion[2], pVersion[3],
fVersion[0], fVersion[1],
fVersion[2], fVersion[3]);
delete[] versionInfo;
return 0;
}
C:\>wmic datafile where name="C:\\Windows\\System32\\kernel32.dll" get version
Version
6.1.7601.18229
Systernals의 listdlls 도구가 작업을 수행 할 수 있습니다. http://technet.microsoft.com/en-us/sysinternals/bb896656.aspx
listdlls -v -d mylib.dll
이 함수는 Cygwin bash (실제 r-click-properties-info)를 사용하는 모든 파일에 대한 ntfs Windows 파일 세부 정보를 용어로 반환합니다.
파일 경로를 finfo ()에 전달하십시오. unix 경로, dos 경로, 상대 또는 절대 일 수 있습니다. 파일은 절대 nix 경로로 변환 된 다음 실제로 일반 / 기존 파일인지 확인합니다. 그런 다음 절대 창 경로로 변환되어 "wmic"로 전송됩니다. 그런 다음 마술, 터미널에 Windows 파일 세부 정보가 있습니다. 용도 : cygwin, cygpath, sed 및 awk. 작동하려면 Windows WMI "wmic.exe"가 필요합니다. 출력은 쉽게 수정됩니다 ...
$ finfo notepad.exe
$ finfo "C:\windows\system32\notepad.exe"
$ finfo /cygdrive/c/Windows/System32/notepad.exe
$ finfo "/cygdrive/c/Program Files/notepad.exe"
$ finfo ../notepad.exe
finfo() {
[[ -e "$(cygpath -wa "$@")" ]] || { echo "bad-file"; return 1; }
echo "$(wmic datafile where name=\""$(echo "$(cygpath -wa "$@")" | sed 's/\\/\\\\/g')"\" get /value)" |\
sed 's/\r//g;s/^M$//;/^$/d' | awk -F"=" '{print $1"=""\033[1m"$2"\033[0m" }'
}
Powershell을 사용하면 다음 명령을 사용하여 모든 dll 또는 exe에서 버전 문자열, 즉 2.3.4를 가져올 수 있습니다.
(Get-Item "C:\program files\OpenVPN\bin\openvpn.exe").VersionInfo.ProductVersion
Windows 10에서 테스트 됨
CodeProject에 "ShowVer"라는 명령 줄 응용 프로그램이 있습니다.
ShowVer.exe 명령 줄 VERSIONINFO 디스플레이 프로그램
평소와 같이 응용 프로그램에는 exe 및 소스 코드 (VisualC ++ 6)가 함께 제공됩니다.
Out은 사용 가능한 모든 메타 데이터를 출력합니다.
독일어 Win7 시스템에서 user32.dll의 출력은 다음과 같습니다.
VERSIONINFO for file "C:\Windows\system32\user32.dll": (type:0)
Signature: feef04bd
StrucVersion: 1.0
FileVersion: 6.1.7601.17514
ProductVersion: 6.1.7601.17514
FileFlagsMask: 0x3f
FileFlags: 0
FileOS: VOS_NT_WINDOWS32
FileType: VFT_DLL
FileDate: 0.0
LangID: 040704B0
CompanyName : Microsoft Corporation
FileDescription : Multi-User Windows USER API Client DLL
FileVersion : 6.1.7601.17514 (win7sp1_rtm.101119-1850)
InternalName : user32
LegalCopyright : ® Microsoft Corporation. Alle Rechte vorbehalten.
OriginalFilename : user32
ProductName : Betriebssystem Microsoft« Windows«
ProductVersion : 6.1.7601.17514
Translation: 040704b0
및 편도 makecab
:
; @echo off
;;goto :end_help
;;setlocal DsiableDelayedExpansion
;;;
;;;
;;; fileinf /l list of full file paths separated with ;
;;; fileinf /f text file with a list of files to be processed ( one on each line )
;;; fileinf /? prints the help
;;;
;;:end_help
; REM Creating a Newline variable (the two blank lines are required!)
; set NLM=^
; set NL=^^^%NLM%%NLM%^%NLM%%NLM%
; if "%~1" equ "/?" type "%~f0" | find ";;;" | find /v "find" && exit /b 0
; if "%~2" equ "" type "%~f0" | find ";;;" | find /v "find" && exit /b 0
; setlocal enableDelayedExpansion
; if "%~1" equ "/l" (
; set "_files=%~2"
; echo !_files:;=%NL%!>"%TEMP%\file.paths"
; set _process_file="%TEMP%\file.paths"
; goto :get_info
; )
; if "%~1" equ "/f" if exist "%~2" (
; set _process_file="%~2"
; goto :get_info
; )
; echo incorect parameters & exit /b 1
; :get_info
; set "file_info="
; makecab /d InfFileName=%TEMP%\file.inf /d "DiskDirectory1=%TEMP%" /f "%~f0" /f %_process_file% /v0>nul
; for /f "usebackq skip=4 delims=" %%f in ("%TEMP%\file.inf") do (
; set "file_info=%%f"
; echo !file_info:,=%nl%!
; )
; endlocal
;endlocal
; del /q /f %TEMP%\file.inf 2>nul
; del /q /f %TEMP%\file.path 2>nul
; exit /b 0
.set DoNotCopyFiles=on
.set DestinationDir=;
.set RptFileName=nul
.set InfFooter=;
.set InfHeader=;
.Set ChecksumWidth=8
.Set InfDiskLineFormat=;
.Set Cabinet=off
.Set Compress=off
.Set GenerateInf=ON
.Set InfDiskHeader=;
.Set InfFileHeader=;
.set InfCabinetHeader=;
.Set InfFileLineFormat=",file:*file*,date:*date*,size:*size*,csum:*csum*,time:*time*,vern:*ver*,vers:*vers*,lang:*lang*"
예제 출력 (wmic 메소드에 약간 추가 된 문자열 버전이 있습니다. :)) :
c:> fileinfo.bat /l C:\install.exe
file:install.exe
date:11/07/07
size:562688
csum:380ef239
time:07:03:18a
vern:9.0.21022.8
vers:9.0.21022.8 built by: RTM
lang:1033
그리고 하나 더 Using shell.application and hybrid batch \ jscript . Here 's tooptipInfo.bat :
@if (@X)==(@Y) @end /* JScript comment
@echo off
rem :: the first argument is the script name as it will be used for proper help message
cscript //E:JScript //nologo "%~f0" %*
exit /b %errorlevel%
@if (@X)==(@Y) @end JScript comment */
//////
FSOObj = new ActiveXObject("Scripting.FileSystemObject");
var ARGS = WScript.Arguments;
if (ARGS.Length < 1 ) {
WScript.Echo("No file passed");
WScript.Quit(1);
}
var filename=ARGS.Item(0);
var objShell=new ActiveXObject("Shell.Application");
/////
//fso
ExistsItem = function (path) {
return FSOObj.FolderExists(path)||FSOObj.FileExists(path);
}
getFullPath = function (path) {
return FSOObj.GetAbsolutePathName(path);
}
//
//paths
getParent = function(path){
var splitted=path.split("\\");
var result="";
for (var s=0;s<splitted.length-1;s++){
if (s==0) {
result=splitted[s];
} else {
result=result+"\\"+splitted[s];
}
}
return result;
}
getName = function(path){
var splitted=path.split("\\");
return splitted[splitted.length-1];
}
//
function main(){
if (!ExistsItem(filename)) {
WScript.Echo(filename + " does not exist");
WScript.Quit(2);
}
var fullFilename=getFullPath(filename);
var namespace=getParent(fullFilename);
var name=getName(fullFilename);
var objFolder=objShell.NameSpace(namespace);
var objItem=objFolder.ParseName(name);
//https://msdn.microsoft.com/en-us/library/windows/desktop/bb787870(v=vs.85).aspx
WScript.Echo(fullFilename + " : ");
WScript.Echo(objFolder.GetDetailsOf(objItem,-1));
}
main();
cmd.exe에 대해 사용 :
C:\Windows\System32\cmd.exe :
File description: Windows Command Processor
Company: Microsoft Corporation
File version: 6.3.9600.16384
Date created: ?22-?Aug-?13 ??13:03
Size: 347 KB
일부 DLL의 경우 .rsrcobjdump
에서 수동으로 버전 정보를 찾았 습니다 . 와 함께 objdump -s -j .rsrc zlib1.dll
:
zlib1.dll: file format pei-x86-64
Contents of section .rsrc:
62e9e000 00000000 00000000 00000000 00000100 ................
62e9e010 10000000 18000080 00000000 00000000 ................
62e9e020 00000000 00000100 01000000 30000080 ............0...
62e9e030 00000000 00000000 00000000 00000100 ................
62e9e040 09040000 48000000 58e00100 34030000 ....H...X...4...
62e9e050 00000000 00000000 34033400 00005600 ........4.4...V.
62e9e060 53005f00 56004500 52005300 49004f00 S._.V.E.R.S.I.O.
62e9e070 4e005f00 49004e00 46004f00 00000000 N._.I.N.F.O.....
62e9e080 bd04effe 00000100 02000100 00000b00 ................
62e9e090 02000100 00000b00 3f000000 00000000 ........?.......
62e9e0a0 04000000 02000000 00000000 00000000 ................
62e9e0b0 00000000 94020000 01005300 74007200 ..........S.t.r.
62e9e0c0 69006e00 67004600 69006c00 65004900 i.n.g.F.i.l.e.I.
62e9e0d0 6e006600 6f000000 70020000 01003000 n.f.o...p.....0.
62e9e0e0 34003000 39003000 34004500 34000000 4.0.9.0.4.E.4...
62e9e0f0 64001e00 01004600 69006c00 65004400 d.....F.i.l.e.D.
62e9e100 65007300 63007200 69007000 74006900 e.s.c.r.i.p.t.i.
62e9e110 6f006e00 00000000 7a006c00 69006200 o.n.....z.l.i.b.
62e9e120 20006400 61007400 61002000 63006f00 .d.a.t.a. .c.o.
62e9e130 6d007000 72006500 73007300 69006f00 m.p.r.e.s.s.i.o.
62e9e140 6e002000 6c006900 62007200 61007200 n. .l.i.b.r.a.r.
62e9e150 79000000 2e000700 01004600 69006c00 y.........F.i.l.
62e9e160 65005600 65007200 73006900 6f006e00 e.V.e.r.s.i.o.n.
62e9e170 00000000 31002e00 32002e00 31003100 ....1...2...1.1.
62e9e180 00000000 34000a00 01004900 6e007400 ....4.....I.n.t.
62e9e190 65007200 6e006100 6c004e00 61006d00 e.r.n.a.l.N.a.m.
62e9e1a0 65000000 7a006c00 69006200 31002e00 e...z.l.i.b.1...
62e9e1b0 64006c00 6c000000 7c002c00 01004c00 d.l.l...|.,...L.
62e9e1c0 65006700 61006c00 43006f00 70007900 e.g.a.l.C.o.p.y.
62e9e1d0 72006900 67006800 74000000 28004300 r.i.g.h.t...(.C.
62e9e1e0 29002000 31003900 39003500 2d003200 ). .1.9.9.5.-.2.
62e9e1f0 30003100 37002000 4a006500 61006e00 0.1.7. .J.e.a.n.
62e9e200 2d006c00 6f007500 70002000 47006100 -.l.o.u.p. .G.a.
62e9e210 69006c00 6c007900 20002600 20004d00 i.l.l.y. .&. .M.
62e9e220 61007200 6b002000 41006400 6c006500 a.r.k. .A.d.l.e.
62e9e230 72000000 3c000a00 01004f00 72006900 r...<.....O.r.i.
62e9e240 67006900 6e006100 6c004600 69006c00 g.i.n.a.l.F.i.l.
62e9e250 65006e00 61006d00 65000000 7a006c00 e.n.a.m.e...z.l.
62e9e260 69006200 31002e00 64006c00 6c000000 i.b.1...d.l.l...
62e9e270 2a000500 01005000 72006f00 64007500 *.....P.r.o.d.u.
62e9e280 63007400 4e006100 6d006500 00000000 c.t.N.a.m.e.....
62e9e290 7a006c00 69006200 00000000 32000700 z.l.i.b.....2...
62e9e2a0 01005000 72006f00 64007500 63007400 ..P.r.o.d.u.c.t.
62e9e2b0 56006500 72007300 69006f00 6e000000 V.e.r.s.i.o.n...
62e9e2c0 31002e00 32002e00 31003100 00000000 1...2...1.1.....
62e9e2d0 78003000 01004300 6f006d00 6d006500 x.0...C.o.m.m.e.
62e9e2e0 6e007400 73000000 46006f00 72002000 n.t.s...F.o.r. .
62e9e2f0 6d006f00 72006500 20006900 6e006600 m.o.r.e. .i.n.f.
62e9e300 6f007200 6d006100 74006900 6f006e00 o.r.m.a.t.i.o.n.
62e9e310 20007600 69007300 69007400 20006800 .v.i.s.i.t. .h.
62e9e320 74007400 70003a00 2f002f00 77007700 t.t.p.:././.w.w.
62e9e330 77002e00 7a006c00 69006200 2e006e00 w...z.l.i.b...n.
62e9e340 65007400 2f000000 44000000 01005600 e.t./...D.....V.
62e9e350 61007200 46006900 6c006500 49006e00 a.r.F.i.l.e.I.n.
62e9e360 66006f00 00000000 24000400 00005400 f.o.....$.....T.
62e9e370 72006100 6e007300 6c006100 74006900 r.a.n.s.l.a.t.i.
62e9e380 6f006e00 00000000 0904e404 00000000 o.n.............
참고 URL : https://stackoverflow.com/questions/602802/command-line-tool-to-dump-windows-dll-version
'code' 카테고리의 다른 글
텍스트 상자에 정수만 허용하는 방법은 무엇입니까? (0) | 2020.11.22 |
---|---|
빌드 경로가 불완전하여 프로젝트가 빌드되지 않았습니다. (0) | 2020.11.22 |
OS X에서 'make'사용 (0) | 2020.11.22 |
matplotlib에서 임의의 색상을 생성하는 방법은 무엇입니까? (0) | 2020.11.22 |
C ++의 함수형 프로그래밍. (0) | 2020.11.22 |