Ответы пользователя по тегу Assembler
  • Доступ к массиву объявленному в ассемблере из Си?

    @none7
    Это с точки зрения Ассемблера array это адрес. А с точки зрения Си uint32_t* array это глобальная статическая переменная в которой лежит указатель на uint32_t или соответствующий массив . То, что в Ассемблерах выглядит примерно так array_ptr dd offset array. А так как это bss, то естественно, что в этой переменной лежит ноль.
    Ответ написан
    4 комментария
  • Для чего вообще существует ассемблер?

    @none7
    Все алгоритмы openssl реализованы на Ассемблере. Потому, что оптимизирующие компиляторы генерируют не оптимальный код. Речь даже не про SIMD, самые простые инструкции при весьма ограниченном количестве переменных, компиляторы не в с состоянии расставить в идеальном порядке.
    Ответ написан
  • Как разобрать дамп объектного файла, скомпилированного MASM32?

    @none7
    Это формат COFF.
    Ответ написан
    Комментировать
  • Как процессор знает сколько байт занимает команда машинного кода?

    @none7
    Инструкции x86 разбросаны довольно хаотично по числовому диапазону, не говоря уже про их длину, но самому процессору намного проще декодировать инструкции, чем программам. Он просто имеет внутри дерево, если старший бит первого байта инструкции равен 0 одна ветвь, иначе другая. Так по ветвям он спускается и например доходит до инструкции 01010b (push reg) и вот он уже знает, что длина этой инструкции 5 бит + 3 бита аргументов. И может даже сразу запустить найденную инструкцию, если это какой-нибудь i286. И всё за 1 такт.
    Ответ написан
  • Почему не получается перемножать и делить assembler?

    @none7
    По моему дело в компиляторе Си. sizeof(al) != sizeof(short) отсюда и ошибка. Вторая ошибка это в том, что idiv принимает только один аргумент и делит dx:ax на указанный аргумент.
    Ответ написан
    Комментировать
  • Возможные способы вывода графики?

    @none7
    В смысле .jpeg,.png,.gif? Нельзя. Если речь про прямой доступ к видеобуферу то он 0xA000:0x0000 представлен как массив RGB-структур.
    Есть такой полезный сайт https://wiki.osdev.org/User:Omarrx024/VESA_Tutorial
    Ответ написан
    2 комментария
  • Как правильно оформить inline вставку ассемблера в отдельный код для MASM?

    @none7
    На x64 под виндой эта функция лишена смысла, поскольку стандартное соглашение вызовов не предполагает смещения стека для передачи параметров. Независимо от флагов stdcall/cdecl, компилятор использует fastcall.
    Ответ написан
  • R = ±2e* m как понимать эту формулу?

    @none7
    1. Я полагаю очевидно, старший бит традиционно указывает является ли число отрицательным. Ноль относится к положительным(±).
    2-3 нужно объяснять вместе. Мантисса это биты числа, сколько бы их не было для вычислений считается, что оно находится в диапазоне от 1 до 2, всё остальное дробная часть. Возьмём мантиссу 1,5 и умножим на 2. Так как число не влезает в диапазон, процессор просто добавляет степень двойки(2*e). Теперь он всё ещё хранит число 1,5 в мантиссе которое нужно умножить на 2 в первой степени(21*1,5). Если ещё раз умножить на 2, то будет во второй степени(22*1,5) и т.д. С числами меньше единицы, та же история 0.25 это мантисса 1 умноженная на 2 в минус 2 степени(+2-2*1).
    Ответ написан
    Комментировать
  • Почему падает ядро при записи в массив?

    @none7
    mov     eax, move
    mov     ebx, field

    Это присвоение указателей на переменные? А затем сложение двух указателей и запись в этот мусор? Возможно movzx eax, byte ptr [move]
    Ответ написан
  • Как сделать простой цикл с printf на nasm 64bit macos?

    @none7
    В Mac OS x86-64, rcx используется в качестве четвёртого параметра и не обязан сохранять свое значение после вызова функции. Храните значение счётчика в памяти или в одном из сохраняемым регистров(rbx, rbp, r12-r15), но помните Вы так же обязаны восстановить значения этих регистров, при выходе в код Си, если конечно меняли их.
    Посколько rcx не сохраняется то лучше заменить loop на пару инструкций dec, jne.
    Ответ написан
  • Почему написанная программа не отправляет уведомления?

    @none7
    Для отображения сообщения с Vista требуется флаг NIF_SHOWTIP. Без него только будет появляться иконка в трее, а сообщение будет подавлено. RegisterClassEx требует структуру WNDCLASSEX
    Ответ написан
    Комментировать
  • Как работает память процессов в windows?

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

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

    ASLR
    Я хочу просто перезаписат отделюную инструкцию, как мне это сделать, если она каждый раз находится на разных адресах.

    EnumProcessModules GetModuleFileNameEx
    Ответ написан
    Комментировать
  • Как реализуется унарный минус и логическое отрицание?

    @none7
    С машинной точки зрения нет особой разницы между bool,char и int, просто первые 2 в памяти обычно занимают меньше места. Также операции -x и x^255 выполняются одинаково быстро, то есть тоже никакой разницы.
    Ответ написан
  • Изначальная память процесса и 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
    Код самого цикла с точки зрения 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 комментарий
  • Как правильно написать 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 комментария
  • Что делает данный участок кода?

    @none7
    Что возвращают функции то и заталкиваем, то есть:
    invoke  AllocConsole
        invoke  GetStdHandle, STD_INPUT_HANDLE
            push    eax ;InputHandle
            push    eax ;InputHandle
        invoke  GetStdHandle, STD_OUTPUT_HANDLE
            push    eax ; OutputHandle
        invoke  SetConsoleMode, eax, ENABLE_PROCESSED_OUTPUT ; OutputHandle
            pop eax
        invoke  WriteConsole, eax, hello, msgsz, NULL, NULL ; OutputHandle
        invoke  FlushConsoleInputBuffer ; функция сама забирает 1 аргумент, InputHandle
            pop eax
        invoke  ReadConsole, eax, buf, bufsz, cnt, NULL ; InputHandle
        invoke  FreeConsole
        invoke  ExitProcess,0

    Компиляторы кстати так делать не будут. Они или сохранят значения в ebx, esi, edi или будут сохранять в стек через [ebp-x].
    Ответ написан
    2 комментария
  • Почему не работает код, какие есть нюансы fasm?

    @none7
    А зачем у Вас вообще include 'win32a.inc' и .code, если Вы под DOS пишете. Там никаких WinAPI и секций кода и данных нет. А вот org 100h в начале не помешал бы. Хоть fasm и может компилировать под различные системы, но оформление кода всегда разное; в википедии есть примеры для каждой из систем.
    Ответ написан
    8 комментариев
  • Основные принципы взлома для чайника?

    @none7
    Чтобы натравить готовый эксплоит на сайт знать вообще ничего не нужно. А при поиске уязвимостей не имея исходника и даже бинарника, нужно как можно больше знаний обо всех смежных областях. Так как дыры обычно случаются, когда программисты и админы используют инструмент, технологию, язык не до конца понимая как оно всё работает. SQL-инъекции самый отличный пример, того. Впрочем дыр в софте нынче всё меньше, сейчас модно искать дыры в мозгах людей.
    Ответ написан
    2 комментария
  • Как на Ассемблере сделать сложные условия?

    @none7
    Если именно а,b,c, и не экономить каждый байт, то
    cmp ax, 'a'
    setb cl
    cmp ax, 'c'
    seta ch
    or ch, cl
    jne default
    call [ax + jump_table - 'a']
    default:
    ret
    jump_table dd getHelp, openTextEditor, reboot
    Ответ написан
    1 комментарий