Mit Assembler laufenden Prozess beenden

Hallo Forum,

Ich wollte mal Fragen, wie es mit Assembler möglich ist einen Windows-Prozess zu beenden.
Ich habe schon länger danach gesucht, aber leider bis jetzt nichts brauchbares gefunden.
Wahrscheinlich brauche ich auch noch eine ProzessID, von der ich aber genau so wenig Ahnung habe, wie ich sie bekommen soll.
Weiss einer von euch vielleicht etwas darüber?
Codebeispiele wären gut.

Auf jeden Fall vielen Dank für Hilfe,

MfG, Xantoo
 
Hab ich von einem einfachem Antidebuggingtrick einer Crackme:
Code:
.DATA
olly db "OLLYDBG",0
...
.CODE
...
INVOKE FindWindowA,offset olly,0
INVOKE SendMessageA,eax,010h,0,0
Ist für MASM. Falls das mit invoke nicht geht, einfach push und call benutzen.
 
Hmm... Also notepad lässt sich damit - warum auch immer - ziemlich gut beenden, im Gegensatz dazu aber so gut wie kein anderer Prozess.

Ich habe im Internet noch was gefunden, das heißt TerminateProcess. Allerdings gab es nirgendwo 'ne Anleitung/Referenz, wie's funktioniert.
Hat jemand von euch davon Ahnung?
 
Wenn du den Fensternamen kennst, müsste es so gehen.

Code:
invoke FindWindow, NULL, SADD ("Fenstername")
;mov hWnd, eax
invoke GetWindowThreadProcessId, eax, ADDR ProcessID
invoke TerminateProcess, ProcessID, 0

Ich habs nicht getestet. Will grad keinen Neustart machen (bin mit linux unterwegs). Wenn du Probleme hast, sag Bescheid. Vergiss nicht für die Makros den entsprechenden include zu machen...
include \masm32\macros\macros.asm

Gibt ein schönes Beispiel mit VB wie man alle Prozesse ausliest.
http://www.vbarchiv.net/vbapi/CreateToolhelp32Snapshot.php
 
Naja, die Sprache ist egal, solange man die OS-Funktionen nutzt:

als erstes sollte das Programm SeDebugPriviledge haben, um etwas mehr ausrichten zu können:
Code:
GetSeDebugPrivilege proc
LOCAL   tkp:TOKEN_PRIVILEGES
LOCAL   hToken:HANDLE
LOCAL   curProc :HANDLE
	.data
	 debug db "SeDebugPrivilege",0
	 
	 currentID dd 0
	.code
	;;;;;; Das Programm höher privilegeren...
        invoke GetCurrentProcess
        mov curProc,eax
        invoke GetCurrentProcessId
        mov currentID,eax
        invoke OpenProcessToken,curProc,TOKEN_ADJUST_PRIVILEGES xor TOKEN_QUERY, addr hToken        
        invoke LookupPrivilegeValue,NULL, addr debug, addr tkp.Privileges[0].Luid 
        mov tkp.PrivilegeCount,1   
        mov tkp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
        invoke AdjustTokenPrivileges,hToken, FALSE, addr tkp, 0, NULL, 0 
        ;;;;;;;;;;;;;;;;  
	ret

GetSeDebugPrivilege endp

Prozessliste durchgehen:
(der folgende Code geht die Liste durch und füllt dabei eine ComboBox-Liste, das sollte sich auch umkrempeln lassen)
Code:
FillProcessList proc
LOCAL uProcess	: PROCESSENTRY32
LOCAL  hSnapshot :DWORD
LOCAL processNameID [MAX_PATH]:byte

.data
  templatePID db "%s [%d]",0
.code
  
     
     ;clear list
     invoke SendDlgItemMessage,hWin,IDC_PROCESSLIST,CB_RESETCONTENT,0,0
	 invoke	CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0	
	 mov hSnapshot,eax
	 .if eax!=-1 
	 	mov uProcess.dwSize, sizeof uProcess
	 	lea esi, processNameID
	 	lea ecx, uProcess
	 	invoke	Process32First, eax, ecx
	 	
	 	.while eax
	 		lea edi,[uProcess.szExeFile]	 		
	 		push eax
	 		invoke wsprintf,addr processNameID,addr templatePID,edi,uProcess.th32ProcessID	
	 		 pop eax		
	 		
	 		invoke SendDlgItemMessage,hWin,IDC_PROCESSLIST,CB_ADDSTRING,0,esi
	 		
	 		invoke SendDlgItemMessage,hWin,IDC_PROCESSLIST,CB_SETITEMDATA,eax,uProcess.th32ProcessID
	 		invoke	Process32Next, [hSnapshot], ADDR uProcess	 		
	 	.endw	
	   
	   
  

	  
	 
	   invoke SendDlgItemMessage,hWin,IDC_PROCESSLIST,WM_SETREDRAW,TRUE,0
	   invoke CloseHandle,hSnapshot
	 .endif	
	 ;damit das Feld nicht leer bleibt:
	 invoke SendDlgItemMessage,hWin,IDC_PROCESSLIST,CB_SETCURSEL,0,0
	 
	ret

FillProcessList endp
Und jetzt beenden (achtung, der nachfolgende code ist ca 5 Jahre alt):
Code:
Killtask proc Processnumber:DWORD
	LOCAL hProcess: HINSTANCE
	.data
	  Fehler_nicht_genug_Rechte db "Achtung, Prozess konnte aufgrund fehlender Berechtigung",13
	                            db "nicht beendet werden ... (so ist es vom System vorgesehen).",0	                            
	  Fehler_unbekannt          db "Prozess konnte nicht beendet werden ! ",0
	  Beende_mich_text          db "Befolge Ihre Befehle: begehe Selbstmord",0
	  Beende_mich_title        db  "Selbstzerstörung ...",0	                            
	.code
	invoke	OpenProcess, PROCESS_TERMINATE, 1, Processnumber	
	
	.if eax!=NULL
	    mov hProcess,eax
	    mov ebx,Processnumber
	   
	    invoke	TerminateProcess, hProcess, 0
	    invoke CloseHandle,hProcess
	  	invoke AktualisierenProc  
	  	
	.else
		invoke GetLastError
		.if eax==5		    
		   	  invoke MessageBox,hWin,addr Fehler_nicht_genug_Rechte,addr Fehler_title,MB_ICONERROR
		   	  

		.else
		     invoke MessageBox,hWin,addr Fehler_unbekannt,addr Fehler_title,MB_ICONERROR		   	 

		.endif
	.endif
		
	ret

Killtask endp
wenn man nur nach einem bestimmten Prozess sucht, so kann man irgendwo hiernach:
Code:
.while eax
	lea edi,[uProcess.szExeFile]
eine Überprüfung einfügen, da uProcess.szExeFile einen Pointer auf den Prozessnamen enthält.
http://msdn2.microsoft.com/en-us/library/ms684839.aspx

gezielte Suche nach einem Prozess:
(statt Prozess zu beenden, wird dieser gepatcht, lässt sich aber mit Minimalaufwand umrüsten, da hier schon alle Rechte richtig gesetzt werden sollten)
Code:
      .386                      
      .model flat, stdcall      
      option casemap :none      

;     include files
;     ~~~~~~~~~~~~~
      include \masm32\include\windows.inc
      include \masm32\include\masm32.inc
  
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc
      include \masm32\include\psapi.inc
      includelib \masm32\lib\psapi.lib
      include \masm32\include\advapi32.inc
      includelib \masm32\lib\advapi32.lib
;     libraries
;     ~~~~~~~~~
      includelib \masm32\lib\masm32.lib
    
      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib    
   ; ?????????????????????????????????????????????????????????????????????
.code


start:

	  jmp @f
	  hInstance dd 0
          hSnapshot dd 0
	  cmname db "zensiert.exe",0
	  error db "Fehler!",0
	  hExplorer dd 0
	  hProcess dd 0
	  ID dd 0	 	 
	  oldprotection dd 0
	  uProcess	PROCESSENTRY32	<>


	@@:
      invoke AddDebugPrivileges
      invoke GetModuleHandle,NULL
      mov hInstance,eax

       invoke	CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0	
	 mov hSnapshot,eax
	 
	 .if eax!=-1 
	 	mov uProcess.dwSize, sizeof uProcess	 	
	 	invoke	Process32First, eax, ADDR uProcess
	 		
	 	.while eax
	 		lea edi,[uProcess.szExeFile]
	 		
	 		push edi
	 		  lea esi,cmname   ;<---name der Exe
	 		  xor ecx,ecx
	 		  compare_loop:
	 		    mov al,byte ptr [edi]
	 		    mov ah,byte ptr [esi]
	 		    .if al==0 || ah==0
	 		        mov eax,uProcess.th32ProcessID
	 		    	mov hExplorer,eax
	 		    	jmp next1
	 		    .endif
	 		    .if al!=ah
	 		        jmp @f
	 		    .endif
	 		    add edi,1
	 		    add esi,1
	 		    jmp compare_loop
	 		    @@:
	 		pop edi	 	
	 		invoke	Process32Next, [hSnapshot], ADDR uProcess	
	 	.endw	
	  next1:
	  invoke CloseHandle,hSnapshot
	 .endif	
          ; hier kann man auch einen killaufruf machen
        invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,hExplorer
        .if eax!=0
          mov hProcess,eax
         invoke VirtualProtectEx,hProcess,77E41BBDh,1000h,PAGE_EXECUTE_READWRITE,addr oldprotection
        	.if eax!=0
        	     jmp @f                 
                  patch dw 0feebh
                   
                @@:
              invoke WriteProcessMemory,hProcess,77E41BBDh,offset patch,4,addr cmname
              .endif
        .else
        	invoke MessageBox,0,addr error,addr error,MB_ICONERROR
        .endif     
      invoke ExitProcess,eax

; ?????????????????????????????????????????????????????????????????????


; ?????????????????????????????????????????????????????????????????????

; ?????????????????????????????????????????????????????????????????????
AddDebugPrivileges PROC
;**********************

LOCAL tkP:TOKEN_PRIVILEGES
LOCAL hToken  :HANDLE
LOCAL CurProc :DWORD
.data
   debug  db "SeDebugPrivilege",0
.code


invoke GetCurrentProcess
mov CurProc,eax
lea eax,hToken

invoke  OpenProcessToken,CurProc,TOKEN_ADJUST_PRIVILEGES,eax

lea eax,tkP.Privileges[0].Luid
invoke LookupPrivilegeValue,NULL,addr debug,eax

mov [tkP.PrivilegeCount],1
mov tkP.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
lea eax,tkP

invoke AdjustTokenPrivileges,hToken,FALSE,eax,0,NULL,0

invoke CloseHandle,[hToken]
mov eax,0
ret
AddDebugPrivileges ENDP


end start
 
Zurück
Oben