• Изначальная память процесса и 4-х миллионный байт?

    @none7
    Поле ImageBase указывающее системе в какую часть виртуальной памяти процесса нужно разместить исполняемый файл. Традиционно .exe файлы размещают по адресу 0x400000, это не значит, что он занимает 4 мегабайта, просто адрес. Dll традиционно размещают по адресу 0x10000000; поскольку для dll весьма возможен конфликт адресов, к ним обязательно прикрепляют релоки. Адрес размещения .exe и .dll строго говоря может быть любым кратным 0x10000, но не 0, не адрес ntdll.dll и не в пространстве ядра. Сам же исполняемый файл может занимать минимум 1 страницу(4Кбайт на x86) памяти + минимум по 1 странице на секцию, независимо от адреса размещения исполняемого файла.
    То, что без таблицы импорта нельзя ничего сделать, строго говоря неверно. Можно через стандартные адреса выяснить где расположены системные .dll и их экспортируемые функции и через них загрузить всё, что необходимо. Но без самих системных .dll можно только зависнуть или умереть. Подгружать нужно то, что необходимо для работы кода приложения, это полностью зависит от самого приложения. Например для классического HelloWorld
    void func() {
        MessageBoxA(NULL, "Hello", "Hello, World!", MB_OK);
        ExitProcess(0);
    }
    нужны user32.dll:MessageBoxA и kernel32.dll:ExitProcess.
    Если обратиться к адресам памяти никак их не проинициализировав, то произойдёт исключение. Если при этом не настроены обработчики исключений, то выскочет традиционное окошко.ef716e0677a846e0a53b4665103d2029.png
    Ответ написан
    6 комментариев
  • Где в оперативной памяти находится виртуальная машина?

    @none7
    Включи в диспетчере задач включи отображение колонки Вид -> Выбрать столбцы... ->"Память - рабочий набор". Там скорее всего и будет видно.
    Ответ написан
  • Как сделать пагинацию на AJAX?

    @none7
    А разве для отправки запроса не нужно вызвать xmlHttp.send() ?
    Ответ написан
    Комментировать
  • Как просканировать IPv6 на наличие хостов?

    @none7
    Если не отвечает на ping6 ff02::1%ifname, то просканировать сеть IPv6 проблематично. Если коммутатор использовал EUI-64, то можно сформировать link-local адрес из MAC (calc). Ну или в крайнем случае при включении он должен рассылать ICMPv6 уведомления для предотвращения возможных конфликтов адресов и это уведомление можно поймать снифером.
    Ответ написан
    Комментировать
  • Что такое VirtualProtect?

    @none7
    ОС может блокировать для приложения возможность чтения, записи, исполнения определённых диапазонов виртуальной памяти. Например код *((char*)GetProcAddress(hkernel32, "GetProcAddress")) = 0 по умолчанию вызовет исключение. Но если выдать региону памяти права на запись, то первый байт функции в данном процессе будет успешно перезаписан.
    Ответ написан
    Комментировать
  • Как легко осуществить ввод/вывод string Visual C++?

    @none7
    #include <iostream>
    #include <string>
    
    int main() {
        std::string s1, s2;
        std::getline(std::cin, s1);
        std::cin >> s2;
    }
    Ответ написан
    2 комментария
  • Почему декомпилятор не может преобразовать код?

    @none7
    Код самого цикла с точки зрения ilspy выглядит так:
    for (int i = 0; i < bytes.Length; i += 2)
        bytes[i] = (byte)((int)bytes[i] ^ 168 - i);

    но по моему так:
    for (int i = 0; i < bytes.Length; i += 2)
        bytes[i] = (byte)((i - 168) ^ bytes[i]);

    Но выше цикла вообще ересь. Метод System.Console::WriteLine(string) требует 1 аргумент, а System.Text.Encoding::GetBytes(string) требует ещё и объект для которого будет вызван метод. И где же тогда соответствующие ldarg,ldloc ? Запустить этот кусок IL-кода мне также не удалось. Выплёвывает исключение System.InvalidProgramException, может быть этот кусок просто обманка, а реальный в обработчике исключения? Также вполне возможно, что данное приложение полиморф и этот код на самом деле будет переписан во время работы.
    Ответ написан
    1 комментарий
  • Как передать 270 кбайт информации по Сокету?

    @none7
    Размер TCP пакета обычно не превышает 1500 байт. Метод Receive записывает в буфер данные из пакета и возвращает их длину. Файл при желании можно даже передать по 1 байту в каждом пакете, и Receive будет также стабильно возвращать по 1 байту. MTU Loopback интерфейса более 2 Гб, поэтому 300 Кб данных приходят одним пакетом. Метод Send вроде тоже не гарантирует отправку всех данных.
    Ответ написан
    Комментировать
  • Нужно ли проверять полученные данные и отсылать уведомление о их получении при использовании TCP?

    @none7
    В нынешнем Интернете это вероятно не нужно. В Ethernet и оптоволокне шумы приводящие к ошибкам, возможны только при грубом нарушении правил строительства сети. В Wi-Fi, xDSL, сотовых сетях обеспечивают больший контроль целостности на канальном уровне. В IPv6 по этому поводу даже чексумму убрали, осталась только в TCP и UDP. Таких ошибок было много во времена Dial-Up, где контроль целостности на канальном уровне был явно недостаточен.
    Ответ написан
    Комментировать
  • Контрольная сумма С#?

    @none7
    Для первого набора байт подходит такой простой код:
    static byte[] crc(byte[] data) {
        ushort sum = 0;
        foreach (byte b in data)
            sum += b;
        return new byte[] {(byte)(sum & 255), (byte)(sum >> 8)};
    }

    Те есть сумма всех байтов сообщения включая код операции и длину сообщения, но без чексуммы. То есть в документации косяк чексумма считается с 0 по 4+n без -1, n длина данных для команды. Но там ведь сказано, что чексумма это «сумма байтов пакета».

    А вот собственно и полный тест:
    static ushort crc(byte[] data, ushort sum = 0) {
        foreach (byte b in data) sum += b;
        return sum;
    }
    static void Main(string[] args)
    {
        // пакеты без чексумм
        byte[] mass1 = new byte[] { 75, 0, 25, 0, 3, 48, 117, 0, 126, 37, 0, 188, 138, 169, 53, 66, 15, 52, 115, 203, 112, 103, 220, 16, 92, 237, 76, 80, 254};
        byte[] mass2 = new byte[] { 75, 0, 25, 0, 3, 64, 156, 0, 126, 37, 0, 188, 138, 169, 245, 165, 14, 52, 115, 203, 96, 64, 220, 16, 92, 237, 76, 80, 254};
        byte[] mass3 = new byte[] { 75, 0, 25, 0, 3, 80, 195, 0, 126, 37, 0, 88, 138, 169, 181, 9, 14, 52, 115, 203, 120, 60, 220, 32, 131, 237, 236, 214, 255};
        byte[] mass4 = new byte[] { 75, 0, 25, 0, 3, 112, 17, 1, 126, 37, 0, 88, 138, 169, 181, 9, 14, 52, 115, 203, 120, 60, 220, 32, 131, 237, 236, 214, 255};
        byte[] mass5 = new byte[] { 75, 0, 25, 0, 3, 60, 134, 1, 126, 37, 0, 88, 138, 169, 181, 9, 14, 52, 115, 203, 120, 60, 220, 32, 131, 237, 236, 214, 255};
    
        foreach(var mass in new byte[][] {mass1, mass2, mass3, mass4, mass5}) {
            bool first = true;
            Console.Write("{");
            foreach (var b in mass)  {
                if (!first) Console.Write(", ");
                else first = false;
    
                Console.Write(b);
            }
            var sum = BitConverter.GetBytes(crc(mass));
            // вывод чексуммы
            Console.WriteLine(", {0}, {1}}}", sum[0], sum[1]);
        }
    }
    Ответ написан
    2 комментария
  • Сколько ГБ Windows NT выделяет процессу?

    @none7
    With IMAGE_FILE_LARGE_ADDRESS_AWARE set (default):
    x64: 8 TB
    Intel Itanium-based systems: 7 TB
    Windows 8.1 and Windows Server 2012 R2: 128 TB
    2 GB with IMAGE_FILE_LARGE_ADDRESS_AWARE cleared
    Отсюда.
    Ответ написан
    Комментировать
  • Как провести инъекцию через UNION SELECT?

    @none7
    Ни UPDATE, ни DELETE через SELECT ... UNION провести нельзя. А раз доступ к файлам запрещён, то единственное, что Вы может, это вытащить из базы все доступные Вам данные. Через вложенные запросы.
    Ответ написан
    Комментировать
  • Можно ли связать консольное c# приложение с веб-мордой?

    @none7
    Интерфейс CGI/FastCGI устроит? Если нет то понадобится обертка преобразующая набор параметров и поток ввода если нужно.
    Ответ написан
    Комментировать
  • Литература по демонам?

    @none7
    Демон отличается от обычного консольного приложения тем, что отказывается от доступа к консоли и становиться независим от жизни и смерти процесса предка и консоли. Как бы это предложение растянуть на 600 страниц?
    Ответ написан
    5 комментариев
  • Как перенести код JS в C, что я делаю не правильно?

    @none7
    В чистом C нет динамических строк, есть только числовые переменные, указатели(ссылки), структуры и массивы фиксированного размера. Самым близким к JS коду, но и самым кривым будет такой код:
    char line[8];
    *line = 0;
    for(strcat(line, "#"); strlen(line) < 7; strcat(line, "#"))
        puts(line);
    Ответ написан
    Комментировать
  • Openvpn Не Меняет ip?

    @none7
    Fri Jul 22 23:35:48 2016 ROUTE: route addition failed using CreateIpForwardEntry: ???? ?????? ??? ????
    ??????. [status=5010 if_index=25]

    net helpmsg 5010
    Этот объект уже существует.
    На сервере видимо есть конфликтующий маршрут.
    Ответ написан
    Комментировать
  • Как правильно написать SEH-обработчик на ассемблере под win32?

    @none7
    К чему искать проблем с исключениями, если способ через PEB работает от Win2k до Win10?
    mov eax, fs:[18]
    mov eax, [eax+30h]
    mov eax, [eax+0ch]
    mov eax, [eax+0ch]

    Так находится структура описывающая основный .exe файл.
    +0h Next
    +18h HANDLE
    +24h UNICODE_STRING FullFileName
    +2Ch UNICODE_STRING ShortName
    Через Next можно перечислить все загруженные модули, следующим после .exe файла гарантировано будет ntdll. От вас требуется только написание stricmp для структур UNICODE_STRING, ну или импортировать RtlEqualUnicodeString из ntdll.
    Ответ написан
    3 комментария
  • Как узнать права на файл через консоль в windows?

    @none7
    cacls
    Ответ написан
    Комментировать
  • Можно ли открывать только часть кода при использовании библиотеки с лицензией GNU GPL?

    @none7
    Проприетарное ПО в принципе не может распространятся вместе с GPL кодом. Даже если если он идёт в отдельном исполняемом файле. С LGPL ещё можно динамически линковаться не изменяя, а полностью свободные в этом плане только BSD, MIT, Apache.
    Ответ написан
    4 комментария
  • Как узнать где будет располагаться кода в памяти EXE?

    @none7
    Вот говорил же злые хакеры всё уже сделали за Вас. Утилита PE Tools, выбрать процесс, выбрать исполняемый файл, ПКМ, PE editor -> read only, FLC(File Location Calculator), RVA, VA, file offset, считает, что угодно из чего угодно. Делать подсчёт в патчере смысла нет, если это не тот самый исполняемый файл, что и у Вас, то Вы его своим RVA to FO попросту сломаете. Просто запишите хеш файла и смещение в файле в исходник патчера. Кстати нагуглить код функции было проще простого rva to file offset
    Ответ написан