الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

مغلق
بدأه GHOST2010 في 26 مايو 2009 · 27 رد · 16,620 مشاهدة · في أرشيف قسم Windows APIs
مشاركة: واتساب X فيسبوك تيليجرام
#26

شكرا لك اخي 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 في 12 ديسمبر 2009 في 13:39

#27

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

كود على السريع بـ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

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#28

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

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

تم تعديل هذه المشاركة بواسطة soufianosse في 18 ديسمبر 2009 في 22:53

هذا الموضوع مغلق.

مواضيع مشابهة