GHOST2010

[ تمت الإجابة ]كيف يمكن معرفة العملية التى تستخدم ملف معين؟

28 ردود في هذا الموضوع

شكرا لك اخي GM على التوضيح .

لنعد الى هدا الرد ونحاول تطبيقه

الحل باختصار كالآتي (ابحث اكثر ستجد اكواد جاهزة) :
1- جرد جميع المقابض بالنظام (Call NtQuerySystemInformation + SystemHandleInformation).
2- عمل Duplicate للمقابض مقبض مقبض بحيث يمكنك استخدام هذا المقبض للحصول على معلومات اضافية للـObject .
3- جلب بيانات عن الـObject الخاص بالمقبض (NtQueryObject) بمعرفة نوعه (Process/File/Thread ..etc) .
4- اذا كان الكائن عبارة عن ملف يتم جلب اسمه ثم مقارنته بالملف الذي تريد اغلاقه .
5- يتم اغلاق المقبض عن طريق نفس الدالة NtDuplicateHandle مع العلم CloseSource .

لم يسبق لي تعاملت مع هده الدوال لكني سأحاول دالك من خلال هدا الموضوع وطبعا بمساعدتكم

اولا عملت الكود الاتي :

.386
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc


includelib kernel32.lib
includelib user32.lib



DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD



.data

ntdll db"Ntdll.dll",0
nqsi db"NtQuerySystemInformation",0

.data?

hInstance HINSTANCE ?

.const

.code

start:

invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam, hInstance,1001,NULL,addr DlgProc, NULL
invoke ExitProcess,eax



DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM


.if uMsg == WM_INITDIALOG

.elseif uMsg == WM_COMMAND
mov eax,wParam
.if eax == 1003

invoke LoadLibrary,offset ntdll
invoke GetProcAddress,eax,offset nqsi
mov ebx,eax

; NtQuerySystemInformation parametre

call ebx






.endif


.elseif uMsg == WM_CLOSE
invoke EndDialog,hWnd,0
.endif
xor eax,eax
Ret
DlgProc endp


end start

الشطر الاساسي هو هدا

invoke LoadLibrary,offset ntdll
invoke GetProcAddress,eax,offset nqsi
mov ebx,eax

; NtQuerySystemInformation parametre

call ebx

قمت بتحميل المكتبة Ntdll.dll تم جلب عنوان الدالة NtQuerySystemInformation ووضعته في EBX لان EAX يتغير . اضن ان هده هي الطريقة الصحيحة لاستدعاء هده الدوال ؟

هنا وقعت في مشكل وهو كيف امرر البارامترات عبر الامر Push فقد كنت متعودا على invoke

وامر اخر SystemHandleInformation لم اجد لها تعريفا

اضن ان لها بارامتران ProcessId الموجودة في SYSTEM_PROCESS_INFORMATION و مؤشر الى Structure لاستقبال المعلومات

تم تعديل بواسطه soufianosse
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم .

كود على السريع بـmasm32 ، ربما به اخطاء فقد كتبته مستعجلا ولم اضف تعليقات عليه .

هذا الكود يقوم فقط بجرد مقابض الملفات المفتوحة ويعرضها في log file ولا يقوم باغلاقها ... هذه مهمتك وقد اخبرت من قبل كيف يتم ذلك !

.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive


include windows.inc
include kernel32.inc
include user32.inc
include comctl32.inc

includelib kernel32.lib
includelib user32.lib
includelib comctl32.lib




;NTSTATUS
;NtQuerySystemInformation(
; IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
; OUT PVOID SystemInformation,
; IN ULONG Length,
; OUT PULONG ReturnLength);


;NTSTATUS
;NtQueryObject(
; IN HANDLE Handle,
; IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
; OUT PVOID ObjectInformation,
; IN ULONG ObjectInformationLength,
; OUT PULONG ReturnLength);



SystemHandleInformation equ 16
ObjectNameInformation equ 1

DlgProc PROTO :DWORD, :DWORD, :DWORD, :DWORD


SYSTEM_HANDLE struct
ProcessId dd ?
ObjectType db ?
Flags db ?
Handle dw ?
Object dd ?
GrantedAccess dd ?
SYSTEM_HANDLE ends




.data
newline db 13, 10, 0
logfilename db "OpenedFiles.log", 0
format db "ProcessId : %ld - FileName : %ws", 0
str_ntdll db "Ntdll.dll", 0
str_ntqsi db "NtQuerySystemInformation", 0
str_ntdo db "NtDuplicateObject", 0
str_ntqo db "NtQueryObject", 0
str_ntopt db "NtOpenProcessToken", 0
str_ntapt db "NtAdjustPrivilegesToken", 0

.data?
hInstance HINSTANCE ?
hLog HFILE ?
NtQuerySystemInformation dd ?
NtDuplicateObject dd ?
NtQueryObject dd ?



.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke InitCommonControls
invoke DialogBoxParam, hInstance, 101, NULL, addr DlgProc, NULL
invoke ExitProcess, 0

;########################################################################

RtlAdjustDebugPrivilege proc
LOCAL Status : DWORD
LOCAL Token : HANDLE
LOCAL LuidPrivilege : LUID
LOCAL NewPrivileges : TOKEN_PRIVILEGES
LOCAL OldPrivileges : TOKEN_PRIVILEGES
LOCAL cb : DWORD
LOCAL ZwOpenProcessToken : DWORD
LOCAL ZwAdjustPrivilegesToken : DWORD

invoke LoadLibrary, addr str_ntdll
push eax
push eax
invoke GetProcAddress, eax, addr str_ntopt
mov ZwOpenProcessToken, eax
pop eax
invoke GetProcAddress, eax, addr str_ntapt
mov ZwAdjustPrivilegesToken, eax
pop eax


lea eax, Token
push eax
push TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY
push -1
call ZwOpenProcessToken
mov Status, eax
.if (eax != 0)
mov eax, Status
ret
.endif

mov LuidPrivilege.LowPart, 20
and LuidPrivilege.HighPart, 0
mov NewPrivileges.PrivilegeCount, 1
push LuidPrivilege.LowPart
push LuidPrivilege.HighPart
pop NewPrivileges.Privileges.Luid.HighPart
pop NewPrivileges.Privileges.Luid.LowPart
mov NewPrivileges.Privileges.Attributes, SE_PRIVILEGE_ENABLED

lea eax, cb
push eax
lea eax, OldPrivileges
push eax
push sizeof TOKEN_PRIVILEGES
lea eax, NewPrivileges
push eax
push FALSE
push Token
call ZwAdjustPrivilegesToken
mov Status, eax

invoke CloseHandle, Token

mov eax, Status
ret
RtlAdjustDebugPrivilege endp

;########################################################################

WriteLog proc Pid:dword, FileName:dword
LOCAL buffer[512] : byte
LOCAL brw : dword

.if hLog != INVALID_HANDLE_VALUE
mov edx, FileName
invoke wsprintf, addr buffer, addr format, Pid, dword ptr [edx + 4]
invoke lstrcat, addr buffer, addr newline
invoke lstrlen, addr buffer
mov ecx, eax
invoke WriteFile, hLog, addr buffer, ecx, addr brw, NULL
.endif

ret
WriteLog endp

;########################################################################

QueryFileName proc Handle:ptr SYSTEM_HANDLE
LOCAL hProcess : dword
LOCAL hFile : dword
LOCAL buffer[1024] : byte

mov eax, Handle
invoke OpenProcess, PROCESS_DUP_HANDLE, FALSE, SYSTEM_HANDLE.ProcessId[eax]
.if eax != NULL
mov hProcess, eax
mov edx, Handle
movzx edx, SYSTEM_HANDLE.Handle[edx]
invoke DuplicateHandle, hProcess, edx, 0ffffffffh, addr hFile, 0, FALSE, DUPLICATE_SAME_ACCESS
.if eax == TRUE
invoke RtlZeroMemory, addr buffer, 1024
push NULL
push 1024
lea eax, buffer
push eax
push ObjectNameInformation
push hFile
call NtQueryObject
.if eax == 0
mov edx, Handle
invoke WriteLog, SYSTEM_HANDLE.ProcessId[edx], addr buffer
.endif
invoke CloseHandle, hFile
.endif
invoke CloseHandle, hProcess
.endif
ret
QueryFileName endp

;########################################################################

ScanHandleTable proc ptrHandle:ptr SYSTEM_HANDLE, Count:DWORD
LOCAL ThreadId : dword

xor edi, edi
push ebx
mov ebx, ptrHandle
assume ebx : ptr SYSTEM_HANDLE
.while edi < Count
.if [ebx].ObjectType == 28 ; file type index for xp
invoke CreateThread, NULL, 0, addr QueryFileName, ebx, 0, addr ThreadId
push eax
invoke WaitForSingleObject, eax, 500 ; wait for 1 second
.if eax == WAIT_TIMEOUT
pop eax
push eax
invoke TerminateThread, eax, 0
.endif
pop eax
invoke CloseHandle, eax
.endif
inc edi
add ebx, sizeof SYSTEM_HANDLE
.endw
pop ebx
ret
ScanHandleTable endp

;########################################################################

DlgProc proc hWin:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL dwSize:dword
LOCAL lpBuffer:dword

mov eax, uMsg
.if eax == WM_INITDIALOG
invoke CreateFile, addr logfilename, GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL
mov hLog, eax
invoke RtlAdjustDebugPrivilege
invoke GetModuleHandle, addr str_ntdll
mov edi, eax
invoke GetProcAddress, edi, addr str_ntqsi
mov NtQuerySystemInformation, eax
invoke GetProcAddress, edi, addr str_ntdo
mov NtDuplicateObject, eax
invoke GetProcAddress, edi, addr str_ntqo
mov NtQueryObject, eax
.elseif eax == WM_COMMAND
mov eax, wParam
.if eax == 1001
mov dwSize, 4000h
invoke VirtualAlloc, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE
.if eax != NULL
mov lpBuffer, eax
lea eax, dwSize
push eax
push dwSize
push lpBuffer
push SystemHandleInformation
call NtQuerySystemInformation
.while eax == 0C0000004h
add dwSize, 1000h
invoke VirtualFree, lpBuffer, 0, MEM_RELEASE
invoke VirtualAlloc, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE
.if eax == NULL
mov eax, 0ffffffffh
.break
.endif
mov lpBuffer, eax
lea eax, dwSize
push eax
push dwSize
push lpBuffer
push SystemHandleInformation
call NtQuerySystemInformation
.endw
.if eax == 0 ; STATUS_SUCCESS
mov eax, [lpBuffer]
lea edx, [eax + 4]
mov ecx, dword ptr [eax]
invoke ScanHandleTable, edx, ecx
.endif
invoke VirtualFree, lpBuffer, 0, MEM_RELEASE
.endif
.endif
.elseif eax == WM_CLOSE
invoke CloseHandle, hLog
invoke EndDialog, hWin, 0
.else
mov eax, FALSE
ret
.endif
mov eax, TRUE
ret

DlgProc endp

end start

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا اخي GM عل الكود

لو امكن ان تضيف تعليقات سيكون احسن بكتير

تم تعديل بواسطه soufianosse
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .