cls
@echo off
setlocal enabledelayedexpansion

echo.
echo **************************************
echo *** Welkom bij c't-KeyFinder       ***
echo ***                                ***
echo *** Documentatie en downloads op   ***
echo *** https://www.ct.nl/ctkeyfinder  ***
echo **************************************
echo.

rem --------- Variabelen instellen, hier hoeft niets bij aangepast te worden -----------

Set workdir=%~d0%~p0Sources\
Set OutputFile=%~d0%~p0ctKey.txt
Set tmpdir=%workdir%Keyfindertmp
Set Generic=%tmpdir%\generic.txt
Set vbs=%workdir%\DecodeKey.vbs
Set checkpid=%workdir%\Check-Pid.ps1
Set Admin=1
Set PE=0
Set SRP=0

rem ----------- Opruimen als het script de vorige keer niet tot het einde werd uitgevoerd -----------

if exist %tmpdir% (
	For %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist "%tmpdir%\%%a:\Software" (
			reg unload HKLM\_Station_%%aSoftware >nul 2>nul
			reg unload HKLM\_Station_%%aSystem >nul 2>nul
	)
  if exist %generic% del %generic%
)
	
rem ----------- 32/64-bit toekenningen -----------

Set Strings=%workdir%Strings64.exe
Set BIOS=%tmpdir%\ctBiosKey64.exe
if "%ProgramW6432%" EQU "" set Strings=%workdir%Strings.exe && Set BIOS=%tmpdir%\ctBiosKey32.exe
if not exist %Strings% echo Fehler:  %Strings% ontbreekt. && echo. && pause && goto :eof

rem ----------- Draait het script onder PE? -----------

if exist %windir%\system32\wpeinit.exe set PE=1

rem ----------- Administratorrechten  aanwezig? -----------

if "%PE%" NEQ "1" %windir%\system32\whoami.exe /groups | %windir%\system32\find.exe "S-1-16-12288" > nul
	if errorlevel 1 set Admin=0
	
rem --------- Software Restriction Policies actief? -----------


If "%PE%" EQU "0" For /f %%a in ('powershell $ExecutionContext.SessionState.LanguageMode') do if "%%a" EQU "ConstrainedLanguage" set SRP=1

rem ------ Voor de PID-database zijn Admininistratorrechten nodig --------

if "%PE%" EQU "0" if "%SRP%" EQU "1" (
	echo ###############################################
	echo ###              Opgelet^^!                 ###
	echo ### PowerShell werkt in de modus            ###
	echo ### ConstrainedLanguage. Dat is normaal,    ###
	echo ### als Software Restriction Policies       ###
	echo ### actief zijn. Uitlezen van de informatie ###
	echo ### uit de PID-database is in deze          ###
	echo ### modus echter niet mogelijk.             ###
	echo ###                                         ###
	echo ### Druk op een toets om het script toch    ###
	echo ### voor te zetten of sluit het venster     ###
	echo ### en start het script via het contextmenu ###
	echo ### "Als administrator uitvoeren" opnieuw.  ###
	echo ###############################################
	echo.
	pause
)

rem ------ Voor het uitlezen van parallelle installaties zijn ook Administratorrechten nodig --------

if "%PE%" EQU "0" if "%Admin%" EQU "0" (
	For %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist "%%a:\windows" (
		if "%%a:" NEQ "%systemdrive%" (
				echo.
				echo ###############################################
				echo ###              Opgelet^^!                 ###
				echo ### Parallele installatie op %%a: gevonden. ###
				echo ### Het zoeken naar sleutel heeft daar      ###
				echo ### Administratorrechten voor nodig, maar   ###
				echo ### het script werkt momenteel zonder.      ###
				echo ###                                         ###
				echo ### Druk op een toets om het script toch    ###
				echo ### voor te zetten of sluit het venster     ###
				echo ### en start het script via het contextmenu ###
				echo ### "Als administrator uitvoeren" opnieuw.  ###
				echo ###############################################
				echo.
				pause
		)
	)
)


rem ------ Onder PE is het uitelzen van de PID-databbase niet mogelijke --------

if "%PE%" EQU "1" (
	echo ###############################################
	echo ### Het script draait onder Windows PE.     ###
	echo ###                                         ###   
	echo ### Het uitelzen van informatie uit de      ###
	echo ### PID-databasa is daarom niet mogelijk.   ###
	echo ### Druk op een toets om door te gaan.      ###
	echo ###############################################
	echo.
	pause
)

rem ------ Onder Windows 7 geen uitelzen van de BIOS-sleutel --------

if "%PE%" EQU "0" (
	for /f "tokens=3 delims=.]" %%z in ('ver') do (
		set build=%%z
		if !Build! LSS 9200 (
			echo .
			echo ###############################################
			echo ### Het script daarit onder Windows 7       ###
			echo ### of ouder. Sleutels in het Register      ###
			echo ### worden wel gevonden, maar zoeken        ###
			echo ### in het BIOS is hier niet mogelijk.      ###
			echo ###                                         ###
			echo ### Om ook in het BIOS te zoeken, start     ###
			echo ### je c't-KeyFinder onder                  ###
			echo ### Windows 8, 8.1, 10, 11 of met           ### 
			echo ### c't-rescue-Windows of met Windows PE.   ###
			echo ###                                         ###
			echo ### Druk op een toets om door te gaan.      ###
			echo ###############################################
			pause
		)
	)
)

rem ------ Onder PE ctBiosKey.exe uitpakken --------

if "%PE%" EQU "1" (
	if not exist %workdir%ctbioskey.7z echo Fout: %workdir%ctbioskey.7z ontbreekt. && echo. && pause
	set decrypt=%workdir%7z-64\7z.exe
	if "%ProgramW6432%" EQU "" set decrypt=%workdir%7z-32\7z.exe
	!decrypt! e -pctkeyfinder -o%tmpdir% %workdir%ctbioskey.7z >nul 2>nul
)

rem ----------- It giet oan -----------

md %tmpdir% >nul 2>nul

echo ### %COMPUTERNAME% ### %date% ### %time% >> %OutputFile% ###

echo.
echo Zoek in de systeembestanden naar niet-activeerbare sleutels...
echo.

For %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist "%%a:\windows" (
	echo Doorzoek station %%a: ...
	For %%d in ("%%a:\windows\System32\LicensingWinRT.dll" "%%a:\windows\System32\clipwinrt.dll" "%%a:\windows\System32\ClipUp.exe" "%%a:\windows\System32\pkeyhelper.dll" "%%a:\windows\System32\reseteng.dll" "%%a:\windows\System32\Dism\TransmogProvider.dll" "%%a:\windows\System32\oobe\winsetup.dll" "%%a:\windows\System32\Secinit.exe") do (
		if exist %%d echo Analyseer: %%d
		For /F %%g in ('%strings% -n 29 %%d -accepteula -nobanner 2^>nul') do (
			set Genkey=%%g
			if "!GenKey:~5,1!" EQU "-" if "!GenKey:~11,1!" EQU "-" if "!GenKey:~17,1!" EQU "-" if "!GenKey:~23,1!" EQU "-" echo %%g >> %generic%
		)
		if "%%a:" NEQ "%systemdrive%" (
			copy %%a:\windows\system32\Config\software %tmpdir%\%%aSoftware >nul 2>nul
			reg load HKLM\_Station_%%a_Software %tmpdir%\%%aSoftware >nul 2>nul
			copy %%a:\windows\system32\Config\system %tmpdir%\%%aSystem >nul 2>nul
			reg load HKLM\_Station_%%a_System %tmpdir%\%%aSystem >nul 2>nul
		)
	)
	echo.
)

if "%PE%" EQU "0" if !Build! LSS 9200 (
	echo. >> %OutputFile%
	echo Zoeken onder Windows 7 of ouder. >> %OutputFile%
	echo Daarmee is het uitlezen van de BIOS-sleutels niet mogelijk. >> %OutputFile%
	echo. >> %OutputFile%
	goto reg
)

echo.
echo Zoek sleutels in ACPI-tabel MSDM van de moederbordfirmware ...
echo.
		
if "%PE%" EQU "1" for /f "tokens=* delims=" %%k in ('%BIOS%') do set prodkey=%%k
if "%PE%" EQU "0" for /f "tokens=*" %%k in ('wmic path softwarelicensingservice get OA3xOriginalProductKey 2^>nul') do (
	set tmpKey=%%k
	if "!tmpKey:~5,1!" EQU "-" if "!tmpKey:~11,1!" EQU "-" if "!tmpKey:~17,1!" EQU "-" if "!tmpKey:~23,1!" EQU "-" set prodkey=%%k
	)
)

if "%prodkey%" EQU "" set prodkey=Geen productsleutel gevonden.

echo. >> %OutputFile%
echo BIOS-sleutel >> %OutputFile%
echo ### %prodkey% ### >> %OutputFile%
echo %prodkey%
	
if "%prodkey%" NEQ "Geen productsleutel gevonden." (				
	if "%PE%" EQU "0" if "%SRP%" EQU "0" (
  	for /f "delims=;" %%n in ('powershell -NoLogo -NoProfile -NonInteractive -EP Bypass -File %checkpid% ^"%prodkey%^" -SimpleOutput') do (
  		if "%%n" NEQ "Product onbekend" echo Volgens PID-database: %%n >> %OutputFile%
		)
	)
)

:reg

echo.
echo Zoek sleutels in het Register ...
echo.
for /f "delims=" %%d in ('reg query HKLM /s /v "DigitalProductId"') do (
	set Hits=%%d
	if "!Hits:~0,4!" EQU "HKEY" (
		echo Sleutel gevonden in %%d
		echo.
								
		for /f "tokens=* delims=" %%k in ('cscript.exe /nologo %vbs% "!Hits!\DigitalProductId"') do set prodkey=%%k
		
		echo. >> %OutputFile%
		echo. >> %OutputFile%
		echo ### !prodkey! ### >> %OutputFile%
						
		if "%PE%" EQU "0" if "%SRP%" EQU "0" (
			for /f "delims=;" %%n in ('powershell -NoLogo -NoProfile -NonInteractive -EP Bypass -File %checkpid% ^"^!prodkey^!^" -SimpleOutput') do (
				if "%%n" NEQ "Product onbekend" echo Volgens PID-database: %%n >> %OutputFile%
			)
		)
		
						
		for /f "tokens=3*" %%i in ('reg query "!Hits!" /v ProductName 2^>nul ^| %windir%\system32\find.exe "ProductName"') do if "%%i" neq "" for /f "tokens=3*" %%i in ('reg query ^"!Hits!^" /v ProductName 2^>nul ^| %windir%\system32\find.exe "REG_SZ"') do echo Volgens Register: %%i %%j >> %OutputFile%
		
		for /f "tokens=3*" %%m in ('reg query "!Hits!" /v CurrentBuild 2^>nul ^| %windir%\system32\find.exe "CurrentBuild"') do if "%%m" neq "" for /f "tokens=3*" %%m in ('reg query ^"!Hits!^" /v CurrentBuild 2^>nul ^| %windir%\system32\find.exe "REG_SZ"') do echo Volgens Register: Build %%m %%n >> %OutputFile%
		
		
		echo Locatie: !Hits! >> %OutputFile%
		
		if not exist %generic% echo ### Resultaat: geen uitspraak over activeerbaarheid mogelijk. ### >> %OutputFile%
		
		set gen=0
		
		if exist %generic% For /F %%t in (%generic%) do if %%t EQU !prodkey! set gen=1
		
		if !gen! EQU 1 (
			echo Resultaat: niet-activeerbare sleutel >> %OutputFile%
			) else (
				if exist %generic% (
					echo Resultaat: >> %OutputFile%
					echo #################################################################### >> %OutputFile%
					echo ######### Sleutel is eventueel te activeren. UITPROBEREN^^! ######## >> %OutputFile%
					echo #################################################################### >> %OutputFile%
				)
		)
		
		
	)
)

echo.  >> %OutputFile%

if "%PE%" EQU "1" (
	echo Opgelet^^! Draait onder PE. >> %OutputFile%
	echo Uitlezen van de informatie uit de >> %OutputFile%
	echo PID-database was daarom niet mogelijk. >> %OutputFile%
	echo.  >> %OutputFile%
)
	
If not exist %generic% (
	echo Opgelet^^! KeyFinder heeft nu geen >> %OutputFile%
	echo sleutels in de systeembestanden gevonden. >> %OutputFile%
	echo Uitspraken over sleutels zijn daarom niet mogelijk.  >> %OutputFile%
	echo.  >> %OutputFile%
)

For %%A in (%generic%) do (
	set Gensize=%%~zA
	if !Gensize! LEQ 10000 (
		echo Opgelet^^! KeyFinder heeft nu slecht >> %OutputFile%
		echo weinig informatie over niet-activeerbare >> %OutputFile%
		echo sleutesl in systeembestanden gevonden.  >> %OutputFile%
		echo Uitspraken over sleutels zijn daarom beperkt.  >> %OutputFile%
		echo.  >> %OutputFile%
	)
)

echo. >> %OutputFile%
echo. >> %OutputFile%
echo. >> %OutputFile%

For %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist "%%a:\windows" (
		if "%%a:" NEQ "%systemdrive%" (
			reg unload HKLM\_Station_%%a_Software >nul 2>nul
			reg unload HKLM\_Station_%%a_System >nul 2>nul
			)
	)


if exist %tmpdir% rd /q /s %tmpdir%
start notepad %OutputFile%
goto :eof


REM (C) 2023 Axel Vahldiek/Noud van Kruysbergen c't
REM Auteur van de VBS-routine helaas onbekend.
REM Versie 1.44