Перейти к содержанию

Trix

Пользователи
  • Постов

    107
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Trix

  1. Есть такой вопрос, как узнать видима ли цель или нет в 3д шутере(я пишу под CS source) 

    уже написал автонаведение курсора на цель, осталась задача - узнать, находится ли цель в области видимости(не за укрытием, стенкой и тд)

    Буду благодарен за ответ) Нужен только алгоритм, как обычно это делают более опытные геймхакеры:huh:

  2. 1 час назад, Xipho сказал:

    Есть еще GeckoFX (вроде так называется). Можно его пощупать тоже.

    Тоже неплохая тема, однако, на сколько я понял, проект забросили)

    В принципе, без разницы, главное, чтобы исправно работали вышеупомянутые задачи, ибо с wb я уже намучился, баги, да вылеты

  3. Всем привет, меня интересует цена одного проекта, я бы даже сказал, модуля.

    Есть такая библиотека, как awesomium, некий аналог WebBrowser в c#, читал документацию, крутил, вертел, отчаялся...

    Хотелось бы прицениться, может ли кто-то написать модуль для программы с использованием сие библиотеки?
    тз:
    Класс, управляющий формой(конкретно окошечком браузера аверсомиум) из отдельного потока, асинхронно

    Публичные методы  POST GET с возвращением данных (htm + текст страницы(после обработки js) + url-перенаправление)

    Возможность настроить прокси и user-agent, чистка логов, кукисов и тд

    Полная загрузка страниц(вернее ожидания полной загрузки, а лишь потом выполнение последующих действий)
    Всевозможная заглушка всяких alert'ов, onbeforeunload'еров

    На сколько такой модуль может оцениваться и есть ли кто, уже работавший с этим компонентом?

    • Плюс 1
  4. Привет народ, столкнулся с проблемой в разработке простой программы под себя - управление webbroswer на C#.

    Проблема в следующем - wb создает мессаджбоксы и уведомления, как можно запретить ему это делать?)

    вот например такой скрипт на js

    Скрытый текст

    <script>
    window.onbeforeunload = function (e) {
      // Ловим событие для Interner Explorer
      var e = e || window.event;
      var myMessage= "Вы действительно хотите покинуть страницу, не сохранив данные?";
      // Для Internet Explorer и Firefox
      if (e) {
        e.returnValue = myMessage;
      }
      // Для Safari и Chrome
      return myMessage;
    };
    </script>

    Суть его такова - вывести окно "точно покинуть страницу?", как можно заставить wb игнорировать появление таких окон?

    Есть ли какие-то свойства или лучше сделать это через излюбленное здесь - замена функции на nop?

    Или можно перехватить сразу все вспл. окна? Хотел бы закончить проект, а нигде найти такой информации не удалось

     

     

     

    Что я за человек..... как только сформулировал проблему, так сразу решение появилось.... ПРОСТИТЕ:mellow:

    Если кому-то пригодится(ну а вдруг)

    Надо сделать следующее - дописать функцию переводящую все действия на себя

    Скрытый текст

            private void InjectNoCloseBlocker()
            {
                HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
                HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
                IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
                string alertBlocker = "window.onbeforeunload = function (e) { }";
                element.text = alertBlocker;
                head.AppendChild(scriptEl);
            }

     

    И обязательно повесить ее на обработчик событий  webBrowser1_DocumentCompleted

     

    • Плюс 1
  5. В 06.05.2017 в 13:35, uhx сказал:

    Так я тебе про это две темы затирал)

     

    А это тебе не помогло? Хоть и на плюсах, но принцип тот же. Формула для расчета адреса ведь есть. Я думал после этого хоть понятно станет...

    Ну, видишь, я отличаюсь интеллектом. В плане доходит оч. долго:wacko:

    Первым делом обратил внимание на ассемблерную команду, а потом на байт-код, поэтому и сбился, но зато запомнится 

  6. Окей, нашлось решение, всем спасибо за участие, если кому-то остался актуален этот вопрос, то вот решение 

    jmp - E8, а адрес вычисляется по следующей инструкции:

    Нужный адрес(в моем случае gta-vc.exe+AE8F0  - адрес инъекции, куда поместили байты -  5 (место на jmp(1байт) + адрес(4байта))

     

    В принципе, пришел к выводу, что как команда call, так и jmp относительна)) 

    Всем еще раз спасибо ^_^

  7. 2 часа назад, keng сказал:

    Одно дело - смотреть опкоды в дизассемблере, другое - в отладчике, когда он уже загружен в память. Во втором случае все переходы и смещения уже пересчитаны относительно базового адреса, по которому загрузился исполняемый модуль. В первом - нет. Итого:

     

    gta-vc.exe +  AE8F0 - тот адрес, что тебе показывает отладчик.

    004AE8F0 - куда будем прыгнем по факту. Тут 400000 - базовый адрес.

    E8 DD E8 0D 00 - опкоды из отладчика. E8 - это call, причем относительный, значит прыгать мы будем на 000DE8DD байт вперед (вниз по коду).

     

    В общем, посмотри, по какому адресу загрузился gta-vc.exe. Скорее всего, если из этого адреса вычесть 000DE8DD, то получится 000F0E8A.

    Окей, Кенг, я примерно понял, поковыерялся, дошло что это действительно относительный адрес.. 

    Правда, как его вычислить ух, это непонятно 

     У меня есть следующие значения 

    Смещение на функцию, Базовый адрес, Адрес инъекции, как мне с этим всем можно узнать последующие байты после call?

  8. Думаю, тема не такая и сложная, однако, разобраться с ней сам я не смог, поэтому решил написать данный топик.

    Дело вот в чем, есть команда

    CALL gta-vc.exe +  AE8F0            ||              call 004AE8F0                ||             E8 DD E8 0D 00

    Взаимосвязь между командой и байтами я не вижу, как ни крути... Как понял E8 - равносильно команде call,

    тогда как упаковать мой адрес в эти байты?

     

     

    Вот мой кодец  

    Скрытый текст

                int iProcessId = 1480;
                Process proc = Process.GetProcessById(iProcessId);

                IntPtr hHandle = OpenProcess(ProcessAccessFlags.All, false, iProcessId);
                int ptr_base = (int)proc.MainModule.BaseAddress;

                byte[] asm = new byte[] {
                0x68, 0xB1, 0x00, 0x00, 0x00 , //          - push 000000B1 { 177 }
                0xE8, 0xE6, 0xE8, 0x5D, 0xFF,  //          - call gta-vc.exe+AE8F0
                0x59,                          //          - pop ecx
                0xC3                           //          - ret 
    };

    нашел базовый адрес модуля игры (если ошибаюсь, поправьте) 

    Собственно, как записать адрес я затрудняюсь.... 
    Подскажите пожалуйста, на сколько мне подсказали, то что я ищу: 

    ptr_base + 0xAE8F0  + 5 //Как это можно записать в код? 

    Действительно ли нужен отступ именно на 5? Как преобразовать это в байты?

     

     

  9. 2 часа назад, uhx сказал:

    Напрмер, если Вы сделаете прыжок на 00 00 00 00, то он попадет на Ваш же ret (C3), который находится прямо после прыжка. Если зададите прыжок на -5, то поток зациклится на этом же прыжке) В этом весь jump near. В jump far же абсолютная адресация, но он и больше. Вроде 6 байт, не помню.

    окей, я дошел вот до такой конструкции, однако, все равно код терпит неудачу 

    Скрытый текст

                byte[] asm = new byte[] {
                0x68, 0xB1, 0x00, 0x00, 0x00 ,        //          - push 000000B1 { 177 }
                0xE8, 0xE6, 0xE8, 0x5D, 0xFF,        //          - call gta-vc.exe+AE8F0
                0x59,                                                //          - pop ecx
                0xC3                                                 //          - ret 
    };

    Так ли это делается? 

  10. 3 минуты назад, srg91 сказал:

    Можешь, как написали выше. Но я так понимаю в твоем случае тебе это не нужно же? Я так понимаю ты хочешь просто вызвать эту функцию из своего проекта?

    да, хотел бы вызвать функцию из проекта ради теста) 

    Переписал инъектируемые байты, вышло вот это 

    Скрытый текст

                byte[] asm = new byte[] {
                0x68, 0xB1, 0x00, 0x00, 0x00 , //          - push 000000B1 { 177 }
                0xE8, 0xE6, 0xE8, 0x5D, 0xFF,  //          - call gta-vc.exe+AE8F0
                0x59,                          //          - pop ecx
                0xC3                           //          - ret 
    };

    Однако, игра все так же крашится, в чем я мог допустить ошибку?

  11. 1 час назад, srg91 сказал:

    Привет. Если внимать читательнее - мы выходим на адрес функции через ввод чит-кода.

    так понимаю, у нас разные версии игры, что меня затруднило((( 

     

    У  меня затруднения с Find out what accesses this address:

    получается вот такой список функций, пробовал неоднократно

     

    Скрытый текст

    13812243.png

    Найти функцию, как у вас (которая сравнивает строку, как я понял) не удалось... Или она все же есть? Ибо в регионе памяти не удалось найти похожее сравнение 

     

     

     

    1 час назад, srg91 сказал:

    Если тебе нужно найти саму функцию в игре, но ты не хочешь ориентироваться на адрес модуля - провались внутрь самой функции (ПКМ на call - далее Follow) и через aobscan найди её в игре, после так же вызывай через call.

    В общем, а если есть сам адрес функции, могу ли я обратно узнать кто его вызывает? 

     

     

     

     

    Найти адрес через ввод чита для меня осталось загадкой, буду благодарен за разъяснения, если можно. 

    Но у меня получилось найти его вручную отмотав достаточно приличный кусок кода, так что будет интересно узнать, почему у автора есть функция, а у меня ее нет) 

    И да, гуглил, гуглил, а найти номера всех машин не удалось даже на сайтах разработчиков модов. Нет ли у кого ссылки?)
    Спасибо за статью)

     

     

  12. 4 минуты назад, uhx сказал:

    Я говорю про эти байты. Не забывай так же, что прыжок строится относительно адреса следующей инструкции. Этот занимает 5 байт, значит их и прибавляй.

    Можно сейчас немного по-подробнее ?
    Разве такое возможно? на сколько я понял, jmp выполняет прыжок к метке, то есть к какому-либо адресу

    Игра перезагрузилась, адреса поменялись... я вас немного не понял 

  13. 22 часа назад, uhx сказал:

    Если честно, то ничего не понятно)

    В чем тогда проблема?

     

    Какой еще отдельный код? О чем речь?

    кхх... 

    Скрытый текст

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    using System.Windows;
    using System.Text;
    using System.Threading;


    namespace RemoteThread
    {
        class Program
        {

            [DllImport("kernel32.dll")]
            public static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, bool bInheritHandle, int dwProcessId);
            [DllImport("kernel32.dll")]
            public static extern bool CloseHandle(IntPtr hObject);
            [DllImport("kernel32.dll")]
            public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out UIntPtr lpNumberOfBytesWritten);
            [DllImport("kernel32.dll")]
            public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, AllocationType flAllocationType, MemoryProtection flProtect);
            [DllImport("kernel32.dll")]
            public static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, out uint lpThreadId);

            internal class Win32
            {
                // Use DllImportAttribute to inport the Win32 MessageBox
                // function.  Set the SetLastError flag to true to allow
                // the function to set the Win32 error.
                [DllImportAttribute("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
                public static extern int MessageBox(IntPtr hwnd, String text, String caption, uint type);

            }


            //[DllImportAttribute("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
            //public static extern int MessageBox(IntPtr hwnd, String text, String caption, uint type);

            [Flags]
            public enum ProcessAccessFlags : uint
            {
                Terminate = 0x00000001,
                CreateThread = 0x00000002,
                VMOperation = 0x00000008,
                VMRead = 0x00000010,
                VMWrite = 0x00000020,
                DupHandle = 0x00000040,
                SetInformation = 0x00000200,
                QueryInformation = 0x00000400,
                Synchronize = 0x00100000,
                All = 0x001F0FFF
            }

            [Flags]
            public enum AllocationType
            {
                Commit = 0x00001000,
                Reserve = 0x00002000,
                Decommit = 0x00004000,
                Release = 0x00008000,
                Reset = 0x00080000,
                TopDown = 0x00100000,
                WriteWatch = 0x00200000,
                Physical = 0x00400000,
                LargePages = 0x20000000
            }

            [Flags]
            public enum MemoryProtection
            {
                NoAccess = 0x0001,
                ReadOnly = 0x0002,
                ReadWrite = 0x0004,
                WriteCopy = 0x0008,
                Execute = 0x0010,
                ExecuteRead = 0x0020,
                ExecuteReadWrite = 0x0040,
                ExecuteWriteCopy = 0x0080,
                GuardModifierflag = 0x0100,
                NoCacheModifierflag = 0x0200,
                WriteCombineModifierflag = 0x0400
            }
            public delegate int ThreadProc(IntPtr param);


            static void Main(string[] args)
            {
                byte[] asm = new byte[] {

                   0x53, 0x56, 0x57, 0xB9, 0x20, 0xB2, 0x94, 0x00, 0x83, 0xEC, 0x20, 0xBE, 0xA2, 0x00, 0x00, 0x00, 0xE9, 0xEA, 0xE8, 0x84, 0xFD, 0xC3
    };
                int iProcessId = 2096;
                IntPtr hHandle = OpenProcess(ProcessAccessFlags.All, false, iProcessId);

                if (hHandle == IntPtr.Zero)
                    throw new ApplicationException("Cannot get process handle.");
                IntPtr hAlloc = VirtualAllocEx(hHandle, IntPtr.Zero, (uint)asm.Length, AllocationType.Commit, MemoryProtection.ExecuteReadWrite);

                if (hAlloc == IntPtr.Zero)
                    throw new ApplicationException("Cannot allocate memory.");
                UIntPtr bytesWritten = UIntPtr.Zero;

                if (!WriteProcessMemory(hHandle, hAlloc, asm, (uint)asm.Length, out bytesWritten))
                    throw new ApplicationException("Cannot write process memory.");

                if (asm.Length != (int)bytesWritten)
                    throw new ApplicationException("Invalid written size.");


                uint iThreadId = 0;
                IntPtr hThread = CreateRemoteThread(hHandle, IntPtr.Zero, 0, hAlloc, IntPtr.Zero, 0, out iThreadId);

                

                //Console.WriteLine("___");

                //int error = Marshal.GetLastWin32Error();
               // Console.WriteLine(error.ToString());


                if (hThread == IntPtr.Zero)
                    throw new ApplicationException("Cannot create and execute remote thread.");
                CloseHandle(hThread);
                CloseHandle(hHandle);

                Console.ReadKey();
            }
        }
    }
     

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

  14. Здравствуйте) 

    Тренируюсь в написании скриптов, для примера взял gta vice city, ибо адреса функций уже даны(нашел на сайте с материалами для моддинга) 

    Записал вот такой скрипт(думаю, как-то криво, но работает. Другого решения не нашел, если подскажете, буду оч рад)

    Скрытый текст

    [ENABLE]
    alloc(code, 4048)
    createthread(code)


    code:
    push ebx
    push esi
    push edi
    mov ecx,gta-vc.exe+54B220
    sub esp,20
    mov esi,000000A2
    jmp gta-vc.exe+AE8FF

    ret


    [DISABLE]
    dealloc(code)

    Вот скрипт для CE автоассемблера, работает, не жалуется)

    функция чит-вызова транспорта расположен по адресу 0x004AE8F0

    А номер транспорта (000000A2) = 162(танк) помещается в регистр ESI

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

    PS программа инъектит код в игру исправно, пробовал простейший код, работает.

  15. 2 часа назад, keng сказал:

    Предлагаю для начала сделать то же самое из СЕ, автоассемблером. А дальше уже смотреть, где косяк - в коде, в правах доступа или где-то еще.

    Кенг, со всем уважением)
    Чит в автоассемблере исправно работает, а при инъекции ошибки

  16. 11 час назад, 2zolo2 сказал:

    Это хороший совет, благодарю)

    Если я правильно понял, то выполняется на шарпе это вот так(из описания msdn)
     

    int error = Marshal.GetLastWin32Error();

    И тут непонятное мне явление - если так и оставить, то ошибка будет нуливая, если перед этим заставить консоль что-нибудь вывести - получится ошибка 5

    "Доступ запрещен", почитал стековерфлоу, там ссылаются на ошибку компиляции под разные разрядности системы, честно, не очень-то и понял. 

    Получается, что сапер другой разрядности или как? Был бы очень благодарен за объяснения, ибо понять что к чему в такой ситуации трудно, 

    на всевозможных топиках и статьях все облачно и работает, а у меня что-то не очень) 

    Для примера сделал более простую инъекцию в CE-Tutorial, все работает как часы)

  17. 8 часов назад, roma91212 сказал:

    Взломал игру - сохранил табличку, так и писать ничегг не придется. А если что-то и реализовывать - то такие вещи, которые до тебя еще не делали.

    Да, интересней самому)

    8 часов назад, roma91212 сказал:

    Взломал игру - сохранил табличку, так и писать ничегг не придется. А если что-то и реализовывать - то такие вещи, которые до тебя еще не делали.

    Нет, тут немного запутанней, есть идея написать ради интереса алгоритм, который заместо игрока будет выполнять одну простую тривиальную функцию из пары шагов(как например рыбалка в WOW, только проще)

  18. 8 часов назад, roma91212 сказал:

    Как вы все сложно делаете.... Почему вам просто не взять готовую длл для .net? Blackmagic, memory etc...

    На всю запись в адресс у тебя уйдет 5-10 строчек кода. Согласись, намного проще будет

    Да, я что-то слышал про BlackMagic, правда не разобрался, гляну, спасибо)

  19. Всем привет, заинтересован внедрением своего кода в чужой процесс, научился делать AOB-инъекцию, как например с помощью CE 

    В целом, инъекция в CE работает, вот код 

    Скрытый текст

    [ENABLE]
    alloc(mycode,0x1000)
    registersymbol(mycode)
    createthread(mycode)


    mycode:
    sub rsp, 0x28
    call minesweeper.exe+351E0
    add rsp, 0x28
    ret

    [DISABLE]
    unregistersymbol(mycode)
    dealloc(mycode)

    Что он делает? - Вызывает окно "о программе" в стандартном виндовском приложении сапер (MineSweeper)

    Теперь этот кодец я бы хотел для примера внедрить в программу

    Написал программу(а точнее взял пример с сайта и корректировал под свой процесс, для изучения этого процесса 

    Скрытый текст

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;

    namespace RemoteThread
    {
        class Program
        {

            [DllImport("kernel32.dll")]
            public static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, bool bInheritHandle, int dwProcessId);
            [DllImport("kernel32.dll")]
            public static extern bool CloseHandle(IntPtr hObject);
            [DllImport("kernel32.dll")]
            public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out UIntPtr lpNumberOfBytesWritten);
            [DllImport("kernel32.dll")]
            public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, AllocationType flAllocationType, MemoryProtection flProtect);
            [DllImport("kernel32.dll")]
            public static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, out uint lpThreadId);


            [Flags]
            public enum ProcessAccessFlags : uint
            {
                Terminate = 0x00000001,
                CreateThread = 0x00000002,
                VMOperation = 0x00000008,
                VMRead = 0x00000010,
                VMWrite = 0x00000020,
                DupHandle = 0x00000040,
                SetInformation = 0x00000200,
                QueryInformation = 0x00000400,
                Synchronize = 0x00100000,
                All = 0x001F0FFF
            }

            [Flags]
            public enum AllocationType
            {
                Commit = 0x00001000,
                Reserve = 0x00002000,
                Decommit = 0x00004000,
                Release = 0x00008000,
                Reset = 0x00080000,
                TopDown = 0x00100000,
                WriteWatch = 0x00200000,
                Physical = 0x00400000,
                LargePages = 0x20000000
            }

            [Flags]
            public enum MemoryProtection
            {
                NoAccess = 0x0001,
                ReadOnly = 0x0002,
                ReadWrite = 0x0004,
                WriteCopy = 0x0008,
                Execute = 0x0010,
                ExecuteRead = 0x0020,
                ExecuteReadWrite = 0x0040,
                ExecuteWriteCopy = 0x0080,
                GuardModifierflag = 0x0100,
                NoCacheModifierflag = 0x0200,
                WriteCombineModifierflag = 0x0400
            }
            public delegate int ThreadProc(IntPtr param);


            static void Main(string[] args)
            {
                byte[] asm = new byte[] {
                    0x48, 0x83, 0xEC, 0x28,
                    0xFF, 0x15, 0x02, 0x00, 0x00, 0x00,
                    0xEB, 0x08,
                    0xE0, 0x51, 
                    0xB4, 0xFF,
                    0x00, 0x00,
                    0x00, 0x00,
                    0x48, 0x83, 0xC4, 0x28,
                    0xC3
    };
                int iProcessId = 3408;
                IntPtr hHandle = OpenProcess(ProcessAccessFlags.All, false, iProcessId);

                if (hHandle == IntPtr.Zero)
                    throw new ApplicationException("Cannot get process handle.");
                IntPtr hAlloc = VirtualAllocEx(hHandle, IntPtr.Zero, (uint)asm.Length, AllocationType.Commit, MemoryProtection.ExecuteReadWrite);

                if (hAlloc == IntPtr.Zero)
                    throw new ApplicationException("Cannot allocate memory.");
                UIntPtr bytesWritten = UIntPtr.Zero;

                if (!WriteProcessMemory(hHandle, hAlloc, asm, (uint)asm.Length, out bytesWritten))
                    throw new ApplicationException("Cannot write process memory.");

                if (asm.Length != (int)bytesWritten)
                    throw new ApplicationException("Invalid written size.");
                uint iThreadId = 0;
                IntPtr hThread = CreateRemoteThread(hHandle, IntPtr.Zero, 0, hAlloc, IntPtr.Zero, 0, out iThreadId);

                if (hThread == IntPtr.Zero)
                    throw new ApplicationException("Cannot create and execute remote thread.");
                CloseHandle(hThread);
                CloseHandle(hHandle);


            }
        }
    }
     

    Таким образом программа компилится и вылетает на 5ом исключении(последнее - "Cannot create and execute remote thread.")

    Хотелось бы узнать, в чем проблема, ведь среда не пишет конкретной ошибки в коде, кроме как специально созданной)

    Ассемблерный листинг команд записан правильно. Память с кодом действительно выделилась в программе - проверил лично)

    Флаги, права доступа указаны, что может быть еще не так?

    Тема до жути интересна, на данный момент высвободилось время для изучения, чему я и рад)

     

    Кто может протестировать и подсказать, в чем я ошибся ? 

     

  20. 2 часа назад, barsuuk сказал:

    на счет юникода не уверен,как проверить?

    адрес 100% рабочий так как если прибавить к этому адресу 140 попадем на ник 2 игрока или если прибавить 24 то попадем на жизни

     

    получилось вывести 1 символ ника

    если попытаться вывести сразу все символы, прога вылетает когда доходит до вывода

     

    Увы, в c++ не силен, чем и грешен) Но все же, ваша задача скорее всего в том, чтобы перевести байты в тест, сделать это можно например в онлайн декодерах к примеру, а после посмотреть как это можно сделать на c++ в яндексе или гугле)

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.