Быстрый поиск
Введите фрагмент названия статьи для поиска
Получение списка удаленных файлов в Корзине
22.08.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Удалять файлы в Корзину мы уже научились, теперь давайте разберем, как можно получить список удаленных объектов, которые в этой Корзине находятся. С чего начнем? Ну конечно же с описания кучи структур, интерфейсов и констант, которые нам понадобятся.Code (Assembler) : Убрать нумерацию
- ; GUID {43826D1E-E718-42EE-BC55-A1E261C37BFE}
- IID_IShellItem dd 043826D1Eh
- dw 0E718h
- dw 042EEh
- db 0BCh, 055h, 0A1h, 0E2h, 061h, 0C3h, 07Bh, 0FEh
- ; GUID {93F2F68C-1D1B-11D3-A30E-00C04F79ABD1}
- IID_IShellFolder2 dd 093F2F68Ch
- dw 01D1Bh
- dw 011D3h
- db 0A3h, 00Eh, 000h, 0C0h, 04Fh, 079h, 0ABh, 0D1h
- ; IID_IShellFolder2 Interface
- struct IShellFolder2
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- ; IShellFolder
- ParseDisplayName dd ?
- EnumObjects dd ?
- BindToObject dd ?
- BindToStorage dd ?
- CompareIDs dd ?
- CreateViewObject dd ?
- GetAttributesOf dd ?
- GetUIObjectOf dd ?
- GetDisplayNameOf dd ?
- SetNameOf dd ?
- ; IShellFolder2
- GetDefaultSearchGUID dd ?
- EnumSearches dd ?
- GetDefaultColumn dd ?
- GetDefaultColumnState dd ?
- GetDetailsEx dd ?
- GetDetailsOf dd ?
- MapColumnToSCID dd ?
- ends
- ; IID_IEnumIDList Interface
- struct IEnumIDList
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- Next dd ?
- Skip dd ?
- Reset dd ?
- Clone dd ?
- ends
- struct STRRET
- uType dd ?
- union
- pOleStr dd ?
- uOffset dd ?
- cStr rb 260
- ends
- ends
- struct SHCOLUMNID
- fmtid rb 16
- pid dd ?
- ends
- S_OK = 0
- CSIDL_BITBUCKET = 0Ah
- SHCONTF_FOLDERS = 20h
- SHCONTF_NONFOLDERS = 40h
- SHGDN_NORMAL = 0
- SHGDN_INFOLDER = 1
- SHGDN_FOREDITING = 1000h
- SHGDN_FORPARSING = 8000h
- PID_DISPLACED_FROM = 2
- PID_DISPLACED_DATE = 3
- PKEY_SIZE = 12
- PSGUID_DISPLACED dd 09B174B33h
- dw 040FFh
- dw 011D2h
- db 0A2h, 07Eh, 000h, 0C0h, 04Fh, 0C3h, 008h, 071h
- PKEY_Size dd 0B725F130h
- dw 047EFh
- dw 0101Ah
- db 0A5h, 0F1h, 002h, 060h, 08Ch, 09Eh, 0EBh, 0ACh
Code (Assembler) : Убрать нумерацию
- ; Инициализировать COM-объект
- invoke CoInitialize,NULL
- invoke SHGetSpecialFolderLocation,NULL,CSIDL_BITBUCKET,pidl
- invoke SHGetDesktopFolder,psfDesktop
- ; Получить объект папки Корзины
- mov eax,[psfDesktop]
- mov eax,[eax]
- stdcall dword [eax+IShellFolder2.BindToObject],[psfDesktop],\
- [pidl],NULL,IID_IShellFolder2,psfRecycleBin
- ; Обработать содержимое Корзины
- mov eax,[psfRecycleBin]
- mov eax,[eax]
- stdcall dword [eax+IShellFolder2.EnumObjects],[psfRecycleBin],\
- NULL,SHCONTF_FOLDERS+SHCONTF_NONFOLDERS,peidl
- loc_next:
- ; Очередной элемент содержимого Корзины
- mov eax,[peidl]
- mov eax,[eax]
- stdcall dword [eax+IEnumIDList.Next],[peidl],1,pidlItem,NULL
- ; Больше ничего нет
- or eax,eax
- jnz loc_done
- ; Выполнить необходимые действия с объектом
- ...
- ...
- ...
- jmp loc_next
- loc_done:
- ; Прибраться за собой
- mov eax, [psfRecycleBin]
- mov eax, [eax]
- stdcall dword [eax+IShellFolder2.Release],[psfRecycleBin]
- mov eax, [psfDesktop]
- mov eax, [eax]
- stdcall dword [eax+IShellFolder2.Release],[psfDesktop]
- invoke CoTaskMemFree,[pidl]
- ; Удалить объект
- invoke CoUninitialize
Читать статью целиком »
Просмотров: 1188 | Комментариев: 7
Программное удаление файла в Корзину
18.08.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Небольшой сниппет - удаление файла или группы файлов в Корзину. Делается это при помощи функции SHFileOperation, но сперва нам надо будет определить необходимую структуру SHFILEOPSTRUCT и несколько констант.Code (Assembler) : Убрать нумерацию
- struct SHFILEOPSTRUCT
- hwnd dd ?
- wFunc dd ?
- pFrom dd ?
- pTo dd ?
- fFlags dw ?
- fAnyOperationsAborted dd ?
- hNameMappings dd ?
- lpszProgressTitle dd ?
- ends
- FO_DELETE = 3h
- FOF_ALLOWUNDO = 40h
- FOF_NOCONFIRMATION = 10h
- FOF_SILENT = 4h
Code (Assembler) : Убрать нумерацию
- mov [fos.hwnd],HWND_DESKTOP
- mov [fos.wFunc],FO_DELETE
- mov [fos.pFrom],fname
- mov [fos.fFlags],FOF_ALLOWUNDO+FOF_NOCONFIRMATION+FOF_SILENT
- invoke SHFileOperation,fos
Читать статью целиком »
Просмотров: 1112 | Комментариев: 1
Использование мультимедийного таймера
16.08.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Интересная разновидность системных событий - высокоточный мультимедийный таймер. Гарантированный интервал срабатывания мультимедийных таймеров - около 10 миллисекунд против 50 миллисекунд обычных таймеров, устанавливаемых при помощи функции SetTimer. Кроме того, мультимедийные таймеры позволяют использовать обработчики, которые будут срабатывать в нужные интервалы, тогда как сообщения WM_TIMER от обычных таймеров идут через общую очередь. Если главный поток подвис, заснул или продолжительное время реагирует на какое-нибудь тяжелое сообщение, то таймеру придется ожидать, пока обработчик дойдет до него. Таким образом, добиться предсказуемой периодичности таймера будет очень сложно. Мультимедийные таймеры выполняются в собственном потоке, поэтому лишены перечисленных недостатков.Слова словами, но давайте проверим это на практике. Для этого в простом оконном приложении установим обычный таймер на интервал 1 миллисекунду, вместе с этим создадим мультимедийный таймер с таким же интервалом срабатывания. При каждом срабатывании каждого из этих таймеров будет увеличен соответствующий счетчик. По истечении определенного времени, например, 5 секунд, сравним результаты.
Обработчик окна будет выглядеть примерно так. Для удобства я оставил только минимально необходимый код.
Code (Assembler) : Убрать нумерацию
- cmp [msg],WM_INITDIALOG
- je wminitdialog
- cmp [msg],WM_TIMER
- je wmtimer
- ...
- ...
- wminitdialog:
- ; Обнулить счетчики
- mov [dCntTim],0
- mov [dCntMM],0
- ; Получить начальное время
- invoke GetTickCount
- mov [dTime],eax
- ; Установить обычный таймер на интервал 1 мс
- invoke SetTimer,[hwnddlg],1,1,NULL
- ; Установить мультимедийный таймер на интервал 1 мс
- TIME_PERIODIC = 0x0001
- invoke timeSetEvent,1,1,TimeProc,777,TIME_PERIODIC
- ...
- ...
- wmtimer:
- ; Увеличить счетчик по событию WM_TIMER
- inc [dCntTim]
- ; Прошло 5 секунд?
- invoke GetTickCount
- sub eax,[dTime]
- cmp eax,5000
- jb processed
- jmp wmclose
- wmclose:
- ; Удалить оба счетчика
- invoke KillTimer,[hwnddlg],1
- invoke timeKillEvent,[hTimer]
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; Обработчик высокоточного таймера
- ;-----------------------------------------------------------
- proc TimeProc uTimerID:DWORD,uMsg:DWORD,dwUser:DWORD,dw1:DWORD,dw2:DWORD
- ; Увеличить счетчик по системному событию
- inc [dCntMM]
- ret
- endp
Читать статью целиком »
Просмотров: 1205 | Комментариев: 4
Прячем ярлыки на рабочем столе
05.08.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Очередная мелкая развлекушка на Ассемблере. Сегодня будем прятать все ярлыки на рабочем столе. Нам не понадобится никаких громоздких структур, объектов, интерфейсов и прочей паранормальщины. И что хорошо, фактически все ярлыки остаются на своих местах, ничего не надо потом восстанавливать, ведь при прятании просто скрывается дочерний элемент окна десктопа, в котором ярлыки находятся.Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- szProg db 'ProgMan',0
- ; Сегмент кода
- section '.code' code readable executable
- ...
- invoke FindWindow,szProg,NULL
- invoke GetWindow,eax,GW_CHILD
- invoke GetWindow,eax,GW_CHILD
- ; Сохранить хэндл окна с ярлыками
- mov ebx,eax
- ; Ярлыки показываются?
- invoke IsWindowVisible,ebx
- or eax,eax
- jne @f
- ; Нет, показать
- invoke ShowWindow,ebx,SW_SHOW
- jmp loc_exit
- @@:
- ; Да, скрыть
- invoke ShowWindow,ebx,SW_HIDE
- loc_exit:
Читать статью целиком »
Просмотров: 1067 | Комментариев: 3
Перехват и обработка изменения заголовка окна другого приложения
03.08.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
В предыдущих примерах обработки системных событий мы рассматривали глобальные события, которые происходят во всей системе. Чтобы завершить эту тему, хотелось бы рассказать о системных событиях, ограниченных конкретным приложением. В качестве примера возьмем перехват и обработку изменения заголовка окна какого-нибудь приложения. Немного констант, некоторые из которых вы уже знаете.Code (Assembler) : Убрать нумерацию
- EVENT_OBJECT_NAMECHANGE = 0x800C
- WINEVENT_OUTOFCONTEXT = 0x0000
- OBJID_WINDOW = 0x0000
- CHILDID_SELF = 0x0000
Code (Assembler) : Убрать нумерацию
- ; Найти нужное окно
- invoke FindWindow,NULL,szName
- ; Сохранить хэндл найденного окна
- mov [hExample],eax
- ; Получить идентификаторы процесса и потока, относящиеся к окну
- invoke GetWindowThreadProcessId,[hExample],pID
- mov [tID],eax
- ; Установить хук на системные события
- invoke SetWinEventHook,EVENT_OBJECT_NAMECHANGE,\
- EVENT_OBJECT_NAMECHANGE,NULL,WinEventProc,\
- [pID],[tID],WINEVENT_OUTOFCONTEXT
Code (Assembler) : Убрать нумерацию
- proc WinEventProc hWinEventHook:DWORD, event:DWORD, hwnd:DWORD,\
- idObject:DWORD, idChild:DWORD, idEventThread:DWORD,\
- dwmsEventTime:DWORD
- pusha
- ; Изменяемый объект - окно?
- cmp [idObject],OBJID_WINDOW
- jne .loc_ret
- ; Изменяется само окно?
- cmp [idChild],CHILDID_SELF
- jne .loc_ret
- ; Точно-точно изменяется?
- cmp [event],EVENT_OBJECT_NAMECHANGE
- jne .loc_ret
- ; И меняется именно нужное окно?
- mov eax,[hwnd]
- cmp eax,[hExample]
- jne .loc_ret
- ...
- ...
- ; Выполняются какие-то действия по факту события
- ...
- ...
- .loc_ret:
- popa
- ret
- endp
Безусловно, возможности и область применения системных событий не ограничиваются приведенными примерами. Зато теперь вы знаете, насколько это нужный и мощный инструмент, особенно при грамотном использовании.
Читать статью целиком »
Просмотров: 1065 | Комментариев: 0