История с UAC

Если файл в Vista и выше содержит в имени «patch» , при этом у него нет манифеста (и возможно еще чего-то), то он будет всегда требовать администратора. Это звучит странно, но это факт. Т.е. допустим запустить такой процесс с другой проги может не получится, будет ошибка ERROR_ELEVATION_REQUIRED или как то так. 

Решение — не называть так файлы, либо перехватывать недокументированную функцию RtlQueryElevationFlags , и патчить ее единственный параметр на 0. Вроде как этот параметр берется откуда-то с KUSER_SHARED_DATA , надо реверсить.

Проверить файл можно через недокументированную функцию IsElevationRequired (ординал 865 из Shell32.dll), которая сводится все к тому же.


Windows server

1)Иногда изменить ту или иную политику нельзя (скажем время действия пароля), т.к. глобальные политики преобладают над локальными. Для этого нужно вместо gpedit.msc вызывать gpmc.msc , там найти нужный домен, политика по умолчанию, правой кнопкой-редактировать, и применять уже нужные параметры.

-

Служба Windows в виде DLL

Службы винды можно запускать также в виде DLL-файлов (обычно в ЕХЕ), неясно, какая в этом ценность, но пусть будет. Для запуска в таком виде нужно немного изменить службу. Итак:

Точкой входа , как и обычно, должен быть какой-то стандартный LibMain
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{ ... DisableThreadLibraryCalls(hinstDLL); //по привычке или копипаст, в любом случае оно не нужно


В котором может не быть вообще ничего , можно сразу return;
Библиотека должна экспортировать одну функцию прототипа WinMain , собственно откуда и должна начинать работать служба:

int WINAPI dll_svc_ep(HWND hWnd,HINSTANCE hInst,LPWSTR lpCmdLine,DWORD noNeed)

Запускать нужно так:

sc create service_in_dll binpath= "rundll32 c:\service_in_dll.dll,dll_svc_ep"

ну а дальше, как обычно в службе.

Привилегии и имперсонация

 Привилегии токена плохо работают с имперсонацией, точнее можно хорошо влететь и долго искать ошибку.  Потоки имеют свои собственные токены только когда код использует имперсонацию,иначе нужно открывать токен процесса. Короче говоря, псевдокод такой

GetToken..
ImpresonateWithToken (impersonatelogged/setthreadtoken)
..
if (!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES, TRUE, &hToken))
{
if (GetLastError() == ERROR_NO_TOKEN)
OpenProcessToken (GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
}


Причем сначала имперсонация, а потом привилегия. Казалось бы, зачем оно вообще надо, передавать всегда токен процесса и радоваться. Но, когда используется имперсонация, то привилегии нужно применять именно к токену потока - для процесса толку не будет, ну или только для главного потока, хз.
В native api есть замечательная функция RtlAdjustPrivilege, которая одним вызовом заменяет несколько строк кода. Это как раз тот редкий случай, когда пример на нативе будет лаконичнее и короче винапи (обычно - наоборот). Почему Microsoft не сделали аналогичную функцию для юзермода - неизвестно. Пример с Reactos

BOOLEAN Old;
if (RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, TRUE, TRUE, &Old) ==
STATUS_NO_TOKEN)
{
/* Thread doesn't have a token, give it to the entire process */
RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, TRUE, FALSE, &Old);
}


Под капотом эта функция также открывает токен и так далее; третий параметр - открывать токен потока (TRUE) или же процесса (FALSE);

В винапи такой функции нет, приходится юзать самописную , например вот с MSDN:
Collapse )

Еще раз о Detours

Помимо рассказанных ранее методов сбилдить библиотеку есть более простой путь, работающий однако в новых студиях (не знаю, с какой начиная, VC 2015 и выше точно). В меню проекта выбираем nuget (Project->Nuget ), там вводим Detours, устанавливаем, соглашаемся. Должна появится папка с инклудом и либой, подключаем к проекту — и все работает. Не надо через ifdef указывать разрядность, студия сама подключит нужную либу (32 или 64 бит).

Важно — собирайте релиз версию, дебаг почему-то ничего не перехватывает.

Справку по функциям этой библиотеки можно изучить здесь https://github.com/microsoft/Detours/wiki/Reference#apis-for-detouring-target-functions

Collapse )

MinHook

Скачиваем либу с гитхаба, там есть билд проекты для разных студий и даже для mingw. Собираем, получатся три файла: libMinHook.x86.lib , MinHook.x86.lib и MinHook.x86.dll. Также нужен , ес-но, инклуд MinHook.h . Подключаем это все дело к проекту, возьмем все тот же DLL:

Collapse )

Потестить можно с помощью withdll или Process Haker'a. Подробнее про либу читать здесь:
https://www.codeproject.com/Articles/44326/MinHook-The-Minimalistic-x-x-API-Hooking-Libra
https://github.com/TsudaKageyu/minhook



Спрятать js код в картинке

В формате gif (мб еще в каком-то) есть возможность спрятать код в картинке. Т.е. картинка будет валидна в случаях:

img src="file.gif" и script src="file.gif"
Т.е. то отображается, то исполняется. Сначала идет заголовок GIF89a, потом пишем комент /* , где будет все тело гифки, а этот символ указывает размер или что; потом закрываем опять коментом */, и пишем =1; , чтоб яваскрипт решил что это код вида (переменная) GIF89a .. комент.. =1; и тут идет нужный нам код.

Написать свой скрипт для преобразования гифок. Надо помнить, что во многих больших гифках внутри данных встречается */, и ес-но толку не будет.
Идея с журнала "хакер".

Network заметки (perl,php,http)

Тут разные заметки по сетям, опять же, чисто для себя.

1. Добавление своих заголовков для http:

use HTTP::Request::Common;
use LWP::UserAgent;

$url="http://google.com";
$a = HTTP::Request->new(
GET => $url,
HTTP::Headers->new(HTTP_X_FORWARDED_FOR => '127.0.0.2'),
);

$ua = LWP::UserAgent->new;
print $ua->request($a)->as_string;



2. Keep-alive соединение

use LWP::ConnCache;
use LWP::UserAgent;

$ua = LWP::UserAgent->new(conn_cache => new LWP::ConnCache);
$ua->get('http://google.com/');



3. Опции потока (хидеры, юзерагенты)

?php
$ct = stream_context_create
(
 array
 (
    'http' => array
     (
     'method' => "GET",
     'header' => "User-Agent: Mozilla\r\n"
     )
 )
);

$a = file_get_contents('http://google.com/', false, $ct);

4. В Windows 10 программа Curl доступна из коробки, на старые версии ес-но его можно поставить. Начиная с Win7, в винде есть поддержка служб TCP/IP, таких как: Character Generator, Daytime, Discard, Echo и Quote of the Day. Панель управление- программы - включить/отключить компоненты винды, выбираем "простые службы tcp ip" или как то так. Ребут. Потом управление службами ( services.msc) , там все это надо запустить (вручную или автоматом). Все, по определенным портам доступны службы для разных тестов сокетов. Также там можно взять telnet клиент (включить в программах и компонентах). Важно: если вы юзаете командную строку, на 64 битных ОС, 32 битная цмд "не видит" телнет. Т.е. нужно использовать нативную 64 битную

5. Хотя фтп сейчас мало кому нужен, но все же, его можно юзать с винапи и даже средствами самой винды (на последних не проверял).
.data
file db 'C:\tes.txt',0 ; файл для залива
ftpfn db 'tes.txt',0 ; залитый файл

host db 'yoursite.com',0 ; адрес фтп
login db 'login',0
password db 'password',0
agent db 'iexplore',0
hinet dd 0
hc dd 0
.code
start:
invoke InternetOpen,addr agent,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
mov hinet,eax
invoke InternetConnect,hinet,addr host,INTERNET_DEFAULT_FTP_PORT,addr login,addr password,INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,0
mov hc,eax
invoke FtpPutFile,hc,addr file,addr ftpfn,FTP_TRANSFER_TYPE_BINARY,0
invoke InternetCloseHandle,hc
invoke InternetCloseHandle,hinet
invoke ExitProcess,0
end start

MySQL/MariaDB - ошибка логина

В некоторых случаях не получается войти в управления этими базами данных через скрипты вида phpmyadmin/adminer , когда используется юзер root. Пишет что-то вида “#1698 – Access denied for user ‘root’@’localhost’” Т.к. начиная с какой-то там версии пароля для рут или нет или он не играет роли по дефолту, а используется юникс сокет авторизация. Оно, конечно, удобно с консоли, но неудобно с веба, поэтому можно отключить эту авторизацию, или переключить на другой вариант.

use mysql;
update user set plugin='' where User='root';
flush privileges;
exit
..
sudo systemctl restart mariadb.service


Либо

UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

Не пробовал, но пишут что рабочее. А правильнее, с точки зрения безопасности и удобства, создать нового юзера через консоль и входить уже через него. Но это кому как. Вот так можно создать нового юзера и присвоить ему абсолютно все права (опять же, не делайте так в рабочих проектах , и вроде нужно шифрование для пароля).

CREATE USER type_login IDENTIFIED BY 'type_pass';
GRANT ALL ON *.* TO 'type_login'@'localhost' IDENTIFIED BY 'type_pass';

Исключения. Язык Си и Winapi - Черновик

В отличие от веба, в низкоуровневых языках все немного сложнее. Язык Си (про плюсы я тут ничего не пишу, для C++ есть другие книги, справки и т.д.) доступны 2 вида исключений - собственно, расширения языка Си (CRT) и Windows SEH. Если уж разбираться до конца, то исключения Си базируются на SEH, но в тоже время, не работают без CRT (зачем это надо и как это обойти - напишу дальше).

Исключения языка Си
Ключевые слова: __try,__except,__finally,__leave

Если в вебе мы можем писать как угодно, то здесь нельзя миксовать операторы, на один блок __try должен быть один блок, или __except или __finally. Если нужно и то и то, то придется писать вложенные блоки. В блоке sda можно либо  указать функцию-обработчик, либо указать, какой тип исключений будет обрабатываться:
__except (filter(GetExceptionCode(), GetExceptionInformation())) или __except (EXCEPTION_EXECUTE_HANDLER)
Пример с MSDN
#include excpt.h

int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep)
{
puts("in filter.");
if (code == EXCEPTION_ACCESS_VIOLATION)
  {
  puts("caught AV as expected.");
  return EXCEPTION_EXECUTE_HANDLER;
  }
else
  {
  puts("didn't catch AV, unexpected.");
  return EXCEPTION_CONTINUE_SEARCH;
  };
}

Collapse )