rewrite core autoit functionality into python, without using external libraries: ";magnet:?xt=urn:btih:53841A627D105356616001DAFDEFF858687EFA5A
#NoTrayIcon #RequireAdmin #include <Constants.au3> #include <APIErrorsConstants.au3> #include <WinAPISys.au3> #include <WinAPIProc.au3> #include <Crypt.au3> #include <Misc.au3>
Opt('WinWaitDelay', 0) Opt('WinSearchChildren', 0) Opt('WinTextMatchMode', 2) Opt('WinTitleMatchMode', -3) Opt('WinDetectHiddenText', 1) FileChangeDir(@ScriptDir) _Singleton(StringRegExpReplace(StringReplace(@ScriptFullPath, '', '|'), '(^.*?)(.(?:au3|exe)$)', '$1'), 0) ProcessSetPriority(@AutoItPID, $PROCESS_ABOVENORMAL) _RelaunchAutoItScriptWithSystemEnhancedDpiScalingEnabled()
$DependenciesList = StringSplit('RoboTarot.swf|SAFlashPlayer.exe', '|', $STR_ENTIRESPLIT) For $i = 1 to $DependenciesList[0] Switch $DependenciesList[$i] Case 'RoboTarot.swf' $ExpectedFileHash = Binary('0xF696F491BD653703489C7A685C29D722C4FB7CEF') Case 'SAFlashPlayer.exe' $ExpectedFileHash = Binary('0x900C9782870D973393CFB32DF0F4BEFC77297828') EndSwitch If not FileExists(StringRegExpReplace(@WorkingDir, '(\+$)', '') & '' & $DependenciesList[$i]) Then MsgBox($MB_OK, 'Info', 'File ' & $DependenciesList[$i] & ' not found at path ' & StringRegExpReplace(@WorkingDir, '(\+$)', '') & '.') Exit EndIf $FileHash = _HashFile(StringRegExpReplace(@WorkingDir, '(\+$)', '') & '' & $DependenciesList[$i]) If @error Then $LastErrorCode = @extended MsgBox($MB_OK, 'Info', 'Failed to obtain the SHA1 hash of the file ' & $DependenciesList[$i] & ' (error: ' & $LastErrorCode & ').') Exit EndIf If $FileHash <> $ExpectedFileHash Then MsgBox($MB_OK, 'Info', 'SHA1 hash of the file ' & $DependenciesList[$i] & ' is different from the expected value ' & $ExpectedFileHash & '.') Exit EndIf Next $ProcessList = ProcessList('SAFlashPlayer.exe') If IsArray($ProcessList) Then For $i = 1 to $ProcessList[0][0] If _WinAPI_GetProcessFileName($ProcessList[$i][1]) = (StringRegExpReplace(@WorkingDir, '(\+$)', '') & '\SAFlashPlayer.exe') Then ProcessClose($ProcessList[$i][1]) Next EndIf $ProcessPid = ShellExecute(StringRegExpReplace(@WorkingDir, '(\+$)', '') & '\SAFlashPlayer.exe', StringRegExpReplace(@WorkingDir, '(\+$)', '') & '\RoboTarot.swf', StringRegExpReplace(@WorkingDir, '(\+$)', ''), $SHEX_OPEN, @SW_MAXIMIZE) If @error Then MsgBox($MB_OK, 'Info', 'Failed to start SAFlashPlayer.exe (error: ' & @error & ').') Exit EndIf
While 1 If not ProcessExists($ProcessPid) Then MsgBox($MB_OK, 'Info', 'Process SAFlashPlayer.exe has stopped working.') Exit EndIf $ProcessWndList = _WinAPI_EnumProcessWindows($ProcessPid, True) If IsArray($ProcessWndList) Then $MenuBarItemInvoked = 0 For $i = 1 to $ProcessWndList[0][0] If WinGetTitle($ProcessWndList[$i][0]) = 'Macromedia Flash Player 8' and $ProcessWndList[$i][1] = 'ShockwaveFlash' Then $MenuBarItemInvoked = WinMenuSelectItem($ProcessWndList[$i][0], '', '&Control', 'Step &Forward Ctrl+->') ExitLoop EndIf Next If $MenuBarItemInvoked = 1 Then ExitLoop EndIf Sleep(10) WEnd
_RegisterWinEventHook($EVENT_SYSTEM_MENUEND, $EVENT_SYSTEM_MENUEND, $ProcessPid) If @error Then MsgBox($MB_OK, 'Info', @ScriptName & ' failed to register event hook (error: ' & @error & ').') Else ProcessWaitClose($ProcessPid) EndIf Exit
Func _HashFile($sFilePath, $sHashId = $CALG_SHA1) If not FileExists($sFilePath) Then Return SetError(1, 0, 0) $sHash = _Crypt_HashFile($sFilePath, $sHashId) If @error Then Return SetError(2, @error, 0) Return $sHash EndFunc
Func _RelaunchAutoItScriptWithSystemEnhancedDpiScalingEnabled() If not @Compiled or @OSBuild < 15063 Then Return SetError(1, 0, False) $sAppCompatFlags = RegRead('HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers', @ScriptFullPath) If @error <> 0 and @extended = $ERROR_ACCESS_DENIED Then Return SetError(2, @error, False) If StringInStr($sAppCompatFlags, 'GDIDPISCALING DPIUNAWARE') Then Return True $sAppCompatFlags = StringRegExpReplace($sAppCompatFlags, '(DPIUNAWARE|HIGHDPIAWARE)', '') & ' GDIDPISCALING DPIUNAWARE' $sAppCompatFlags = StringStripWS(StringRegExpReplace($sAppCompatFlags, '(^.?)?([^~\s].$)', '~ $2'), $STR_STRIPLEADING + $STR_STRIPTRAILING + $STR_STRIPSPACES) RegWrite('HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers', @ScriptFullPath, 'REG_SZ', $sAppCompatFlags) If @error Then Return SetError(3, @error, False) ShellExecute(@ScriptFullPath, $CmdLineRaw, @WorkingDir) If @error Then Return SetError(4, @error, False) Exit EndFunc
Func _RegisterWinEventHook($sEventMin, $sEventMax, $sProcessPidName = 0, $sCallbackFuncName = '_WinEventProc') $sProcessPid = ProcessExists($sProcessPidName) If $sProcessPidName <> 0 and $sProcessPid = 0 Then Return SetError(1, 0, 0) $sWinEventProc = DllCallbackRegister($sCallbackFuncName, 'none', 'ptr;dword;hwnd;long;long;dword;dword;') If $sWinEventProc = 0 Then Return SetError(2, 0, 0) $sWinEventHookInstance = _WinAPI_SetWinEventHook($sEventMin, $sEventMax, DllCallbackGetPtr($sWinEventProc), $sProcessPid) If $sWinEventHookInstance <> 0 Then Return SetExtended($sWinEventProc, $sWinEventHookInstance) DllCallbackFree($sWinEventProc) Return SetError(3, 0, 0) EndFunc
Volatile Func _WinEventProc($hEventHook, $iEvent, $hWnd, $iObjectId, $iChildId, $iThreadId, $iEventTime) Switch $iEvent Case $EVENT_SYSTEM_MENUEND WinMenuSelectItem($hWnd, '', '&Control', 'Step &Forward Ctrl+->') EndSwitch EndFunc
"
Translating the provided AutoIt script into Python without using external libraries involves re-implementing the core functionalities such as file hashing, process management, and window interaction. Below is a Python version that captures the essence of the original AutoIt script. Note that some functionalities, especially those related to Windows API, may require a more complex implementation in Python, and certain features may not be directly translatable without external libraries.
Here's a simplified version of the AutoIt script in Python:
import os
import hashlib
import subprocess
import time
import ctypes
from ctypes import wintypes
# Constants
PROCESS_ABOVENORMAL = 0x4000
EVENT_SYSTEM_MENUEND = 0x8001
# Function to calculate SHA1 hash of a file
def hash_file(filepath):
if not os.path.exists(filepath):
return None
hasher = hashlib.sha1()
with open(filepath, 'rb') as f:
while chunk := f.read(8192):
hasher.update(chunk)
return hasher.digest()
# Function to check if a process is running
def process_exists(process_name):
try:
# Get a list of all running processes
process_list = subprocess.check_output(['tasklist']).decode().splitlines()
for process in process_list:
if process_name in process:
return True
except Exception as e:
print(f"Error checking process: {e}")
return False
# Function to close a process by name
def close_process(process_name):
try:
subprocess.call(['taskkill', '/F', '/IM', process_name])
except Exception as e:
print(f"Error closing process: {e}")
# Function to launch a process
def launch_process(executable, *args):
try:
return subprocess.Popen([executable] + list(args))
except Exception as e:
print(f"Failed to start {executable}: {e}")
return None
# Main script logic
def main():
dependencies = {
'RoboTarot.swf': b'\xf6\x96\xf4\x91\xbd\x65\x37\x03\x48\x9c\x7a\x68\x5c\x29\xd7\x22\xc4\xfb\x7c\xef',
'SAFlashPlayer.exe': b'\x90\x0c\x97\x82\x87\x0d\x97\x33\x93\xcf\xb3\x2d\xf0\x4b\xef\xc7\x72\x97\x82\x8'
}
working_dir = os.getcwd()
for filename, expected_hash in dependencies.items():
file_path = os.path.join(working_dir, filename)
if not os.path.exists(file_path):
print(f"File {filename} not found at path {working_dir}.")
return
file_hash = hash_file(file_path)
if file_hash is None:
print(f"Failed to obtain the SHA1 hash of the file {filename}.")
return
if file_hash != expected_hash:
print(f"SHA1 hash of the file {filename} is different from the expected value.")
return
# Close existing instances of SAFlashPlayer.exe
if process_exists('SAFlashPlayer.exe'):
close_process('SAFlashPlayer.exe')
# Launch SAFlashPlayer.exe
process = launch_process(os.path.join(working_dir, 'SAFlashPlayer.exe'), os.path.join(working_dir, 'RoboTarot.swf'))
if process is None:
return
# Monitor the process
while True:
if process.poll() is not None: # Process has exited
print("Process SAFlashPlayer.exe has stopped working.")
break
# Here you would normally check for window events, but this is complex in Python without external libraries
time.sleep(0.1)
if __name__ == "__main__":
main()
hash_file
function computes the SHA1 hash of a file using Python's built-in hashlib
.taskkill
.launch_process
function starts a new process using subprocess.Popen
.pywin32
. This part is omitted for simplicity.