ورود

View Full Version : چگونگی بستن پنجره ها و پروسه های مشکوک (مبتدی-پیشرفته)



REZADG
جمعه 16 اسفند 1387, 17:10 عصر
پیدا کردن و بدست آوردن Handle یک پنجره در ویندوز :
همانطور که گفته شد برای اینکه بخواهیم دستوراتی را بر روی پنجره ها و شئ ها اعمال کنیم ابتدا نیاز به Handle آن داریم . برای بدست آوردن هندل باید از توابع Api استفاده کنیم .
به تکه کد زیر توجه کنید :

کد:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Sub Command1_Click()
Dim tskmgr_hWnd As Long
tskmgr_hWnd = FindWindow ("#32770", "Windows Task Manager")
MsgBox tskmgr_hWnd
End Sub




توضیح سورس بالا :

تکه کد بالا در صورتی که برنامه ی TaskManager ویندوز ، اجرا باشد هندل آن را به صورت پیغام به شما نشان می دهد . ما با استفاده از یکی از توابع Api به نام FindWindow ، هندل پنجره ی اصلی TaskManager را بدست می آوریم . سپس آنرا به صورت یک پیغام نشان می دهیم . هندل این پنجره عددی مثل (394726) می باشد . توجه داشته باشید اگر مقدار 0 برگردانده شود به معنی این است که پنجره ی مورد نظر شما پیدا نشده . یعنی برنامه ی TaskManager اجرا نیست ! .
توضیح بیشتر اینکه این تابع Api دو مقدار دریافت می کند یـکی عنـــوان پـنـجره ی TaskManager که 'Windows Task Manager' می باشد و دیگری کلاس پنجره که در اینجا 32770# کلاس پنجره ی TaskManager می باشد.

بررسی کردن روشی دیگر.

به این سورس توجه کنید:

کد:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const WM_CLOSE = &H10

Private Sub Command1_Click ()
Dim tskmgr_hWnd As Long

tskmgr_hWnd = FindWindow ("#32770", "Windows Task Manager")
'You can use:("#32770", vbNullString) or (vbNullString, "Windows Task Manager")

If tskmgr_hWnd = 0 Then MsgBox "not found this window", vbExclamation, "oh no..." : Exit Sub

CloseResult = SendMessage (tskmgr_hWnd, WM_CLOSE, 0&, 0&)

End Sub


کد فوق ابتدا هندل برنامه ی TaskManager را بدست آورده ، سپس توسط تابع SendMessage پیغامی به برنامه می فرستد (WM_CLOSE) که منجر به بستن برنامه می شود .

در درس های بعدی شما را با بستن پروسه ها مشکوک اشنا می کنم.

ادامه دارد... .

REZADG
جمعه 16 اسفند 1387, 17:10 عصر
روش بعدی پیشرفته تر

کدهای زیر را به بخش ماژول اضافه کنید .

[code]
کد:
Declare Function TerminateProcess Lib "kernel32" (ByVal ApphProcess As Long, _
ByVal uExitCode As Long) As Long
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long
Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal _
hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal _
hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias _
"CreateToolhelp32Snapshot" (ByVal lFlags As Long, lProcessID As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As _
Long, lpExitCode As Long) As Long
Private Const MAX_PATH& = 260
Private Const PROCESS_ALL_ACCESS = &H1F0FFF
Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szexeFile As String * MAX_PATH
End Type

همچنین این کدها را به ماژول کد اضافه کنید.



کد:

Public Function SearchAPP(proc As String)

Dim uProcess As PROCESSENTRY32
Dim rProcessFound As Long
Dim hSnapshot As Long
Dim szExename As String
Dim i As Integer

Const TH32CS_SNAPPROCESS As Long = 2&

uProcess.dwSize = Len(uProcess)
hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
rProcessFound = ProcessFirst(hSnapshot, uProcess)

Do While rProcessFound
i = InStr(1, uProcess.szexeFile, Chr(0))
szExename = LCase$(Left$(uProcess.szexeFile, i - 1))
If LCase(szExename) = LCase$(proc) Then
EndProcess uProcess.th32ProcessID
Exit Function
End If

rProcessFound = ProcessNext (hSnapshot, uProcess)
Loop
Call CloseHandle (hSnapshot)

End Function

Public Function EndProcess (ProcessID As Long)
Dim lProcessHandle As Long
If ProcessID > 0 Then
'Check If WIN9X processes
'If OSPlatForm = Platform_Windows_95_98_ME Then ProcessID = ProcessID * -1
Dim EXCODE as Long, PROCESS as Long
'Give All Access Levels to the Process
PROCESS = OpenProcess (PROCESS_ALL_ACCESS, 0, ProcessID)
If PROCESS > 0 Then
'Access Succeffully Gained
GetExitCodeProcess PROCESS, EXCODE
TerminateProcess PROCESS, EXCODE
DoEvents
End If
CloseHandle PROCESS
End If
End Function

دکمه ای بر روی فرم بزارید . سپس متن زیر را در بخش کد فرم قرار دهید.

کد:
Private Sub Command1_Click ()
SearchAPP "procexp.exe"
End Sub
ادامه دارد... .

REZADG
جمعه 16 اسفند 1387, 17:11 عصر
در این درس روش دیگری را مورد بررسی قرار میدهیم

این روش اگر کلمه ی مورد نظر شما را در عنوان پنجره ای پیدا کند آن را می بندد. در واقع این روش مثل جستجوی فایل در ویندوز است . برای مثال می توانید از علامت ستاره یا علامت سوال استفاده کنید تا جستجو بهتر انجام گیرد . شاید سوال پیش بیاید که چه تفاوتی وجود دارد ... همان روش قبل کارساز است !؟
امل استفاده از این روش خالی از لطف نیست ... به خاطر اینکه می توانید ، برنامه هایی که شما نمی شناسید و به امنیت برنامه تان صدمه وارد می کند را ببندید . برای مثال می توانید در جستجو از کلمه ی Task,Process,Monitor استفاده کنید. بدین ترتیب هر پنجره ای که دارای این کلمات باشد بسته می شود . معمولاً برنامه های مدیریت پروسه چنین عنوان هایی دارند.

این کد ها در یک ماژول نوشته شود:

کد:
Private Declare Function EnumWindows& Lib "user32" (ByVal lpEnumFunc As Long, _
ByVal lParam As Long)

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Private Declare Function IsWindowVisible& Lib "user32" (ByVal hwnd As Long)
Private Declare Function GetParent& Lib "user32" (ByVal hwnd As Long)
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal _
hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Const WM_DESTROY = &H2
Const WM_CLOSE = &H10


هم چنین این کد را رو هم به ادامه ماژول اضافه کنید.

کد:
Function EnumWinProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim k As Long, sName As String
If IsWindowVisible(hwnd) And GetParent(hwnd) = 0 Then
sName = Space$(128)
k = GetWindowText(hwnd, sName, 128)
If k > 0 Then
sName = Left$(sName, k)
sName = UCase(sName)
If sName Like sPattern Then
hFind = hwnd
EnumWinProc = 0
Exit Function
End If
End If
End If
EnumWinProc = 1
End Function

Public Function FindWindowWild(sWild As String) As Long
sPattern = UCase(sWild)
EnumWindows AddressOf EnumWinProc, False
FindWindowWild = hFind
'SendMessage hFind, WM_DESTROY, 0, 0
SendMessage hFind, WM_CLOSE, 0, 0
End Function


و سپس دکمه ای بر روی فرم قرار دهید و کد های زیر را درون ان بنویسید

کد:
Private Sub Command1_Click()
Debug.Print FindWindowWild ("*task*")
'Debug.Print FindWindowWild ("*Process*")
'Debug.Print FindWindowWild ("*monitor*")
End Sub




توضیح بیشتر اینکه پس از افزودن کدها به ماژول و فرم و سپس اجرای برنامه ، هر برنامه ای که متن عنوان آن دارای کلمه ی "task" باشد بسته خواهد شد ... البته هندل پنجره توسط تابع "FindWindowWild" برگرداننده خواهد شد. در ضمن به جای "SendMessage hFind, WM_CLOSE, 0, 0" می توانید از دستورات دیگری که با هندل کار می کنند استفاده کنید . در اینجا برای خلاصه سازی از دستورات شرطی استفاده نشده است ، می توانید دستور شرطی بنویسید که اگر مقدار hFind (که همان هندل پیدا شده می باشد) صفر باشد دستوری اجرا نکند !

ادامه دارد... .file:///G:/My%20Save/Programer/showthread.php.htm0_files/thumbdown.gif

REZADG
جمعه 16 اسفند 1387, 17:14 عصر
کدهای بعدی که برای برنامه های امنیتی که نمایش مسیر پوشه ای در اکسپلورر در آدرس بار برایشان مهم است بسیار کاربردی می باشد . برای مثال برنامه ی ما از پوشه ی "\C:\Windows\Help\asdf" اجرا شده است و مهم است که متوجه شویم که کاربر به این پوشه رفته است ! . حال اگر کاربر (که گویا حرفه ای هستند) مسیر پوشه را از آدرس بار پاک نماید و همچنین نام پوشه ی جاری یا همان متن عنوان پنجره ی اکسپلورر را پاک کرده باشد ، با این کد پنجره ی اکسپلورر Refresh می شود که این باعث دوباره ظاهر شدن متن عنوان و آدرس بار می شود !
در این کد با تابع GetForegroundWindow بیشتر آشنا خواهید شد.
کد بسیار ساده می باشد. ابتدا هندل پنجره ی فعال را گرفته سپس کلاس آن را چک می کند در صورتی که کلاس آن از نوع CabinetWClass باشد اکسپلورر Refresh خواهد شد.
کدها را به فرم اضاف کنید سپس یک شئ تایمر بر روی فرم قرار دهید و خاصیت Interval آن را برابر عدد 1500 قرار دهید.


کد:

Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
(ByVal lHwnd As Long, ByVal lpClassName As String, ByVal lMax As Long) As Long


Private Sub Timer1_Timer ()
Dim ClassI$



ClassI = GetClass (GetForegroundWindow)
If ClassI = "CabinetWClass" Then
SendKeys "{ESC}"
SendKeys "{F5}"
End If
End Sub



Private Function GetClass (xHwnd As Long) As String
Dim xLen As Long
Dim sBuffer As String



sBuffer = String (255, Chr$(0))
xLen = GetClassName (xHwnd, sBuffer, 255)
GetClass = Left (sBuffer, xLen)
End Function

حال برنامه را اجرا کنید و نتیجه را مشاهده کنید.

اموزش ها در این باره بازم ادامه داره... . منتظر بمانید.

REZADG
جمعه 16 اسفند 1387, 17:15 عصر
روش بعد :

این تکه کد از طریق PiD ، هندل برنامه مورد نظر را به دست می آورد.


کد:

'Copy all to form
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) _
As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" _
(ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, _
ByVal wCmd As Long) As Long
Const GW_HWNDNEXT = 2


Function InstanceToWnd (ByVal target_pid As Long) As Long
Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long
test_hwnd = FindWindow (ByVal 0&, ByVal 0&)
Do While test_hwnd <> 0
If GetParent (test_hwnd) = 0 Then
test_thread_id = GetWindowThreadProcessId (test_hwnd, test_pid)
If test_pid = target_pid Then
InstanceToWnd = test_hwnd
Exit Do
End If
End If
test_hwnd = GetWindow (test_hwnd, GW_HWNDNEXT)
Loop
End Function


Private Sub Command1_Click ()
MsgBox InstanceToWnd (Shell ("notepad.exe", vbNormalFocus))


همه ی این کدهارو در فرم کپی کنید و سپس یک دکمه روی فرم قرار دهید!

این کد برنامه ی Notepad را اجرا کرده سپس بر اساس PiD آن ، هندل آن را بدست می آورد.

برای تبدیل هندل به PiDهم می توانید از این کد استفاده کنید.


کد:

'Add one CommandButton to form
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long


Private Sub Command1_Click()
Dim myProcessID As Long
Dim myhWnd As Long


myhWnd = 1770416
ThreadIDX = GetWindowThreadProcessId(myhWnd, myProcessID) 'PROCESSIDX Accept The Idetefier
MsgBox myProcessID
End Sub

xxxxx_xxxxx
جمعه 16 اسفند 1387, 17:24 عصر
دوست عزيز چرا داريد اين كارو مي كنيد؟!!!
اين مقاله كاربر MFire هست كه تو همين تالار به طور كامل در يك تاپيك قرار داده شده.
همينطور pdf ش هم هست.
حداقل نامي از اين بنده خدا مي آورديد.

REZADG
جمعه 16 اسفند 1387, 17:30 عصر
دوست من سلام
من این مطالب رو از سایت http://www.m0rtalkombat.com/ کش رفتم و اصلا حوصله ی تایپ مجدد کتاب شما رو ندارم به نظرم خوب اومد گفتم بزار دوستان کمی باهاش هال کنن

xxxxx_xxxxx
جمعه 16 اسفند 1387, 17:47 عصر
من كه نگفتم كتاب نوشتم كه
اينجا رو نگاه كنيد:
چگونه بستن پنجره ها و پروسه های مشکوک (http://www.barnamenevis.org/forum/showthread.php?t=123563)

ayub_coder
جمعه 16 اسفند 1387, 23:57 عصر
ایشون راست میگن هرچیزی مینویسید لطفا با ذکر منبع بنویسید تا زحمت بقیه هم هدر نره...