Я лучше тебя
-
Автор темы
- #1
Собственно салам хомяки-разбойники. Много лет не писал гайдов и уроков по коддингу и читам в целом, а щас, чет приуныл и заскучал, так что начнем.
Пролог:Перед началом скажу, что подсказывать чего и как скопировать вставить не буду, готового исходника выкладывать тоже, те кому это покажется интересным - разберутся, а на остальных мне похуй нахуй. И стоит быть предельно осторожным, когда метод разрабатывался, мне пришлось тушить пк дважды, ибо из за ошибки нужный процесс запускался от системы миллион раз, по этому, не делайте ошибок.
Еще с год назад, у меня над головой засверкала лампочка вьебатой мысли, пиздануть с процессхакера функцию запуска процесса от имени некого пользователя. (процессхакер может запускать процесс от имени любого пользователя, нетворк, локалсистем, систем и тп) однако столкнувшись с чистым Си в сорцах и километром соресов которых пришлось бы подтянуть следом, решил хуянуть свою реализацию.
Ебаный смысл и как это относится к разделу создания читов:
Смысл в том, что около 50-70% навесных античитов, при проверке снимка процессов винды на ебабильность по их игре наивно отсеивают "системные" (чтобы не хапнуть от винды болт) и любой екстернал подруб, можно запускать от имени системы, получая соответствующие права не ебатся в жопу примерно с половиной версий того же ксигнкодя, (XignCode) или хТрепа (xTrap) и им подобными шляпами.
Задача:
Забабахать обычную программу (для установок и проверки) и виндовс сервис (для магии), запустить сервис из обычной программы, из него, дернуть токен winlogon, и запустить процесс с этим токером.
Суть такова: у такого пользователя как Система (System) свой рабочий стол, по этому все процессы запускаемые от имени системы по умолчанию пиздуют на его десктоп но мы решим эту проблему передав в структуру STARTUPINFO идентификатор дефолтного десктопа (@"winsta0\Winlogon").
Кокс и виски и шлюхи карибские:Суть такова: у такого пользователя как Система (System) свой рабочий стол, по этому все процессы запускаемые от имени системы по умолчанию пиздуют на его десктоп но мы решим эту проблему передав в структуру STARTUPINFO идентификатор дефолтного десктопа (@"winsta0\Winlogon").
Создаем проект, обычное приложение, неважно какое, консоль или форма.
Для работы с сервисами, добавляем в ссылки к проекту System.ServiceProcess, далее, описываем класс для работы с сервисами.
Для работы с сервисами, добавляем в ссылки к проекту System.ServiceProcess, далее, описываем класс для работы с сервисами.
Зависимости:
Код:
using System;
using System.Runtime.InteropServices;
using System.ServiceProcess;
Код:
public class CServiceManager
{
public string _service_path { get; private set; }
public string _service_name { get; private set; }
public string _service_display_name { get; private set; }
public CServiceManager(string service_path, string service_name, string display_name)
{
this._service_path = service_path;
this._service_name = service_name;
this._service_display_name = display_name;
}
/// <summary>
/// импорты
/// </summary>
const string advapi32 = "Advapi32.dll";
const string kernel32 = "kernel32.dll";
[DllImport(advapi32)]static extern IntPtr OpenSCManager(string lpMachineName, string lpSCDB, int scParameter);
[DllImport(advapi32)]static extern IntPtr CreateService(IntPtr SC_HANDLE, string lpSvcName, string lpDisplayName, int dwDesiredAccess, int dwServiceType, int dwStartType, int dwErrorControl, string lpPathName, string lpLoadOrderGroup, int lpdwTagId, string lpDependencies, string lpServiceStartName, string lpPassword);
[DllImport(advapi32)]static extern void CloseServiceHandle(IntPtr SCHANDLE);
[DllImport(advapi32)]static extern int StartService(IntPtr SVHANDLE, int dwNumServiceArgs, string lpServiceArgVectors);
[DllImport(advapi32, SetLastError = true)]static extern IntPtr OpenService(IntPtr SCHANDLE, string lpSvcName, int dwNumServiceArgs);
[DllImport(advapi32)]static extern int DeleteService(IntPtr SVHANDLE);
[DllImport(kernel32)]static extern int GetLastError();
/// <summary>
/// Константы
/// </summary>
const int SC_MANAGER_CREATE_SERVICE = 0x0002;
const int SERVICE_WIN32_OWN_PROCESS = 0x00000010;
const int SERVICE_ERROR_NORMAL = 0x00000001;
const int STANDARD_RIGHTS_REQUIRED = 0xF0000;
const int SERVICE_QUERY_CONFIG = 0x0001;
const int SERVICE_CHANGE_CONFIG = 0x0002;
const int SERVICE_QUERY_STATUS = 0x0004;
const int SERVICE_ENUMERATE_DEPENDENTS = 0x0008;
const int SERVICE_START = 0x0010;
const int SERVICE_STOP = 0x0020;
const int SERVICE_PAUSE_CONTINUE = 0x0040;
const int SERVICE_INTERROGATE = 0x0080;
const int SERVICE_USER_DEFINED_CONTROL = 0x0100;
const int SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL);
int SERVICE_AUTO_START = 0x00000002;
public bool Install()
{
IntPtr sc_handle = OpenSCManager(null, null, SC_MANAGER_CREATE_SERVICE);
if (sc_handle.Equals(IntPtr.Zero))
return false;
IntPtr sv_handle = CreateService(sc_handle, this._service_name, this._service_display_name, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, this._service_path, null, 0, null, null, null);
if (sv_handle.Equals(IntPtr.Zero))
{
CloseServiceHandle(sc_handle);
return false;
}
bool bReturn = StartService(sv_handle, 0, null) != 0;
CloseServiceHandle(sc_handle);
return bReturn;
}
public bool Uinstall()
{
IntPtr sc_handle = OpenSCManager(null, null, 0x40000000);
if (sc_handle.Equals(IntPtr.Zero))
return false;
IntPtr svc_hndl = OpenService(sc_handle, this._service_name, 0x10000);
if (svc_hndl.Equals(IntPtr.Zero))
return false;
bool bReturn = DeleteService(svc_hndl) != 0;
CloseServiceHandle(svc_hndl);
CloseServiceHandle(sc_handle);
return bReturn;
}
public bool Start()
{
ServiceController[] controllers = ServiceController.GetServices();
ServiceController current = null;
foreach (ServiceController controller in controllers)
{
if (controller.ServiceName.Equals(this._service_name))
{
current = controller;
controller.Start();
break;
}
}
if (current == null)
return false;
return current.Status == ServiceControllerStatus.Running;
}
public bool Stop()
{
ServiceController[] controllers = ServiceController.GetServices();
ServiceController current = null;
foreach (ServiceController controller in controllers)
{
if (controller.ServiceName.Equals(this._service_name))
{
current = controller;
controller.Stop();
break;
}
}
if (current == null)
return false;
return current.Status != ServiceControllerStatus.Running;
}
public bool IsRunning()
{
ServiceController[] controllers = ServiceController.GetServices();
ServiceController current = null;
foreach (ServiceController controller in controllers)
{
if (controller.ServiceName.Equals(this._service_name))
{
current = controller;
break;
}
}
if (current == null)
return false;
return current.Status != ServiceControllerStatus.Running;
}
}
Отлично. Теперь мы умеем: устанавливать сервисы, удалять установленные сервисы, запускать сервисы и останавливать сервисы.
Переходим к сервису. Сервис нам нужен по сути, чтобы получить токен этого самого winlogon, ибо из под юзер мода, мы получим ошибку LastErrorCode - 5 (ERROR_ACCESS_DENIED) , а сервис же, по сути запускается от имени системы, или любого другого пользователя, какого мы укажем, так как запускает его сама система.
Добавляем в солюшен проект, Windows Service. Добавляем Project Installer а на нем, ServiceInstaller и ServiceProcessInstaller, как это все сделать ищите в гугле, объяснять примитивную греблю я не буду.
Переходим к сервису. Сервис нам нужен по сути, чтобы получить токен этого самого winlogon, ибо из под юзер мода, мы получим ошибку LastErrorCode - 5 (ERROR_ACCESS_DENIED) , а сервис же, по сути запускается от имени системы, или любого другого пользователя, какого мы укажем, так как запускает его сама система.
Добавляем в солюшен проект, Windows Service. Добавляем Project Installer а на нем, ServiceInstaller и ServiceProcessInstaller, как это все сделать ищите в гугле, объяснять примитивную греблю я не буду.
В ServiceInstaller редактируем настройки сервиса. Поля:
- DisplayName
- ServiceName
- StartType (Boot, System, Automatic, Manual, Disabled)
В ServiceProcessInstaller самый сок, там вы сможете выбрать от имени какого пользователя запустится сервис, на выбор у вас: LocalService, NetworkService, LocalSystem, User. Выбираем LocalSystem.
Переходим к файлу сервиса: (там есть такие методы как OnStart, OnStop)
Там хлопочем с зависимостями:
Код:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security;
using System.ServiceProcess;
using System.Threading;
Код:
#region Structures
[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_ATTRIBUTES
{
public int Length;
public IntPtr lpSecurityDescriptor;
public bool bInheritHandle;
}
[StructLayout(LayoutKind.Sequential)]
public struct STARTUPINFO
{
public int cb;
public String lpReserved;
public String lpDesktop;
public String lpTitle;
public uint dwX;
public uint dwY;
public uint dwXSize;
public uint dwYSize;
public uint dwXCountChars;
public uint dwYCountChars;
public uint dwFillAttribute;
public uint dwFlags;
public short wShowWindow;
public short cbReserved2;
public IntPtr lpReserved2;
public IntPtr hStdInput;
public IntPtr hStdOutput;
public IntPtr hStdError;
}
[StructLayout(LayoutKind.Sequential)]
public struct PROCESS_INFORMATION
{
public IntPtr hProcess;
public IntPtr hThread;
public uint dwProcessId;
public uint dwThreadId;
}
#endregion
#region Enumerations
enum TOKEN_TYPE : int
{
TokenPrimary = 1,
TokenImpersonation = 2
}
enum SECURITY_IMPERSONATION_LEVEL : int
{
SecurityAnonymous = 0,
SecurityIdentification = 1,
SecurityImpersonation = 2,
SecurityDelegation = 3,
}
#endregion
#region Constants
private const int STANDARD_RIGHTS_REQUIRED = 0xF0000;
private const int TOKEN_ASSIGN_PRIMARY = 0x1;
private const int TOKEN_DUPLICATE = 0x2;
private const int TOKEN_IMPERSONATE = 0x4;
private const int TOKEN_QUERY = 0x8;
private const int TOKEN_QUERY_SOURCE = 0x10;
private const int TOKEN_ADJUST_GROUPS = 0x40;
private const int TOKEN_ADJUST_PRIVILEGES = 0x20;
private const int TOKEN_ADJUST_SESSIONID = 0x100;
private const int TOKEN_ADJUST_DEFAULT = 0x80;
private const int TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_QUERY_SOURCE | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_SESSIONID | TOKEN_ADJUST_DEFAULT);
public const uint MAXIMUM_ALLOWED = 0x2000000;
public const uint ALL = 0x001F0FFF;
public const int CREATE_NEW_CONSOLE = 0x00000010;
public const int IDLE_PRIORITY_CLASS = 0x40;
public const int NORMAL_PRIORITY_CLASS = 0x20;
public const int HIGH_PRIORITY_CLASS = 0x80;
public const int REALTIME_PRIORITY_CLASS = 0x100;
#endregion
#region Win32 API Imports
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool CloseHandle(IntPtr hSnapshot);
[DllImport("kernel32.dll")]
static extern uint WTSGetActiveConsoleSessionId();
[DllImport("advapi32.dll", EntryPoint = "CreateProcessAsUser", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public extern static bool CreateProcessAsUser(IntPtr hToken, String lpApplicationName, String lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes,
ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandle, int dwCreationFlags, IntPtr lpEnvironment,
String lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation);
[DllImport("kernel32.dll")]
static extern bool ProcessIdToSessionId(uint dwProcessId, ref uint pSessionId);
[DllImport("advapi32.dll", EntryPoint = "DuplicateTokenEx")]
public extern static bool DuplicateTokenEx(IntPtr ExistingTokenHandle, uint dwDesiredAccess,
ref SECURITY_ATTRIBUTES lpThreadAttributes, int TokenType,
int ImpersonationLevel, ref IntPtr DuplicateTokenHandle);
[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
[DllImport("advapi32", SetLastError = true), SuppressUnmanagedCodeSecurityAttribute]
static extern bool OpenProcessToken(IntPtr ProcessHandle, int DesiredAccess, ref IntPtr TokenHandle);
[DllImport("userenv.dll", SetLastError = true)]
static extern Boolean CreateEnvironmentBlock(ref IntPtr lpEnvironment, IntPtr hToken, Boolean bInherit);
const Int32 CREATE_UNICODE_ENVIRONMENT = 0x00000400;
#endregion
public static bool StartProcessAndBypassUAC(String applicationName, out PROCESS_INFORMATION procInfo)
{
uint winlogonPid = 0;
IntPtr hUserTokenDup = IntPtr.Zero, hPToken = IntPtr.Zero, hProcess = IntPtr.Zero;
procInfo = new PROCESS_INFORMATION();
uint dwSessionId = WTSGetActiveConsoleSessionId();
Process[] processes = Process.GetProcessesByName("winlogon");
foreach (Process p in processes)
{
if ((uint)p.SessionId == dwSessionId)
{
winlogonPid = (uint)p.Id;
}
}
hProcess = OpenProcess(0x001F0FFF, false, winlogonPid);
if (!OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, ref hPToken))
{
CloseHandle(hProcess);
return false;
}
SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
sa.Length = Marshal.SizeOf(sa);
if (!DuplicateTokenEx(hPToken, MAXIMUM_ALLOWED, ref sa, (int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, (int)TOKEN_TYPE.TokenPrimary, ref hUserTokenDup))
{
CloseHandle(hProcess);
CloseHandle(hPToken);
return false;
}
STARTUPINFO si = new STARTUPINFO();
si.cb = (int)Marshal.SizeOf(si);
si.lpDesktop = @"winsta0\Winlogon";//WinSta0\Winlogon winsta0\default
int dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
IntPtr pEnv = IntPtr.Zero;
if (CreateEnvironmentBlock(ref pEnv, hUserTokenDup, true))
{
dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT;
}
bool result = CreateProcessAsUser(hUserTokenDup, null, applicationName, ref sa, ref sa, false, dwCreationFlags, IntPtr.Zero, null, ref si, out procInfo);
CloseHandle(hProcess);
CloseHandle(hPToken);
CloseHandle(hUserTokenDup);
return result;
}
Код:
protected override void OnStart(string[] args)
{
//Права отладчика
Process.EnterDebugMode();
//Процесс который нужно перезапустить от имени системы.
Process[] pList = Process.GetProcessesByName("Ваш процесс");
while(pList.Length == 0)
{
pList = Process.GetProcessesByName("Ваш процесс");
Thread.Sleep(200);
}
Process current = pList[0];
string fileName = current.MainModule.FileName;
current.Kill();
PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
StartProcessAndBypassUAC(fileName, out pi);
}
теперь все проще, возле точки входа основной программы прописываем путь к файлу с сервисом чтобы запустить:
Код:
static string ServicePatch = System.IO.Directory.GetCurrentDirectory() + @"\ВашСервис.exe";
Установить и запустить сервис, он найдет ваш процесс, получит путь к файлу, потом кильнет, и заного запустит но уже от имени системы, после, из вашей программы, нужно проверить, установлен ли сервис, если да, удалить его, ибо после, он нахуй не нужен.
Щас допишу как это будет выглядеть, в тему уже не влазит.
(Длинную телегу кидает наверх страницы, и не видно что пишу)
Код:
static void Main()
{
//Дергаем права отладчика
Process.EnterDebugMode();
//инициализируем экземпляр класса для работы с сервисами
CServiceManager m_pServiceManager = new CServiceManager(ServicePatch, "Имя которое вы указали в поле ServiceName", "Отображаемое имя сервиса");
//узнаем, есть ли в системе процесс нашего сервиса?
Process[] Services = Process.GetProcessesByName("Ваш Сервис");
//если да
if(Services.Length > 0)
{
//удаляем нахуй?
m_pServiceManager.Uinstall();
}
else
{
//если нет - ставим.
m_pServiceManager.Install();
}
//дальше ваш никому не нужный код.
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new SEForm());
}