Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Построение карты памяти процесса

02.04.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Умение работать с памятью сторонних процессов - полезный навык адепта Темной стороны Силы. Таким способом можно найти нужные данные, хранящиеся в памяти, например, расшифрованные файлы, изображения, пароли, и еще много чего вкусного. Также этот навык пригодится при создании распаковщиков, лоадеров для программ и трейнеров для различных игр. Я привел лишь несколько примеров, на практике их можно найти гораздо больше.

Для построения карты памяти процесса используется функция VirtualQueryEx и специальная структура MEMORY_BASIC_INFORMATION. В FASM она как обычно не определена, придется сделать это самостоятельно в сегменте данных:
  1. ; Структура для чтения памяти процесса
  2. struct  MEMORY_BASIC_INFORMATION
  3.         BaseAddress          dd ?
  4.         AllocationBase       dd ?
  5.         AllocationProtect    dd ?
  6.         RegionSize           dd ?
  7.         State                dd ?
  8.         Protect              dd ?
  9.         Type                 dd ?
  10. ends
  11.  
  12. ; Структура для чтения памяти процесса
  13. mbi             MEMORY_BASIC_INFORMATION
Для работы с памятью процесса при помощи функции VirtualQueryEx нам надо знать хэндл этого процесса. Для дочерних, которые мы запустили сами, все просто: это значение hProcess из структуры PROCESS_INFORMATION. Если процесс порожден не нами, то для получения его хэндла, зная ID процесса, надо воспользоваться функцией OpenProcess, обязательно с флагом PROCESS_QUERY_INFORMATION. Возможно, что перед этим потребуется повысить привилегии нашего процесса, активировав SeDebugPrivilege.

Читать статью целиком »
Просмотров: 8858 | Комментариев: 8

Создание и обработка улучшенного MessageBox

19.03.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
В одной из прошлых статей мы уже научились обрабатывать и облагораживать окно выбора каталога, а теперь сделаем что-нибудь необычное и противоестественное с окном сообщения MessageBox. Первое, что приходит на ум - это описать аналог MessageBox в ресурсах или создавать его динамически по мере надобности, но это получается как-то слишком просто. Попробуем перехватить стандартное окно MessageBox в момент создания. Для этого поставим хук на текущий тред нашего процесса, хук должен иметь тип WH_CBT:
  1.         ...
  2.         ; Получить хэндл текущего потока
  3.         invoke  GetCurrentThreadId
  4.         ; Установить перехватчик событий
  5.         invoke  SetWindowsHookEx,WH_CBT,MBHookProc,NULL,eax
  6.         ; Сохранить хэндл хука
  7.         mov     [hMBHook],eax
  8.         ...
Теперь мы можем отследить и обработать момент, когда система захочет активировать любое окно, принадлежащее треду. Значит, если сразу после установки этого хука вызвать функцию MessageBox, то перехватчик также получит управление и мы сможем получить хэндл окна создаваемого MessageBox. В сегменте данных определим нужные переменные, структуры и строки. Их назначение будет раскрыто дальше.
  1. section '.date' data readable writeable
  2.  
  3. ; Заголовок и текст окна
  4. szTitle         db 'Hello!',0
  5. szMess          db 'This is a Customized MessageBox with long text!',13,10
  6.                 db 'FASM is the BEST Assembler!',0
  7.  
  8. ; Новый текст на кнопках
  9. szButt1         db 'Of Course ;)',0
  10. szButt2         db 'No-no-no!!!',0
  11.  
  12. ; Название класса окна
  13. cname           db 'EDIT',0
  14.  
  15. hMBHook         dd ?    ; Хэндл хука
  16. pOldProc        dd ?    ; Адрес старого обработчика окна
  17. hInstance       dd ?    ; Хэндл модуля
  18. hHeap           dd ?    ; Хэндл кучи
  19. hMemory         dd ?    ; Указатель на память
  20. coord           RECT    ; Размеры текста
Зная хэндл, с окном можно сделать практически все что угодно. Здесь есть важный момент: после обработки окна надо обязательно сразу же снять хук, чтобы не было никаких накладок.

Читать статью целиком »
Просмотров: 6975 | Комментариев: 6

Прямой доступ к диску для записи в Windows 7

05.03.2010 | Категория: Темная сторона Силы | Автор: ManHunter

Прямой доступ к диску для записи в Windows 7

При разработке программы для защиты флешек от вирусов возникла необходимость записи секторов напрямую на диск. Прямой доступ к диску осуществлялся через функцию CreateFile. Под Windows XP все работало нормально, а под Windows 7 при попытке записи сектора возвращалась ошибка Access Denied, при том, что при открытии диска на запись никаких ошибок не возникало. После длительных поисков причины было выяснено следующее: еще в самом начале разработки в Windows 7 была обнаружена критическая уязвимость. Если не вдаваться в нудные технические подробности, то смысл ее заключался в том, что злоумышленник мог открыть системный диск напрямую для записи и поместить любой злонамеренный код в файл подкачки. В Microsoft решили проблему с присущей им дубовой прямолинейностью - просто взяли и запретили прямую запись на диски. Но поскольку нельзя, но было очень нужно, то способ обхода защиты нашелся очень быстро. Оказывается, что запись на диски запрещена не полностью, система разрешает записывать данные в нулевую дорожку диска и в неразмеченные области. Такое поведение вполне объяснимо: надо же как-то форматировать диски штатными средствами без дополнительных танцев с бубнами. Значит для того, чтобы система разрешила запись в произвольное место диска, она сперва должна определить его как неразмеченный. А это достигается уничтожением нулевого сектора диска перед записью. Естественно, что перед уничтожением надо сохранить все данные из нулевого сектора в сухом прохладном месте, а потом вернуть их обратно.

Порядок действий следующий: открыть диск для чтения-записи, попробовать записать нужный сектор. Если произошла ошибка Access Denied, то надо прочитать нулевой сектор, записать вместо него нули, после этого обязательно закрыть диск. Это нужно, чтобы система при повторном обращении посчитала диск неразмеченным и разрешила запись в любой сектор. Затем снова открываем диск для чтения-записи. После записи нужных данных восстанавливаем нулевой сектор и закрываем диск. Все, наша задача выполнена, данные записаны, система спокойна. У этого способа есть и минусы. Так, если работа вашей программы по какой-то причине завершилась аварийно до момента, когда она восстановила нулевую дорожку, то данные на диске могут стать недоступны или вообще потеряться. Способ проверен и хорошо работает на съемных дисках с файловой системой FAT/FAT32, на стационарных жестких дисках и других файловых системах я его не проверял.

Читать статью целиком »
Просмотров: 16757 | Комментариев: 8

Восстановление иконки в трее после сбоя системы

02.03.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Если ваше приложение создает и использует свою иконку в трее, то в обязательном порядке надо обрабатывать ситуацию, когда по какой-либо причине произошел сбой и перезапуск Explorer'а. В этом случае перерисовывается панель задач, рабочий стол, системный трей со значками и т.д., и если вы не вернете свою иконку в трей, то она "потеряется". При аварийном перезапуске Explorer'а всем окнам (HWND_BROADCAST) системой отсылается сообщение TaskbarCreated. Особенность этого сообщения в том, что оно не имеет постоянного значения идентификатора, и его значение должно быть получено функцией RegisterWindowMessage. В описаниях этой функции сказано, что она используется для регистрации уникального системного сообщения, но почему-то нигде не указано, что если такое сообщение уже зарегистрировано в системе, то функцией возвращается его существующий идентификатор. Это полезное свойство мы и будем использовать.
  1. ; Сегмент данных
  2. ...
  3. szTBC        db 'TaskbarCreated',0 ; Имя сообщения
  4. restore_msg  dd ?                  ; Идентификатор сообщения TaskbarCreated
  5. ...
Значение идентификатора лучше всего получать на этапе инициализации окна или при запуске приложения, но в любом случае до того, как будет выполняться его обработка.
  1. ; Сегмент кода
  2.         ...
  3.         ; Зарегистрировать сообщение TaskbarCreated
  4.         invoke  RegisterWindowMessage,szTBC
  5.         mov     [restore_msg],eax
  6.         ...
После того, как у вас есть идентификатор сообщения, его можно использовать в обработчике сообщений окна вашего приложения. И, как только оно будет получено, следует просто обновить иконку вашего приложения в трее и выполнить какие-нибудь другие действия по восстановлению работоспособности после перезапуска Explorer'а.
  1.         ...
  2.         ; Сообщение TaskbarCreated?
  3.         mov     eax,[msg]
  4.         cmp     eax,[restore_msg]
  5.         je      .wmrestore
  6.         ...
  7. .wmrestore:
  8.         ; Восстановить иконку в трее
  9.         invoke  Shell_NotifyIcon, NIM_ADD, node
  10.         jmp     .processed
  11.         ...
В этом коде подразумевается, что структура node (NOTIFYICONDATA) была заполнена ранее и содержит всю необходимую информацию об иконке в трее.

Читать статью целиком »
Просмотров: 7412 | Комментариев: 4

Тюнинг функции SHBrowseForFolder

10.02.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Функция API SHBrowseForFolder предназначена для выбора какой-нибудь папки из дерева каталогов всех дисков системы. Со своей задачей она, в принципе, справляется неплохо, но имеет ряд недостатков: окно выбора открывается в произвольных местах экрана, нельзя задать начальный каталог, нельзя менять заголовок окна и т.п. Если посмотреть внимательно на структуру BROWSEINFO, которую функция использует в работе, то в ней обнаруживается интересный параметр - указатель на callback-функцию BrowseCallbackProc. Эта функция получает управление при возникновении различных событий в окне выбора папок. Попробуем с ее помощью немного расширить базовый функционал SHBrowseForFolder. Сперва в сегменте данных определим необходимые значения для создания самого диалога выбора.
  1. ; Описание структуры BROWSEINFO
  2. struct  BROWSEINFO
  3.         hwndOwner            dd ?
  4.         pidlRoot             dd ?
  5.         pszDisplayName       dd ?
  6.         lpszTitle            dd ?
  7.         ulFlags              dd ?
  8.         lpfn                 dd ?
  9.         lParam               dd ?
  10.         iImage               dd ?
  11. ends
  12.  
  13. ; Структура для работы с папками
  14. bi                BROWSEINFO
  15.  
  16. ; Буфер, который получит выбранных путь
  17. szDisplayName     rb MAX_PATH
  18.  
  19. ; Текст подсказки в окне выбора папки
  20. szTitle           db 'Please select folder',0
Вызов функции обычный, за исключением того, что теперь в структуре BROWSEINFO заполнен указатель на callback-функцию:
  1.         ...
  2.         ; Заполнить структуру
  3.         mov     [bi.hwndOwner],NULL
  4.         mov     [bi.ulFlags],BIF_RETURNONLYFSDIRS+BIF_DONTGOBELOWDOMAIN
  5.         mov     [bi.pszDisplayName],szDisplayName
  6.         mov     [bi.lpszTitle],szTitle
  7.         ; Указатель на callback-функцию
  8.         mov     [bi.lpfn],BrowseCallbackProc
  9.  
  10.         ; Открыть диалог выбора папки
  11.         invoke  SHBrowseForFolder,bi
  12.         ...
Флаги диалогового окна, а также значения других параметров структуры BROWSEINFO вы можете посмотреть на сайте MSDN.

Читать статью целиком »
Просмотров: 9156 | Комментариев: 5

01 ... 60 61 62 63 64 65 66 ... 71
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 3 (0.0139 сек.) / Память: 4.5 Mb
Наверх