|
[ Eurora3D Team @ 06.01.2007. 14:58 ] @
| Ovo je MASM32 primer CommandLine programa za unistavanje procesa pod Win32.
Za ostale asemblere koji ne podrzavaju invoke treba izmeniti pozive ka Api funkcijama
Primer:
invoke MessageBox,0,addr Text,addr Titl,MB_OK
sa
push MB_OK
push offset Titl
push offset Text
push 0
call MessageBox
U programu su koriscene i neke Masm High Level funkcija (iz masm32.lib) (inString , szRight) koje treba zameniti svojim.
trmPresess.asm
Code:
;(c) Eurora3D Team - http://www.extramedia.co.yu/eurora3d/
;Program za ukidanje procesa / programa
;Koriscenje - Komandna Linija (napisite je u Notepad-u i snimite kao NekoIme.bat
;NAPOMENA : velika i mala slova u imenu programa moraju da budu ista kao u TaskMenageru npr.: notepad.exe ne Notepad.exe
;Komandna Linija : trmProcess C:\NekiProgram.exe ili trmProcess NekiProgram.exe
;Isto vazi i za pozivanje iz nekog drugog programa (C:\trmProcess.exe notepad.exe)
;Program nema GUI i nije vidljiv pri izvrsenju
;Ovaj kod je napisan za Assembler MASM32 sa HighLevel funkcijama
;Komande za assembler MASM32
;C:\Masm32\Bin\ML.EXE /c /coff /Cp /nologo /I"C:\Masm32\Include" "trmProcess.asm"
;i linker
;C:\Masm32\Bin\LINK.EXE /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /LIBPATH:"C:\Masm32\Lib" /OUT:"trmProcess.exe" "trmProcess.obj"
.586
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
include MACROS.ASM
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
.data
hSnapShot DD ? ; snapshot handler
hSnapShot2 DD ? ; snapshot handler
myProcess PROCESSENTRY32 <> ; process struktura
hProcess dd ?
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
.code
; ---------------------------------------------------------------------------
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL Com[256]:byte
LOCAL blank:DWORD
LOCAL del:DWORD
LOCAL lenn:DWORD
LOCAL buff1[MAX_PATH]:byte
LOCAL buff2[MAX_PATH]:byte
;********************************************************
;Command Line Parser - Uklanjamo prvi deo CommLine (ime programa "trmPrograma ")
invoke lstrcpy,addr Com,CmdLine
invoke lstrlen,addr Com
mov buff1[0],0
mov buff2[0],0
mov lenn,eax
mov blank,eax
mov del,eax
invoke lstrcpy,addr buff1,addr Com
invoke InString,1,addr Com,SADD(" ")
mov blank,eax
.if eax==0
invoke lstrcpy,addr buff1,addr Com
jmp @F
.endif
mov eax,lenn
sub eax,blank
invoke szRight,addr Com,addr buff1,eax
@@:
mov eax,lenn
invoke lstrcpy,addr buff2,addr buff1
invoke InString,1,addr Com,SADD("\")
.while eax!=0
mov del,eax
.if eax<lenn
inc del
.endif
mov edi,lenn
sub edi,del
inc edi
invoke szRight,addr Com,addr buff2,edi
invoke InString,del,addr Com,SADD("\")
.endw
invoke lstrlen,addr buff1
.if eax==0
ret
.endif
invoke lstrlen,addr buff2
.if eax==0
ret
.endif
;Za debugovanje obrisite ; ispred sledece dve linije
;invoke MessageBox,0,addr buff1,SADD("trmProcess"),MB_OK
;invoke MessageBox,0,addr buff2,SADD("trmProcess"),MB_OK
;
;*****************************************************
;Process Unistavanje
pushad
invoke CreateToolhelp32Snapshot, TH32CS_SNAPALL, 0 ; kreiranje snapshot
mov hSnapShot, eax ;cuvanje snapshot hendlera
mov myProcess.dwSize, sizeof myProcess ; podesavamo velicinu Proc. strukture
invoke Process32First,hSnapShot, ADDR myProcess ; dobijamo prvi proces
.while eax; kruzimo kroz sve procese
; Ovde imamo dva if-a jedan za punu aresu programa a drugi samo za ima programa
invoke lstrcmp,addr myProcess.szExeFile,addr buff1
.if eax==0
invoke OpenProcess,PROCESS_ALL_ACCESS, FALSE,myProcess.th32ProcessID
.if eax !=0
mov hProcess,eax
invoke TerminateProcess,hProcess,0
invoke CloseHandle,hProcess
.endif
.endif
invoke lstrcmp,addr myProcess.szExeFile,addr buff2
.if eax==0
invoke OpenProcess,PROCESS_ALL_ACCESS, FALSE,myProcess.th32ProcessID
.if eax !=0
mov hProcess,eax
invoke TerminateProcess,hProcess,0
invoke CloseHandle,hProcess
.endif
.endif
invoke Process32Next,hSnapShot, ADDR myProcess ;dobijamo sledeci proces u eax-u
.endw
invoke CloseHandle,hSnapShot
popad
;**********************************************************
ret
WinMain endp
end start
Uz primer zakacen je i zip sa sors kodom i napravljenim programom |
[ Eurora3D Team @ 29.05.2007. 22:04 ] @
Da dodam i ovo
Unistavanje procesa je bukvalan prevod (ovakvi izrazi se cesto koristi u dokumentaciji).
Bolji (blazi) pevod bi bio Ukidanje rada nekog programa.
[ Eurora3D Team @ 14.07.2007. 01:12 ] @
System Tray primer
Ispod je kod / primer za koriscenje System Tray-a (malih ikonica kod sata u Windowsu) u Win32 assembler - u.
Kod je za MASM32 assembler.
Svi komentari i uputstva su u kodu.
Da bi se assemblirao potreban je assembler MASM32
Code:
;MASM32 Primer koriscenja System Tray-a
;Program kreira prozor. Kada korisnik pritisne dugme _ za minimalizovanje
;program pravi tray i konicu i meni na njoj koji je dostupan desnim klikom
;Dok je Tray ikonica aktivna glavni prozor je nevidljiv i obrnuto
.386
.model flat,stdcall
option casemap:none
;inkludovali smo potrebne inc i lib fajlove
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\shell32.lib
;Globalne konstante i promenljive u programu su ispod
WM_SHELLNOTIFY equ WM_USER+5
IDI_TRAY equ 0
IDM_RESTORE equ 1000
IDM_EXIT equ 1010
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
.data
ClassName db "TrayIconWinClass",0
AppName db "TrayIcon Demo",0
RestoreString db "&Vrati na predhodnu velicinu",0
ExitString db "I&skljuci program",0
.data?
hInstance dd ?
note NOTIFYICONDATA <>
hPopupMenu dd ?
.code
start:
;Klasican start , uzimamo modul handler i idemo na WinMain .
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT ; Iz ove procedure cemo se vratiti kada prozor bude unisten
invoke ExitProcess,eax ;i ovo je kraj programa .
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
;Klasicna WinMain procedura koja kreira jedan prozor
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX ; Punjenje WNDCLASSEX strukture wd. Koristimo mov i Stack (Push Pop)
mov wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS ;stil prozora
mov wc.lpfnWndProc, OFFSET WndProc ;Nasa window procedura (to je sledeca funkcija u programu)
mov wc.cbClsExtra,NULL ;broj extra bajtova za klasu (ovo se nekad koristi da bi se neki podatci cuvali u ovoj strukturi)
mov wc.cbWndExtra,NULL ;slicno kao i gornji komentar
push hInst
pop wc.hInstance ;instanca programa. Svaki process ima svoj jedinstveni ID u windows-u
mov wc.hbrBackground,COLOR_APPWORKSPACE ;boja prozora
mov wc.lpszMenuName,NULL ;meni nemamo
mov wc.lpszClassName,OFFSET ClassName ;ime klase prozora
invoke LoadIcon,NULL,IDI_APPLICATION ;klasicna app ikonica
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW ;kursor strelica
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc ;Da bi registrovali klasu za nas window i u sledecoj liniji ga kreiramo
invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_MAXIMIZEBOX+WS_VISIBLE,CW_USEDEFAULT,\
CW_USEDEFAULT,350,200,NULL,NULL,hInst,NULL
mov hwnd,eax
.while TRUE ; Ovo je Message loop iz koje se izlazi kad iskljucimo prozor. Do tada je aktivna WndProc koja je pozvana kroz DispatchMessage
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endw
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
;Ovo je nasa window procedura u kojoj procesuiramo poruke za nas prozor koje nas zanimaju
LOCAL pt:POINT ;lokalna promenljiva tipa tacka x,y
.if uMsg==WM_CREATE ; Ova poruka je poslada nasem prozoru od windowsa prilikom kreiranja
invoke CreatePopupMenu ;Kreiramo Popup meni ( onaj koji se pokazuje desnim klikom )
mov hPopupMenu,eax ; i cuvamo njegov handler u promenjljivoj
invoke AppendMenu,hPopupMenu,MF_STRING,IDM_RESTORE,addr RestoreString ; dodajemo 2 itema u nas meni
invoke AppendMenu,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString ;ovo je drugi
.elseif uMsg==WM_DESTROY ;Ova poruka je poslata nasem prozoru od windowsa kada prozor treba da se unisti
invoke DestroyMenu,hPopupMenu ; Brisemo nas Popup meni
invoke PostQuitMessage,NULL ;i saljemo poruku o prekidu
.elseif uMsg==WM_SIZE ; Ova poruka je poslada nasem prozoru od windowsa kada prozor treba da promeni velicinu
.if wParam==SIZE_MINIMIZED ; U wParamu imamo vrstu promene velicine . Treba nam poruka za minimalizovanje
mov note.cbSize,sizeof NOTIFYICONDATA ;popunjavamo strukturu za notifikaciju (kada predjemo misem preko ikonice u tray-u)
push hWnd
pop note.hwnd ;ID naseg prozora
mov note.uID,IDI_TRAY ; ID koji se odredjivati nasu ikonicu .Ovaj id smo mi odredili i on je 0
mov note.uFlags,NIF_ICON+NIF_MESSAGE+NIF_TIP ;flagovi
mov note.uCallbackMessage,WM_SHELLNOTIFY ; ovo je callback poruka koju cemo da dobijemo od windowsa (iz system tray-a)
invoke LoadIcon,NULL,IDI_APPLICATION ; koristimo klasicnu app ikonicu
mov note.hIcon,eax
invoke lstrcpy,addr note.szTip,addr AppName ;Ovo je tekst koji se vidi kad se misem predje preko tray ikonice
invoke ShowWindow,hWnd,SW_HIDE ; Sakrivamo nas prozor
invoke Shell_NotifyIcon,NIM_ADD,addr note ;I aktiviramo tray notifikaciju
.endif
.elseif uMsg==WM_COMMAND ; Ove komandne poruke dobijamo od nase Popup menija
;Imamo 2 itema Vrati velicinu i Izlaz .
.if lParam==0
invoke Shell_NotifyIcon,NIM_DELETE,addr note ;U svakom slucaju tray nam vise ne treba
mov eax,wParam
.if ax==IDM_RESTORE ;ako je komanda sa naseg menija IDM_RESTORE
invoke ShowWindow,hWnd,SW_RESTORE ;Onda vracamo prozor u prvobitno stanje
.else ;inace
invoke DestroyWindow,hWnd ;posto je nasa druga komanda za Izlaz unistavamo prozor i kasnije izlazimo iz programa
.endif
.endif
.elseif uMsg==WM_SHELLNOTIFY ;Ako smo dobili poruku iz tray-a
.if wParam==IDI_TRAY ;sa nasim ID-om
.if lParam==WM_RBUTTONDOWN ; ako je pritisnuto desno dugme
invoke GetCursorPos,addr pt ;uzimamo poziciju kursora da bi tu prikazali nas Popup meni
invoke SetForegroundWindow,hWnd ;postavljamo nas prozor kao gornji iako nije vidljiv (ovo je bitan trik)
invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTALIGN,pt.x,pt.y,NULL,hWnd,NULL ; prikazujemo nas Popup meni
invoke PostMessage,hWnd,WM_NULL,0,0 ;saljemo null prozoru
.elseif lParam==WM_LBUTTONDBLCLK ;ako je dva puta kliknuto na ikonicu
invoke SendMessage,hWnd,WM_COMMAND,IDM_RESTORE,0 ;saljemo WM_RESTORE poruku nasem prozoru
;(kao da smo kliknuli Vrati u nasem meniju)
.endif
.endif
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; ako nije nista od ovoga prepustamo windowsu da procesuira window poruku
ret
.endif
xor eax,eax
ret
WndProc endp
end start
;Assembliranje
;Snimite fail kao Tray.asm
;Komandna linija za assembler MASM32 i linker
;Snimiti sledece 2 linije u fail sa nastavkom bat (bez prvih znakova ;) i pokrenite taj fail
;C:\Masm32\Bin\ML.EXE /c /coff /Cp /nologo /I"C:\Masm32\Include" "Tray.asm"
;C:\Masm32\Bin\LINK.EXE /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /LIBPATH:"C:\Masm32\Lib" /OUT:"Tray.exe" "Tray.obj" "Tray.res"
;NAPOMENA Ako bat fail nije u folderu sa asm failom ispravite gornje linije upisujuci punu putanju do asm faila
;Ako asembler nije u folderu koji je gore naznacen izmenite putanje do assemblera i linkera
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|