В этом треде мы изучаем самый компактный и низкоуровневый язык Ассемблер и смежную с ним область: Реверс-инженеринга (RE).
Вы пишите на ассемблере или собираетесь начать на нём писать? Программируете микроконтролёры, пишете драйвера для ОС, а то и саму ОС? Вам сюда. Вы изучаете алгоритмы работы закрытого софта, пишите патчи бинарников? Вам тоже сюда.
Попрошайки с "решите лабу по асме за меня" идут в общий тред, а лучше нахуй.
О, даже Крис есть тут в списках. Я бы посоветовал еще добавить курс exelab. Ранее это было очень уж годно, а сейчас уж не знаю как. Кстати, ОП ты пробовал реверсить с помощью radare2? Стоит туда вкатываться как в альтернативу IDA? Хотя мне она нравится. Уж куда лучше, чем родна и любимая олля, жаль уже почившая.
>>1015220 Я пробовал r2. Не рекомендую третий тред подряд, даже рядом с IDA не стоял, если тебе что-то серьезное нужно. А несерьезное можно хоть через objdump -D реверсить. Единственная причина использовать - кококо ида нешвабодная, дорогая, а ильфак пидар.
Алсо, что касается ольги, то ее клон вполне юзабелен, жив и здравствует, называется x64dbg.
>>1015227 >Единственная причина использовать - кококо ида нешвабодная, дорогая, а ильфак пидар. Но ведь это весомая причина, всё-таки. Ковыряю сейчас r2+webui, в первом приближении сносно. Сравнивать с IDA пока нелепо, но с objdump ещё нелепей.
>>1015296 Откуда вообще в этом итт треде взялось слово веб? У меня, например, бинарники по 10-20 метров, после анализа базы иды весят по полгига. Ида просто рисует нужные места листинга при переходе, а браузер как? Полностью грузит? Ну удачи ему, лол. Динамически подгружает при скролле? А если я долго скроллю? Не пробовал вебморду, от консольного интерфейса впечатления в основном негативные, от функциональности тоже, новый нативный гуй тоже руки не дошли еще посмотреть. Хорошего в веб-клиенте (или лучше в нативной ренедерилке, которая не будет продираться сквозь десятки слоев абстракций и песочниц, и не будет заставлять html/css делать не свойственные ему вещи) - только возможность запустить сложный анализ где-нибудь на соседней машине, пока на своей машине я лампово пишу скрипты и собираю сигнатурки для либ. Ну и совместная работа, куда же без нее, хотя с ней все очень сложно, нужен вменяемый undo, с которым все еще более сложно.
>>1015329 Не могу защищать radare2, так как с ним не работал, но не могу не заметить, что ты поехавший, если думаешь, что веб-интерфейс принципиально не может иметь возможности подгружать только нужные области данных. Говоря проще, хуйню несешь какую-то. Если ты имел в виду конкретную реализацию веб-интерфейса, а не веб-интерфейсы вообще, то ты просто очень плохо выразил мысль.
>>1015337 Перефразирую: количество анальной боли при реализации нативного интерфейса не идет ни в какое сравнение с той болью, которую придется испытать, чтобы сделать что-то хотя бы отдаленно юзабельное в браузере. Да, я имею в виду веб-интерфейсы вообще, и мне очень жаль, что индустрия до этого докатилась.
>>1015329 Ты какой-то из 90ых. Анальную боль несут с++/жаба, а не нода. А экономить на байткоде в 2к17 может хотеть либо ембеддщик с 8-битной атмегой, либо старый пердун с устаревшими рефлексамм. Загугли скрины уже, если самому некогда ковырять.
>>1015291 Как ты быстро. У меня нет WoT и скачать для того, чтобы посмотреть, нет возможности. Изменить количество боёв - не проблема. А где создаётся второй запрос, не знаю. Мне нужно узнать, где функция шифрования, та, которая использует '/start?data='. В IDA нет ссылки на неё. Возможно, она с помощью VMProtect защищена, а может и косвенно вызывается, поэтому и ссылки нет. OllyDbg 2.01 с плагином ScyllaHide (а может и без него, не проверял) нормально запускает программу. Запусти в отладчике, дождись, пока программа проверит валидность ключа, а потом поставь точку останова (Ctrl+G, название функции, когда перейдёт, жми F2) на WS2_32.send. Хотя разработчик для проверки ключа использует функцию WININET.HttpSendRequestA, то можно и на эту функцию поставить точку остановки. И не забудь выключить ASLR, в данном случае это только мешать будет. Скопируешь в блокнот, сохранишь как *.reg файл. Или в реест залезь. Потом перезагрузись.
>>1015467 >при запущенном боте Если запустить программу, она дважды соединяется с сервером: проверка обновлений и проверка ключа. Затем ничего не передаётся. По крайней мере, у меня именно так. Вот после запуска и проверки нужно поставить брекпойнт. Как вижу, передаётся 4 байта. Посмотри в Wireshark, что он там передаёт. Пингует сервер, что ли?
>>1015599 Нет, теперь всё правильно. Размер буфера 0xC1, что больше 0x64. А что хотя бы передаёт? Текст или бинарные данные? Щёлкни на третьем, от вершины стека, параметре правой кнопкой мыши и нажми "Follow in Dump". Если там текст "GET /start?....", то нужно будет трассировать до функции шифрования. Сначала можно Ctrl+F9, таким образом отладчик остановится на первом ret, что как раз будет выходом из функции send. А дальше F7 или F8 и смотри, что там идёт. Нужно найти, где в стек кладётся адрес (07CB15C8 в данном случае). И найти, откуда он берётся. Где-то поблизости, если повезёт, будет функция шифрования.
>>1015615 >Посмотри в Wireshark, что он там передаёт. Абсолютная тишина. >Follow in Dump Пикрелейтед Эта апишка не может для чего-то еще использоваться, кроме передачи по сети? Общение между потоками, например, я хз. Вообще я ловил два типа запроса, проверка ключа и этот start?data. Первый отправляется при запуске бота и старте боя, второй только при старте боя. А БП про который ты говорил срабатывает постоянно, я даже кнопку "в бой" не успеваю прожать.
>>1015627 >Абсолютная тишина Подозрительно. >для чего-то еще использоваться, кроме передачи по сети Если в сеть не идёт, значит локально используется. Попробуй брекпойнт на WININET.HttpSendRequestA. Или измени условие на [[esp+8]] == "GET"
>>1015662 >WININET.HttpSendRequestA Попался этот самый запрос с data. Не мог бы ты пояснить, куда копать дальше? По Ctrl-F9 меня кидает рядом, на 7129193D.
>>1015369 В общем, какой-то локальный мемчик про какую-то скучную лабу. Решай крякми, реверси реальный софт, реверси свои собственные сэмплы, забей на эту хуйню.
>>1015682 Можно и так. А можно и здесь, как-то по теме треда всё же. >>1015677 Предыдущий скрин, нашёл алгоритм шифрования, немного перепечатал с экрана, расшифровал и похоже, что передаются какие-то настройки. Почему так - не знаю. Скачал базовый набор для WoT на 2.5 Гб. И у меня отказывается загружаться CyberTank, если уже запущен клиент, а если сначала его, то не показываются танки. Как сделать, чтобы были доступны? >куда копать дальше Тебе надо найти, где данные шифруются. Если пролистнёшь по стеку (правое нижнее окно) вниз, то есть вероятность увидеть не шифрованные данные. Сейчас там видна шифрованная строка. Если не шифрованные данные есть, то жмёшь Ctrl+F9, оказываешься в конце функции, жмёшь F7/F8, оказываешься в предыдущей функции. Жми поочерёдно, посматривая в стек до тех пор, пока не дойдёшь до функции, которая шифрует строку. Ещё можешь сделать дамп программы (плагин OllyDumpEx, например), загрузи его в IDA, так гораздо удобнее будет. Завтра попробую сделать сам, если не осилишь, ты только напиши, как эти танки в ангар добавить, когда они и так там уже стоят.
>>1015912 >нашёл алгоритм шифрования, немного перепечатал с экрана, расшифровал Можешь скинуть описание? >похоже, что передаются какие-то настройки Мое предположение, в начале каждого боя, в параметре data бот отсылает хозяину ключ, плюс карту, возможно сетапы, а в ответ получает алгоритм действий и заодно декрементится счетчик доступных боев на серваке. >отказывается загружаться CyberTank Не могу сказать, не сталкивался с такой траблой. Единственный момент, чтоб дойти до момента передачи шифрованных данных, нужен валидный ключ. Если хочешь, могу расшарить каким-нибудь тимвьювером свою виртуалку с игрой, ботом и olly. >Завтра попробую сделать сам Если будет проще, напиши в скупе j0hnny_mn3monic[at]outlook.com, предоставлю готовое рабочее окружение.
>>1016125 Шифрование крутится в виртуальной машине VMProtect, что ожидаемо. >Можешь скинуть описание? for (i = 0; i < data_size; decrypt[ i ] = encrypt[ i ] ^ ((i + 0xD5) % 0xFF), i++); >Мое предположение Маловато места для алгоритма. Уже выключил всё, а скопировать не догадался. Там передаётся ключ, какая-то шифрованная строка длиной символов 20, некоторые параметры или что-то подобное. >чтоб дойти до момента передачи шифрованных данных, нужен валидный ключ Нет, не нужен. Ключ периодически проверяется во время работы, но ответ легко подделать. Он не шифрован, в Wireshark ты должен был его увидеть. А шифрованные данные передаются уже после начала боя, когда секундомер ожидания начала боя дойдёт до 0. Как уже писал ранее, самый простой вариант в данном случае - просто отправить ранее перехваченные данные обратно программе. Простейший прокси-сервер, который не пустит трафик программы дальше твоего компьютера. Программа использует системные настройки, поэтому перенаправить трафик очень просто, "Свойства обозревателя/Подключения/Настройка сети" в "Панели управления". Перехватываешь один раз сессию и всегда её используешь. Один и тот же ключ должен, наверное, давать один и тот же результат, если там, конечно же, не добавляется что-то типа времени. Только не забудь добавить проброс трафика, который не относится к программе, дальше, а иначе тот же Хром перестанет работать, т.к. он использует системные настройки. >Не могу сказать, не сталкивался с такой траблой Странное поведение, нужно сначала запускать программу в отладчике, а только потом игру, тогда всё работает.
>>1016149 >for (i = 0; i < data_size; decrypt[ i ] = encrypt[ i ] ^ ((i + 0xD5) % 0xFF), i++); Блин, я у мамы тупенький. Это обратимо, помимо перебора? >А шифрованные данные передаются уже после начала боя Сори, не совсем корректно написал, имел ввиду именно этот запрос. C подделкой счетчика боев в запросе checkKey проблем нет.
>>1016220 Где ты там два неизвестных нашел? Там однобайтовый ксор, просто тот байт просто не с нуля стартует и инкрементируется. Это не шифрование даже, а просто обфускация.
>>1016188 >Это обратимо, помимо перебора Да для ксора, функция шифрования и расшифровки одна и та же. Ты C(++) или C# знаешь? Имена всем переменным осознанные дал же, в чём именно сложность? >имел ввиду именно этот запрос Именно этот запрос и имел в виду. Не нужен валидный ключ, чтобы добраться до функции шифрования. Бот сам начинает нажимать кнопки, вступает в бой, а затем отправляет шифрованные данные. Забыл написать, функция перед шифрованием находится по адресу 0043EA10, можешь посмотреть, что именно передаётся. А ещё мне мысль в голову пришла, что та странная строка - это может быть hardware ID, как защита от того, что тебе советую. Для одного и того же компьютера может и пройдёт. >>1016238 У тебя ошибка, нет двух X. Первый X - текущий символ для шифровки/расшифровки. Второй X - это счётчик, он равен текущей позиции символа, от 0 до n - 1, где n - длина строки.
>>1016288 >У тебя ошибка, нет двух X. Сори, спасибо. Правда лыжи все равно не едут. В твоих руках это ienpfmofkilamheebffnkiicpnacebnibeamjjbipaodeglnfpbbkdnhinbjnmkfaneghfmickenhfhchddohbjnjbngcjahbbgnkfmdegibppnj превращается во что-то удобочитаемое? Сори, что дергаю по ерунде, просто скила не хватает, а интерес разгорелся, лол.
>>1016448 У меня тоже не едут, кстати. Может, вместо 0xd5 что-то динамическое? Алсо, зачем ты творишь эту херь с binascii, когда в питоне есть нормальные шестнадцатеричные константы? мимоанон
Давно хотел зайти сюда и спросить. Тут есть те, кто шарят в криптовке файлов, крипторах, алгоритмах шифрования и вот этом всем? Сложно ли мимо дурачку запердолить полиморфный криптор, и шоб антивирусы не палили без знаний ассемблера? Есть знания пифона и джаваскрипта.
>>1016563 "Полиморфный" как бы подразумевает, что ты будешь менять инструкции в стабе. Чтобы что-то менять, надо знать, что оно из себя представляет. Выучи асм, это самый простой язык.
>>1016448 >лыжи все равно не едут Это не для этого, а вот для этого >>1015627. То, что ты привёл, как раз и есть то, что тебе, в итоге, нужно. Так что увы, с этим пока ничего не получится. Кстати, когда у тебя срабатывает брекпойнт на HttpSendRequestA, окно с игрой перестаёт реагировать на любые действия? Как будто бы зависло приложение? И почему команда, в которую кидает, всё время проигрывает? Они что, без одного танка не могут победить? Один раз была победа и раз 5 поражение.
>>1016730 >когда у тебя срабатывает брекпойнт на HttpSendRequestA, окно с игрой перестаёт реагировать на любые действия Да >почему команда, в которую кидает, всё время проигрывает Это норма, они бы и с тобой лузнули. Имхо, это фишка разработчика по разводу на донат.
>>1016909 >А как ты код из-под VMProtect вытащил Никак не вытаскивал, функция была не защищена, а с программы был снят дамп, поэтому с ним можно работать в IDA.
А че на этих ваших ассемблерах писать можно? Надо прокачать архитектуру компютера там, операциооные системы, системное программирование. Короче, есть ли прикол писать на ассемблере?
>>1018318 Что угодно. То же, что и на других языках.
> есть ли прикол писать на ассемблере В основном для обучения и ради интереса. Ну и для embedded небольшие кусочки приходится писать именно на ассемблере.
>>1018318 >А че на этих ваших ассемблерах писать можно? Что угодно от Hello World до операционной системы. >Короче, есть ли прикол писать на ассемблере? Есть.
>>1018408 Компиляторы (трансляторы) транслируют код во что-то. Это может быть машинный код (он же двоичный), может быть ассемблер текстом, может быть сишечка текстом (так делал C++ в давние-давние времена, и для последующей обработки уже требовался компилятор сишечки), может быть байткод какой-нибудь вм, может быть какое-то промежуточное представление (погугли link-time code generation - в таком случае машинный код генерит линкер, это позволяет делать некоторые глобальные оптимизации). Вариантов дохуя. Общее в них только то, что код на чем-то человекочитаемом преобразуется во что-то другое (часто более низкоуровневое, но не обязательно).
>>1018436 Я не уточнил, что имел ввиду компиляторы в нативный код. Но я не могу понять, как можно компилировать в двоичный код, для чего. Если процессор понимает только команды ассемблера, как двоичный код будет исполняться? Тогда другой вопрос возникает, если компилятор транслирует в ассемблер, то тогда требуется повторная компиляция в исполняемые файлы компилятором ассемблера.
>>1018441 Команды ассемблера - это текст. Компилятор ассемблера превращает текст в двоичный код, в байтики. В байтиках закодированы инструкции, ну т.е., вот такие-то биты говорят, какая инструкция, что она делает, вот тут у нас immediate, вот тут биты указывают, в какой регистр положить результат. Процессор читает байтики, разбирает вот эту закодированную информацию и делает, что указано.
> Тогда другой вопрос возникает, если компилятор транслирует в ассемблер, то тогда требуется повторная компиляция в исполняемые файлы компилятором ассемблера. Именно так и делается в классическом тулчейне. Просто то, что ты считаешь компилятором, называется compiler driver. Для сишечки он: примет аргументы, вызовет препроцессор, для результата препроцессирования вызовет компилятор (транслятор), для результатов компиляции вызовет ассемблер, для полученных объектных файлов вызовет линкер, и ты получишь свой исполняемый бинарник. Компилятор может содержать все эти утилиты внутри себя, может объединять некоторые этапы (например, может напрямую генерить машинный код, и никакого ассемблера текстом), поэтому ты можешь получить исполняемый файл без промежуточных результатов - зависит от компилятора.
>>1018446 Спасибо за подробное разъяснение. Команды ассемблера и инструкции процессора это не одно и то же? Если нет, то можно ли обращаться напрямую к процессору без ассемблера?
>>1018450 > Команды ассемблера и инструкции процессора это не одно и то же? Все сложно. Одну команду ассемблера ассемблер может превращать в разные инструкции (например, для тебя mov - это просто mov, а для процессора есть разные - mov reg, reg; mov reg, imm; mov reg, [reg] - опкоды отличаются), могут быть оптимизации на уровне ассемблера (масм заменял lea на mov, или наоборот - не помню уже), могут быть псевдоинструкции (например, в ARM некоторые команды не существуют на самом деле и разворачиваются в несколько реальных инструкций). Но в общем и целом соответствие почти полное. Т.е., ассемблерные "команды" - это просто человеко-читаемые имена для реальных кодов инструкций процессора.
> можно ли обращаться напрямую к процессору без ассемблера Качаешь мануал по процессору, ищешь формат инструкций, ищешь таблицу опкодов, втыкаешь нужные числа в нужные места, пишешь байтики в память и выполняешь. В этом даже есть некоторый смысл, если ты хочешь написать свой JIT с нуля и не хочешь таскать за собой внешний кодогенератор или ассемблер.
>>1018452 Так если у процессора и ассемблера разные инструкции, то зачем лишняя прослойка? Пока не догоняю разницу между инструкциями процессора и командами ассемблера, если разница вообще есть.
>>1018459 >>1018461 Спасибо за помощь. Зачем мне это? Чтобы понять откуда ноги растут. Слишком много абстракций друг на друге, хочется понять с чего все начинается, чтобы понимать как все работает изнутри. А то получается пишешь какие то заклинания, как будто магия. Это не дает мне покоя.
>>1018463 Понятно что проще. Но для меня непонятно все ли возможности дает ассемблер, какие дает процессор. И какова разница в их эффективности. Опять же в ассемблерах встречаются функции, в процессоре как я понимаю их нет, вот хочу понять во что они транслируются.
Существует путаница, даже в руководствах Интела инструкциями процессора называют - команды непосредственно процессора, команды ассемблера, и даже двоичный код.
>>1018462 >то зачем лишняя прослойка? Затем, что она адреса автоматически проставляет. Если ты пишешь в машинном коде, ты должен высчитывать размер каждой инструкции, чтобы поставить джамп в нужное место, знать адреса каждой константы. Причем если ты добавляешь код в середину функции, то все адреса, соответственно, изменяются, и тебе приходится все заново все пересчитывать. Основная функция ассемблера - именно линковка и проставление адресов, а не текстовое представление кода. Цифры не так уж сложно читать при должной практике.
В PE файле релоки могут быть где либо кроме кодовых секций? Спрашиваю потому, что если придется их фиксить вручную, можно ли ебануть VirtualProtect(...PAGE_READWRITE, &oldProtect) по всему диапазону релоков, а потом восстанавливать через тот же oldProtect, или там могут попасться и секции данных, и tls и еще хуй знает то?
>>1015083 (OP) Господа, пишу криптор. Для запуска программы в памяти мне нужен PE-загрузчик. Стоит ли писать его с использованием некоторых объектов C++ STL? Отказываться от STL все равно что выйти из зоны комфорта. Может ли использование STL помешать морфингу кода и затруднить чистку стаба?
>>1020547 Дак вот в том и дело, что если при каждой итерации для страницы это делать, то дохуя вызовов VirtualProtect получается. Я думал, может можно в 2 вызова это сделать, а не 2N
>>1020563 Почему C++ такой уебищный? Пишу PE-загрузчик и десять минут потратил на создание сущностей для автоматического освобождения ресурсов, хотя если бы писал на си, то мог бы сосредоточиться на решении задачи.
Что находится в [image_optional_header] SizeOfHeaders? Суммарный размер всех заголовков или может быть что-то другое? Можно рассчитывать на значение этого поля, проецируя все заголовки на память?
>>1015083 (OP) Подскажите библиотеки для ассемблирования и дезассемблирования или расскажите как пользоваться вот этим http://ref.x86asm.net/coder64.html Что означают эти r/m8, r16/32/64, m16/32, imm8. Ну я предпологаю, что r означает регистр, а остальное не очень понятно. А ещё я немного не понимаю команду jmp. Это относительный переход? Абсолютный? Или и то и то? Просто я не понимаю как происходят переходы в обычных программах, ведь они каждый раз загружаются в разные участки памяти. То же самое и с mov [адрес],значение. А ещё мне хорошо бы почитать про устройство elf-файла и линковку с библиотеками. Я не нашёл.
>>1022266 > библиотеки для ассемблирования и дезассемблирования keystone/capstone
> Что означают эти r/m8, r16/32/64, m16/32, imm8 r - регистр, m - память, imm - непосредственное значение (константа, которая кодируется прямо в инструкцию) циферка - количество бит. r/m8 - восьмибитный регистр или байт из памяти.
>>1025441 Молча. Они на них пишут. Ты тоже так можешь уже много лет: #include <stdio.h> static void йоба(char сообщение[]) { puts(сообщение); } int main(void) { йоба("привет, мир"); } Как тебе Hopper?
>>1025602 Оперативку он жрет конкретно, бинарники от 20мб и выше IDA отжирает 300-400мб, Hopper жрет гиг и более. После закрытия файлов память практически не освобождается, постоянно нужно перезапускать программу.
Сам реверсач, помоги неофиту. Решил я поиграть в скайрим, и сейчас нужно много золота. Ну я подумал - хули, сейчас подкрутим. Расчехлил ollydbg, запустил в нем skyrim и понял, что я обосрался: я не могу найти переменную, в которой хранится количество золота. Что я уже пробовал: 1. Смотрел количество золота и искал его hex-значение в секции .data в виртуальной памяти, не исполняемом файле, он же вроде memory dump. Также искал значение в стеках каждого треда. Значение пробовал как в прямом порядке искать, так и обратном, свойственном виртуальной памяти (типа 00 00 0E 8B и 8B 0E 00 00 ). Нихуя не получилось, в памяти очень много адресов с этим значением. 2. Далее, попробовал сделать search for referenced strings, поставил брейкпоинты на всю хуйню с текстом gold вне зависимости от регистра. Теперь, когда я открываю инвентарь, у меня срабатывает BP (т.к. там в инвентаре кол-во золота отображается), казалось бы, прощелкай пошагово всю хуйню и найди где есть обращение к переменной, в которой хранится количество золота. Но это пиздец, там очень много щелкать приходится.
Я так понимаю, что 2 вариант более работоспособный, поэтому меня интересует, нет ли какого то механизма в ollydbg, который мог бы мне помочь? С чего вообще стоит начинать и как стоит делать, чтобы в программе найти значение какой либо переменной и подкрутить ей значение?
>>1026185 Делай, как Крис Касперски: сделай дамп образа, чтобы зафиксировать текущее число голды. Измени количество голды и сделай еще один дамп. Для верности сделай еще дамп с другим количеством голды. Сравни дампы.
>>1026213 А можно просто взять Cheat Engine, который сделает это автоматически. Алсо, искать константу лишено всякого смысла. Значение может быть в "копейках" (или еще каком-то fixed-point), может быть float или double. Может быть зашифровано, может дублироваться и сравниваться. Много чего может быть.
>>1026213 То есть нет волшебной кнопки "сделать заебись"? Либо вручную перебирать ебучие DWORD'ы, либо сделать как ты предлагаешь, либо использовать cheat engine, который автоматизирует то же самое?
>>1028885 Нет разницы, как учить асм. Это самый простой язык, где все сложности заканчиваются на отличиях компиляторов. Можно хоть Intel SDM читать. Калашников сойдет тоже.
>>1028916 Спасибо, анон. А что на счёт практических задачек? Как я понял, в ассемблировании важно понять не сколько сам яп с его синтаксисом и набором инструкций, сколько принципы работы CPU, изменение регистров по ходу кода етс. А у Калашникова ничего веселее разбора резидента нет вроде. Может есть какой-нибудь годный сборник лаб для студентов дцп курса, а то читать и тупо копипастить код уже утомило.
>>1028980 Не знаю, чего тебе конкретного посоветовать. Так-то в 32-битный асм вкатиться проще: если знаешь какой-нибудь Си, можно компилировать код с разным уровнем оптимизаций и смотреть, во что он свернется; на васме были туториалы Iczelion-а, можно писать полноценные десктопные приложения, смотреть олькой или x64dbg, как они выполняются и т. д. Но у тебя там 16-битный код ведь? Пытайся играть с каждой новой инструкцией, пиши минимальные программки в 3-4 инструкции, разбирайся, как все работает. Возьми простые задачки для любого другого языка и пиши их на асме. Подходы к реализации от языка не меняются. Алсо, можешь взять Human Resource Machine, поиграть в нее, потом поделать то же самое на реальном ассемблере.
Пацаны, а каким образом хранятся переменные в C? Вообще переменные в высших языках это одно и тоже на низком уровне? Это же надо сопоставить имя переменной и ее значение. А Имя переменной оно же огромное, это буквы, каждую нужно закодировать минимум одним байтом. Почему дураки программисты их используют вместо номера ячеек памяти? Это же очевидная оптимизация!
>>1033634 Толсто. Во время компиляции имена заменяются на номера ячеек памяти. Если изначально использовать адреса, ты заебешься их пересчитывать вручную при изменении программы. Для этого-то как раз изначально и придумали ассемблер, а потом и другие языки.
Сап, драч. Допустим, есть вызов функции, после которого EAX принимает известное мне еще до вызова функции значение. Мне нужно найти, где это значение присваивается в ходе выполнения функции. Можно ли в ollydbg поставить брейкпоинт, чтобы когда определенный регистр принимал определенное значение, срабатывал БП? Conditional breakpoint мне не очень подходит, т.к. он, как я понял, срабатывает на определенной инструкции, а не на всей функции
>>1015220 Годная тулза, но только если нравится/удобно ковыряться в сонсоли. Для большого унылого энтерпрайза не очень, но для ctf/прошивок/эмуляции - самое оно мимо р2фанбой
>>1037376 > Error in `r2': double free or corruption (!prev) > Aborted (core dumped) Каждый раз, когда у меня возникает необходимость это использовать (IDA под рукой нет), дело заканчивается листингом objdump. По разным причинам. Сегодня, например, вот так.
Что мне нужно учесть, если я в PE файл хочу добавить запись об импорте функции из kernel32.dll? Наиболее оптимальным по трудозатратам и красоте мне кажется в конец существующей таблицы импорта добавить новую запись kernel32.dll и нужную из неё функцию, ибо я в рот ебал вставлять функцию в уже существующем импорте kernel32.dll и искать все вызовы импортируемых после вставки функций, чтобы добавлять к ним смещение.
Допустим, что секция, в которой находится таблица импортов, позволит вместить в себя достаточно байт, чтобы за оффсет не перевалить. Я понимаю, что нужно увеличить виртуальный размер секции с импортом, увеличить размер IMPORT_DATA_DIRECTORY или как там её. Какие еще подводные камни?
>>1039413 Да бля понятно что тут ссылок дохуя и все годные, я спрашивал про фундаментальные вещи и нужно ли они типо, а надо ли по ОС заморочится?Надо ли читать Таненбаумана?а архитектуру проццесора?мне сначала это прочитать а потом уже асм,гайды хуйды по реверсу или и так норм
>>1039626 как вкатиться, как вкатиться. ответь себе вопрос что происходит с программной точки зрения, когда ты отправляешь сообщения на дваче от нажатия на клавишу и движения мышкой до ввода капчи и нажатия отправить. нахуй оно тебе нужно, читать сразу обо всём без конкретной задачи. информация не будет задерживаться. поставь себе задачу в поле RE. любую, хоть самую дебильную, и решай её. так и вкатишься.
>>1039626 > надо ли Надо. И го выучить надо. И джаву с паттернами. И алгоритмы. И цифровую схемотехнику. Чем больше ты знаешь - тем проще реверсить. Но в каком конкретно порядке учить - похуй. Можно просто начать с первой ссылки в шапке. Можно просто выучить асм. Можно начать с теории.
Вопрос знатокам оптимизаций: как можн оптимизировать следующий цикл с учетом того что ег осложность что-то между O(n^2) и O(n^3). Все перменные это ymm регистры, но даже один единственный лишний mov уменьшает скорость на 15-20%
>>1039626 >>1039626 Таненбаум та еще ересь, по крайней мере на русском, в оригинале нет. Лет 20 назад до дыр зачитал книгу Кейслер операционные системы - проектирование. Проясняет мозги.
>>1042647 Таненбаум читабелен. Местами вводит ненужные сущности, местами рассказывает о какой-нибудь хуйне до ее описания, но в целом норм (английскую версию читал).
>>1016757 Зачем только за эти танки взялся? От нечего делать, сделал митм на трафик танков. Пароль передаётся в открытом виде, хотя он и в зашифрованном трафике, но заменить публичный ключ на свой не составляет труда, что, собственно, мной же и сделано. Не понимаю, что за тупость у разработчиков? Сделать SHA256 от пароля хотя бы что мешает? Увести пароль от аккаунта проще некуда, возможно, даже фаервол ничего не скажет, весь трафик будет локальным. А на сервере, интересно, пароль хранится в незашифрованном виде? А может так было изначально в движке. "Server Programming Guide" BigWorld легко гуглится. >When a player logs in to a BigWorld server, he sends a username and a password. These are compared to a server-side database, to make sure that the user is subscribed. Ни слова о том, что логин/пароль передаётся в зашифрованном виде. Вообще, защита трафика от прослушки (и, возможно, модификации) очень плохая. Мне даже не пришлось модифицировать программу, чтобы его прослушать. >It would still be possible for a player to hack its own binary and sniff the data stream from the server after it has been decrypted. Гордо написано в гайде, что не правда. Ничего не надо модифицировать, клиент не знает, сервер не догадывается. Интересно, что передаётся в трафике. Сейчас это набор бинарных данных, ничего толком не понятно, кроме строк, которые в них проскакивают. Действительно ли совсем ничего лишнего клиенту не передаётся? Так же у меня есть идея, как сделать обход проверки в боте. Но мне лень сейчас это реализовывать.
>>1042965 Ты в свой тред заглядывал вообще? Что ты конкретно хочешь эмулировать? Ты осознаешь, что к моменту, когда твой код получает управление, процесс уже создан, и LdrpAllocateTls уже отработала? Зачем тебе второй раз ее запускать?
>>1043001 > публичный ключ на свой не составляет труда Это палево и пиздец какое, олсо: >Сделать SHA256 от пароля хотя бы что мешает? Что мешает вычислить пароль с коллизионным SHA256?
>>1043170 >Это палево В чём или на чём? Само собой, трафик нужно расшифровать и снова зашифровать нужным публичным ключом. Мой аккаунт пока что не заблокировали. Если заблокируют, тогда где-то по тихому передаётся информация о публичном ключе. Не написал, что используется RSA, не сертификат. >с коллизионным SHA256 Сложность вычисления коллизии? Это всё-равно лучше, чем пароль открытым текстом. Можно усложнить и добавить соль, которую присылает сервер. Или ещё более усложнить, вычисляя SHA от SHA несколько тысяч раз, как сделано в Wifi.
>>1043360 Долбаеб короче с кем я спорю Ты сам читал статью то? Это поиск коллизии только на 24 раунда из 64 в SHA256, для всех раундов каких либо результатов значительно снижающих количество операций пл сравнению с полным перебором - нет.
Кроме того только недавно была опубликовпна ПЕРВАЯ коллизия найденная гуглом на суперкомпах для SHA-1, а SHA-256 значительно сложнее [1], короче иди нахуй уроки учить
>>1043391 > Что мешает навернуть birthday Мешает то, что SHA256reduced - это не SHA256. С точки зрения криптографии - это две родственные, но разные хэш-функции.
>>1043397 Но разве мы не можем перейти от одного класса к другому заменив функцию расширения сообщений использующуюся с DCE? Я просто к чему веду, недавно ломали JP Morgan Chase, кто в теме говорили о факте компроментации (сорри за мой русский он не совсем родной, я его не очень часто практикую, разве что в /b/) SHA256 на 80 раундов, причем во внутренней сети, т.е. дело обошлось ресурсами какого-то из внутренних серваков на который закинули минимальный код через сотрудников. Да и пруфы косвенные есть, в частности сменили все хеши на BF судя по техникал репортам.
Пацаны тут СЕНСАЦИЯ сыч с двача ищет коллизии к SHA 256 как два пальца, чисто чтоб пароль к танкам проснифить,призываем срочно в тред криптографический отдел гугла чтоб захайить ГЕНИЯ, в то они там мучаются а на дваче все давно уже известно!!
>>1043469 Т.е вся твоя аргументация строится на теории заговора которую невозможно подтвердить мои опровергнуть?
Кще раз, парень писал что надо бы закрыит алеие текст пароли в протоколе танков хотя бы хешем SHA256, на что анон (ты или другой) ответил что это ничего не изменит и якобы колизию подобрать легко. Плз расскажи как ТЫ это будешь делать? Без крутых историй заговора и херни типа я был на конфе в вегасе, а также ссылок на статьи которые ты сам не читал.
Есть софт для которого под МакОС есть кряк. Кряк сделан в виде замены главного exe файл. Лицензирование сделано через текстовый txt файл. Exe'шник при попытке запуска через виртуалку отрубается.
Насколько сложно будет портировать кряк под шиндовс? Ида умеет разбирать маковские исполняемые файлы? Есть ли там аналог diff'a для сравнения двух версий файла? Чтобы сразу было ясно где пропатчено? Кто-нибудь тут уже делал подобные операции?
Это тред байтоебов? Поясните, пожалуйста за такую вещь. - вот есть некий вирос, он ловится антивиросами по характерным сигнатурам (да?). - сигнатура - это машинный код. - одно и то же состояние регистров может быть вызвано разным машинным кодом / ассемблерными коммандами. - предположим, у нас есть метод автоматически получать подобные "синонимичные" комманды (разный машинный код, приводящий к одинаковым состояниям регистров) для любого нужного состояния регистров. Можем ли мы исходя из этого получить неуязвимый вирос, просто меняя изначальный машинный код на "синонимичный"?
>>1055424 >он ловится антивиросами по характерным сигнатурам (да?). Нет. Это уже не так с середины 00-х. Ловится по поведению динамически. >Можем ли мы исходя из этого получить неуязвимый вирос, просто меняя изначальный машинный код на "синонимичный"? Можем.
>>1055497>>1055509 >Ловится по поведению динамически. А какое поведение считается неправильным? Представим полностью полиморфный meterpreter. Антивирос его не спалил по сигнатурам. Что нужно сделать программе, чтобы антивирос таки догадался? Ну кроме очевидной толстоты - форматирования винтов, массового удаления файлов и т.д.
>>1055512 >массового удаления файлов Судя по массовому распространению шифраторов, это нормальное поведение программы. Не нормальное поведение для антивируса, это когда программа создаёт удалённый поток, копирует/записывает в память чужого процесса, изменяет исполняемые файлы, читал, что очень не нравится антивирусу, когда программа обращается к службе BITS. Много чего ему может не нравиться.
Поясните, пожалуйста, за тонкую разницу и отношения между опкодом, байткодом и машинным кодом. Как понял я: - мнемоники (MOV, PUSH и т.д.) - удобное для человека представление опкодов - опкод - единичный элемент машинного кода - машинный код - исполняемая процессором последовательность опкодов (?) - байткод - ??? - отношение опкода к байткоду - ??? - отношение машинного кода к байткоду - ??? Или где можно почитать про это внятно, коротко и по-существу? Что скажете за этот ресурс http://ref.x86asm.net/
>>1056129 >опкод - MOV Но MOV это же мнемокод для удобства, опкоды у этой комманды могут быть разные. Машинный код - это бинарное представление 16ричного байткода?
А еще есть https://en.wikipedia.org/wiki/Micro-operation Короче, я окончательно запутался... Вот то, что можно посмотреть в hiew - это что? Опкод, машинный код, байткод или микрооперации?
>>1056105 >байткод Где-то читал такое определение. Байткод - это код, длина которого равна одному байту. Как понимаю, длина команды, без аргументов. Это, по большей части, к скриптовым языкам относится. Остальное не знаю. Вроде про мнемоники правильно ты написал.
>>1056201 Байткодом обычно называют машинный код для несуществующей (виртуальной) машины.
>>1056174 > что можно посмотреть в hiew Хекс-дамп. Для дизасма лучше использовать более современные инструменты. В дизасме ты видишь представление машинного кода в виде мнемоник ассемблера. Опкод - часть инструкции (байтики), кодирующая непосредственно саму операцию (остальные части могут кодировать непосредственные значения, регистры, условие и т. д.). Микрооперации выполняют процессоры с микрокодом при обработке всех или только некоторых сложных инструкций (т.е., инструкция машинного кода может выполняться в виде нескольких микроопераций).
У микропроцессора есть система (набор) команд, которые он может выполнить, и все эти команды кодируются в памяти с помощью чисел. Ну условно говоря, число 1 может обозначать "сложить регистры A и B и поместить результат в C", а например 2 - "поместить ноль в регистр X". Соответственно, программа для процессора записана в памяти как последовательность таких чисел. Он читает их и выполняет по очереди.
Опкод - это просто сокращение для "код операции". В машинном коде у каждой команды свой код, это и есть опкод. В примере выше 1 это опкод для операции сложения.
Машинный код (копипащу) или машинный язык — система команд (набор кодов операций) конкретной вычислительной машины.
Человеку неудобно читать числа, потому придуман ассемблер - язык, который представляет машинные коды в виде текстовых команд вроде ld r12, 0x0
Байткод - это что-то вроде машинного кода, но не для процессора, а для виртуальной машины (например, байткод Java или .NET). То есть последовательность примитивных команд, записанная в виде чисел, которую выполняет не процессор, а программа (виртуальная машина). Команды в нем не обязаны занимать один байт.
Микрооперации - это примитивные внутренние для процессора команды, на которые он разбивает большую сложную команду. Ну то есть если допустим у какого-то процессора есть команда "поместить в регистр X значение из ячейки памяти по адресу равному Y + Z" то он может разбить ее на такие микрооперации:
- сложить регистры Y и Z, поместив результат во временный регистр T - направить запрос на чтение памяти по адресу из T - поместить пришедший из памяти результат в регистр X
Микрооперации никак не видны снаружи, они есть только внутри процессора и про них знают только его разработчики (информация о внутреннем устройстве процессора обычно не публикуется). Когда-то в микропроцессорах все команды (и микрооперации, на которые они разбиваются) были жестко заложены в схеме, но в последние лет 20 вместо этого используют микрокод, который можно перезаписать. Это сделано для того, чтобы можно было исправить ошибку после выпуска процессора.
- смещение в байтах относительно начала файла - машинные коды, записанные в 16-чной системе счисление, представляющие одну команду процессора (те самые опкоды) - та же команда на ассемблере
>>1057188 Спасибо, теперь понятно. А вот на пике одним и тем же ассемблерным коммандам соответствуют разные коды, это почему? Или там не только комманды, но и операнды? >>1057189 >Ты бы попробовал сделать или хотя бы спроектировать простейший микропроцессор из логических элементов, сразу лучше все это понимать начнешь. Да ну, я в такое не смогу.
>>1057370 > одним и тем же ассемблерным коммандам соответствуют разные коды Тут от разработчика набора инструкций зависит. Обычно разные опкоды делают для разных наборов операндов. Например, может быть опкод для mov reg, imm32, и другой для mov reg, reg.
>>1057370 > одним и тем же ассемблерным коммандам соответствуют разные коды Значит они не совсем одинаковые. Если ты про таблицу отсюда >>1056137 - то там именно что разные команды. Ну например, если взять первые 3 строчки:
Видно, что здесь одна команда, но разный порядок и типы операндов. В зависимости от них и выбирается код.
Также, здесь написаны команды в обобщенном виде. Ну например r8 (r = register) - это один из 8-битных регистров (AH, AL, BH, BL, CH, CL, DH, DL). А r/m8 (m = memory) значит "8-битный регистр или указание на ячейку памяти".
Тут видно, что указать в качестве r/m8 адрес ячейки памяти можно несколькими способами (квадратные скобки обозначают доступ к памяти):
- указать ядрес явно: MOV [123456], AH -> скопировать 1 байт из ячейки с адресом 123456 в регистр AH - указать, что адрес берется из регистра: MOV [EBX], AH - указать что адрес хранится в 32-битном регистре, к которому прибавляется 1-или 4-байтное смещение: MOV [EAX + 12], BH - указать адрес с помощью сложного выражения SIB, вроде MOV [EAX + EBX x 4], CH
Разумеется, чтобы их различать, после кода 88 идут дополнительные байты. Если мы почитаем например статью тут
то мы увидим, что инструкции в машинном коде могут состоять из нескольких байт.
- в начале может идти префикс, меняющий какие-то параметры команды (обычно он используется для выбора размера данных, надо которыми выполняется операция, 16/32 или 64 бита), - затем идет опкод из 1 или 2 байт - затем может идти байт MOD R/M который кодирует, над какими именно регистрами делается операция - затем может идти байт SIB, смещение или явно указанный адрес ячейки памяти. Они указываются только если они используются в команде.
Так что реально команда MOV AH, CL кодируется 2 байтами - код операции и байт выбора регистров MOD R/M. А команда MOV [123456], AH состоит из опкода, байта MOD R/M и 4-байтового адреса ячейки памяти.
Ты просто наверно пропускаешь основы и берешься сразу за сложное. Сначала тебе надо изучить, какие есть в процессоре регистры, какие есть режимы адресации, а потом уже смотреть, как кодируется та или иная команда, иначе ты не поймешь зачем нужны байты вроде MOD R/M в машинном коде.
Ну и не у всех процессоров такая сложная система команд. Если еще такой подход как RISC, где используется небольшое число простых команд.
>>1057370 Чтобы спроектировать процессор, надо изучить логические схемы: регистры, триггеры, счетчики, логические элементы. Соответственно, (простейший) процессор состоит из:
- постоянных и временных регистров для хранения данных - АЛУ, устройство, которое делает арифметические и логические операции надо числами (например, складывает) - шины или шин для передачи данных между регистрами, АЛУ и памятью - декодера команд, который "разбирает" код команды и о котором ниже
Вот пример простейшего процессора. Он содержит:
- IP - регистр, хранящий адрес текущей выполняемой команды. Он увеличивается на 1 после чтения одного байта из памяти. Изначально при включении процессора он хранит 0, то есть программа должна располагаться в памяти, начиная с ячейки с адресом 0 - временный регистр CMD для хранения прочитанной из памяти команды. Вход этого регистра подключен к шине данных (по которой приходит прочитанная команда), а выход - к декодеру - декодер команд. Он читает команду из CMD и выдает на выходах сигналы, указывающие микрооперации, из которых состоит команда - 2 8-битных регистра A и B - временный регистр для хранения результата R - АЛУ, входы которого жестко подключены к регистрам A и B, а выход к R
Процессор должен разбивать команду на микрооперации, каждая из которых выполняется в определенный момент времени (такт). Допустим, у нашего процессора есть команда LD A, $X, которая кладет в регистр A число $X (указанное после кода команды). Вот как ее можно разбить на микрооперации:
Первые 3 микрооперации выполняются для любой команды (чтение кода команды из памяти), а следующие зависят от того, какая именно команда была прочитана.
1) подсоединить выход регистра IP к шине адреса памяти, подать в память сигнал чтения
В ответ на это память выдаст на шину данных содержимое ячейки по адресу из регистра IP.
2) подсоединить вход CMD к шине данных и сохранить пришедший из памяти код команды в этом регистре. Так как выход CMD подсоединен к декодеру команд, то он разбирает команду и на его выходе появляются управляющие сигналы, которые выбирают, какие именно микрооперации (на шагах 4, 5 и 6) надо будет делать дальше.
3) увеличить значение регистра IP на один
Теперь идут микрооперации, которые относятся конкретно к команде LD A, $X. Нам надо прочитать следующий байт из памяти и сохранить его в A
4) подсоединить выход регистра IP к шине адреса памяти, подать в память сигнал чтения
В ответ на это память выдаст на шину данных содержимое ячейки по адресу из регистра IP (то есть число $X, которое хранится после кода команды)
5) подсоединить вход A к шине данных и сохранить значение с нее в регистре
6) увеличить значение регистра IP на один
7) команда выполнена, перейти к шагу 1
Или например рассмотрим команду INC A - увеличить A на один. Если наши регистры умеют увеличивать значения, то она будет состоять из одной микрооперации:
4) увеличить значение A на один
Если нет - нам придется сделать как-то так:
4) подать на второй вход АЛУ число 1 (к первому входу подсоединен регистр A) 5) запустить сложение в АЛУ, сохранить результат в R 6) подсоединить выход R к внутренней шине, подсоединить вход A к внутренней шине и сохранить в регистр A значение с нее
>>1057646 >Ты просто наверно пропускаешь основы и берешься сразу за сложное. Сначала тебе надо изучить, какие есть в процессоре регистры, какие есть режимы адресации, а потом уже смотреть, как кодируется та или иная команда, иначе ты не поймешь зачем нужны байты вроде MOD R/M в машинном коде. Это все где-то изложено в одном месте? Вот это https://www.nostarch.com/assembly2.htm норм книжка? >>1057671 Это все можно же свести к машине Тьюринга?
Есть какая-нибудь годная старая книга, можно 90-х, где бы суровые профессора раскладывали по полочкам ассемблер так, как они это делали с делфей? Чтобы даже мне зашло.
Как матчасть Танненбаум, похоже, как раз то что нужно. А что насчет софта? Самая годнота для дизассемблирования, как я понял, IDA Pro, а опенсорс, как обычно, хуета из-под кота? Или я не прав?
>>1057671 >Это все можно же свести к машине Тьюринга? Свести можно, но машина Тьюринга - это математическая модель, которая используется для доказательства различных гипотез. К тому же в ней программа заложена жестко. А я хотел показать примерные идеи, на которых делаются (точнее делались) реальные микропроцессоры.
> Это все где-то изложено в одном месте? Я помню в универе видел толстую книгу с описанием интеловской архитектуры, но название забыл. Танненбаум наверно.
>>1059848 >а опенсорс, как обычно, хуета из-под кота? Ну не то чтобы как обычно, но в случае реверса ты совершенно прав. >>1059884 Ну поди и улучшь. Самый ебанутый довод опенсорсников. Уверен, что 99,999% его использующих ни разу ничего не добавили.
Там архитектура с самых основ объясняется, и довольно подробно. Есть там и хардкор, но его не обязательно разбирать досконально для понимания общих принципов.
Ещё у Таненбаума есть "Structured Computer Organization", но там более сжато.
>>1061540 >Сам-то с мипсов начинал? Именно с них. Потом ARM. х86 сейчас начинают ударными темпами закапывать, так что сейчас не понятно, оправданно ли вообще на ее изучение время тратить. >Чтоб тебе самому вместо изучения асма Перед изучением асма неплохо бы знать, что это вообще за штуковина такая - процессор, чем там ALU занимается на самом деле, что за "дополнение до двух", вот это все. По моей ссылке этому как раз треть материала посвящена, самые что ни на есть азы. >с нормальными отладчиками, дизассемблерами и кучей документации Под него есть симулятор (как и под любую другую архитектуру), ассемблер/дизассемблер тебе все равно по хорошему свой писать, а с документацией у мипсов как раз все хорошо (весь reference manual занимает от силы страниц 400). >роутер ебать! Лично я ебал PSP, но и роутер никто не запрещает.
>>1061601 > х86 сейчас начинают ударными темпами закапывать Я это в девяностых слышал.
> Перед изучением асма неплохо бы знать Нахуй не нужно новичку. Ты еще с транзисторов предложи начать. Хотя нет, слишком высокий уровень. С ядерной физики.
> reference manual занимает от силы страниц 400 О да, новичкам только мануалы и читать. Сразу, сходу. Вместе с невозможностью запустить код на реальной машине - охуенный способ не выучить асм, проклясть байтоеблю и пойти писать на джаваскрипте, или что там сейчас модно.
>>1061649 >Я это в девяностых слышал. Ну так сейчас как раз повторяется та же самая история: Microsoft и Qualcomm вместо Transmeta пилят транслятор машинного кода ( https://www.youtube.com/watch?v=L9xLYHHBN-A ), исследователи грызут аппаратные баги F00F ( https://www.youtube.com/watch?v=KrksBdWcZgQ&list=PLXI5ri9BGtlFvtN-7boRTVC4mUXiswT63&index=6 ), на серверный рынок лезут всякие жирные arm64 с терабайтами оперативки и даже OpenPOWER зашевелился. Про embedded-рынок и так все понятно. Так что посмотрим, может на этот раз и вправду закопают. >Нахуй не нужно новичку. Ты еще с транзисторов предложи начать. Не передергивай. Представление целых со знаком не надо знать новичку? А что ему тогда надо знать в первую очередь, зоопарк режимов и сегментную адресацию? >О да, новичкам только мануалы и читать. Сразу, сходу. Кто сказал, что сходу? Вот наиграется этот новичок с HelloWorld'ами и решит собственный ассемблер написать. Хороший способ доказать самому себе, что имеешь представление о данной архитектуре. >Вместе с невозможностью запустить код на реальной машине А мужики-то и не знали. >охуенный способ не выучить асм, проклясть байтоеблю и пойти писать на джаваскрипте, или что там сейчас модно По мне так последовательное разгребание наслоений человеческой жадности и раздолбайства - отличный способ забить посреди процесса.
>>1061670 > Microsoft и Qualcomm вместо Transmeta пилят транслятор машинного кода Ну и пусть пилят. Microsoft скоро осознает, что их очередное вторжение на планшеты и телефоны в очередной раз закончилось ничем, и все похоронит. Проходили уже. И убийца x86 ака титаниум для серверов был, как раз недавно официально окончательно похоронили. К тому же, даже если какая-нибудь архитектура и станет вдруг более популярной, неебическое количество существующего кода для x86 никуда не денется, его все так же придется писать, реверсить и отлаживать. Все это, разумеется, отнюдь не означает, что современному байтоебу не нужно разбираться хотя бы в ARM.
> Представление целых со знаком не надо знать новичку? Это надо знать до изучения асма и программирования вообще. Это азы, как и системы счисления, как арифметика младших классов и хотя бы отдаленное представление о логике. А вот что внутри процессора - это лишние, запутывающие новичка знания. Как и существование сегментов или зоопарка режимов процессора. К счастью, 32-битный режим в x86 неебически прост, и если новичок где-нибудь на нем и забьет, то ничего, в общем-то, не потеряет - навык чтения асма у него останется, и он сможет при случае выхлоп компилятора посмотреть или отладить чего-нибудь. Если начнет с MIPS и бросит, то с 99.9% вероятностью полученные знания ему никогда не пригодятся.
> А мужики-то и не знали. Ну вот смотри: либо у тебя кривой эмуль, кросскомпиляция, непонятные утилиты, написанные чужими для нелюдей и удаленная отладка через gdb, либо у тебя няшный фасм с собственным редактором, компиляция одной кнопкой, отладка в OllyDbg/x64dbg с графикой, отображением всего, что только можно, трейсами-бэктрейсами, встроенным ассемблером, интуитивным интерфейсом и туториалами на ютубе впридачу. Профессионалу похуй, а вот выбор новичка очевиден.
> решит собственный ассемблер написать Во. То есть нужно начинать с мипсов, чтобы написать еще один ассемблер. Вместо чего-нибудь полезного. Я бы понял, если бы ты рассказал про поиск и патчинг бэкдоров и багов в роутерах, когда производитель на них забил, ну или про моддинг, про портирование старых игр с PS. Я бы понял, если бы ты рекомендовал ARM, чтобы взять стмку за копейки и вкатываться в эмбеддед, чтобы заниматься всякими интересными вещами под андроидом. Но написание ассемблера - это самое бессмысленное занятие, которое можно придумать - пишется за вечер, архитектуру при этом знать необязательно, из всего мануала потребуется прочитать страниц десять, большая часть времени будет потрачена на копипаст и правку табличек опкодов. Да, иногда в этом есть смысл - у меня был случай с экзотической архитектурой, когда модуля для иды не было, какого-либо другого дизасма тоже, ассемблера или компилятора тем более, мануал на китайском, прошивка для железки упакована, нужно было поправить пару килобайт кода и упаковать все обратно. Пришлось писать самому ассемблер, модуль для иды и подобие эмулятора впридачу. Но, сам понимаешь, такие случаи возникают очень нечасто.
>>1061698 >Microsoft скоро осознает, что их очередное вторжение на планшеты и телефоны в очередной раз закончилось ничем, и все похоронит. В прошлый раз оно окончилось ничем именно из-за отсутствия возможности запускать с х86-бинарники. На этот раз все будет зависеть от того, у кого лоеры зубастее. >И убийца x86 ака титаниум для серверов был Итаник утонул частично по той же самой причине: отсутствие обратной совместимости + сложная задроченная архитектура -> отсутствие нормальных компиляторов -> хреновое быстродействие за астрономическую цену привет Эльбрус. У arm64 с этим особых проблем нет, да и рынок серверов сейчас большей частью под Open Source. Также у него нет проблем с масштабируемостью, 2^8-ядерные сервера уже давно в свободной продаже. >даже если какая-нибудь архитектура и станет вдруг более популярной, неебическое количество существующего кода для x86 никуда не денется, его все так же придется писать, реверсить и отлаживать. Насколько я понимаю, именно на это и делают ставку. Вот вам готовая связка архитектура+ПО, которая может крутить ваш существующий код без существенной потери производительности, но если хотите полной отдачи - новый код старайтесь писать уже под нее. Как какой-нибудь древний сервер, про который уже никто толком не знает, как и почему вообще он работает. Проще засунуть в виртуалку и сделать копию. >Это надо знать до изучения асма и программирования вообще. Это азы, как и системы счисления, как арифметика младших классов и хотя бы отдаленное представление о логике. Ну так вместо того, чтобы агриться на слово "MIPS", открой мою ссылку и полистай. Там как раз очень подробно разжевывают самые-самые азы (системы счисления, представления чисел и строк, bitwise-операции и сдвиги, плавающую точку, передачу аргументов через регистры и стек, рекурсию, массивы, etc.). Причем разжевывают весьма грамотно, последовательно, с периодическими блиц-повторениями усвоенного. Просто делают это на примере MIPS-архитектуры, потому что (вот так сюрприз!) вся эта теория ложится на нее почти идеально, практически без архитектуро-специфичного оверхеда - кристально чистое байтоебство. Не самый худший вариант потратить 2 недели своего драгоценного времени, если собрался вкатываться в asm и не знаешь вообще ничего. В качестве бонуса сможешь на начальном уровне в MIPS и слегка попрактикуешь разговорный английский (там есть кнопка начитки голосом каждой отдельной темы). В качестве минуса - даже ARM будет в дальнейшем казаться кривой архитектурой. >А вот что внутри процессора - это лишние, запутывающие новичка знания. Смотря какие. Я вот видел людей, которые считали, что ALU на самом деле складывает и вычитает какие-то там числа. >Ну вот смотри: либо у тебя кривой эмуль, кросскомпиляция, непонятные утилиты, написанные чужими для нелюдей и удаленная отладка через gdb, либо у тебя няшный фасм Пожалуйста, после краткого курса молодого бойца бери свой няшный фасм и пиши сразу под x86_64 там хоть от нехватки регистров не будет так сильно припекать. Ты уже не будешь смотреть на него коровьими глазами и гадать, 0x10000000 - это сколько кило/мега/гигабайт снизу. >написание ассемблера - это самое бессмысленное занятие, которое можно придумать Не совсем. Он сильно пригодится, если ты захочешь ассемблировать свое творчество непосредственно на самой железке прямо в память, без перезагрузки/перепрошивки на каждый чих. Да, это я про форт-машину сейчас.
>>1061670 >Microsoft и Qualcomm вместо Transmeta пилят транслятор машинного кода И за это их засудит Интел просто нахуй. >>1061834 >Итаник утонул частично по той же самой причине Эмулятор х86 там был, работал так же хуёво, как и в ARM.
>>1059201 В общем продолжаем. Есть функция PopDefaultProcessorPolicy. ИДА из кода WRK создаёт следующее https://pastebin.com/MWxG7w9H Обратите внимание на оптимизацию компелятора с использованием переменной v3. Я среверсил это в вот такой код: https://pastebin.com/giNvha1q Что выливается после компиляции и реверса ИДЫ в https://pastebin.com/RyMCNPRD Оптимизация сработала по другому, хотя код делает ровно тоже самое. Собственно вопрос- как мне изменить код, чтобы он компилировался в тоже самое, что и оригинальный майкрософтовский? Плюс в том файле ещё PoInitSystem с кучей неизвестных структур, ну да ладно.
>>1061934 >И за это их засудит Интел просто нахуй. За что, за то что Майкрософт запилила программный транслятор бинарников? Так интеловские патенты в основном не про это, а про аппаратную реализацию. Иначе всякие Qemu уже давно бы кверху пузом всплыли. И к Квалкому не особо прикопаешься: они к драгоценной x86 вообще пальцем не притронулись, просто немного подкрутили свой процессор, чтобы транслятор от MS на нем быстрее работал. Если тяжба и начнется - длиться она будет доооолго. >Эмулятор х86 там был, работал так же хуёво, как и в ARM. На майкрософтовских демках сейчас всякие фотошопы с офисами вполне резво бегают и даже танчики какие-то катаются. Поглядим, короче, что выкатят к концу года. Мне кажется никто не будет возражать, если охреневшую монополию хотя бы на рынке ноутбуков немного расшевелят. Конкуренция - это хорошо.
>>1062032 >За что, за то что Майкрософт запилила программный транслятор бинарников? А то. >Иначе всякие Qemu уже давно бы кверху пузом всплыли. А ты знаешь продаваемые устройства с квеми? Он просто нахуй никому не нужен, вот и не придираются. >На майкрософтовских демках сейчас всякие фотошопы с офисами вполне резво бегают и даже танчики какие-то катаются. Просто процы со времён итаника подросли, вот и тянут трансляцию без тормозов. >Мне кажется никто не будет возражать, если охреневшую монополию хотя бы на рынке ноутбуков немного расшевелят. Конкуренция - это хорошо. Кроме интела- никто не против. Но интел не хуй с горы, и просто так своё властвующее положение не отдаст.
>>1062046 >Он просто нахуй никому не нужен, вот и не придираются. Тогда почему тот же Интел не засудил в свое время Трансмету, а наоборот схлопотал иск от нее? Или история с IBM и Apple, там вообще все один в один: ушли на архитектуру конкурента, запилили транслятор. >Просто процы со времён итаника подросли, вот и тянут трансляцию без тормозов. Это еще Apple в свое время продемонстроровала, сейчас подросли АРМы и настал черед Microsoft. Статус кво не мог вечно продолжаться.
Привет, ребят, студент компьютер сайенс 19 лвл репортинг. Очень понравился ассемблер (Уже сделал половину лаб по нему). Можно ли как-то в него вкатиться, или слишком сложно? Что для этого надо делать?
>>1063843 >Что для этого надо делать? Шапку прочитать. А так как ты самостоятельно не смог до этого догадаться, то уровень твоего интеллекта не позволит освоить ассемблер в высокой степени.
>>1064289 В шапке нет гайда для тех, кто желает вкатиться. У меня проблема не в недостатке материала, а в отсутствии человека, который знаком с этим и может поделиться немного опытом.
>>1063843 Немного странный вопрос. Учитывая, что ты уже половину лаб сделал. Просто делаешь дальше остальные. Ещё ты не написал, какой ассемблер. Или нет другой архитектуры, кроме x86 и Intel пророк его? Тогда можешь писать программы на C и смотреть, во что превращается код. Даже Visual Studio (если ты в Windows работаешь) может показать ассемблерный листинг, что наглядно и удобно. Дальше берёшь OllyDbg, гуглишь туториалы и вперёд. Попутно знакомишься с Ida.
Начал читать Танненбаума, полистал книжку, там что с точки зрения математики нет ничего сложнее булевой алгебры? В историческом обзоре машина Тьюринга и алгоритмы даже не упомянуты. Это нормально? И еще вопрос, про полиморфизм: если там только булева алгебра, ничего же не стоит автоматически заменять ассемблерные комманды эквивалентными им логическими построениями (в простейшем случае - двойное отрицание комманды логически равно этой комманде, но если так поступить с виросом, все сигнатуры, по которым он детектится, проебутся). Получается, уже таким деревянным методом можно получать идеальный неуязвимый полиморф?
>>1064573 Давно уже во многих протекторах так и делают. Это медленно и печально, но все же раскручивается обрано. Гугли SAT solver. А что насчет полиморфа, то ты просто получишь детект от эвристики за ебнутый код.
>>1064739 Мм..,ок. А если запилить (в виде макросов для ассемблера) собственную логическую аксиоматику, сколь угодно ебнутую, но непротиворечивую? Компиляться нормально будет, но без моих макросов никак не раскрутишь до изначального кода.
>>1065033 >Машина Тюринга нужна только для научных статей, она не имеет отношения ни к реальному железу, ни к обфускации кода. Как жи не имеет. Это одно из уточнений понятия алгоритма. >Антивирусы могут смотреть не только на сигнатуры. А что еще они смотрят? >А зачем смотреть на твой код? Достаточно посмотреть, какие системные вызовы он делает, какие файлы читает, что по сети шлет. Есть конкретные критерии, что должен делать вирос, чтобы признать файл виросом? Вот если сделать бэкдор из скрипта установки и настройки Active directory в шиндовс, антивирос его спалит?
>>1065041 > Есть конкретные критерии, что должен делать вирос Нет. Каждому действию присваивается вес, веса суммируются в оценку или оценки, по которым антивирус решает, норм или нет. > вот если сделать бэкдор из скрипта Проактивка может спалить. Сканер спалит, только если у него есть модуль для такого скрипта и эвристика для поиска каких-то вредных действий.
> Как жи не имеет Когда у тебя будет бесконечная память - приходи.
>>1065041 >А что еще они смотрят? Поведение. >Есть конкретные критерии, что должен делать вирос, чтобы признать файл виросом? У каждого антивиря они свои, и раскрывать их они желанием не горят. Реверсь все антивири и узнавай, что они ищут.
>>1065239 >>1065130 Вот насчет этих маняэвристик и т.п. мне реально смешно. К сожалению, плавали, знаем. Имею опыт общения с мутной малварью на компе и телефоне. Так вот, установленному антивиросу на тилибоне было строго по хую, что браузер сам переходит по каким-то ссылкам, активируются платные подписки, вылезают рекламные баннеры и т.п. Т.е. обнаружение реально вредоносной хуйни там уровня /б, это я видел своими глазами. На компе какая-то ебала, запущенная как системный процесс svchost.exe, что-то слала по сети, коннектилась к десяткам адресов, делала еще хуй знает что, заметно загружая процессор, к слову. Пока вручную процесс експлорером не выявил, где оно лежит (откуда запускается) и т.д. и не удалил к хуям, касперский на нее вообще внимания не обращал. Если это и есть ваши супернанотехнологии - эвристика проактивка, то я спокоен.
А чего можно почитать про устройство процессора? Устройство управления интересует, Пецтольд о его устройстве тактично умолчал. Пытаюсь в Logisim собрать 8-битный проц уровня /b/, пока есть только АЛУ примерно такого же уровня.
>пока есть только АЛУ примерно такого же уровня. Дорисуй остальные части - память, шины, регистры всякие. Как дорисуешь, может быть поймешь что устройство управления это совсем несложное устройство.
>>1065412 >За вторую ссылку спасибо. По первой ссылке: >Глава 23. Архитектура и структурная VHDL-модель процессора DP32. Это более простой пример, чем по второй ссылке. А значит в нем проще будет разобраться. Из того примера явно видно, что устройство управления - это дешифратор с счетчиком.
>VHDL И verilog, боюсь, не осилю. Verilog совсем простой же. В /ra/ есть ПЛИС-тред в котором подскажут, если что-то будет непонятно. А для альтернативно одаренных есть http://nand2tetris.org/
>>1015083 (OP) Поясните кто-нибудь за знаковое деление (IDIV) в asm. Архитектуры пк не знаю.(а стоило бы наверное, но времени толком нету) (спасибо блядям впихнувшим матанохуйню) Потому и не получается понять деление отрицательного числа на положительное. Единственное что знаю, что отрицательные числа хранятся в дополнительном коде.
Есть, например: AX = -120 BX = 1 Обнуляю перед делением DX(т.к. деление идет на слово, то остаток помещен будет в DX) Но на деле оказывается, что нужно заполнить регистр DX знаковым битом числа AX, т.е. в DX будут единицы, если делимое отрицательное. Вот тут я и не понимаю почему это так. Поясните как происходит самое деление.
>>1066287 idiv bx делит dx:ax на bx. dx:ax означает, что старшие биты делимого берутся из dx, младшие из ax. Если ты не заполняешь dx знаковым битом (хотя хули там заполнять - cwd), то твоое делимое получается 0000000000000000:ax, старший бит ноль, и это будет вполне себе положительное 32-битное число, меньшее чем 65536, вне зависимости от содержимого ax.
>>1066393 >>1066394 >делить на bl, если уверен, что частное влезет в al Да там по заданию требуют слово на слово деление делать. Спасибо, вроде минимально понятно стало.
Какие могут быть последствия вызова одной и той же .dll в коде дважды, если у них разное название? Сам PE-файл то один и тот же. Мне кажется, ничего плохого произойти не должно, просто она загрузится в адресное пространство процесса в двух экземплярах, никак друг с другом не пересекающихся. Или я о чем то не знаю?
>>1066824 > просто она загрузится в адресное пространство процесса в двух экземплярах И не надейся. Повторно винда грузить ничего не будет, просто счетчик использования DLL при повторных вызовах LoadLibrary() инкрементируется (т.е., если DLL уже загружена, то по сути делается GetModuleHandleEx(0, "somedll.dll", ...)), и для выгрузки DLL понадобится не один вызов FreeLibrary(), а столько, сколько раз была вызвана LoadLibrary(). Если тебе нужно именно две копии DLL в памяти, лучше всего просто скопировать файл с другим именем. Есть еще вариант с модификацией PEB_LDR_DATA, но без особых причин туда лезть не стоит.
>>1066889 Я в первом посте как раз написал, что имена разные. Про инкрементирование счетчика я знаю, меня интересует именно не будет ли нежданчика, если 2 фактически одинаковых библиотеки будут загружены через LoadLibrary, если они в ФС разные имена имеют.
>>1066890 Зависит от либы. Например, если DLL в процессе работы создает какой-нибудь именованный объект (мьютекс, например, или memory mapping), то очевидно, она слегка охуеет и сломается. И это в лучшем случае.
А поясните, что мешает разврнуть взад sha-256 хеширование? Алгоритм хеширования существует, результат каждого последующего прохода - функция от предыдущего, итоговый результат - суперпозиция таких функций. Ну, и?
>>1067240 А что ты ожидаешь получить в итоге? Файл, от которого взят хеш? Идеальная функция компрессии будет, любой размер данных в 32 байта можно уместить.
>>1067253 >Ну так там же не сам файл хешируется? А что, твоя мамка? >Допустим, речь только о закодированных сообщениях или блоках биткойнов Пусть. Вот простейшая хеш-функция, сложение. Берём два числа, например 23 и 19. Результатом такого "хеширования" будет 42. Так какие числа у меня там были? Ну, и?
>>1067415 Нормализованное значение получается: 1.000 1011 0000 1111 0010 0111 1011 и т. д. Выделенная единичка уже не влезает в разрядную сетку и округляется (а так как она 1, она не отбрасывается как 0, а прибавляется): ...0111 (7 на конце в твоем хекс-представлении) + 1 = 1000 (8 на конце в правильном представлении).
Начал учить этот ваш ассемблер, потому что уже очень давно загорелся такой идеей. Но расстраивает то, что почти ничего непонятно. Вкатываюсь с ооочень большим трудом, до этого программировал на питончике. Я ведь не один такой тугой здесь? Как думаете, упорное залипание в теорию и параллельная практика дадут свои плоды? Я совсем отчаялся уже :с
Решил вкатиться в асм, наваял пузырьковую сортировку знаковых целых, а она сортирует по величине от 0x00 (ну короче без учета дополнительного кода, 0xFF считает больше чем 0x10). https://pastebin.com/2u4g1kHY Как бы вы переделали? И что я тут наговнокодил? (кроме отсутствия разбиения на процедуры)
Аноны помогите, нужно понять что делает программка через ida но я ньюфаг и хз с чего начать даже,помогите как разобраться в этом?Нужно ли полагаться на хекс рэйс или он часто наебывает?
>>1069697 > нужно понять что делает программка через ida Особую уличную магию.
> Нужно ли полагаться на хекс рэйс или он часто наебывает Иногда без правки дизасма невозможно заставить его выдать корректный код. Без корректных типов переменных могут пропадать целые блоки кода. Иногда циклы превращаются в условия. Куча проблем с floating point, про SIMD вообще молчим.
>>1069712 Очевидные "Образ мышления IDA" (Крис Касперски, книга протухла, но в целом ничего с тех пор не поменялось), beginners.re из шапки, "The IDA Pro Book" (Крис Игл).
Поясните, что должна делать функция 00h прерывания 10h, а то ДосБокс это не переваривает как-то. Должна что-то делать с курсоров вроде, но я не понимаю, что именно.
Делаю лабу с математическим процессором 80х87, нужно поднять одну хуету в степень. Мне надо поднять x в степень а x^a. Надо использовать: fld x fscale a
Я всё правильно делаю? Ассемблер интересный, но инфы пиздец мало, простите, что у вас такое простое спрашиваю.
>>1071035 Блэт, это же школьная программа. x = 2 ^ log2(x) x ^ a = (2 ^ log2(x)) ^ a = 2 ^ (a log2(x)) a log2(x) находится с помощью fyl2x (y = a, x = x). Возведение в степень: f2xm1 (x = результат fyl2x). Полученный результат инкрементишь и получаешь x ^ a. Вместо f2xm1 можно просто шифтануть 1 влево на fyl2x.
Сап программач. Пытаюсь вкатиться в реверс-инжиниринг. Есть программа на С, принимаюшая ввод от пользователя в массив и выыводяшая этот массив на экран. Пытаюсь произвести переполнение стека, чтобы программа запросила ввод еще раз, но попытки с командой echo дают результат seg fault. Отладчик при этом показывает, что в стеке якобы выделяется гораздо больше памяти для массива чем 2 байта. Что я делаю не так?
Как то раз баловался ollydbg'ром с одним проприетарным софтом и заметил, что по коду разбросаны JMP'ы, которые сбивают ассемблерный листинг. Типа вот ты шел по инструкциям, 10: MOV EAX EBX 16: PUSH 0xFF 18: CALL [ECX] 22: JMP 27 26: SUB ECX, 0xFFFF 28: INC [EAX] ... И вот после JMP 25 у тебя следующая инструкция уже та, которую ты в листинге не видел, и вместо 26: SUB ECX, 0xFFFF 28:INC [EAX]
>>1071757 Это очень примитивное запутывание control flow. Возьми иду, она на такое не ведется, и зделоет тебе 26: db байтики, 27: call. Виртуализация - это когда полезная нагрузка представлена инструкциями виртуальной машины, а код, который ты видишь в дизасм - мусор, перемешанный с кодом самой виртуальной машины.
>>1071767 Что тогда с программной точки зрения представляет собой виртуализация? Я знаю концепцию в теории: есть виртуальная машина, у которой свой набор инструкции, которые неким образом сопоставляются реальным инструкциям. И как это реализуется? Всё, что мне приходит в голову - это типа я беру сырые байты кодовой секции, хуярю их функцией byte Virtualize(byte), которая, например, добавляет 1 к каждому байту исходников, потом логику девиртуализации компилирую в .dll, потом в исходники добавляю вызов byte devirtualize(byte, DWORD EIP) из либы с "виртуальной машиной", но по моему я неправильно себе представляю это, потому что уж слишком это уёбищно, чтобы быть правдой.
Может есть какой нибудь ресурс, где на простом насколько это допустимо в данной тематике было бы проиллюстрировано виртуализирование на примере какого нибудь калькулятора?
>>1071776 > И как это реализуется? Ты вообще представляешь как виртуальная машина работает? Напиши сначала простую вм в вакууме. Какой-то набор инструкций, какой-то массив с байткодом (вручную напишешь какой-нибудь 99 bottles of beer, например) и бесконечный цикл, который выбирает следующую инструкцию, исполняет ее и переходит к следующей (или к какой-то иной, если это было ветвление или вызов функции).
Собственно, для виртуализованного кода ты так же пишешь примерно такую же вм. Затем берешь функцию в машинном коде, берешь ее байты, дизассемблируешь, разбиваешь на базовые блоки (грубо говоря, последовательности без ветвлений), инструкции в каждом базовом блоке преобразуешь в инструкции вм, в конце втыкаешь вызовы вм для перехода между базовыми блоками (т.к., скорее всего размер байткода вм будет не равен размеру машинного кода, из которого ты его генерировал). Байткодом затираешь функцию или кладешь байткод в отдельную секцию - похуй. Вместо вызова фукнции втыкаешь вызов вм с адресом входного базового блока. Ну это если без обфускации и антиотладки. Для упрощения своей жизни пилишь кастомный линкер, говоришь компилятору separate functions for linker и работаешь с объектными файлами, а не с исполняемым. Далее тебе становится очевидно, что дизассемблирование - неудобный подход, и логическим развитием будет написание бэкенда к llvm, чтобы сразу генерировать виртуализированный код.
>>1071802 > добавляет 1 к каждому байту исходников Это обфускация, не виртуализация. Виртуализация подразумевает, что твоя вм байтики выполняет (они инструкции, команды, блять). И нет, > инструкции, которые неким образом сопоставляются реальным инструкциям Не обязательно. Одна инструкция вм может реализовываться хоть мегабайтами кода вм. Ты можешь без проблем придумать для себя инструкцию http_download_file и написать для нее в вм соответствующий обработчик.
Несколько вопросов: 1. Как эта программа получает ввод с клавиатуры, если в дизассемблере ни одного прерывания не видно? 2. Если они все же есть, то как до них добраться? Запустил программу в edebugger, а функция return_input и находящийся в ней gets завершились и все. Даже окно терминала ни разу не вылезло для запроса ввода. А ведь еще при учебе в шараге при отладке с помощью Turbo Debugger какой-нибудь простенькой программы с вводом с клавиатуры появлялось окно терминала, потом происходил ввод одного символа и отладка продолжалось дальше. Поэтому третий вопрос: 3. Какая настройка/опция отвечает за поведение отладчика описанное выше?
>>1071881 > прерывания Ты в юзермоде. Единственное твое прерывание - это сисколл. Он надежно спрятан внутри функций, вызываемых функцией gets.
> Если они все же есть, то как до них добраться ЗАЧЕМ?
> edebugger Наверняка какое-нибудь говно. Наверняка оно отбирает у программы stdin. У тебя на скрине gdb, кто тебе мешает поставить брейкпоинт на return_input?
>>1071881 И еще 1 вопрос отвалился: поясните пожалуйста за "ширину" стека. В интернете пишут что ширина стека составляет то 2 байта, то 4 байта. Просто последовательность команд чисто для примера push1,push2 кладет мне в стек по адресу N цифру 1, а по адресу [N-4] кладет цифру 2, хотя для этих цифр должно хватать 1 байта, следовательно почему не происходит варианта типа цифра 1 по адресу N, а цифра 2 по адресу [N-1] ?
>>1071885 А как мне отлаживать через gdb? просто запрашивается ввод когда я ввожу run, а содержимое регистров параллельно с этим не выводится на экран. А после завершения программы состояние регистров мне ничего говорить не будет.
> push1,push2 push - инструкция x86. Если не использовать operand size override (префикс 66), то оно кладет в стек dword (4 байта) в 32-битном и qword (8 байт) в 64-битном режиме.
> почему не происходит варианта типа цифра 1 по адресу N Потому что ты наебнешь выравнивание стека на 4/8 байт, и потом, когда ты захочешь push 0xbaadf00d, вызываемая функция будет сосать по производительности из-за чтения этого значения по невыровненному адресу. Молчу уже про всякие SSE. К тому же, пришлось бы явно указывать pop, сколько байтов читать. Экономить 3 байта в стеке такой ценой нахуй никому не сдалось, поэтому процессор это не поддерживает (ну, точнее, поддерживает 16-битный push через префикс, но лучше так не делать). Если тебе очень хочется положить в стек байт, зарезервируй место каким-нибудь sub esp,N (или push нескольких двордов), и потом клади туда что угодно с помощью mov.
>>1071887 Ставь брейкпоинты (break) в нужное место перед run, ходи по инструкциям (step, next). И вообще, man gdb.
>>1071889 А разве такой подход к стеку не ведет к тому, что стек может быть равномерно забит значениями, для которых хватило бы и 1 байта, т.е. такой подход ведь никак не экономит оперативную память.
Кстати, понял как работать с gdb и попутно понял что это офигеть какой неудобный отладчик. Ощущение что под линукс удобный отладчик с GUI хрен найдешь.
>>1071892 > т.е. такой подход ведь никак не экономит оперативную память. Еще раз: невыровненный доступ, возникающий из-за хранения байтов и двордов вплотную - это дорого, причем дорого для всех переменных вызываемой функции и ее потомков. При этом экономия на передаче небольших целочисленных констант (это будет какой-нибудь enum или bool) - копеечная. Даже в программах с глубокой вложенностью вызываемых функций ты наэкономил бы максимум какой-нибудь сраный килобайт. В x86-64 ты вообще ничего не наэкономишь, потому что твой байт с большой вероятностью будет передан в 64-битном регистре. Некоторый смысл мог быть при рекурсии, но глубокая рекурсия на системном стеке - зло.
>>1071916 >Хуй знает, что тебе нужно. Возможность манипулировать с опкодами, как с ассемблерными коммандами. Например, представить опкод одной комманды в виде функции от другого опкода. В ассемблере можно заменять исходные комманды их логическими эквивалентами, хочется чего-то похожего, но с 16-ричными опкодами и не только логикой, но и любыми функциями, н-р арифметикой.
>>1071919 Ну посмотри на fasmg все же. Когда видишь его впервые, синтаксис кажется слегка странным, если не писал на фасме до этого, но если привыкнуть - вполне норм. Примеры в комплекте, написано оно на себе самом.
Снова вкатывающийся в отладку программ. Есть программа принимающая ввод в буфер величиной 2 байта и 1 раз выводящая его. Мне таки удалось заставить программу вывести буфер 2 раза, а не один результат пикрелейтед путем тупого подбора т.к.я не очень умею в линуховые отладчики они все консольные и жутко неудобные, но дело не в этом. Вопрос: судя по дизассемблированному виду функция return_input выделяет вначале стеку 36 байт, тогда почему для выхода из фрейма стека и перезаписи сохраненного ebp и адреса возврата потребовалось 18 байт? И еще: в gdb есть разница между выводом десятичной десятки и шестнадцатеричной?
>>1074935 > я не очень умею в линуховые отладчики Можешь отлаживать идой через gdbserver, хотя отладчик в IDA тоже неудобным кажется после OllyDbg.
> почему для выхода из фрейма стека и перезаписи сохраненного ebp и адреса возврата потребовалось 18 байт Потому что аргумент gets адресуется относительно ebp, а не esp. Передается ebp-10, плюс 4 байта на сохраненный ebp, плюс 4 байта на адрес возврата.
> в gdb есть разница между выводом десятичной десятки и шестнадцатеричной Не понял вопроса.
Что думаете про реверс-инжиниринг игр с целью геймхака и самого геймдева в общем. Актуально ли и нужно ли кому-нибудь. Сколько ещё проживёт эта индустрия? Идется речь про реверсинг/разработку многопользовательских видеоигр.
>>1075208 За деньги - только если тебя с этого прет. Если не прет - заебешься, проклянешь айти и уйдешь в дворники. Без денег аналогично. А в целом актуально и нужно.
Хотел вот поизучать ДОС, скопипастил кодик на С, который должен блокировать нажатие клавиши. Ничего не работает (пикрел, https://pastebin.com/gJpdrs5K). Потом скопипастил кодик, который выдает инфу о системе, ОЗУ, ПЗУ - какие-то ебанутые значения получаются. А так хочется вкатиться в эту древнюю тему, но ничего не получается. Подскажи ньюфагу, как ему быть.
>>1083076 Должно работать в досбоксе. Только а) для активации тебе надо нажать хоткей, который он тебе предлагает, б) блокирует оно клавишу "3", а если нужны другие - гугли таблицы сканкодов и меняй сканкод в начале исходника. Можешь допилить и сделать антиспеллчекер (вставлять опечатки или заменять введенные слова на другие).
Есть одна прошивка для TV платы на Mstar'о подобном mips soc так же известном как tsumv59 если точнее. В конце файла есть хедер одинаковый для всех прошивок, 4-6 нулевых байт и некая контрольная сумма минимум 4 байта. Конец и вывод команды crc32 в разных прошивках под этот проц выглядят так BE EF 00 00 00 00 00 00 00 00 CD 57 61 A4 B0 22 (crc 4b814419)
BE EF 00 00 00 00 00 B3 51 CD AB AA 55 73 F7 B6 2D(crc 74124a07)
BE EF 00 00 00 00 67 C7 F3 87 11 51 (crc32 8cb436f5, сам файл прикладываю) https://nofile.io/f/fgo1eWKKos4/1.zip Любое изменение до/в/после контрольной суммы вызывает отказ обновления по USB. Модификация файла с последующим приведением crc32 к исходному виду не помогает. IDA особенно не помогает. binwalk выплёвывает >40 LZMA Compressed data которую распаковывает в 0 или 256байт мусор и TIFF логотип. Как вычисляется эта контрольная сумма?
>>1083216 Что-то совсем тебя не понял. Это точно CRC32? Ты смог получить это значение на не изменённой прошивке? Явно там не весь файл проверяется, а только сами данные без заголовка (хотя это не точно). >Модификация файла с последующим приведением crc32 к исходному виду не помогает Вот эта фраза мне не понятна. Ты изменил файл, но оставил неизменным контрольную сумму? Подключайся по отладочному интерфейсу к устройству (JTAG что-ли называется) и смотри, как проверяется контрольная сумма. Может и в файле ещё где-то есть места, где проверяется целостность файла.
>>1083300 crc32 можно привести к любому значению за счёт 4 dummy байт. Помимо того crc считается для каждого отдельного раздела кроме ресурсов и для целого бинарнка. Получить записанное в прошивке значение у меня не получается, это вполне может быть экзотический полином для crc32 или результат обычного crc32/16 инвертирован/реверсирован/сдвинут, это я пытаюсь выяснить. Я попробовал трюк с приведением crc32 к исходному просто чтобы исключить последнее предположение.
Я менял значение случайных байт в различных частях прошивки, увеличивал/уменьшал размер в конца с начала чтобы определить границы проверки. Если снять дамп микросхемы, его можно превратить в файл прошивки для usb обрезав хвост после контрольной суммы и дав ему правильное имя. На плате есть UART, но полезной информации кроме тех. данных платы он не выплёвывает В итоге мы имеем 1.Файл проверяется целиком, любое изменение в любом месте/размере ведёт к ошибке. 2. Проверочная сумма считается для целого файла на этапе сборки, затем записывается в хвост в виде 2-4 байт, затем файл подгоняется dummy байтами под исходную сумму. Это привычная практика для файлов с вшитой кс. 3. JTAG не вывден, даже если бы был, делать мне там нечего. Есть теоретический дебаг/прошивка через i2c/uart. Так то мне ничего не мешает внести изменения в бинарник, зашить его через SPI и забыть, если конечно прошивка не проверяет себя при запуске. Мне просто любопытно как организована проверка целостности и как её обойти.
>>1083491 >Помимо того crc считается для каждого отдельного раздела кроме ресурсов *зачастую, не обязательно в данном случае Короч, у кого есть предложения, открываю конкурс по окирпичиванию моего телевизора. сделайте мод отличный от оригинала который зальётся по usb.
Почему никто не вкладывает денег в разработку игрового движка на ассемблере, тут одни плюсы, высокая производительность, более качественная графика, для меньшего геморроя можно поддерживаемые процессоры начиная от i3 и выше. Посмотрите на демосцены какой там охуеный графон в 64К. Для простоты разработки можно использовать высокоуровневые макросы но не везде.
Как по вашему идея? Какие трудности могут возникнуть? Сколько времени уйдет чтобы дойти до уровня UE4? Была ли такая идея на кикстартере?
>>1083508 > Почему никто не вкладывает денег в разработку игрового движка на ассемблер Потому что писать медленно, модифицировать сложно, а практического смысла нет. > высокая производительность В теории. На практике компилятор знает лучше тебя, и у него больше возможностей (например, автоматическая оптимизация по результатам профилирования - на сколько проходов тебя хватит вручную?).
> более качественная графика Не более качественная, чем на любом другом языке программирования.
> какой там охуеный графон в 64К Практически все даже не на Си - на крестах! И даже 4К многие на Си.
> Сколько времени уйдет чтобы дойти до уровня UE4? ∞ Обоснование: пока пишешь - поддерживаемое железо уйдет в небытие, и ты будешь начинать с нуля снова и снова.
>>1083491 Ты прошивку-то реверсить пробовал? Чего гадать, если можно взять дамп и посмотреть на код USB-бутлоадера? Только лучше именно дамп, чтобы не ебаться с распаковкой.
>>1083514 Дамп=прошивка+настройки в хвосте. Какой бы фс/сжатием эта прошивка не пользовалась, binwalk определить не может. >Ты прошивку-то реверсить пробовал? > IDA особенно не помогает Читай внимательнее. Не знаю что я делаю не так, но читаемого кода очень мало. в основном всё текстовые строки без кросс отсылок. Единственное где вообще получилось найти касающийся USB_isp и crc кусок - в прошивке под другой процессор tsumv29. Алгоритм проверки там такой же, ибо файлом от 29 можно окирпичить 59. появилась зацепка, строка "golden crc". Но как я понял это как раз и есть механизм записи контрольной суммы файла в сам файл.
>>1083542 > Дамп=прошивка+настройки в хвосте. Ну кто-то же ее читает и распаковывает!
> Какой бы фс/сжатием эта прошивка не пользовалась, binwalk определить не может. Ну вот я сходу нашел там кусок, упакованный дефлейтом https://ideone.com/Uatl3I и содержащий строки:
> Download Buffer Addr: 0x%08lx\n > Download Buffer Size: 0x%08lx\n > Error> File size error > Copying image from USB to DRAM > Error> CRC32 Integrity Check failed !! > CRC32 Integrity Check pass !!
а также весьма интересное: > ChecksumErrOrBCHParityErr (про BCH спроси англовики, если не сталкивался), а также: > LzmaStatus так что LZMA там тоже есть. А по 0x78e8 в распакованном куске видно литералы для zlib.inflate.
> но читаемого кода очень мало. в основном всё текстовые строки без кросс отсылок Есть даташит хотя бы на семейство чипа? Там точно мипсы? (Хотя вроде как регистры репортит вполне себе мипсовые). Код вообще на исполняемый не похож, куда ни ткнись.
>>1083558 >Datasheet..MIPS Даташита нет. Даже то что это mstar чип я выяснил по уликам в коде и uart инфе. это вполне может быть не mips. Это скорее догадка. Из инфы существует схема и пинаут. >Ну кто-то же ее читает и распаковывает! Я к тому что на флеше лежит точная копия файла прошивки без изменений. если и есть фс/сжатие, то код ответственный за распаковку должен быть виден, а у фс должна быть обнаружимая сигнатура/
Потыкал файл свопом с разными настройками, получил mysql compresed data и криптопарашу. Заодно binwalk после свопа начал определять код как Arm. РАзный своп даёт немного больше читаемого кода.
>>1083770 > это вполне может быть не mips Я тут погуглил еще, и нашелся мануал по сборке бутлоадера под это дело (по крайней мере одно имя файла со скриншота в бинарнике есть): https://wenku.baidu.com/view/7faa4869a6c30c2258019e25.html Если поискать по csdn, то найдутся и другие мануалы по сборке, все они настолько же ебнутые (colinux и т. д.) и все предлагают поставить mipsisa32-elf, что как бы намекает.
На pudn лежат исходники бутлоадера от более старой прошивки (по слову mstar ищутся), они в принципе помогли бы составить общее впечатление о прошивке в целом. Есть аккаунт? Мой стух. Если знаешь живой поисковик по облаку baidu вроде умершего wangpanhezi, можешь там поискать. Очень часто всплывают даташиты и инструменты для прошивки.
>>1083972 Алсо, нужно хотя бы 5-15 желающих людей поднять такую конференцию. Если такое число наберется, то можно будет создавать. Желающие решившие поддержать идею — напишите свои юзернеймы в ответ.
>>1083982 >15 желающих людей поднять такую конференцию хз, зачем это. сидеть там и ололокать? задрачивать самообразование можно и в оффлайне, а для пары вопросов в сутки и тредика хватит
>>1083972 >Создание конфы по этому треду в Telegram Messanger. Нахуй не нужно, инфа там тонет, общаться там всё равно что пердеть в вечность. А эти треды заархивируем и приложим к первому, так что даже через века ньюфани будут читать наш FAQ и восхищаться нашими знаниями. >>1084109 >Что такого ОС делает с дисками Какая ОС, мы должны угадать? Нихрена в этом не понимаю, считаю, что ОС тебя озалупила в режим виртуального V86 и подкладывает тебе эмулированных хуйцов. И весь твой реальный режим эмулирован, и int 13h, даже небо, даже деление на ноль.
>>1083770 > это вполне может быть не mips Вот исходник того, что было пожато дефлейтом: https://github.com/caxyu/mstar6a918/tree/master/code/MBoot_Napoli_TVOS/sboot/src/macaw12 Судя по синтаксису инструкций, строкам в бинарнике и названиям файлов, это какое-то отродье OpenRISC на асике, но мой дизасм его не жрет, да и статистика показывает что-то больше похожее на 16-битные опкоды. Возможно, опкоды изменены. Кроме того, в дереве исходников овердохуя всяких интересных вещей, вплоть до загрузчика на базе 8051 - ребята там развлекались по-полной.
>>1084417 > Стал гуглить, как распаковать Внезапно upx -d filename (понадобится UPX 2.x, его несложно нагуглить или собрать из исходников). Алсо, там пароль ведь для открытия настроек, а не для файла. Или я что-то делаю неправильно? Алсо, там два exe, чем они отличаются?
>>1084397 >Какая ОС, мы должны угадать? Ленсук. > Нихрена в этом не понимаю, считаю, что ОС тебя озалупила в режим виртуального V86 и подкладывает тебе эмулированных хуйцов. Нет, я с помощью kexec загружаю свой бинарь, ему ленсук передаёт всё управление и сам завершается полностью.
Треда конкретно по микроконтролерам не нашел, поэтому спрошу здесь. В универе препод предложил запрограмировать микроконтролер avr для регулятора напряжения асинхронного двигателя. На чем лучше писать, си или асм, мой опыт программирования это хелловорды на джаве и вебговно. С чего вообще начать изучение этой темы, и какой ресурс для этого лучше всего? Сайтов и книг много, где-то советуют асм, где-то C.
>>1084771 С асма начинать проще, и асм все равно нужен будет рано или поздно, но если у тебя одноразовая учебная задача, можно и на си склепать, не погружаясь.
>>1084749 В инишнике по первой ссылке Password="D3SPQOQsJbNZs8YxX3Nv6DJdscaG25jo" расшифровывается в "1202201320072010" (пасс для доступа к настройкам). Password2="SFTS7fJAJ-PTPBPRk6RYmg14db4eN-S7bJNMV2sYtFF6dl8sXceoLE" расшифровывается в "true D3SPQOQsJbNZs8YxX3Nv6DJdscaG25jo" (как видно, вторая строки та же, что и в Password - нахуй так было делать, я не знаю). То есть никаких паролей к базам в ini не лежит.
Шифрование Blowfish, big-endian, CFB c IV="Init Vector" (IV забивается нулями, потом каждый байт строки с индексом index ксорится с байтом по iv[index % 8]), в конце шифротекста обычный паддинг. Для ini-файла строки шифруются с паролем "#$%^dfjhER%khuw" и потом кодируются base64 с кастомным алфавитом "+-0..9A..Za..z".
В принципе можно написать банальный брут по известному открытому тексту. Если еще что-то нужно - пиши, базу иды пока не удаляю.
>>1085254 Охуеваю еще больше. Мы тут в треде про реверсинг или где? Может, мы еще и не программисты? Бери любимый язык программирования и пиши код (у меня были Python 3 + родной base64 с предварительной трансляцией в стандартный алфавит + blowfish из pip).
>>1015083 (OP) > Совсем запутался с адресацией в двубайтовом массиве. В di нужен адрес на элемент в массиве. Изначально в di - адрес на первый элемент. lea di, array затем: 1) cmp word ptr arr[bx], word ptr di //сравниваю два байта из массива по смещению bx со значением по адресу di(но тут я походу проебался где-то) 2) lea di, arr[bx] - вот тут тоже.
>>1089524 >1) cmp word ptr arr[bx], word ptr di //сравниваю два байта из массива по смещению bx со значением по адресу di(но тут я походу проебался где-то) > сделал так: mov ax, word ptr [di] cmp word ptr arr[bx], ax И заработало. Есть вариант лучше? Без задействования регистров в одну строку?
>>1089524 > cmp word ptr arr[bx], word ptr di Так нельзя. В инструкциях x86 только один операнд может обращаться к памяти. > 2) lea di, arr[bx] - вот тут тоже Тут все норм (кроме ебучего нелогичного синтаксиса адресации). Если не компилируется, попробуй lea di,[arr+bx]
>>1089549 > А что конкретно? Вот в фасме логичный синтаксис - есть обращение к памяти (или его имитация в lea) - вся хуйня всегда в квадратных скобках, снаружи только тип. Нет обращения - просто втыкаешь имя переменной. И никаких offset, addr, ptr и прочей хуйни. Просто: mov ax,[di] cmp [bx],ax и lea di,[arr+bx]
Програмный реверс мехатроники и прочей мелкой поебени, которую не предполагается подключать к компьютеру вообще никогдаАноним11/11/17 Суб 15:27:43#334№1090307
Сап реверсач. Не так давно в мои руки попала одна хуйнюшка - моторчик из здоровенного напольного МФУ - которую я был бы не прочь реверснуть. Сразу скажу, аппаратный реверс обсуждать не буду, всё же это нерелейтед, и с таким нужно идти в /ra/. Предположим, что его я уже сделал, ну то есть разобрался, какой пин коннектора за что отвечает. Предположим, также, что я создал подходящий переходник с какого-нибудь COM-порта. Что делать дальше? Как реверсить систему комманд мотора, хотя, я бы даже сказал, сервопривода, так как эта штука имеет свою собственную печатную плату, и при этом предполагается, что она будет подключаться к материнской плате МФУ. Да и сам внешний вид коннектора намекает на то, что там больше пинов, чем просто плюс и минус, то есть какие-то данные между материнкой и платой мотора передаются. Собственно, способы подобного реверса имеются? Спецификации мотора, положим, найти я могу, но то не интересно.
>>1090307 >Предположим, что его я уже сделал, ну то есть разобрался, какой пин коннектора за что отвечает. А больше может ничего и не нужно. Например, простейшие контроллеры двигателей управляются без команд как таковых. Один провод направление, а по фронту сигнала на другом проводе двигатель делает шаг. В любом случае начинать необходимо с поиска схемы, если схему найти не удается то искать документацию на отдельные микросхемы. Иначе будет неизвестно даже что там за микроконтроллер/процессор. Если устройство в рабочем состоянии, то можно посмотреть осциллографом сигналы на этом разъеме.
>>1015083 (OP) Необходимо перекрыть прерывание таймера. И сделать установку и удаление обработчика используя аргументы командной строки. И использовать мультиплексорное прерывание.
Я правильно понимаю, что помимо перекрытого обработчика таймера, мне еще придется перекрывать обработчик мультиплексорного прерывания??
Вот я не могу понять: mov ah,* mov al,0 ; функция проверки установлен ли обработчик int 2FH
Даже не знаю, где спрашивать. Хочу сделать ассемблерную вставку в сишный код, т.к. нужно ловить ногодрыг от ведомого устроства, что стандартными методами, внезапно, оказалось нетривиальной задачей я еще молчу про синхронизацию и выдержку интервала времени по RTC-таймеру, которые компилятор заботливо "оптимизирует", из-за чего после каждой сборки на ножки вылазит какая-то хуйня вместо расчетного интервала, ибо компилятор GCC и используется AT&T-подобный синтаксис. Что должно быть: Загрузка в регистр адреса, по которому располагается регистр для ногодрыга как забить сюда PERIPH_BASE+GPIOA_BASE+GPIO_ODR в душе не ебу, пришлось клеить так Загрузка в другие два регистра собственно значений для ногодрыга конкретной ногой Запись значения из регистра по адресу.
>>1098394 Судя по названиям регистров это STM32. С этим тебе скорее в /ra/. >нужно ловить ногодрыг от ведомого устроства Так делается только в простейшем случае. Для вариантов чуть посложнее в таймерах есть модуль сравнения/захвата. В совсем сложных случаях - пересылка ПДП из GPIO в память.
>которые компилятор заботливо "оптимизирует" Это потому что Си не знаешь. Для того чтобы компилятор не "выкидывал" код, нужно использовать volatile.
>>1098410 Простейший пока потому, что лепить сразу в кучу все на прерывания займёт достаточно много времени - хочу для начала получить рабочую модель "на пальцах", а уж потом заняться её перетрушиванием. Инты и пдп довольно простые вещи, но работоспособность вперёд. >Это потому что Си не знаешь. Есть такое, да. Я в железо хочу, а не в Си, поэтому в душе не ебу, как делать те или иные вещи, которые опытному сишнику на раз-два. Честно говоря - в душе ебал этот Си с его кучей несовместимых между собой компиляторов, каждую конкретную хуйню приходится по часу шарить в гугле, нет бы предоставить тот же ассемблер, но с возможностью не грузиться вопросами "R2 и R3 трогать нельзя, R0 щас заюзаем, а что там R3? звуки шуршания листингом в поисках последнего использования регистра, каждый проект приходится править, чтоб он начал собираться gcc, а от эвоного инлайн асма с синтаксисом AT&T но при этом типичным расположением операндов я вообще в осадок выпал - это при том, что собсно AS из гнутого тулчейна жрет вполне себе человеческий код безо всяких процентов и амперсандов с кавычками и двоеточиями.
>>1098432 Из твоих портянок нихера не понятно, что же это у тебя за задача такая нетривиальная, но я если она связана с портами и временем, я бы постарался сделать строго на таймерах, тем более, что в stm они прекрасные. Ещё можно использовать DMA, бывает задорно получается.
Ещё замечу, что за десять лет дрочения контроллеров у меня не было ни одного случая, чтобы задачу io нельзя было нормально решить на С.
>>1098499 В конкретном случае я просто пытался проверить, насколько резво стмка умеет дрыгать ногами. Вменяемого результата добился только когда выкинул к ебеням большую часть писанины, оставив только ногодрыг. Чуть более глобально - ловить ACK от геймпада с выдержкой задержки перед следующим пакетом, 5й канал. В итоге вкуривал, какие же задержки реально выходят. А, хер с ним. В итоге проц ещё и дрыгает ногой там, где в коде этого вообще не подразумевается, даже полное стирание пару раз прогнал. Обидно, конечно, что нельзя просто так взять и написать в линеечку код, который просто возьмёт и заработает, придётся въезжать на прерываниях.
что можно прочитать покороче про директивы ассемблера, ну то говно с точкой. писать умею, инструкции брать ясно где, секции понятно что - мне бы собрать в кучу это всё.
ещё я не очень понял такую штуку, чем ассемблеры отличаются? я так понял, спецификация по процессору определяет и его ассемблер, тогда почему получился синтаксис ГАС? причём я так понял, под другие архитектуры там всё как у всех.
ну и наверно директивы, это главное чем отличаются ассемблеры, в этом плане мне интересен такой момент: как писать портируемые смещения в структурах - какие-нибудь алиасы или что-то такое.
>>1101025 Виртуалбокс с линуксами возьми. Хотя можно и просто шланг для винды (clang --target=mips -S -с foo.c тебе будет вполне достаточно, либы и хедеры не нужны).
Ребят, подскажите, в чем прикол. Компилирую все в экзешник, под стек отвел 100h. Я в секции .data объявляю строку, например string db 'string $'. При компиляции lea dx,string , тасм превращает мое lea в mov dx, offset string (экономит байт). Собстно вопрос: почему в отладчике я получаю mov dx,[0000] ? Тасм не учитывает, что при запуске exe в [0000] будет не string, а PSP? Что исправить? Я не понимаю, что делаю не так
>>1104807 Потому что сегмент загрузи. Я хуй знаю, как в ваших тасмах, достаточно ли там assume или нужно явно сказать mov ds,DATA. А если хочешь, чтобы все в одном сегменте валялось, зделой .com, model tiny, вся хуйня.
Хочу вкатиться, открываю beginners.re из шапки, а там прямо в первой главе, как говорится, с места в карьер, и где-то к 50й странице уже становится тяжко и непонятно. Так и должно быть, или мне лучше почитать дополнительную литературу/статьи?
>>1105249 >beginners.re Как я понял, beginners.re это сайт описывающий технику обратной разработки, предполагая, что изучающий уже знаком с инструментарием языка ассемблера и его особенностями. Посмотри сайты ниже в ОП-посте. Ну или сам погугли какой-нибудь "ASM для чайников". Поищи на вики статьи про такие понятия, как "сегментная адресация", "регистры процессора" и прочее.
>>1105980 дык ольки под 64 и нет. Это перевод в виде Chm внутри и олька и плагины и CrackMe, на ехелабе подобрал когда то. А так как курс под начинающих - смысл перепиливать - с этим разберется как есть - дальше уже сам материал найдет, если будет интересно.
>>1105748 >ОП, ты незаслуженно забываешь в шапку добавлять Нарваху Если бы я знал о его существовании... Как бы намекаю >>1015083 (OP) >Шапка треда в процессе пополнения, пока так. В следующий раз добавлю. Бессменный ОП этого треда
Двач, не поможешь ньюфагу? Недавно заинтересовался реверс-инжинирингом и в качестве первой жертвы выбрал известного в узких кругах бота для игры. На первый взгляд все было очень просто, и даже с околонулевыми знаниями я вскоре смог запустить основное окно несмотря на неправильный ключ (который должен сверяться на сервере бота). Однако, к игровым серверам оно по-прежнему отказывалось подключаться. Оказалось, что сначала проверяется статус нужного сервера (пик1), а в случае его доступности активируется функция проверки некоего ключа авторизации (пик2), которая уже выше моего понимания. Интересно, что если ссылку оттуда вставить в браузер и изменять переменные, то значение ключа будет меняться только при редактировании v1, которая скорее всего является айпишником сервера. Возникает вопрос, зачем тогда вообще нужен правильный ключ. Еще больше вопросов вызывает переменная "HuyZhaet". Кроме прикрепленных скринов она встречается несколько десятков раз в различных функциях, и всегда окружена подобными конструкциями. Подскажите хоть примерно что дальше делать, у меня даже предположений нет.
>>1106954 >Еще больше вопросов вызывает переменная "HuyZhaet". Кроме прикрепленных скринов она встречается несколько десятков раз в различных функциях, и всегда окружена подобными конструкциями. Это вызов виртуальной функции в C++. Судя по тому, что этой переменной ничего не присваивается, она глобальная. Смотри, где создаётся (легко найти по конструкции вида mov global_var, eax) и восстанавливай виртуальную таблицу. Там и должна быть интересующая тебя функция проверки ключа. >если ссылку оттуда вставить в браузер и изменять переменные, то значение ключа будет меняться только при редактировании v1, которая скорее всего является айпишником сервера Нет. Там ясно видно, что это функция типа sprintf и первым параметром передаётся auth_in в создаваемом url. Подозреваю, что это берётся из первого запроса. Запусти Wireshark и посмотри.
>>1107685 Я в asm вкатывался Калашников - Ассемблер - это просто (морально устарело, но на XP и в DOSBox всё работает, для наглядного использования годно) и http://asmworld.ru/uchebnik/
анончики, насколько быстро можно вкатиться в байтоебство, чтобы хотя бы суметь проанализировать простенький пакет в вайршарке. много ли вы получаете профита от асма, если не используете его в работе. Всмысле стоит ли его изучать как хобби?
>>1015083 (OP) OP, ЯД с Крисом - твой? если да - предлагаю заменить Образ мышления IDA, тут вот оригинальный исходный DOC для издатесльства лежит, только некоторых иллюстраций не хватает, зато все листинги как надо. _https://rutracker.org/forum/viewtopic.php?t=272818
>>1015370 Вот опять, хипстарок защищает своё глючное поделие только потому что умеет в него. Нода хороша только для сборки фронтенда -- и то, лишь потому, что можно простить ей все глюки зависимостей сотен пакетов на локальной машине.
Помню, в 2001 работал (начинающим тогда юникс админом) в конторе, которая пилила, помимо прочего, полулегальный рекламный малварь -- после установки прога заменяла рекламу во всех браузерах на свою и даже корректировала поисковую выдачу. Сейчас уже не у кого спросить, как они это делали, а интересно: каким образом можно перехватить ответ от сервера в браузер (при том, ssl) и заменить в нём пару параметров?
>>1111721 >каким образом можно перехватить ответ от сервера в браузер Самый простой способ - прокси-сервер. Скорее всего, именно это и было. >при том, ssl >в 2001 Нунизнаю. Но это тоже решается очень просто своим корневым сертификатом в системе и того же прокси-сервера.
Товарищи аноны, читаю "Архитектура компьютера" Э. Таненбаума, и что-то я не совсем понимаю тему про "Упорядочение байтов", в чем, собственно профиты систем с обратным порядком следования и/или систем с прямым порядком?
>>1113742 >pipelined (хз что это) Вычислительный конвейер. Как пример, пока работает АЛУ, можно параллельно считывать следующую инструкцию из памяти. Я не понимаю как порядок байт может улучшить производительность.
>>1113533 Какой-то порядок байт все равно должен быть. Оба варианта практически равноценны, какой выбрать? Это как порядок бит при передаче по последовательному интерфейсу.
OK, here's the reason as I've had it explained to me: Addition and subtraction
When you add or subtract multi-byte numbers, you have to start with the least significant byte. If you're adding two 16-bit numbers for example, there may be a carry from the least significant byte to the most significant byte, so you have to start with the least significant byte to see if there is a carry. This is the same reason that you start with the rightmost digit when doing longhand addition. You can't start from the left.
Consider an 8-bit system that fetches bytes sequentially from memory. If it fetches the least significant byte first, it can start doing the addition while the most significant byte is being fetched from memory. This parallelism is why performance is better in little endian on such as system. If it had to wait until both bytes were fetched from memory, or fetch them in the reverse order, it would take longer.
This is on old 8-bit systems. On a modern CPU I doubt the byte order makes any difference and we use little endian only for historical reasons.
>>1113884 Сейчас аргумент про длиную арифметику потерял смысл: длинную арифметику реализуют не массивами байтов, а массивами слов, и порядок байтов в слове никак не влияет на реализацию, лишь бы сами слова располагались в порядке little-endian.
Зато есть другой аргумент: компиляторы достаточно часто при работе с переменными типа char или short int кладут временные результаты в полноразмерное слово (int или long int) - это быстрее, а при необходимости (например, при возврате байта из функции) читают оттуда только первые один-два байта. С big-endian такие финты не пройдут: вместо простого чтения по указателю потребовалось бы прибавление офсета, а заодно и само чтение было бы по невыровненному адресу. Алсо, некоторые любят делать магиюписать говнокод вида uint32_t foo = 0x11223344; ∗(uint16_t ∗) foo = 0xffff, который теряет всякий смысл на big-endian машине.
пиздец везет тем кто шарит в реверсинге, всегда хотел заниматься им, но никогда не было времени нормально изучить это. В итоге 30 лвл пишу гавно на джаве.хотя платят много, но не интересно нисколько Парни как вы находите время на лоу левел? Это у вас как хобби или работа?
>>1114879 RetDec одинаково некачественный и бесполезный. Не стоит потраченного времени и тех десятков гигов оперативки, которая требуется, чтобы прожевать им что-нибудь сложнее хелловорлда.
А как всякие дебаггеры примитивные получают состояние процессора (регистры, стек, команды)? От ос ведь? А как можно получить доступ ко всему этому без ОС? С помощью каких механизмов это происходит?
>>1115621 Ну смотри, ОС переключает задачи по прерыванию (по прерыванию таймера, по исключению и т. д.). При переключении задачи ОС сохраняет/восстанавливает регистры в контекст выполнения (кусок памяти, привязанный к потоку выполнения) банально через push/pusha или mov [dest],reg, ну или там через всякие fxsave для FPU/SSEx.
Когда в отлаживаемом процессе возникает исключение (например, когда выполнение дошло до брейкпоинта - брейкпоинты вызывают исключение), ОС видит, что к процессу подключен отладчик, и вместо того, чтобы прибить процесс, она переключает задачу на какую-нибудь другую (например, на этот самый отладчик) и сигнализирует отладчику об этом событии. При этом на отлаживаемую задачу ОС перестает переключаться (т.е., останавливает ее), пока отладчик явно не скажет, что все ок, и можно продолжать.
А теперь, что касается твоего вопроса: раз отлаживаемый процесс остановлен, значит, его состояние сохранено в контексте выполнения и не меняется. А раз оно там сохранено, то по запросу отладчика ОС может это состояние прочитать или изменить.
>>1115822 О, спасибо огромное! Теперь картинка сложилась. А аппаратные точки генерируют прерывание или исключение? Помню я читал у нарвахи про их отличие от виртуальных брейкпоинтов. Если не ошибаюсь, то с их помощью, в частности, обходят обходят программы, проверяющие, отлаживают ли их.
>>1117318 Почитал. И не понимаю, почему всем не похуй. Если эта заплатка КОКОКО СНИЖЕНИЕ ПРОИЗВОДИТЕЛЬНОСТИ ДО 30% ОТ НАЧАЛЬНОГО УРОВНЯ то нахер оно нужно? Вот если бы вскрылась уязвимость в процессорах какого-нибудь сетевого оборудования, типа кисок или хуйвеев, вот это была бы проблема. Впрочем, там инфа соточка бэкдуров дохера. Главное, чтобы они не попали в открытый доступ, в руки васянов.
>>1117218 Про статью вестимо. >>1117445 >СНИЖЕНИЕ ПРОИЗВОДИТЕЛЬНОСТИ ДО 30% ОТ НАЧАЛЬНОГО УРОВНЯ то нахер оно нужно? Нахер тебе тогда вообще защищённая ОС? Сиди на параше без разделения прав, получишь прибавку в скорости в 100%. >И не понимаю, почему всем не похуй. Жабаскрипт в броузере может прочитать все твои пароли от архивов с ЦП, и тебе не похуй?
>>1117460 > Жабаскрипт в броузере может прочитать все твои пароли Не может. В браузерах уже успели похерить точность performance.now (снова!), так что все измерения скорости доступа превращаются в гадание на кофейной гуще. Тащемта даже не в браузерах на более-менее загруженной системе это тоже гадание на кофейной гуще с охуительной скоростью уровня байт-в-секунду.
>>1117467 Нет. >>1117478 Осталось только обновить мой устаревший браузер, так как ничего нового на XP всё равно не идёт. >Тащемта даже не в браузерах на более-менее загруженной системе это тоже гадание на кофейной гуще с охуительной скоростью уровня байт-в-секунду. Вот тут в общем согласен, это надо систему в монопольный доступ захватывать. Пойду поставлю майнер биткоинов в фоновый режим, пусть хакиры пососут.
Кстати вопрос. Функция CmpGetAcpiBiosInformation возвращает в переданном ей аргументе структуру с трёх элементов: boot_arch pm_profile flags которые добывает из АCPITable FADT Ни у кого нет мыслей, что это за структура, или мне придмывать свою?
>>1015083 (OP) Прорвался через 7 слоёв капчи к вам ИТТ! Хочу вкатиться в GAS на Линухе. Что посоветуете? Хоть что-нибудь на русском есть? Алсо, AT&T синтаксис для пацанов, да?
>>1117779 Может, хоть ты пояснишь, что с ними не так, и что лучше использовать? Вообще, у вас тут только тред реверс-инжиниринга, так? Вы тут игры взламываете и порнуху рипаете, или тут есть программисты на ASM'е?
>>1117824 Синтаксисы intel и at&t это просто представление мнемониками байтов в памяти. Мне нравится интеловский синтаксис тем, (один из плюсов) что порядок записи аргументов команды одинаков с высокоуровневыми языками. Т.е mov ax, 100 Можно записать как int ax = 100 В at&t это выглядит как mov 100, ax
Похоже с флагом можно компилировать в GAS интеловски синтакс. Но вот как с библиотеками это законтачится - я не знаю. Так как я себе поставил дос с tasm'ом для обучения и никаких либ не использовал.
Можете обоссывать меня. Но я сразу скажу, что в шараге нам так ничего и не пояснили, а я как последний лох проебал 800р, наткнувшись на мошенника, который обещал помочь. Анон, у меня уже нет денег, ты моя последняя надежда, может найдется не равнодушный. TASM, 16-битный ассемблер.
Ёбанный Обу когда будет нормальная капча? Можете пояснить за функцию VfZwDeleteBootEntry. Если смотреть на код отладочной х86 венды (или WRK), то получается пикрил. Внимание, вопрос. Что за переменная var_1C, и на кой она там нужна? Применив все свои недюжинные скиллы в брутфорсе исходного кода, получил такой код, который компилится байт-в-байт, но всё равно не понимаю, что там задумывалось. NTSTATUS NTAPI VfZwDeleteBootEntry ( IN ULONG Id ) { NTSTATUS Status; if ( VfZwShouldCheck(_ReturnAddress()) ) { try { Status = STATUS_SUCCESS; } except (VfZwExceptionFilter(GetExceptionInformation())) { NOTHING; } } Status = ZwDeleteBootEntry(Id); return Status; }
IDA отказывается открывать либу. Верно определяет тип либы, начинает загружать, почти мгновенно говорит, что не может считать сектор X. При этом указанный номер соответствует номеру байта, следующего за концом файла. Не помню точно формулировку ошибки, что-то вроде "Could not read file at sector XXXXXXXX, continue?" (ошибка всё равно не гуглится). В чём может быть дело?
>>1122499 ИДА пытается прочитать эти байты и понять, куда они ведут. При использовании некоторых хаков можно добиться разного поведения кода для процессора и с точки зрения иды, то есть процессор будет исполнять валидную инструкцию, а ида неправильно её дешифрует и попытается заглянуть за границу файла. Ах да, некоторые либы на самом деле являются указателями на функции в дллке, и не содержат кода. Попробуй посмотреть ей 7зипом, лол.
>>1122502 Когда работал с оверлеями, ида не ругалась, когда, например, вызывала функцию за пределами адресного пространства этого файла, а просто помечала адрес красным. Или ты не об этом?
>>1122504 > Или ты не об этом? Да я сам ХЗ о чём. Просто читал покойного Криску про наёбывание ИДЫ. >>1122506 >ДЛЛ'ок тут в принципе никаких нет. И я про что. Что ты там дизассемблировать собрался, текст вида имя_либы.dll имя_функции
>>1122566 Я тебе ильфак чтоли? Откуда мне знать? Никто не репортил? Никому не нужно? Напиши свой лоадер всего семейства (CPE, EXE, OBJ, BIOS и т. д.) или возьми 6.5. Лоадер на питоне пишется за пару часов.
>>1122591 IDA 7.0.torrent @ C:\Program Files\IDA 7.0\ida64.exe Не является приложением Win32 @ Патчишь байтики подсистемы PE заголовка @ Запускаешь на хрюше Ильфак- пидарас.
>>1122600 А потом один из плагинов захочет современный API, не сможешь вызвать какой-нибудь fstat64 из новой ucrt и что-нибудь тебе сломает. Ильфак не пидорас, это скорее к Microsoft претензии. Но все равно версии в заголовке не просто так сделали.
>>1122613 Код исключения: 0xC0000005 Сведения об исключении: Потоком была предпринята попытка прочитать или записать данные на виртуальный адрес, к которому он не имеет соответствующего доступа. Сведения о куче: Присутствующие
Если тебе по какой-то причине неприятно/неудобно более тесно общаться, то я буду рад и анонимной помощи здесь. Потому что мне помогает либо никто, либо ты.
Не хотел вызывать щитшторм на свою голову, но как в edb-debugger сделать запуск программы с аргументом, чей текст находится в файле? Я говорю об аналоге из gdb типа run < arg.txt
Просто хочется толкового gui-отладчика, а как только ищу адекватные отладчики под линукс, то напрашивается или какой-нибудь voltron производные от gdb, которые еще напильником надо обрабатывать, да еще не на всех дистрах нормально работают или этот edb.
>>1123542 NASM генерирует только отладочные символы CodeView8 для Win32. Я не знаю ни одного дебаггера, умеющего их читать (кроме самого CodeView, очевидно). А конвертер cv2pdb у меня не завёлся с готового бинарника. Компилировать его вручную я не хочу.
Ньюфаг в треде. Есть %программа_нейм% заранее скомпилированная с флагами -fno-stack-protector и -execstack с помощью gcc. В проге изначально нет проверки на размер введенных данных. Если запускать прогу через gdb и использовать при вводе строку с определенным количеством символов и payload`ом, то payload успешно запускается. Если просто запускать программу в терминале, то та же самая строка с payload`ом приводит к сегфолту. В чем дело? Имеет место быть ASLR?
>>1125416 А что же ещё. Неплохо было бы анализировать частоту использования и складывать в долгий ящик редко используемые регистры, но это больше для динамической рекомпиляции подходит, где можно собрать актуальную статистику.
>>1125539 Как-то неудобно выходит, это ж придется ещё записывать куда-нибудь в кучу, где какие регистры сохранены (а тогда уж проще для таблицы регистров и выделить значение в куче, но это уже совсем какая-то эмуляция получается).
> это ж придется ещё записывать куда-нибудь в кучу, где какие регистры сохранены (а тогда уж проще для таблицы регистров и выделить значение в куче Хранить регистры в куче бессмысленно. Тебе их между вызовами функций сохранять, а раз ты их все равно сохраняешь в какой-то стек (эмулированный или родной x86), то зачем куча? К тому же, если одна из целей - это натравливание HexRays на результат, то с глобальными переменными результат получается отвратительным. Лучше забудь, что в x86 вообще есть какие-то там регистры и создавай в каждой функции фрейм стека с 32 (ну или меньше) переменными reg_0...reg31. Все действия будешь делать с ними, а x86-регистры будешь использовать только для хранения операндов инструкций, загружая их непосредственно перед инструкцией. Увидишь последовательно выгрузку-загрузку одной и той же переменной - удаляешь. По скорости все это не так ужасно, как кажется - tinycc тому пример. А уже потом поверх этого будешь писать register allocator, выделяя регистры под "горячие" переменные, если захочешь.
> но это уже совсем какая-то эмуляция получается Никуда не денешься. Тебе все равно придется носить с программой либо кусок своего транслятора, либо эмулятор. Потому что никакая IDA тебе все цели непрямых переходов не найдет. А значит, некоторые такие переходы будут крашить программу. А чтобы не крашилось, нужно инструментировать непрямые call и jmp, проверяя, попадаешь ли ты в начало базового блока. Если цель перехода попадает не в начало базового блока, либо вообще вне базового блока, тогда такой код придется либо транслировать на лету, либо эмулировать. Да, при следующей итерации трансляции эта конкретная позиция пофиксится, но ты никогда не сможешь быть уверен, что пофиксил всё.
Вы пишите на ассемблере или собираетесь начать на нём писать? Программируете микроконтролёры, пишете драйвера для ОС, а то и саму ОС? Вам сюда.
Вы изучаете алгоритмы работы закрытого софта, пишите патчи бинарников? Вам тоже сюда.
Попрошайки с "решите лабу по асме за меня" идут в общий тред, а лучше нахуй.
Шапка треда в процессе пополнения, пока так.
Книги по RE:
https://beginners.re/ - "Reverse Engineering для начинающих"- бесплатная современная книга на русском языке. К прочтению вкатывающимся и прочим ньюфагам обязательна!
https://www.goodreads.com/shelf/show/reverse-engineering - список книг
Сайты по RE:
http://wiki.yobi.be/wiki/Reverse-Engineering
https://www.reddit.com/r/ReverseEngineering/comments/hg0fx/a_modest_proposal_absolutely_no_babies_involved/
http://www.program-transformation.org/Transform/ReengineeringWiki
http://blog.livedoor.jp/blackwingcat/
https://yurichev.com/blog/
http://wiki.xentax.com/index.php/DGTEFF
Все книги и статьи Криса Касперски (R.I.P.)
https://yadi.sk/d/CxzdM1wyea4WP
Книги по ассемблеру:
"Архитектура компьютера" Э. Таненбаум
С.В. Зубков: Assembler. Язык неограниченных возможностей.
Сайты по ассемблеру:
Замена почившему wasm.ru- https://wasm.in/
https://www.unknowncheats.me/wiki/Assembly
http://asmworld.ru/
https://software.intel.com/en-us/articles/intel-sdm
http://www.nasm.us/doc/
https://sourceware.org/binutils/docs/as/index.html#Top
https://msdn.microsoft.com/en-us/library/afzk3475.aspx
Для ковыряющих винду и софт под неё, сайты с описанием структур со смещениями и разными версиями оных:
http://geoffchappell.com/
http://msdn.moonsols.com/
http://terminus.rewolf.pl/terminus/
Предыдущие
№1 https://arhivach.org/thread/223223/
№2 https://arhivach.org/thread/255168/