Быстрый поиск
Введите фрагмент названия статьи для поиска
Диалог открытия файлов и юзабилити Windows
02.11.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
При всех удобствах Windows некоторые моменты меня очень сильно раздражают. Особенно поведение системы при вызове диалогов открытия файлов. Сперва немного предыстории. При работе с файлами через функцию GetOpenFileName или GetSaveFileName в структуре OPENFILENAME есть возможность указать путь, который должен открыться по умолчанию. Если это значение не задано, то система сама где-то запоминает папку, в которой последний раз был удачно открыт файл (то есть окно выбора файла было закрыто через кнопку "Ok"). Где именно хранится эта информация - я пока не выяснил, да и не особо надо. Второй вариант. Предположим, что некоторая программа самостоятельно запоминает путь к папке, в которой последний раз ею выполнялись какие-то действия с файлами. Это может быть, например, текстовый редактор, просмотрщик графики и т.п., не суть. Главное, что задумка очень хорошая и правильная. При следующем запуске или вызове диалога выбора файла в соответствующее поле OPENFILENAME будет подставлен сохраненный путь и пользователь продолжит работу с того места, где он в прошлый раз остановился. Что-то типа такого:Code (Assembler) : Убрать нумерацию
- ...
- invoke GetModuleHandle,0
- mov [ofn.hInstance],eax
- mov [ofn.lStructSize], sizeof.OPENFILENAME
- mov [ofn.hwndOwner],0
- mov [ofn.nMaxFile],MAX_PATH
- mov [ofn.lpstrFile],buff
- ; Открывать с последней сохраненной папки
- mov [ofn.lpstrInitialDir],saved_dir
- mov [ofn.Flags],OFN_EXPLORER+OFN_FILEMUSTEXIST
- invoke GetOpenFileName,ofn
- ...
Читать статью целиком »
Просмотров: 7297 | Комментариев: 6
Новый алгоритм получения Google PageRank
11.10.2011 | Категория: Web-мастеру и не только | Автор: ManHunter
Буквально на днях Google поменял алгоритм, по которому генерировалась ссылка для получения показателей Google PageRank. В результате этого отвалились многие сервисы, вспомогательные программы, сторонние тулбары, счетчики и еще бессчетное количество сеошного барахла. Мне было бы глубоко фиолетово на их проблемы, но у меня на сайте тоже используется система автоматического съема значений Google PR. Поэтому пришлось быстренько адаптироваться к новым условиям. Я установил себе гугловский тулбар, быстренько выпотрошил его и получил алгоритм генерации ссылки для получения Google PageRank. Вот как он выглядит на JavaScript:Code (JavaScript) : Убрать нумерацию
- <script type="text/javascript">
- // Программисты Google явно с юмором :)
- var HASH_SEED = "Mining PageRank is AGAINST GOOGLE'S TERMS OF SERVICE. "+
- "Yes, I'm talking to you, scammer.";
- // Расчет хэша строки запроса
- awesomeHash = function(a) {
- var b = 16909125;
- for (c = 0; c < a.length; c++) {
- b ^= HASH_SEED.charCodeAt(c % HASH_SEED.length) ^ a.charCodeAt(c);
- b = b >>> 23 | b << 9;
- }
- return '8'+hexEncodeU32(b);
- };
- // Перевод числа в HEX-значение
- hexEncodeU32 = function(a) {
- var b = toHex8(a >>> 24);
- b += toHex8(a >>> 16 & 255);
- b += toHex8(a >>> 8 & 255);
- return b + toHex8(a & 255)
- };
- toHex8 = function(a) {
- return (a < 16 ? "0": "") + a.toString(16)
- };
- // Функция получения ссылки для запроса Google PR
- getPageRankLink = function(a) {
- return 'http://toolbarqueries.google.ru/tbr?features=Rank'+
- '&client=navclient-auto-ff&ch='+awesomeHash(a)+'&q=info:'+
- encodeURIComponent(a);
- }
- </script>
Code (JavaScript) : Убрать нумерацию
- <script type="text/javascript">
- // Пример использования
- st='http://www.manhunter.ru/'
- alert(getPageRankLink(st));
- </script>
Читать статью целиком »
Просмотров: 7239 | Комментариев: 12
Расчет CRC8 на Ассемблере
25.09.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
Контрольная сумма CRC8 применяется в основном для коротких сетевых пакетов и в микроконтроллерах. Из-за большой вероятности появления коллизий, использовать ее можно или для контроля целостности небольших объемах данных (оптимально - до 15 байт информации), или в случаях, когда возможность появления искажений исходных данных крайне мала. Алгоритм расчета CRC8 реализуется очень просто, работает очень быстро, из-за чего до сих пор находит свое применение. Первый вариант - прямой расчет.Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------------------
- ; Функция вычисления хеша CRC8
- ; by ManHunter / PCL
- ; http://www.manhunter.ru
- ;-----------------------------------------------------------------------
- ; Параметры:
- ; lpData - указатель на строку
- ; dSize - длина строки
- ; На выходе:
- ; AL = полученный хеш
- ;-----------------------------------------------------------------------
- proc CRC8 lpData:DWORD, dSize:DWORD
- push ebx ecx edx esi edi
- CRC8_POLYNOM = 31h
- ; Инициализация
- mov al,0FFh
- ; Длина строки
- cmp [dSize],0
- je .loc_ret
- ; Указатель на начало строки
- xor ecx,ecx
- @@:
- ; Получить символ из строки
- mov ebx,[lpData]
- xor al,byte [ebx+ecx]
- xor esi,esi
- .loc_cycle:
- test al,80h
- jz .loc_1
- shl al,1
- xor al,CRC8_POLYNOM
- jmp .loc_next
- .loc_1:
- shl al,1
- .loc_next:
- inc esi
- cmp esi,8
- jb .loc_cycle
- ; Следующий символ
- inc ecx
- cmp ecx,[dSize]
- jb @b
- .loc_ret:
- and eax,0FFh
- pop edi esi edx ecx ebx
- ret
- endp
Читать статью целиком »
Просмотров: 11966 | Комментариев: 3
Принудительное завершение процесса
20.08.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
Рано или поздно в программистской практике возникает задача по управлению процессами, в частности их принудительного завершения. Для дочерних процессов, порожденных собственным приложением, обычно хватает вызова TerminateProcess, но в некоторых случаях требуется принудительно завершить чужой процесс. Зная идентификатор процесса сделать это не составит большого труда. Открываем процесс функцией OpenProcess с правами PROCESS_TERMINATE, а затем, в случае успеха, отдаем полученный хэндл функции TerminateProcess. Вроде бы все просто, но не тут-то было. При попытке открыть некоторые процессы, как правило системные, возвращается ошибка ERROR_ACCESS_DENIED. Это связано с тем, что дескрипторы безопасности системных процессов блокируют такой доступ для всех пользователей, включая Администраторов. Чтобы обойти запрет, требуется поднять привилегии нашего процесса, а именно получить привилегию отладчика SE_DEBUG_NAME. Как повышать привилегии процесса в системе я уже писал. Напомню только, что необходимые структуры и константы в FASM отсутствуют и их придется определить самостоятельно.Code (Assembler) : Убрать нумерацию
- ; Константы для работы привилегиями
- TOKEN_ADJUST_PRIVILEGES = 20h
- TOKEN_QUERY = 8h
- SE_PRIVILEGE_ENABLED = 2h
- ; Структуры для работы привилегиями
- struct LUID
- lowPart dd ?
- HighPart dd ?
- ends
- struct LUID_AND_ATTRIBUTES
- pLuid LUID
- Attributes dd ?
- ends
- struct _TOKEN_PRIVILEGES
- PrivilegeCount dd ?
- Privileges LUID_AND_ATTRIBUTES
- ends
Code (Assembler) : Убрать нумерацию
- invoke GetCurrentProcess
- invoke OpenProcessToken,eax,TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,TTokenHd
- ; Получить привилегии процесса
- invoke LookupPrivilegeValue,NULL,SE_DEBUG_NAME,udtLUID
- ; Повысить привилегии процесса
- mov [tkp.PrivilegeCount],1
- mov [tkp.Privileges.Attributes],SE_PRIVILEGE_ENABLED
- mov eax,[udtLUID.lowPart]
- mov [tkp.Privileges.pLuid.lowPart],eax
- mov eax,[udtLUID.HighPart]
- mov [tkp.Privileges.pLuid.HighPart],eax
- invoke AdjustTokenPrivileges,[TTokenHd],0,tkp,0,0,0
Читать статью целиком »
Просмотров: 8474 | Комментариев: 18
Запись в архивы RAR, ZIP и ARJ без помощи архиватора
09.08.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
Решил вспомнить свою юность, когда я занимался разработкой "самоходного программного обеспечения". Одной из особенностей моих творений было распространение не только через исполняемые файлы, но и через архивы различных форматов. Технология внедрения в архивные файлы не нова, она использовалась в разных вирусах еще со времен MS-DOS. Так как готовых решений на тот момент у меня не было, приходилось доходить до всего самому. Никакого вредоносного кода на этом сайте не появится, а вот некоторыми своими наработками по внедрению в архивы я с удовольствием поделюсь. Поскольку полноценно продублировать алгоритмы сжатия архиваторов в столь малом размере файла не представляется возможным, внедряться в архивы мы будем по методу "Store". Это означает, что файл в архив добавлен с опцией "без сжатия". Внутренние форматы различных архивных файлов, естественно, различаются, но у всех обязательно присутствуют служебные заголовки, используемые архиваторами, и, собственно, сами упакованные данные.Самый простой для внедрения - формат RAR, используемый одноименным архиватором. Подробную спецификацию формата RAR можно почитать здесь.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; RAR Header
- ;---------------------------------------------
- rhcrc dw ? ; --> Low-word CRC32 of fields in header
- rhtype db ? ; Header type: 0x74
- rhflag dw ? ; Bit flags
- rhsize dw ? ; File header full size
- rcsize dd ? ; Compressed file size
- rosize dd ? ; Uncompressed file size
- rhoss db ? ; Target OS version
- rfcrc dd ? ; --> File CRC32
- rdtm dd ? ; File Time/Date
- runp db ? ; Archive version to extract
- rmeth db ? ; Packing method (store)
- rnsize dw ? ; File name size
- rfattr dd ? ; File attributes
- rfname rb (?) ; File name
Code (Assembler) : Убрать нумерацию
- ; "Хвост" архива - признак окончания данных
- tail db 0C4h,03Dh,07Bh,00h,040h,07h,00h
- tail_length = $-tail
Читать статью целиком »
Просмотров: 17228 | Комментариев: 12