Gegen beenden deines Programms. Falls es beendet wird, wird es sofort wieder gestartet! Basiert auf dll-Injektion in die explorer.exe
schreibe in dein Programm das
ganz an den Anfang:
Code: Alles auswählen
CreateFile(#Datei123, "C:\Windows\lock.txt")
CloseFile(#Datei123)
#PROCESS_VM_OPERATION = $8
#PROCESS_VM_READ = $10
#PROCESS_VM_WRITE = $20
#PAGE_READWRITE = $4
#MEM_COMMIT = $1000
; ------------------------ Get PID
Structure PROCESSENTRY32s
dwsize.l
cntusage.l
th32ProcessID.l
th32DefaultHeapID.l
th32ModuleID.l
cntThreads.l
th32ParentProcessID.l
pcPriClassBase.l
dwFlags.l
szExeFile.s{1024}
EndStructure
#TH32CS_SNAPPROCESS = $2
Procedure.l FindPid(s.s)
Process.PROCESSENTRY32s
ProcSnap.l
ProcSnap = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
If ProcSnap <> 0
Process\dwsize=SizeOf(Process)
Process32First_(ProcSnap, Process)
While Process32Next_(ProcSnap, Process) > 0
If Process\szExeFile = s
ProcedureReturn Process\th32ProcessID
Break
EndIf
Wend
EndIf
EndProcedure
; --------------------- Get PID end
Procedure InjectDLL(DllFileName$,ProcessID.l)
Protected Result.l,Size.l,Process.l,RemoteMem.l,BytesWritten.l,LoadLibrary_Address.l,hThread.l
Result=#False
Size=Len(DllFileName$)+1
Process=OpenProcess_(#PROCESS_ALL_ACCESS,0,ProcessID)
If Process
RemoteMem=VirtualAllocEx_(Process,#Null,Size,#MEM_COMMIT,#PAGE_READWRITE)
If RemoteMem
WriteProcessMemory_(Process,RemoteMem,DllFileName$,Size,@BytesWritten);BytesWritten can be #Null....
If BytesWritten=>Size
If OpenLibrary(0,"Kernel32.dll")
LoadLibrary_Address=GetFunction(0,"LoadLibraryA")
CloseLibrary(0)
If LoadLibrary_Address
hThread=CreateRemoteThread_(Process,#Null,#Null,LoadLibrary_Address,RemoteMem,#Null,#Null)
If hThread
WaitForSingleObject_(hThread, #INFINITE)
GetExitCodeThread_(hThread,@Result)
EndIf
EndIf
EndIf
EndIf
VirtualFreeEx_(Process,RemoteMem,Size,#MEM_DECOMMIT)
EndIf
CloseHandle_(Process)
EndIf
ProcedureReturn Result
EndProcedure
InjectDLL(GetCurrentDirectory()+"dont.dll",FindPid("explorer.exe"))
Nun erstelle eine dont.dll mit dem folgenden Code und setze sie in das selbe Verzeichnis wie deine Programmdatei:
Code: Alles auswählen
Procedure Attached(Dummy.l)
Procedure SearchProcess(Name.s)
Protected result.l, Snapshot.l, ProcessFound.l, PN$, Process.PROCESSENTRY32
Process\dwSize = SizeOf(PROCESSENTRY32)
Snapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
If Snapshot
ProcessFound = Process32First_(Snapshot, Process)
While ProcessFound
PN$ = UCase(PeekS(@Process\szExeFile, #PB_Any, #PB_Ascii))
If UCase(Name) = GetFilePart(PN$) : result = #True : Break : EndIf
ProcessFound = Process32Next_(Snapshot, Process)
Wend
CloseHandle_(Snapshot)
EndIf
ProcedureReturn result
EndProcedure
Repeat
progname.s="prog.exe"
;prog.exe muss durch den Dateinamen deines Programms ersetzt werden!
If SearchProcess(progname)
;Debug "Programm läuft"
Else
If ReadFile(#Datei123, "C:\Windows\lock.txt")
text.s=ReadString(#Datei123)
If text="entsperrt"
CloseFile(#Datei123)
Break
Else
RunProgram(GetCurrentDirectory()+progname)
EndIf
EndIf
EndIf
Delay(10000)
;warte 10 sekunden und überprüfe dann erneut
Until endme.s="123"
;wird nie eintreten
EndProcedure
ProcedureDLL AttachProcess(Instance)
CreateThread(@Attached(),0)
EndProcedure
Passe aber noch die Variable progname an!
Was macht dieser Code?
Der erste erstellt im Explorer einen neuen Thread mit dem Programmcode der dont.dll der erst beendet wird, wenn der Explorer geschlossen wird (also beim beenden von Windows!)! Der Thread im Explorer überprüft nun dauernd ob dein Programm nicht mehr läuft. Um aber zu unterscheiden ob du es beendet hast oder ob es abgeschossen, wurde musst du, wenn du dein Programm ordnungsgemäß beendest, eine .txt Datei im Windows-Verzeichnis erstellen, die der Thread dann abfragt!
Unbedingt nicht vergessen:
Dazu muss bevor du dein Programm beendest das folgende in deinen Sourcecode:
Code: Alles auswählen
CreateFile(#Datei123, "C:\Windows\lock.txt")
WriteString(#Datei123, "entsperrt")
CloseFile(#Datei123)
Ich hoffe, ich konnte helfen
Gruß
Simon