Это копия, сохраненная 8 марта 2018 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Вы пишите на ассемблере или собираетесь начать на нём писать? Программируете микроконтролёры, пишете драйвера для ОС, а то и саму ОС? Вам сюда.
Вы изучаете алгоритмы работы закрытого софта, пишите патчи бинарников? Вам тоже сюда.
Попрошайки с "решите лабу по асме за меня" идут в общий тред, а лучше нахуй.
Шапка треда в процессе пополнения, пока так.
Книги по 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/
Я пробовал r2. Не рекомендую третий тред подряд, даже рядом с IDA не стоял, если тебе что-то серьезное нужно. А несерьезное можно хоть через objdump -D реверсить. Единственная причина использовать - кококо ида нешвабодная, дорогая, а ильфак пидар.
Алсо, что касается ольги, то ее клон вполне юзабелен, жив и здравствует, называется x64dbg.
>Алсо, что касается ольги, то ее клон вполне юзабелен, жив и здравствует, называется x64dbg.
И как годно? Блин, надо бы грузануть, вспомнить старые-добрые времена, хех :)
>Кстати, ОП ты пробовал реверсить с помощью radare2?
Даже не понял, как начать. Какая-то хуета для хипстеров.
>Единственная причина использовать - кококо ида нешвабодная, дорогая, а ильфак пидар.
Но ведь это весомая причина, всё-таки.
Ковыряю сейчас r2+webui, в первом приближении сносно. Сравнивать с IDA пока нелепо, но с objdump ещё нелепей.
Откуда вообще в этом итт треде взялось слово веб? У меня, например, бинарники по 10-20 метров, после анализа базы иды весят по полгига. Ида просто рисует нужные места листинга при переходе, а браузер как? Полностью грузит? Ну удачи ему, лол. Динамически подгружает при скролле? А если я долго скроллю?
Не пробовал вебморду, от консольного интерфейса впечатления в основном негативные, от функциональности тоже, новый нативный гуй тоже руки не дошли еще посмотреть.
Хорошего в веб-клиенте (или лучше в нативной ренедерилке, которая не будет продираться сквозь десятки слоев абстракций и песочниц, и не будет заставлять html/css делать не свойственные ему вещи) - только возможность запустить сложный анализ где-нибудь на соседней машине, пока на своей машине я лампово пишу скрипты и собираю сигнатурки для либ. Ну и совместная работа, куда же без нее, хотя с ней все очень сложно, нужен вменяемый undo, с которым все еще более сложно.
Не могу защищать radare2, так как с ним не работал, но не могу не заметить, что ты поехавший, если думаешь, что веб-интерфейс принципиально не может иметь возможности подгружать только нужные области данных. Говоря проще, хуйню несешь какую-то. Если ты имел в виду конкретную реализацию веб-интерфейса, а не веб-интерфейсы вообще, то ты просто очень плохо выразил мысль.
Перефразирую: количество анальной боли при реализации нативного интерфейса не идет ни в какое сравнение с той болью, которую придется испытать, чтобы сделать что-то хотя бы отдаленно юзабельное в браузере. Да, я имею в виду веб-интерфейсы вообще, и мне очень жаль, что индустрия до этого докатилась.
Ты какой-то из 90ых.
Анальную боль несут с++/жаба, а не нода. А экономить на байткоде в 2к17 может хотеть либо ембеддщик с 8-битной атмегой, либо старый пердун с устаревшими рефлексамм.
Загугли скрины уже, если самому некогда ковырять.
Как ты быстро.
У меня нет WoT и скачать для того, чтобы посмотреть, нет возможности. Изменить количество боёв - не проблема. А где создаётся второй запрос, не знаю. Мне нужно узнать, где функция шифрования, та, которая использует '/start?data='. В IDA нет ссылки на неё. Возможно, она с помощью VMProtect защищена, а может и косвенно вызывается, поэтому и ссылки нет.
OllyDbg 2.01 с плагином ScyllaHide (а может и без него, не проверял) нормально запускает программу. Запусти в отладчике, дождись, пока программа проверит валидность ключа, а потом поставь точку останова (Ctrl+G, название функции, когда перейдёт, жми F2) на WS2_32.send. Хотя разработчик для проверки ключа использует функцию WININET.HttpSendRequestA, то можно и на эту функцию поставить точку остановки.
И не забудь выключить ASLR, в данном случае это только мешать будет. Скопируешь в блокнот, сохранишь как *.reg файл. Или в реест залезь. Потом перезагрузись.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
"MoveImages"=dword:00000000
Бро, при запущенном боте этот БП срабатывает постоянно, даже когда тот ничего не делает.
>при запущенном боте
Если запустить программу, она дважды соединяется с сервером: проверка обновлений и проверка ключа. Затем ничего не передаётся. По крайней мере, у меня именно так. Вот после запуска и проверки нужно поставить брекпойнт.
Как вижу, передаётся 4 байта. Посмотри в Wireshark, что он там передаёт. Пингует сервер, что ли?
Увидел, передаётся 00000001. Поставь условный брекпойнт, Shitf+F2, [esp+0c] > 64
Нет, теперь всё правильно. Размер буфера 0xC1, что больше 0x64. А что хотя бы передаёт? Текст или бинарные данные? Щёлкни на третьем, от вершины стека, параметре правой кнопкой мыши и нажми "Follow in Dump". Если там текст "GET /start?....", то нужно будет трассировать до функции шифрования. Сначала можно Ctrl+F9, таким образом отладчик остановится на первом ret, что как раз будет выходом из функции send. А дальше F7 или F8 и смотри, что там идёт. Нужно найти, где в стек кладётся адрес (07CB15C8 в данном случае). И найти, откуда он берётся. Где-то поблизости, если повезёт, будет функция шифрования.
Кстати, по адресам 00444B67 и 00444B90 что-то ксорится. Поставь брекпойнты там и посмотри, что там было изначально.
>Посмотри в Wireshark, что он там передаёт.
Абсолютная тишина.
>Follow in Dump
Пикрелейтед
Эта апишка не может для чего-то еще использоваться, кроме передачи по сети? Общение между потоками, например, я хз.
Вообще я ловил два типа запроса, проверка ключа и этот start?data. Первый отправляется при запуске бота и старте боя, второй только при старте боя. А БП про который ты говорил срабатывает постоянно, я даже кнопку "в бой" не успеваю прожать.
>Абсолютная тишина
Подозрительно.
>для чего-то еще использоваться, кроме передачи по сети
Если в сеть не идёт, значит локально используется.
Попробуй брекпойнт на WININET.HttpSendRequestA. Или измени условие на
[[esp+8]] == "GET"
>WININET.HttpSendRequestA
Попался этот самый запрос с data.
Не мог бы ты пояснить, куда копать дальше? По Ctrl-F9 меня кидает рядом, на 7129193D.
В общем, какой-то локальный мемчик про какую-то скучную лабу. Решай крякми, реверси реальный софт, реверси свои собственные сэмплы, забей на эту хуйню.
> локальный мемчик
http://uu-kk.blogspot.ru/2014/06/of-binary-bombs-part-6.html
http://csapp.cs.cmu.edu/2e/bomblab.pdf
https://www.reddit.com/r/compsci/comments/5wzbfb/defusing_a_binary_bomb_phase_1/
https://github.com/petroav/CMU-assembly-challenge
>крякми
Ок, спасибо за наводку.
По сути, то же самое.
Можно и так. А можно и здесь, как-то по теме треда всё же.
>>015677
Предыдущий скрин, нашёл алгоритм шифрования, немного перепечатал с экрана, расшифровал и похоже, что передаются какие-то настройки. Почему так - не знаю. Скачал базовый набор для WoT на 2.5 Гб. И у меня отказывается загружаться CyberTank, если уже запущен клиент, а если сначала его, то не показываются танки. Как сделать, чтобы были доступны?
>куда копать дальше
Тебе надо найти, где данные шифруются. Если пролистнёшь по стеку (правое нижнее окно) вниз, то есть вероятность увидеть не шифрованные данные. Сейчас там видна шифрованная строка. Если не шифрованные данные есть, то жмёшь Ctrl+F9, оказываешься в конце функции, жмёшь F7/F8, оказываешься в предыдущей функции. Жми поочерёдно, посматривая в стек до тех пор, пока не дойдёшь до функции, которая шифрует строку. Ещё можешь сделать дамп программы (плагин OllyDumpEx, например), загрузи его в IDA, так гораздо удобнее будет.
Завтра попробую сделать сам, если не осилишь, ты только напиши, как эти танки в ангар добавить, когда они и так там уже стоят.
>нашёл алгоритм шифрования, немного перепечатал с экрана, расшифровал
Можешь скинуть описание?
>похоже, что передаются какие-то настройки
Мое предположение, в начале каждого боя, в параметре data бот отсылает хозяину ключ, плюс карту, возможно сетапы, а в ответ получает алгоритм действий и заодно декрементится счетчик доступных боев на серваке.
>отказывается загружаться CyberTank
Не могу сказать, не сталкивался с такой траблой. Единственный момент, чтоб дойти до момента передачи шифрованных данных, нужен валидный ключ. Если хочешь, могу расшарить каким-нибудь тимвьювером свою виртуалку с игрой, ботом и olly.
>Завтра попробую сделать сам
Если будет проще, напиши в скупе j0hnny_mn3monic[at]outlook.com, предоставлю готовое рабочее окружение.
Шифрование крутится в виртуальной машине VMProtect, что ожидаемо.
>Можешь скинуть описание?
for (i = 0; i < data_size; decrypt[ i ] = encrypt[ i ] ^ ((i + 0xD5) % 0xFF), i++);
>Мое предположение
Маловато места для алгоритма. Уже выключил всё, а скопировать не догадался. Там передаётся ключ, какая-то шифрованная строка длиной символов 20, некоторые параметры или что-то подобное.
>чтоб дойти до момента передачи шифрованных данных, нужен валидный ключ
Нет, не нужен. Ключ периодически проверяется во время работы, но ответ легко подделать. Он не шифрован, в Wireshark ты должен был его увидеть. А шифрованные данные передаются уже после начала боя, когда секундомер ожидания начала боя дойдёт до 0.
Как уже писал ранее, самый простой вариант в данном случае - просто отправить ранее перехваченные данные обратно программе. Простейший прокси-сервер, который не пустит трафик программы дальше твоего компьютера. Программа использует системные настройки, поэтому перенаправить трафик очень просто, "Свойства обозревателя/Подключения/Настройка сети" в "Панели управления". Перехватываешь один раз сессию и всегда её используешь. Один и тот же ключ должен, наверное, давать один и тот же результат, если там, конечно же, не добавляется что-то типа времени. Только не забудь добавить проброс трафика, который не относится к программе, дальше, а иначе тот же Хром перестанет работать, т.к. он использует системные настройки.
>Не могу сказать, не сталкивался с такой траблой
Странное поведение, нужно сначала запускать программу в отладчике, а только потом игру, тогда всё работает.
>for (i = 0; i < data_size; decrypt[ i ] = encrypt[ i ] ^ ((i + 0xD5) % 0xFF), i++);
Блин, я у мамы тупенький. Это обратимо, помимо перебора?
>А шифрованные данные передаются уже после начала боя
Сори, не совсем корректно написал, имел ввиду именно этот запрос. C подделкой счетчика боев в запросе checkKey проблем нет.
>Мимопроиграл.
Ну и что ты будешь ксорить, если на руках результат операции и два неизвестных?
Где ты там два неизвестных нашел? Там однобайтовый ксор, просто тот байт просто не с нуля стартует и инкрементируется. Это не шифрование даже, а просто обфускация.
X ^ ((Х + 0xD5) % 0xFF) = 0x6A
Скажи мне пожалуйста, чему равно Х, я наверное действительно что-то не догоняю.
>Это обратимо, помимо перебора
Да для ксора, функция шифрования и расшифровки одна и та же. Ты C(++) или C# знаешь? Имена всем переменным осознанные дал же, в чём именно сложность?
>имел ввиду именно этот запрос
Именно этот запрос и имел в виду. Не нужен валидный ключ, чтобы добраться до функции шифрования. Бот сам начинает нажимать кнопки, вступает в бой, а затем отправляет шифрованные данные.
Забыл написать, функция перед шифрованием находится по адресу 0043EA10, можешь посмотреть, что именно передаётся.
А ещё мне мысль в голову пришла, что та странная строка - это может быть hardware ID, как защита от того, что тебе советую. Для одного и того же компьютера может и пройдёт.
>>016238
У тебя ошибка, нет двух X.
Первый X - текущий символ для шифровки/расшифровки.
Второй X - это счётчик, он равен текущей позиции символа, от 0 до n - 1, где n - длина строки.
Это обычный юникод, UTF-16LE.
Латиница - как и положено ей быть, кириллицу можешь посмотреть здесь https://ru.wikipedia.org/wiki/Кириллица_(блок_Юникода)
>У тебя ошибка, нет двух X.
Сори, спасибо.
Правда лыжи все равно не едут. В твоих руках это ienpfmofkilamheebffnkiicpnacebnibeamjjbipaodeglnfpbbkdnhinbjnmkfaneghfmickenhfhchddohbjnjbngcjahbbgnkfmdegibppnj превращается во что-то удобочитаемое?
Сори, что дергаю по ерунде, просто скила не хватает, а интерес разгорелся, лол.
Спасибо тебе большое, действительно помог
У меня тоже не едут, кстати. Может, вместо 0xd5 что-то динамическое? Алсо, зачем ты творишь эту херь с binascii, когда в питоне есть нормальные шестнадцатеричные константы?
мимоанон
Тут есть те, кто шарят в криптовке файлов, крипторах, алгоритмах шифрования и вот этом всем?
Сложно ли мимо дурачку запердолить полиморфный криптор, и шоб антивирусы не палили без знаний ассемблера? Есть знания пифона и джаваскрипта.
"Полиморфный" как бы подразумевает, что ты будешь менять инструкции в стабе. Чтобы что-то менять, надо знать, что оно из себя представляет. Выучи асм, это самый простой язык.
>лыжи все равно не едут
Это не для этого, а вот для этого >>015627.
То, что ты привёл, как раз и есть то, что тебе, в итоге, нужно. Так что увы, с этим пока ничего не получится.
Кстати, когда у тебя срабатывает брекпойнт на HttpSendRequestA, окно с игрой перестаёт реагировать на любые действия? Как будто бы зависло приложение? И почему команда, в которую кидает, всё время проигрывает? Они что, без одного танка не могут победить? Один раз была победа и раз 5 поражение.
>когда у тебя срабатывает брекпойнт на HttpSendRequestA, окно с игрой перестаёт реагировать на любые действия
Да
>почему команда, в которую кидает, всё время проигрывает
Это норма, они бы и с тобой лузнули. Имхо, это фишка разработчика по разводу на донат.
>А как ты код из-под VMProtect вытащил
Никак не вытаскивал, функция была не защищена, а с программы был снят дамп, поэтому с ним можно работать в IDA.
Ну с дампом-то понятно. Я думал, тут внезапно образовались спецы, которые саму вм раскручивают за полчаса.
Что угодно. То же, что и на других языках.
> есть ли прикол писать на ассемблере
В основном для обучения и ради интереса. Ну и для embedded небольшие кусочки приходится писать именно на ассемблере.
>А че на этих ваших ассемблерах писать можно?
Что угодно от Hello World до операционной системы.
>Короче, есть ли прикол писать на ассемблере?
Есть.
Компиляторы (трансляторы) транслируют код во что-то. Это может быть машинный код (он же двоичный), может быть ассемблер текстом, может быть сишечка текстом (так делал C++ в давние-давние времена, и для последующей обработки уже требовался компилятор сишечки), может быть байткод какой-нибудь вм, может быть какое-то промежуточное представление (погугли link-time code generation - в таком случае машинный код генерит линкер, это позволяет делать некоторые глобальные оптимизации). Вариантов дохуя. Общее в них только то, что код на чем-то человекочитаемом преобразуется во что-то другое (часто более низкоуровневое, но не обязательно).
Я не уточнил, что имел ввиду компиляторы в нативный код. Но я не могу понять, как можно компилировать в двоичный код, для чего. Если процессор понимает только команды ассемблера, как двоичный код будет исполняться? Тогда другой вопрос возникает, если компилятор транслирует в ассемблер, то тогда требуется повторная компиляция в исполняемые файлы компилятором ассемблера.
Команды ассемблера - это текст. Компилятор ассемблера превращает текст в двоичный код, в байтики. В байтиках закодированы инструкции, ну т.е., вот такие-то биты говорят, какая инструкция, что она делает, вот тут у нас immediate, вот тут биты указывают, в какой регистр положить результат. Процессор читает байтики, разбирает вот эту закодированную информацию и делает, что указано.
> Тогда другой вопрос возникает, если компилятор транслирует в ассемблер, то тогда требуется повторная компиляция в исполняемые файлы компилятором ассемблера.
Именно так и делается в классическом тулчейне. Просто то, что ты считаешь компилятором, называется compiler driver. Для сишечки он: примет аргументы, вызовет препроцессор, для результата препроцессирования вызовет компилятор (транслятор), для результатов компиляции вызовет ассемблер, для полученных объектных файлов вызовет линкер, и ты получишь свой исполняемый бинарник. Компилятор может содержать все эти утилиты внутри себя, может объединять некоторые этапы (например, может напрямую генерить машинный код, и никакого ассемблера текстом), поэтому ты можешь получить исполняемый файл без промежуточных результатов - зависит от компилятора.
Спасибо за подробное разъяснение. Команды ассемблера и инструкции процессора это не одно и то же? Если нет, то можно ли обращаться напрямую к процессору без ассемблера?
Можно, но нахуя? Я теоретик-петухан, но для процессорных инструкций используют программаторы вроде. Поправьте, если обосрался.
> Команды ассемблера и инструкции процессора это не одно и то же?
Все сложно. Одну команду ассемблера ассемблер может превращать в разные инструкции (например, для тебя mov - это просто mov, а для процессора есть разные - mov reg, reg; mov reg, imm; mov reg, [reg] - опкоды отличаются), могут быть оптимизации на уровне ассемблера (масм заменял lea на mov, или наоборот - не помню уже), могут быть псевдоинструкции (например, в ARM некоторые команды не существуют на самом деле и разворачиваются в несколько реальных инструкций). Но в общем и целом соответствие почти полное. Т.е., ассемблерные "команды" - это просто человеко-читаемые имена для реальных кодов инструкций процессора.
> можно ли обращаться напрямую к процессору без ассемблера
Качаешь мануал по процессору, ищешь формат инструкций, ищешь таблицу опкодов, втыкаешь нужные числа в нужные места, пишешь байтики в память и выполняешь. В этом даже есть некоторый смысл, если ты хочешь написать свой JIT с нуля и не хочешь таскать за собой внешний кодогенератор или ассемблер.
И вообще набери в гугле "васм заклинание кода". Где-нибудь обязательно перевыложено.
Так если у процессора и ассемблера разные инструкции, то зачем лишняя прослойка? Пока не догоняю разницу между инструкциями процессора и командами ассемблера, если разница вообще есть.
Понятно что проще. Но для меня непонятно все ли возможности дает ассемблер, какие дает процессор. И какова разница в их эффективности. Опять же в ассемблерах встречаются функции, в процессоре как я понимаю их нет, вот хочу понять во что они транслируются.
https://software.intel.com/sites/default/files/managed/a4/60/325383-sdm-vol-2abcd.pdf
>то зачем лишняя прослойка?
Затем, что она адреса автоматически проставляет. Если ты пишешь в машинном коде, ты должен высчитывать размер каждой инструкции, чтобы поставить джамп в нужное место, знать адреса каждой константы. Причем если ты добавляешь код в середину функции, то все адреса, соответственно, изменяются, и тебе приходится все заново все пересчитывать. Основная функция ассемблера - именно линковка и проставление адресов, а не текстовое представление кода. Цифры не так уж сложно читать при должной практике.
Раз для разнообразных, то не подходит.
Заебись технология. Только современному былокодеру ни к чему.
> В PE файле релоки могут быть где либо кроме кодовых секций?
Конечно. Пример (глобальные переменные):
int foo = 1;
int *bar = &foo;
> или там могут попасться и секции данных
Ну попадутся секции данных, но если ты все равно флаги защиты восстановишь, в чем проблема-то?
Господа, пишу криптор. Для запуска программы в памяти мне нужен PE-загрузчик. Стоит ли писать его с использованием некоторых объектов C++ STL? Отказываться от STL все равно что выйти из зоны комфорта. Может ли использование STL помешать морфингу кода и затруднить чистку стаба?
Дак вот в том и дело, что если при каждой итерации для страницы это делать, то дохуя вызовов VirtualProtect получается. Я думал, может можно в 2 вызова это сделать, а не 2N
Почему C++ такой уебищный? Пишу PE-загрузчик и десять минут потратил на создание сущностей для автоматического освобождения ресурсов, хотя если бы писал на си, то мог бы сосредоточиться на решении задачи.
https://ideone.com/Yy5the
А можно было написать класс и освобождать/закрывать все в деструкторе. Диды десятилетиями так писали, а тут ты со своим scoped.
Количество байт с учетом паддинга нулями, выделенное под заголовки в файле, а не образе. В образе округляй по размеру страницы.
Подскажите библиотеки для ассемблирования и дезассемблирования или расскажите как пользоваться вот этим http://ref.x86asm.net/coder64.html Что означают эти r/m8, r16/32/64, m16/32, imm8. Ну я предпологаю, что r означает регистр, а остальное не очень понятно.
А ещё я немного не понимаю команду jmp. Это относительный переход? Абсолютный? Или и то и то? Просто я не понимаю как происходят переходы в обычных программах, ведь они каждый раз загружаются в разные участки памяти. То же самое и с mov [адрес],значение.
А ещё мне хорошо бы почитать про устройство elf-файла и линковку с библиотеками. Я не нашёл.
Пост не мой я простио разместил объяву.
Сходите пните этого хуя по оригинальной ссылке: https://lol_if_ox.org/b/res/174.html#330
> библиотеки для ассемблирования и дезассемблирования
keystone/capstone
> Что означают эти r/m8, r16/32/64, m16/32, imm8
r - регистр, m - память, imm - непосредственное значение (константа, которая кодируется прямо в инструкцию) циферка - количество бит. r/m8 - восьмибитный регистр или байт из памяти.
Молча. Они на них пишут. Ты тоже так можешь уже много лет:
#include <stdio.h>
static void йоба(char сообщение[]) { puts(сообщение); }
int main(void) { йоба("привет, мир"); }
Как тебе Hopper?
Оперативку он жрет конкретно, бинарники от 20мб и выше IDA отжирает 300-400мб, Hopper жрет гиг и более. После закрытия файлов память практически не освобождается, постоянно нужно перезапускать программу.
> Оперативку он жрет конкретно
Ну ничего, вот седьмая ида, которая 64-bit only, выйдет, и будет примерно столько же.
1. Смотрел количество золота и искал его hex-значение в секции .data в виртуальной памяти, не исполняемом файле, он же вроде memory dump. Также искал значение в стеках каждого треда. Значение пробовал как в прямом порядке искать, так и обратном, свойственном виртуальной памяти (типа 00 00 0E 8B и 8B 0E 00 00 ). Нихуя не получилось, в памяти очень много адресов с этим значением.
2. Далее, попробовал сделать search for referenced strings, поставил брейкпоинты на всю хуйню с текстом gold вне зависимости от регистра. Теперь, когда я открываю инвентарь, у меня срабатывает BP (т.к. там в инвентаре кол-во золота отображается), казалось бы, прощелкай пошагово всю хуйню и найди где есть обращение к переменной, в которой хранится количество золота. Но это пиздец, там очень много щелкать приходится.
Я так понимаю, что 2 вариант более работоспособный, поэтому меня интересует, нет ли какого то механизма в ollydbg, который мог бы мне помочь? С чего вообще стоит начинать и как стоит делать, чтобы в программе найти значение какой либо переменной и подкрутить ей значение?
Делай, как Крис Касперски: сделай дамп образа, чтобы зафиксировать текущее число голды. Измени количество голды и сделай еще один дамп. Для верности сделай еще дамп с другим количеством голды. Сравни дампы.
А можно просто взять Cheat Engine, который сделает это автоматически. Алсо, искать константу лишено всякого смысла. Значение может быть в "копейках" (или еще каком-то fixed-point), может быть float или double. Может быть зашифровано, может дублироваться и сравниваться. Много чего может быть.
То есть нет волшебной кнопки "сделать заебись"? Либо вручную перебирать ебучие DWORD'ы, либо сделать как ты предлагаешь, либо использовать cheat engine, который автоматизирует то же самое?
Или entry point + rva?
Именно так.
Нет разницы, как учить асм. Это самый простой язык, где все сложности заканчиваются на отличиях компиляторов. Можно хоть Intel SDM читать. Калашников сойдет тоже.
Спасибо, анон. А что на счёт практических задачек? Как я понял, в ассемблировании важно понять не сколько сам яп с его синтаксисом и набором инструкций, сколько принципы работы CPU, изменение регистров по ходу кода етс. А у Калашникова ничего веселее разбора резидента нет вроде. Может есть какой-нибудь годный сборник лаб для студентов дцп курса, а то читать и тупо копипастить код уже утомило.
Не знаю, чего тебе конкретного посоветовать. Так-то в 32-битный асм вкатиться проще: если знаешь какой-нибудь Си, можно компилировать код с разным уровнем оптимизаций и смотреть, во что он свернется; на васме были туториалы Iczelion-а, можно писать полноценные десктопные приложения, смотреть олькой или x64dbg, как они выполняются и т. д. Но у тебя там 16-битный код ведь? Пытайся играть с каждой новой инструкцией, пиши минимальные программки в 3-4 инструкции, разбирайся, как все работает. Возьми простые задачки для любого другого языка и пиши их на асме. Подходы к реализации от языка не меняются. Алсо, можешь взять Human Resource Machine, поиграть в нее, потом поделать то же самое на реальном ассемблере.
Это же надо сопоставить имя переменной и ее значение. А Имя переменной оно же огромное, это буквы, каждую нужно закодировать минимум одним байтом. Почему дураки программисты их используют вместо номера ячеек памяти? Это же очевидная оптимизация!
Толсто. Во время компиляции имена заменяются на номера ячеек памяти. Если изначально использовать адреса, ты заебешься их пересчитывать вручную при изменении программы. Для этого-то как раз изначально и придумали ассемблер, а потом и другие языки.
Нашел походу. Run trace - это то, что нужно
Годная тулза, но только если нравится/удобно ковыряться в сонсоли. Для большого унылого энтерпрайза не очень, но для ctf/прошивок/эмуляции - самое оно
мимо р2фанбой
> Error in `r2': double free or corruption (!prev)
> Aborted (core dumped)
Каждый раз, когда у меня возникает необходимость это использовать (IDA под рукой нет), дело заканчивается листингом objdump. По разным причинам. Сегодня, например, вот так.
Допустим, что секция, в которой находится таблица импортов, позволит вместить в себя достаточно байт, чтобы за оффсет не перевалить. Я понимаю, что нужно увеличить виртуальный размер секции с импортом, увеличить размер IMPORT_DATA_DIRECTORY или как там её. Какие еще подводные камни?
Никаких, так и делают обычно. Учти только, что за импорты две датадиректории отвечают. Есть IAT еще.
Шапку.
Да бля понятно что тут ссылок дохуя и все годные, я спрашивал про фундаментальные вещи и нужно ли они типо, а надо ли по ОС заморочится?Надо ли читать Таненбаумана?а архитектуру проццесора?мне сначала это прочитать а потом уже асм,гайды хуйды по реверсу или и так норм
как вкатиться, как вкатиться. ответь себе вопрос что происходит с программной точки зрения, когда ты отправляешь сообщения на дваче от нажатия на клавишу и движения мышкой до ввода капчи и нажатия отправить. нахуй оно тебе нужно, читать сразу обо всём без конкретной задачи. информация не будет задерживаться. поставь себе задачу в поле RE. любую, хоть самую дебильную, и решай её. так и вкатишься.
Спасибо анон, чтоб у тебя доляры сыпались рекой,любая прога реверсилась, а тянки прыгали на хуйце
> надо ли
Надо. И го выучить надо. И джаву с паттернами. И алгоритмы. И цифровую схемотехнику. Чем больше ты знаешь - тем проще реверсить. Но в каком конкретно порядке учить - похуй. Можно просто начать с первой ссылки в шапке. Можно просто выучить асм. Можно начать с теории.
как можн оптимизировать следующий цикл с учетом того что ег осложность что-то между O(n^2) и O(n^3). Все перменные это ymm регистры, но даже один единственный лишний mov уменьшает скорость на 15-20%
Таненбаум читабелен. Местами вводит ненужные сущности, местами рассказывает о какой-нибудь хуйне до ее описания, но в целом норм (английскую версию читал).
Почему в ntdll нет функции LdrpAllocateTls?
Потому что есть, но она внутренняя, не является частью публичного апи, и поэтому не экспортируется. Зачем тебе она?
Зачем только за эти танки взялся? От нечего делать, сделал митм на трафик танков. Пароль передаётся в открытом виде, хотя он и в зашифрованном трафике, но заменить публичный ключ на свой не составляет труда, что, собственно, мной же и сделано. Не понимаю, что за тупость у разработчиков? Сделать 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.
Гордо написано в гайде, что не правда. Ничего не надо модифицировать, клиент не знает, сервер не догадывается.
Интересно, что передаётся в трафике. Сейчас это набор бинарных данных, ничего толком не понятно, кроме строк, которые в них проскакивают. Действительно ли совсем ничего лишнего клиенту не передаётся?
Так же у меня есть идея, как сделать обход проверки в боте. Но мне лень сейчас это реализовывать.
Ты в свой тред заглядывал вообще? Что ты конкретно хочешь эмулировать? Ты осознаешь, что к моменту, когда твой код получает управление, процесс уже создан, и LdrpAllocateTls уже отработала? Зачем тебе второй раз ее запускать?
> публичный ключ на свой не составляет труда
Это палево и пиздец какое, олсо:
>Сделать SHA256 от пароля хотя бы что мешает?
Что мешает вычислить пароль с коллизионным SHA256?
>Это палево
В чём или на чём? Само собой, трафик нужно расшифровать и снова зашифровать нужным публичным ключом. Мой аккаунт пока что не заблокировали. Если заблокируют, тогда где-то по тихому передаётся информация о публичном ключе. Не написал, что используется RSA, не сертификат.
>с коллизионным SHA256
Сложность вычисления коллизии? Это всё-равно лучше, чем пароль открытым текстом. Можно усложнить и добавить соль, которую присылает сервер. Или ещё более усложнить, вычисляя SHA от SHA несколько тысяч раз, как сделано в Wifi.
>на чём
На сервере, паблик скорее всего из кольца, если оно не сойдется - будет не очень хорошо.
Вот краткое овервью
http://maths.straylight.co.uk/edb_files/crypto_colloquium.pdf
>Сложность вычисления коллизии
O(1), для ключей до 128 бит есть уже предрассчитанные словари.
Долбаеб короче с кем я спорю
Ты сам читал статью то? Это поиск коллизии только на 24 раунда из 64 в SHA256, для всех раундов каких либо результатов значительно снижающих количество операций пл сравнению с полным перебором - нет.
Кроме того только недавно была опубликовпна ПЕРВАЯ коллизия найденная гуглом на суперкомпах для SHA-1, а SHA-256 значительно сложнее [1], короче иди нахуй уроки учить
1. https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html?m=1
> Что мешает навернуть birthday
Мешает то, что SHA256reduced - это не SHA256. С точки зрения криптографии - это две родственные, но разные хэш-функции.
Но разве мы не можем перейти от одного класса к другому заменив функцию расширения сообщений использующуюся с DCE?
Я просто к чему веду, недавно ломали JP Morgan Chase, кто в теме говорили о факте компроментации (сорри за мой русский он не совсем родной, я его не очень часто практикую, разве что в /b/) SHA256 на 80 раундов, причем во внутренней сети, т.е. дело обошлось ресурсами какого-то из внутренних серваков на который закинули минимальный код через сотрудников. Да и пруфы косвенные есть, в частности сменили все хеши на BF судя по техникал репортам.
>криптографический отдел гугла
Знал о хартблиде за три года до публикации уязвимости. А ты продолжай веровать.
Т.е вся твоя аргументация строится на теории заговора которую невозможно подтвердить мои опровергнуть?
Кще раз, парень писал что надо бы закрыит алеие текст пароли в протоколе танков хотя бы хешем SHA256, на что анон (ты или другой) ответил что это ничего не изменит и якобы колизию подобрать легко. Плз расскажи как ТЫ это будешь делать? Без крутых историй заговора и херни типа я был на конфе в вегасе, а также ссылок на статьи которые ты сам не читал.
>теории заговора
Посмеялся от души, спасибо.
>ничего не изменит
Это так
>как ТЫ это будешь делать
>Без крутых историй
VentureCrypt дальше ты сам, раз просил без историй.
За что люблю русских - говно всегда лезет вперед всего. Проигрывать можно бесконечно :^)
т.к. я живу в украине но все сервисы мэйл ру работают
впрочем, у меня дом. сеть, т.ч. всё возможно
Насколько сложно будет портировать кряк под шиндовс? Ида умеет разбирать маковские исполняемые файлы? Есть ли там аналог diff'a для сравнения двух версий файла? Чтобы сразу было ясно где пропатчено? Кто-нибудь тут уже делал подобные операции?
Ничего я не смог сделать. Пропатчил аналогичным образом под шиндовс и нихуя не заработало. Программа зависает. Сижу разбираюсь почему.
- вот есть некий вирос, он ловится антивиросами по характерным сигнатурам (да?).
- сигнатура - это машинный код.
- одно и то же состояние регистров может быть вызвано разным машинным кодом / ассемблерными коммандами.
- предположим, у нас есть метод автоматически получать подобные "синонимичные" комманды (разный машинный код, приводящий к одинаковым состояниям регистров) для любого нужного состояния регистров. Можем ли мы исходя из этого получить неуязвимый вирос, просто меняя изначальный машинный код на "синонимичный"?
https://ru.wikipedia.org/wiki/Полиморфизм_компьютерных_вирусов
>получить неуязвимый вирос
С 1990 года хитрые человеки пытаются, говорит статья выше.
>он ловится антивиросами по характерным сигнатурам (да?).
Нет. Это уже не так с середины 00-х. Ловится по поведению динамически.
>Можем ли мы исходя из этого получить неуязвимый вирос, просто меняя изначальный машинный код на "синонимичный"?
Можем.
>Ловится по поведению динамически.
А какое поведение считается неправильным? Представим полностью полиморфный meterpreter. Антивирос его не спалил по сигнатурам. Что нужно сделать программе, чтобы антивирос таки догадался? Ну кроме очевидной толстоты - форматирования винтов, массового удаления файлов и т.д.
>массового удаления файлов
Судя по массовому распространению шифраторов, это нормальное поведение программы. Не нормальное поведение для антивируса, это когда программа создаёт удалённый поток, копирует/записывает в память чужого процесса, изменяет исполняемые файлы, читал, что очень не нравится антивирусу, когда программа обращается к службе BITS. Много чего ему может не нравиться.
- мнемоники (MOV, PUSH и т.д.) - удобное для человека представление опкодов
- опкод - единичный элемент машинного кода
- машинный код - исполняемая процессором последовательность опкодов (?)
- байткод - ???
- отношение опкода к байткоду - ???
- отношение машинного кода к байткоду - ???
Или где можно почитать про это внятно, коротко и по-существу?
Что скажете за этот ресурс http://ref.x86asm.net/
>опкод - MOV
Но MOV это же мнемокод для удобства, опкоды у этой комманды могут быть разные.
Машинный код - это бинарное представление 16ричного байткода?
>байткод
Где-то читал такое определение. Байткод - это код, длина которого равна одному байту. Как понимаю, длина команды, без аргументов. Это, по большей части, к скриптовым языкам относится.
Остальное не знаю. Вроде про мнемоники правильно ты написал.
Байткодом обычно называют машинный код для несуществующей (виртуальной) машины.
>>056174
> что можно посмотреть в hiew
Хекс-дамп. Для дизасма лучше использовать более современные инструменты. В дизасме ты видишь представление машинного кода в виде мнемоник ассемблера. Опкод - часть инструкции (байтики), кодирующая непосредственно саму операцию (остальные части могут кодировать непосредственные значения, регистры, условие и т. д.). Микрооперации выполняют процессоры с микрокодом при обработке всех или только некоторых сложных инструкций (т.е., инструкция машинного кода может выполняться в виде нескольких микроопераций).
У микропроцессора есть система (набор) команд, которые он может выполнить, и все эти команды кодируются в памяти с помощью чисел. Ну условно говоря, число 1 может обозначать "сложить регистры A и B и поместить результат в C", а например 2 - "поместить ноль в регистр X". Соответственно, программа для процессора записана в памяти как последовательность таких чисел. Он читает их и выполняет по очереди.
Опкод - это просто сокращение для "код операции". В машинном коде у каждой команды свой код, это и есть опкод. В примере выше 1 это опкод для операции сложения.
Машинный код (копипащу) или машинный язык — система команд (набор кодов операций) конкретной вычислительной машины.
Человеку неудобно читать числа, потому придуман ассемблер - язык, который представляет машинные коды в виде текстовых команд вроде ld r12, 0x0
Байткод - это что-то вроде машинного кода, но не для процессора, а для виртуальной машины (например, байткод Java или .NET). То есть последовательность примитивных команд, записанная в виде чисел, которую выполняет не процессор, а программа (виртуальная машина). Команды в нем не обязаны занимать один байт.
Микрооперации - это примитивные внутренние для процессора команды, на которые он разбивает большую сложную команду. Ну то есть если допустим у какого-то процессора есть команда "поместить в регистр X значение из ячейки памяти по адресу равному Y + Z" то он может разбить ее на такие микрооперации:
- сложить регистры Y и Z, поместив результат во временный регистр T
- направить запрос на чтение памяти по адресу из T
- поместить пришедший из памяти результат в регистр X
Микрооперации никак не видны снаружи, они есть только внутри процессора и про них знают только его разработчики (информация о внутреннем устройстве процессора обычно не публикуется). Когда-то в микропроцессорах все команды (и микрооперации, на которые они разбиваются) были жестко заложены в схеме, но в последние лет 20 вместо этого используют микрокод, который можно перезаписать. Это сделано для того, чтобы можно было исправить ошибку после выпуска процессора.
> Вот то, что можно посмотреть в hiew - это что?
На этом скриншоте http://www.hiew.ru/pic/hiew851.gif я вижу такие колонки:
- смещение в байтах относительно начала файла
- машинные коды, записанные в 16-чной системе счисление, представляющие одну команду процессора (те самые опкоды)
- та же команда на ассемблере
У микропроцессора есть система (набор) команд, которые он может выполнить, и все эти команды кодируются в памяти с помощью чисел. Ну условно говоря, число 1 может обозначать "сложить регистры A и B и поместить результат в C", а например 2 - "поместить ноль в регистр X". Соответственно, программа для процессора записана в памяти как последовательность таких чисел. Он читает их и выполняет по очереди.
Опкод - это просто сокращение для "код операции". В машинном коде у каждой команды свой код, это и есть опкод. В примере выше 1 это опкод для операции сложения.
Машинный код (копипащу) или машинный язык — система команд (набор кодов операций) конкретной вычислительной машины.
Человеку неудобно читать числа, потому придуман ассемблер - язык, который представляет машинные коды в виде текстовых команд вроде ld r12, 0x0
Байткод - это что-то вроде машинного кода, но не для процессора, а для виртуальной машины (например, байткод Java или .NET). То есть последовательность примитивных команд, записанная в виде чисел, которую выполняет не процессор, а программа (виртуальная машина). Команды в нем не обязаны занимать один байт.
Микрооперации - это примитивные внутренние для процессора команды, на которые он разбивает большую сложную команду. Ну то есть если допустим у какого-то процессора есть команда "поместить в регистр X значение из ячейки памяти по адресу равному Y + Z" то он может разбить ее на такие микрооперации:
- сложить регистры Y и Z, поместив результат во временный регистр T
- направить запрос на чтение памяти по адресу из T
- поместить пришедший из памяти результат в регистр X
Микрооперации никак не видны снаружи, они есть только внутри процессора и про них знают только его разработчики (информация о внутреннем устройстве процессора обычно не публикуется). Когда-то в микропроцессорах все команды (и микрооперации, на которые они разбиваются) были жестко заложены в схеме, но в последние лет 20 вместо этого используют микрокод, который можно перезаписать. Это сделано для того, чтобы можно было исправить ошибку после выпуска процессора.
> Вот то, что можно посмотреть в hiew - это что?
На этом скриншоте http://www.hiew.ru/pic/hiew851.gif я вижу такие колонки:
- смещение в байтах относительно начала файла
- машинные коды, записанные в 16-чной системе счисление, представляющие одну команду процессора (те самые опкоды)
- та же команда на ассемблере
Ты бы попробовал сделать или хотя бы спроектировать простейший микропроцессор из логических элементов, сразу лучше все это понимать начнешь.
Спасибо, теперь понятно. А вот на пике одним и тем же ассемблерным коммандам соответствуют разные коды, это почему? Или там не только комманды, но и операнды?
>>057189
>Ты бы попробовал сделать или хотя бы спроектировать простейший микропроцессор из логических элементов, сразу лучше все это понимать начнешь.
Да ну, я в такое не смогу.
> одним и тем же ассемблерным коммандам соответствуют разные коды
Тут от разработчика набора инструкций зависит. Обычно разные опкоды делают для разных наборов операндов. Например, может быть опкод для mov reg, imm32, и другой для mov reg, reg.
Просто берёшь и перебираешь все варианты.
> одним и тем же ассемблерным коммандам соответствуют разные коды
Значит они не совсем одинаковые. Если ты про таблицу отсюда >>056137 - то там именно что разные команды. Ну например, если взять первые 3 строчки:
MOV r/m8, r8 | 88
MOV r/m16/32/64, r16/32/64 | 89
MOV r8, r/m8 | 8A
Видно, что здесь одна команда, но разный порядок и типы операндов. В зависимости от них и выбирается код.
Также, здесь написаны команды в обобщенном виде. Ну например r8 (r = register) - это один из 8-битных регистров (AH, AL, BH, BL, CH, CL, DH, DL). А r/m8 (m = memory) значит "8-битный регистр или указание на ячейку памяти".
То есть реально кодом 88 кодируются команды вроде
MOV AH, BL
MOV [EAX + 4], AH
MOV [адрес ячейки], CL
Тебе стоило бы почитать про режимы адресации, где описано какие именно аргументы могут быть у команд. Я что-то не нашел хорошего описания, потому дам ссылку на ту же страницу: http://www.c-jump.com/CIS77/CPU/x86/lecture.html#X77_0090_addressing_modes
Тут видно, что указать в качестве 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 идут дополнительные байты. Если мы почитаем например статью тут
http://www.c-jump.com/CIS77/CPU/x86/lecture.html#X77_0020_encoding_overview
то мы увидим, что инструкции в машинном коде могут состоять из нескольких байт.
- в начале может идти префикс, меняющий какие-то параметры команды (обычно он используется для выбора размера данных, надо которыми выполняется операция, 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, где используется небольшое число простых команд.
> одним и тем же ассемблерным коммандам соответствуют разные коды
Значит они не совсем одинаковые. Если ты про таблицу отсюда >>056137 - то там именно что разные команды. Ну например, если взять первые 3 строчки:
MOV r/m8, r8 | 88
MOV r/m16/32/64, r16/32/64 | 89
MOV r8, r/m8 | 8A
Видно, что здесь одна команда, но разный порядок и типы операндов. В зависимости от них и выбирается код.
Также, здесь написаны команды в обобщенном виде. Ну например r8 (r = register) - это один из 8-битных регистров (AH, AL, BH, BL, CH, CL, DH, DL). А r/m8 (m = memory) значит "8-битный регистр или указание на ячейку памяти".
То есть реально кодом 88 кодируются команды вроде
MOV AH, BL
MOV [EAX + 4], AH
MOV [адрес ячейки], CL
Тебе стоило бы почитать про режимы адресации, где описано какие именно аргументы могут быть у команд. Я что-то не нашел хорошего описания, потому дам ссылку на ту же страницу: http://www.c-jump.com/CIS77/CPU/x86/lecture.html#X77_0090_addressing_modes
Тут видно, что указать в качестве 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 идут дополнительные байты. Если мы почитаем например статью тут
http://www.c-jump.com/CIS77/CPU/x86/lecture.html#X77_0020_encoding_overview
то мы увидим, что инструкции в машинном коде могут состоять из нескольких байт.
- в начале может идти префикс, меняющий какие-то параметры команды (обычно он используется для выбора размера данных, надо которыми выполняется операция, 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, где используется небольшое число простых команд.
Чтобы спроектировать процессор, надо изучить логические схемы: регистры, триггеры, счетчики, логические элементы. Соответственно, (простейший) процессор состоит из:
- постоянных и временных регистров для хранения данных
- АЛУ, устройство, которое делает арифметические и логические операции надо числами (например, складывает)
- шины или шин для передачи данных между регистрами, АЛУ и памятью
- декодера команд, который "разбирает" код команды и о котором ниже
Вот пример простейшего процессора. Он содержит:
- 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 значение с нее
Чтобы спроектировать процессор, надо изучить логические схемы: регистры, триггеры, счетчики, логические элементы. Соответственно, (простейший) процессор состоит из:
- постоянных и временных регистров для хранения данных
- АЛУ, устройство, которое делает арифметические и логические операции надо числами (например, складывает)
- шины или шин для передачи данных между регистрами, АЛУ и памятью
- декодера команд, который "разбирает" код команды и о котором ниже
Вот пример простейшего процессора. Он содержит:
- 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 значение с нее
>Ты просто наверно пропускаешь основы и берешься сразу за сложное. Сначала тебе надо изучить, какие есть в процессоре регистры, какие есть режимы адресации, а потом уже смотреть, как кодируется та или иная команда, иначе ты не поймешь зачем нужны байты вроде MOD R/M в машинном коде.
Это все где-то изложено в одном месте? Вот это https://www.nostarch.com/assembly2.htm норм книжка?
>>057671
Это все можно же свести к машине Тьюринга?
вот через укртелеком двач у мну не работал, а теперь работает, хотя я в украине живу и прокси не юзаю
>Это все где-то изложено в одном месте?
Палю годноту: Harris & Harris "Digital Design and Computer Architecture".
Thanks, nyasha!
Чтобы даже мне зашло.
Что тебе там раскладывать по полочкам? Самый простой язык в мире. Учи мнемоники @ пиши код.
->
>>015083 (OP)
>Книги по ассемблеру:
>"Архитектура компьютера" Э. Таненбаум
>С.В. Зубков: Assembler. Язык неограниченных возможностей
>Это все можно же свести к машине Тьюринга?
Свести можно, но машина Тьюринга - это математическая модель, которая используется для доказательства различных гипотез. К тому же в ней программа заложена жестко. А я хотел показать примерные идеи, на которых делаются (точнее делались) реальные микропроцессоры.
> Это все где-то изложено в одном месте?
Я помню в универе видел толстую книгу с описанием интеловской архитектуры, но название забыл. Танненбаум наверно.
Для этого придется сначала взять и выкинуть то, что там есть. Почти все.
Define "новичок" тогда уж.
Там архитектура с самых основ объясняется, и довольно подробно. Есть там и хардкор, но его не обязательно разбирать досконально для понимания общих принципов.
Ещё у Таненбаума есть "Structured Computer Organization", но там более сжато.
Раз уж на то пошло, x86 - не самая лучшая архитектура для "новичка". Я бы начал с MIPS.
http://chortle.ccsu.edu/AssemblyTutorial/
Сам-то с мипсов начинал? Чтоб тебе самому вместо изучения асма с нормальными отладчиками, дизассемблерами и кучей документации роутер ебать!
>Сам-то с мипсов начинал?
Именно с них. Потом ARM. х86 сейчас начинают ударными темпами закапывать, так что сейчас не понятно, оправданно ли вообще на ее изучение время тратить.
>Чтоб тебе самому вместо изучения асма
Перед изучением асма неплохо бы знать, что это вообще за штуковина такая - процессор, чем там ALU занимается на самом деле, что за "дополнение до двух", вот это все. По моей ссылке этому как раз треть материала посвящена, самые что ни на есть азы.
>с нормальными отладчиками, дизассемблерами и кучей документации
Под него есть симулятор (как и под любую другую архитектуру), ассемблер/дизассемблер тебе все равно по хорошему свой писать, а с документацией у мипсов как раз все хорошо (весь reference manual занимает от силы страниц 400).
>роутер ебать!
Лично я ебал PSP, но и роутер никто не запрещает.
> х86 сейчас начинают ударными темпами закапывать
Я это в девяностых слышал.
> Перед изучением асма неплохо бы знать
Нахуй не нужно новичку. Ты еще с транзисторов предложи начать. Хотя нет, слишком высокий уровень. С ядерной физики.
> reference manual занимает от силы страниц 400
О да, новичкам только мануалы и читать. Сразу, сходу. Вместе с невозможностью запустить код на реальной машине - охуенный способ не выучить асм, проклясть байтоеблю и пойти писать на джаваскрипте, или что там сейчас модно.
>Я это в девяностых слышал.
Ну так сейчас как раз повторяется та же самая история: 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'ами и решит собственный ассемблер написать. Хороший способ доказать самому себе, что имеешь представление о данной архитектуре.
>Вместе с невозможностью запустить код на реальной машине
А мужики-то и не знали.
>охуенный способ не выучить асм, проклясть байтоеблю и пойти писать на джаваскрипте, или что там сейчас модно
По мне так последовательное разгребание наслоений человеческой жадности и раздолбайства - отличный способ забить посреди процесса.
> Microsoft и Qualcomm вместо Transmeta пилят транслятор машинного кода
Ну и пусть пилят. Microsoft скоро осознает, что их очередное вторжение на планшеты и телефоны в очередной раз закончилось ничем, и все похоронит. Проходили уже. И убийца x86 ака титаниум для серверов был, как раз недавно официально окончательно похоронили. К тому же, даже если какая-нибудь архитектура и станет вдруг более популярной, неебическое количество существующего кода для x86 никуда не денется, его все так же придется писать, реверсить и отлаживать. Все это, разумеется, отнюдь не означает, что современному байтоебу не нужно разбираться хотя бы в ARM.
> Представление целых со знаком не надо знать новичку?
Это надо знать до изучения асма и программирования вообще. Это азы, как и системы счисления, как арифметика младших классов и хотя бы отдаленное представление о логике. А вот что внутри процессора - это лишние, запутывающие новичка знания. Как и существование сегментов или зоопарка режимов процессора. К счастью, 32-битный режим в x86 неебически прост, и если новичок где-нибудь на нем и забьет, то ничего, в общем-то, не потеряет - навык чтения асма у него останется, и он сможет при случае выхлоп компилятора посмотреть или отладить чего-нибудь. Если начнет с MIPS и бросит, то с 99.9% вероятностью полученные знания ему никогда не пригодятся.
> А мужики-то и не знали.
Ну вот смотри: либо у тебя кривой эмуль, кросскомпиляция, непонятные утилиты, написанные чужими для нелюдей и удаленная отладка через gdb, либо у тебя няшный фасм с собственным редактором, компиляция одной кнопкой, отладка в OllyDbg/x64dbg с графикой, отображением всего, что только можно, трейсами-бэктрейсами, встроенным ассемблером, интуитивным интерфейсом и туториалами на ютубе впридачу. Профессионалу похуй, а вот выбор новичка очевиден.
> решит собственный ассемблер написать
Во. То есть нужно начинать с мипсов, чтобы написать еще один ассемблер. Вместо чего-нибудь полезного. Я бы понял, если бы ты рассказал про поиск и патчинг бэкдоров и багов в роутерах, когда производитель на них забил, ну или про моддинг, про портирование старых игр с PS. Я бы понял, если бы ты рекомендовал ARM, чтобы взять стмку за копейки и вкатываться в эмбеддед, чтобы заниматься всякими интересными вещами под андроидом. Но написание ассемблера - это самое бессмысленное занятие, которое можно придумать - пишется за вечер, архитектуру при этом знать необязательно, из всего мануала потребуется прочитать страниц десять, большая часть времени будет потрачена на копипаст и правку табличек опкодов. Да, иногда в этом есть смысл - у меня был случай с экзотической архитектурой, когда модуля для иды не было, какого-либо другого дизасма тоже, ассемблера или компилятора тем более, мануал на китайском, прошивка для железки упакована, нужно было поправить пару килобайт кода и упаковать все обратно. Пришлось писать самому ассемблер, модуль для иды и подобие эмулятора впридачу. Но, сам понимаешь, такие случаи возникают очень нечасто.
> Microsoft и Qualcomm вместо Transmeta пилят транслятор машинного кода
Ну и пусть пилят. Microsoft скоро осознает, что их очередное вторжение на планшеты и телефоны в очередной раз закончилось ничем, и все похоронит. Проходили уже. И убийца x86 ака титаниум для серверов был, как раз недавно официально окончательно похоронили. К тому же, даже если какая-нибудь архитектура и станет вдруг более популярной, неебическое количество существующего кода для x86 никуда не денется, его все так же придется писать, реверсить и отлаживать. Все это, разумеется, отнюдь не означает, что современному байтоебу не нужно разбираться хотя бы в ARM.
> Представление целых со знаком не надо знать новичку?
Это надо знать до изучения асма и программирования вообще. Это азы, как и системы счисления, как арифметика младших классов и хотя бы отдаленное представление о логике. А вот что внутри процессора - это лишние, запутывающие новичка знания. Как и существование сегментов или зоопарка режимов процессора. К счастью, 32-битный режим в x86 неебически прост, и если новичок где-нибудь на нем и забьет, то ничего, в общем-то, не потеряет - навык чтения асма у него останется, и он сможет при случае выхлоп компилятора посмотреть или отладить чего-нибудь. Если начнет с MIPS и бросит, то с 99.9% вероятностью полученные знания ему никогда не пригодятся.
> А мужики-то и не знали.
Ну вот смотри: либо у тебя кривой эмуль, кросскомпиляция, непонятные утилиты, написанные чужими для нелюдей и удаленная отладка через gdb, либо у тебя няшный фасм с собственным редактором, компиляция одной кнопкой, отладка в OllyDbg/x64dbg с графикой, отображением всего, что только можно, трейсами-бэктрейсами, встроенным ассемблером, интуитивным интерфейсом и туториалами на ютубе впридачу. Профессионалу похуй, а вот выбор новичка очевиден.
> решит собственный ассемблер написать
Во. То есть нужно начинать с мипсов, чтобы написать еще один ассемблер. Вместо чего-нибудь полезного. Я бы понял, если бы ты рассказал про поиск и патчинг бэкдоров и багов в роутерах, когда производитель на них забил, ну или про моддинг, про портирование старых игр с PS. Я бы понял, если бы ты рекомендовал ARM, чтобы взять стмку за копейки и вкатываться в эмбеддед, чтобы заниматься всякими интересными вещами под андроидом. Но написание ассемблера - это самое бессмысленное занятие, которое можно придумать - пишется за вечер, архитектуру при этом знать необязательно, из всего мануала потребуется прочитать страниц десять, большая часть времени будет потрачена на копипаст и правку табличек опкодов. Да, иногда в этом есть смысл - у меня был случай с экзотической архитектурой, когда модуля для иды не было, какого-либо другого дизасма тоже, ассемблера или компилятора тем более, мануал на китайском, прошивка для железки упакована, нужно было поправить пару килобайт кода и упаковать все обратно. Пришлось писать самому ассемблер, модуль для иды и подобие эмулятора впридачу. Но, сам понимаешь, такие случаи возникают очень нечасто.
>Microsoft скоро осознает, что их очередное вторжение на планшеты и телефоны в очередной раз закончилось ничем, и все похоронит.
В прошлый раз оно окончилось ничем именно из-за отсутствия возможности запускать с х86-бинарники. На этот раз все будет зависеть от того, у кого лоеры зубастее.
>И убийца x86 ака титаниум для серверов был
Итаник утонул частично по той же самой причине: отсутствие обратной совместимости + сложная задроченная архитектура -> отсутствие нормальных компиляторов -> хреновое быстродействие за астрономическую цену привет Эльбрус. У arm64 с этим особых проблем нет, да и рынок серверов сейчас большей частью под Open Source. Также у него нет проблем с масштабируемостью, 2^8-ядерные сервера уже давно в свободной продаже.
>даже если какая-нибудь архитектура и станет вдруг более популярной, неебическое количество существующего кода для x86 никуда не денется, его все так же придется писать, реверсить и отлаживать.
Насколько я понимаю, именно на это и делают ставку. Вот вам готовая связка архитектура+ПО, которая может крутить ваш существующий код без существенной потери производительности, но если хотите полной отдачи - новый код старайтесь писать уже под нее. Как какой-нибудь древний сервер, про который уже никто толком не знает, как и почему вообще он работает. Проще засунуть в виртуалку и сделать копию.
>Это надо знать до изучения асма и программирования вообще. Это азы, как и системы счисления, как арифметика младших классов и хотя бы отдаленное представление о логике.
Ну так вместо того, чтобы агриться на слово "MIPS", открой мою ссылку и полистай. Там как раз очень подробно разжевывают самые-самые азы (системы счисления, представления чисел и строк, bitwise-операции и сдвиги, плавающую точку, передачу аргументов через регистры и стек, рекурсию, массивы, etc.). Причем разжевывают весьма грамотно, последовательно, с периодическими блиц-повторениями усвоенного. Просто делают это на примере MIPS-архитектуры, потому что (вот так сюрприз!) вся эта теория ложится на нее почти идеально, практически без архитектуро-специфичного оверхеда - кристально чистое байтоебство. Не самый худший вариант потратить 2 недели своего драгоценного времени, если собрался вкатываться в asm и не знаешь вообще ничего. В качестве бонуса сможешь на начальном уровне в MIPS и слегка попрактикуешь разговорный английский (там есть кнопка начитки голосом каждой отдельной темы). В качестве минуса - даже ARM будет в дальнейшем казаться кривой архитектурой.
>А вот что внутри процессора - это лишние, запутывающие новичка знания.
Смотря какие. Я вот видел людей, которые считали, что ALU на самом деле складывает и вычитает какие-то там числа.
>Ну вот смотри: либо у тебя кривой эмуль, кросскомпиляция, непонятные утилиты, написанные чужими для нелюдей и удаленная отладка через gdb, либо у тебя няшный фасм
Пожалуйста, после краткого курса молодого бойца бери свой няшный фасм и пиши сразу под x86_64 там хоть от нехватки регистров не будет так сильно припекать. Ты уже не будешь смотреть на него коровьими глазами и гадать, 0x10000000 - это сколько кило/мега/гигабайт снизу.
>написание ассемблера - это самое бессмысленное занятие, которое можно придумать
Не совсем. Он сильно пригодится, если ты захочешь ассемблировать свое творчество непосредственно на самой железке прямо в память, без перезагрузки/перепрошивки на каждый чих. Да, это я про форт-машину сейчас.
>Microsoft скоро осознает, что их очередное вторжение на планшеты и телефоны в очередной раз закончилось ничем, и все похоронит.
В прошлый раз оно окончилось ничем именно из-за отсутствия возможности запускать с х86-бинарники. На этот раз все будет зависеть от того, у кого лоеры зубастее.
>И убийца x86 ака титаниум для серверов был
Итаник утонул частично по той же самой причине: отсутствие обратной совместимости + сложная задроченная архитектура -> отсутствие нормальных компиляторов -> хреновое быстродействие за астрономическую цену привет Эльбрус. У arm64 с этим особых проблем нет, да и рынок серверов сейчас большей частью под Open Source. Также у него нет проблем с масштабируемостью, 2^8-ядерные сервера уже давно в свободной продаже.
>даже если какая-нибудь архитектура и станет вдруг более популярной, неебическое количество существующего кода для x86 никуда не денется, его все так же придется писать, реверсить и отлаживать.
Насколько я понимаю, именно на это и делают ставку. Вот вам готовая связка архитектура+ПО, которая может крутить ваш существующий код без существенной потери производительности, но если хотите полной отдачи - новый код старайтесь писать уже под нее. Как какой-нибудь древний сервер, про который уже никто толком не знает, как и почему вообще он работает. Проще засунуть в виртуалку и сделать копию.
>Это надо знать до изучения асма и программирования вообще. Это азы, как и системы счисления, как арифметика младших классов и хотя бы отдаленное представление о логике.
Ну так вместо того, чтобы агриться на слово "MIPS", открой мою ссылку и полистай. Там как раз очень подробно разжевывают самые-самые азы (системы счисления, представления чисел и строк, bitwise-операции и сдвиги, плавающую точку, передачу аргументов через регистры и стек, рекурсию, массивы, etc.). Причем разжевывают весьма грамотно, последовательно, с периодическими блиц-повторениями усвоенного. Просто делают это на примере MIPS-архитектуры, потому что (вот так сюрприз!) вся эта теория ложится на нее почти идеально, практически без архитектуро-специфичного оверхеда - кристально чистое байтоебство. Не самый худший вариант потратить 2 недели своего драгоценного времени, если собрался вкатываться в asm и не знаешь вообще ничего. В качестве бонуса сможешь на начальном уровне в MIPS и слегка попрактикуешь разговорный английский (там есть кнопка начитки голосом каждой отдельной темы). В качестве минуса - даже ARM будет в дальнейшем казаться кривой архитектурой.
>А вот что внутри процессора - это лишние, запутывающие новичка знания.
Смотря какие. Я вот видел людей, которые считали, что ALU на самом деле складывает и вычитает какие-то там числа.
>Ну вот смотри: либо у тебя кривой эмуль, кросскомпиляция, непонятные утилиты, написанные чужими для нелюдей и удаленная отладка через gdb, либо у тебя няшный фасм
Пожалуйста, после краткого курса молодого бойца бери свой няшный фасм и пиши сразу под x86_64 там хоть от нехватки регистров не будет так сильно припекать. Ты уже не будешь смотреть на него коровьими глазами и гадать, 0x10000000 - это сколько кило/мега/гигабайт снизу.
>написание ассемблера - это самое бессмысленное занятие, которое можно придумать
Не совсем. Он сильно пригодится, если ты захочешь ассемблировать свое творчество непосредственно на самой железке прямо в память, без перезагрузки/перепрошивки на каждый чих. Да, это я про форт-машину сейчас.
В общем продолжаем.
Есть функция PopDefaultProcessorPolicy. ИДА из кода WRK создаёт следующее
https://pastebin.com/MWxG7w9H
Обратите внимание на оптимизацию компелятора с использованием переменной v3.
Я среверсил это в вот такой код:
https://pastebin.com/giNvha1q
Что выливается после компиляции и реверса ИДЫ в
https://pastebin.com/RyMCNPRD
Оптимизация сработала по другому, хотя код делает ровно тоже самое.
Собственно вопрос- как мне изменить код, чтобы он компилировался в тоже самое, что и оригинальный майкрософтовский?
Плюс в том файле ещё PoInitSystem с кучей неизвестных структур, ну да ладно.
>И за это их засудит Интел просто нахуй.
За что, за то что Майкрософт запилила программный транслятор бинарников? Так интеловские патенты в основном не про это, а про аппаратную реализацию. Иначе всякие Qemu уже давно бы кверху пузом всплыли. И к Квалкому не особо прикопаешься: они к драгоценной x86 вообще пальцем не притронулись, просто немного подкрутили свой процессор, чтобы транслятор от MS на нем быстрее работал. Если тяжба и начнется - длиться она будет доооолго.
>Эмулятор х86 там был, работал так же хуёво, как и в ARM.
На майкрософтовских демках сейчас всякие фотошопы с офисами вполне резво бегают и даже танчики какие-то катаются. Поглядим, короче, что выкатят к концу года. Мне кажется никто не будет возражать, если охреневшую монополию хотя бы на рынке ноутбуков немного расшевелят. Конкуренция - это хорошо.
>За что, за то что Майкрософт запилила программный транслятор бинарников?
А то.
>Иначе всякие Qemu уже давно бы кверху пузом всплыли.
А ты знаешь продаваемые устройства с квеми? Он просто нахуй никому не нужен, вот и не придираются.
>На майкрософтовских демках сейчас всякие фотошопы с офисами вполне резво бегают и даже танчики какие-то катаются.
Просто процы со времён итаника подросли, вот и тянут трансляцию без тормозов.
>Мне кажется никто не будет возражать, если охреневшую монополию хотя бы на рынке ноутбуков немного расшевелят. Конкуренция - это хорошо.
Кроме интела- никто не против. Но интел не хуй с горы, и просто так своё властвующее положение не отдаст.
>Он просто нахуй никому не нужен, вот и не придираются.
Тогда почему тот же Интел не засудил в свое время Трансмету, а наоборот схлопотал иск от нее? Или история с IBM и Apple, там вообще все один в один: ушли на архитектуру конкурента, запилили транслятор.
>Просто процы со времён итаника подросли, вот и тянут трансляцию без тормозов.
Это еще Apple в свое время продемонстроровала, сейчас подросли АРМы и настал черед Microsoft. Статус кво не мог вечно продолжаться.
>Что для этого надо делать?
Шапку прочитать. А так как ты самостоятельно не смог до этого догадаться, то уровень твоего интеллекта не позволит освоить ассемблер в высокой степени.
В шапке нет гайда для тех, кто желает вкатиться. У меня проблема не в недостатке материала, а в отсутствии человека, который знаком с этим и может поделиться немного опытом.
А какой тебе опыт нужен? Штудируй литературу и дело с концом.
Немного странный вопрос. Учитывая, что ты уже половину лаб сделал. Просто делаешь дальше остальные.
Ещё ты не написал, какой ассемблер. Или нет другой архитектуры, кроме x86 и Intel пророк его? Тогда можешь писать программы на C и смотреть, во что превращается код. Даже Visual Studio (если ты в Windows работаешь) может показать ассемблерный листинг, что наглядно и удобно. Дальше берёшь OllyDbg, гуглишь туториалы и вперёд. Попутно знакомишься с Ida.
Давно уже во многих протекторах так и делают. Это медленно и печально, но все же раскручивается обрано. Гугли SAT solver. А что насчет полиморфа, то ты просто получишь детект от эвристики за ебнутый код.
Мм..,ок. А если запилить (в виде макросов для ассемблера) собственную логическую аксиоматику, сколь угодно ебнутую, но непротиворечивую? Компиляться нормально будет, но без моих макросов никак не раскрутишь до изначального кода.
Машина Тюринга нужна только для научных статей, она не имеет отношения ни к реальному железу, ни к обфускации кода.
>>064573
Антивирусы могут смотреть не только на сигнатуры.
>>064957
А зачем смотреть на твой код? Достаточно посмотреть, какие системные вызовы он делает, какие файлы читает, что по сети шлет.
>Машина Тюринга нужна только для научных статей, она не имеет отношения ни к реальному железу, ни к обфускации кода.
Как жи не имеет. Это одно из уточнений понятия алгоритма.
>Антивирусы могут смотреть не только на сигнатуры.
А что еще они смотрят?
>А зачем смотреть на твой код? Достаточно посмотреть, какие системные вызовы он делает, какие файлы читает, что по сети шлет.
Есть конкретные критерии, что должен делать вирос, чтобы признать файл виросом? Вот если сделать бэкдор из скрипта установки и настройки Active directory в шиндовс, антивирос его спалит?
> Есть конкретные критерии, что должен делать вирос
Нет. Каждому действию присваивается вес, веса суммируются в оценку или оценки, по которым антивирус решает, норм или нет.
> вот если сделать бэкдор из скрипта
Проактивка может спалить. Сканер спалит, только если у него есть модуль для такого скрипта и эвристика для поиска каких-то вредных действий.
> Как жи не имеет
Когда у тебя будет бесконечная память - приходи.
>А что еще они смотрят?
Поведение.
>Есть конкретные критерии, что должен делать вирос, чтобы признать файл виросом?
У каждого антивиря они свои, и раскрывать их они желанием не горят. Реверсь все антивири и узнавай, что они ищут.
>>065130
Вот насчет этих маняэвристик и т.п. мне реально смешно. К сожалению, плавали, знаем. Имею опыт общения с мутной малварью на компе и телефоне. Так вот, установленному антивиросу на тилибоне было строго по хую, что браузер сам переходит по каким-то ссылкам, активируются платные подписки, вылезают рекламные баннеры и т.п. Т.е. обнаружение реально вредоносной хуйни там уровня /б, это я видел своими глазами. На компе какая-то ебала, запущенная как системный процесс svchost.exe, что-то слала по сети, коннектилась к десяткам адресов, делала еще хуй знает что, заметно загружая процессор, к слову. Пока вручную процесс експлорером не выявил, где оно лежит (откуда запускается) и т.д. и не удалил к хуям, касперский на нее вообще внимания не обращал. Если это и есть ваши супернанотехнологии - эвристика проактивка, то я спокоен.
А никто и не писал, что они эффективны на 100%. но сканер уровня /б, как ни странно, неплохо ловит вирусы уровня /б
Не в тот тред пишешь и даже не в тот раздел, это больше для /ra/ подходит.
http://www.bhv.ru/books/full_contents.php?id=182109
http://dmkpress.com/catalog/electronics/circuit_design/978-5-97060-450-2/
Logisim лучше выкини, для этих целей есть verilog и VHDL.
>пока есть только АЛУ примерно такого же уровня.
Дорисуй остальные части - память, шины, регистры всякие. Как дорисуешь, может быть поймешь что устройство управления это совсем несложное устройство.
>За вторую ссылку спасибо.
По первой ссылке:
>Глава 23. Архитектура и структурная VHDL-модель процессора DP32.
Это более простой пример, чем по второй ссылке. А значит в нем проще будет разобраться.
Из того примера явно видно, что устройство управления - это дешифратор с счетчиком.
>VHDL И verilog, боюсь, не осилю.
Verilog совсем простой же. В /ra/ есть ПЛИС-тред в котором подскажут, если что-то будет непонятно.
А для альтернативно одаренных есть http://nand2tetris.org/
Поясните кто-нибудь за знаковое деление (IDIV) в asm.
Архитектуры пк не знаю.(а стоило бы наверное, но времени толком нету) (спасибо блядям впихнувшим матанохуйню)
Потому и не получается понять деление отрицательного числа на положительное.
Единственное что знаю, что отрицательные числа хранятся в дополнительном коде.
Есть, например:
AX = -120
BX = 1
Обнуляю перед делением DX(т.к. деление идет на слово, то остаток помещен будет в DX)
Но на деле оказывается, что нужно заполнить регистр DX знаковым битом числа AX, т.е. в DX будут единицы, если делимое отрицательное.
Вот тут я и не понимаю почему это так.
Поясните как происходит самое деление.
idiv bx делит dx:ax на bx. dx:ax означает, что старшие биты делимого берутся из dx, младшие из ax. Если ты не заполняешь dx знаковым битом (хотя хули там заполнять - cwd), то твоое делимое получается 0000000000000000:ax, старший бит ноль, и это будет вполне себе положительное 32-битное число, меньшее чем 65536, вне зависимости от содержимого ax.
под вызовом имею в виду получение дескриптора через LoadLibrary()
> просто она загрузится в адресное пространство процесса в двух экземплярах
И не надейся. Повторно винда грузить ничего не будет, просто счетчик использования DLL при повторных вызовах LoadLibrary() инкрементируется (т.е., если DLL уже загружена, то по сути делается GetModuleHandleEx(0, "somedll.dll", ...)), и для выгрузки DLL понадобится не один вызов FreeLibrary(), а столько, сколько раз была вызвана LoadLibrary(). Если тебе нужно именно две копии DLL в памяти, лучше всего просто скопировать файл с другим именем. Есть еще вариант с модификацией PEB_LDR_DATA, но без особых причин туда лезть не стоит.
Я в первом посте как раз написал, что имена разные. Про инкрементирование счетчика я знаю, меня интересует именно не будет ли нежданчика, если 2 фактически одинаковых библиотеки будут загружены через LoadLibrary, если они в ФС разные имена имеют.
Зависит от либы. Например, если DLL в процессе работы создает какой-нибудь именованный объект (мьютекс, например, или memory mapping), то очевидно, она слегка охуеет и сломается. И это в лучшем случае.
А что за задача у тебя?
А что ты ожидаешь получить в итоге? Файл, от которого взят хеш? Идеальная функция компрессии будет, любой размер данных в 32 байта можно уместить.
Ну так там же не сам файл хешируется? Допустим, речь только о закодированных сообщениях или блоках биткойнов.
>Ну так там же не сам файл хешируется?
А что, твоя мамка?
>Допустим, речь только о закодированных сообщениях или блоках биткойнов
Пусть. Вот простейшая хеш-функция, сложение. Берём два числа, например 23 и 19. Результатом такого "хеширования" будет 42. Так какие числа у меня там были? Ну, и?
-0.5432 = 0.1000 1011 0010 1001 0101 1110 10
дальше, в нормализованном виде:
-0.5432 = 1.000 1011 0000 1111 0010 0111 * 2 в степени (-1)
Харакетристика: 7F - 1 = 7E = 01111110
получаем:
S + характеристика + мантисса =
1 01111110 000 1011 0000 1111 0010 0111
1011 1111 0000 1011 0000 1111 0010 0111
BF0B0F27
Потом пишу dd -0.5432, компилю, в листинге вижу BF0B0F28, то есть последний разряд какого-то хуя на единичку больше. Поясните, ЧЯДНТ?
Нормализованное значение получается:
1.000 1011 0000 1111 0010 0111 1011 и т. д.
Выделенная единичка уже не влезает в разрядную сетку и округляется (а так как она 1, она не отбрасывается как 0, а прибавляется):
...0111 (7 на конце в твоем хекс-представлении) + 1 = 1000 (8 на конце в правильном представлении).
Оу, понял. Спасибо.
Мне не нужно решение, я спрашиваю, что гуглить. Спасибо. Может есть книги, в которых это описали?
> открыть
Ты имеешь в виду "запустить" или "открыть для чтения/записи"? int 21h/ah=4bh. Любой справочник по прерываниям. Например, этот: http://www.codenet.ru/progr/dos/int_0026.php
https://pastebin.com/2u4g1kHY
Как бы вы переделали? И что я тут наговнокодил? (кроме отсутствия разбиения на процедуры)
Забыл сказать, код для 16-битного окружения, под дос короче, сам запускаю из-под досбокса, обмазываюсь debug'ом и дебажу
> нужно понять что делает программка через ida
Особую уличную магию.
> Нужно ли полагаться на хекс рэйс или он часто наебывает
Иногда без правки дизасма невозможно заставить его выдать корректный код. Без корректных типов переменных могут пропадать целые блоки кода. Иногда циклы превращаются в условия. Куча проблем с floating point, про SIMD вообще молчим.
Ну понятно что это с практикой более менне придет , но вот с 0 что можно сделать?Нет там хоть начальных статей,гуидов
Очевидные "Образ мышления IDA" (Крис Касперски, книга протухла, но в целом ничего с тех пор не поменялось), beginners.re из шапки, "The IDA Pro Book" (Крис Игл).
И тут я понял, что неверно прочитал и мне нужна 01h. Спасибо, иначе так бы и тупил
Мне надо поднять x в степень а x^a.
Надо использовать:
fld x
fscale a
Я всё правильно делаю?
Ассемблер интересный, но инфы пиздец мало, простите, что у вас такое простое спрашиваю.
Черт, насколько я понял - я проебался.
Выходит - мне надо будет писать функцию поднятия до степеня самостоятельно?
Степень должна быть 2*n+1
Стандартный способ возведения в степень на FPU - комбинация fyl2x и f2xm1. Про логарифмы в школе рассказывали?
Дружище, я ничего не помню почти с курса матана и подобного. Уделишь пару минуток и объяснишь? Буду очень благодарен.
Блэт, это же школьная программа.
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.
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]
ты видишь уже
27: call kernel32.dll:0x1048
31: MOV ECX, 0x15
35:JMP 41
Это и есть виртуализация, или это какая то другая контр-реверсинговая мера?
Насчет stack protector`а: как он отключается/включается? При компиляции были флаги m32, ggdb и mpreferred-stack-boundary=2.
Это очень примитивное запутывание control flow. Возьми иду, она на такое не ведется, и зделоет тебе 26: db байтики, 27: call. Виртуализация - это когда полезная нагрузка представлена инструкциями виртуальной машины, а код, который ты видишь в дизасм - мусор, перемешанный с кодом самой виртуальной машины.
>>071765
Внезапно -fno-stack-protector
Большое спасибо.
Что тогда с программной точки зрения представляет собой виртуализация? Я знаю концепцию в теории: есть виртуальная машина, у которой свой набор инструкции, которые неким образом сопоставляются реальным инструкциям. И как это реализуется? Всё, что мне приходит в голову - это типа я беру сырые байты кодовой секции, хуярю их функцией byte Virtualize(byte), которая, например, добавляет 1 к каждому байту исходников, потом логику девиртуализации компилирую в .dll, потом в исходники добавляю вызов byte devirtualize(byte, DWORD EIP) из либы с "виртуальной машиной", но по моему я неправильно себе представляю это, потому что уж слишком это уёбищно, чтобы быть правдой.
Может есть какой нибудь ресурс, где на простом насколько это допустимо в данной тематике было бы проиллюстрировано виртуализирование на примере какого нибудь калькулятора?
> И как это реализуется?
Ты вообще представляешь как виртуальная машина работает? Напиши сначала простую вм в вакууме. Какой-то набор инструкций, какой-то массив с байткодом (вручную напишешь какой-нибудь 99 bottles of beer, например) и бесконечный цикл, который выбирает следующую инструкцию, исполняет ее и переходит к следующей (или к какой-то иной, если это было ветвление или вызов функции).
Собственно, для виртуализованного кода ты так же пишешь примерно такую же вм. Затем берешь функцию в машинном коде, берешь ее байты, дизассемблируешь, разбиваешь на базовые блоки (грубо говоря, последовательности без ветвлений), инструкции в каждом базовом блоке преобразуешь в инструкции вм, в конце втыкаешь вызовы вм для перехода между базовыми блоками (т.к., скорее всего размер байткода вм будет не равен размеру машинного кода, из которого ты его генерировал). Байткодом затираешь функцию или кладешь байткод в отдельную секцию - похуй. Вместо вызова фукнции втыкаешь вызов вм с адресом входного базового блока. Ну это если без обфускации и антиотладки. Для упрощения своей жизни пилишь кастомный линкер, говоришь компилятору separate functions for linker и работаешь с объектными файлами, а не с исполняемым. Далее тебе становится очевидно, что дизассемблирование - неудобный подход, и логическим развитием будет написание бэкенда к llvm, чтобы сразу генерировать виртуализированный код.
> добавляет 1 к каждому байту исходников
Это обфускация, не виртуализация. Виртуализация подразумевает, что твоя вм байтики выполняет (они инструкции, команды, блять). И нет,
> инструкции, которые неким образом сопоставляются реальным инструкциям
Не обязательно. Одна инструкция вм может реализовываться хоть мегабайтами кода вм. Ты можешь без проблем придумать для себя инструкцию http_download_file и написать для нее в вм соответствующий обработчик.
1. Как эта программа получает ввод с клавиатуры, если в дизассемблере ни одного прерывания не видно?
2. Если они все же есть, то как до них добраться? Запустил программу в edebugger, а функция return_input и находящийся в ней gets завершились и все. Даже окно терминала ни разу не вылезло для запроса ввода. А ведь еще при учебе в шараге при отладке с помощью Turbo Debugger какой-нибудь простенькой программы с вводом с клавиатуры появлялось окно терминала, потом происходил ввод одного символа и отладка продолжалось дальше. Поэтому третий вопрос:
3. Какая настройка/опция отвечает за поведение отладчика описанное выше?
> прерывания
Ты в юзермоде. Единственное твое прерывание - это сисколл. Он надежно спрятан внутри функций, вызываемых функцией gets.
> Если они все же есть, то как до них добраться
ЗАЧЕМ?
> edebugger
Наверняка какое-нибудь говно. Наверняка оно отбирает у программы stdin. У тебя на скрине gdb, кто тебе мешает поставить брейкпоинт на return_input?
И еще 1 вопрос отвалился: поясните пожалуйста за "ширину" стека. В интернете пишут что ширина стека составляет то 2 байта, то 4 байта. Просто последовательность команд чисто для примера push1,push2 кладет мне в стек по адресу N цифру 1, а по адресу [N-4] кладет цифру 2, хотя для этих цифр должно хватать 1 байта, следовательно почему не происходит варианта типа цифра 1 по адресу N, а цифра 2 по адресу [N-1] ?
А как мне отлаживать через 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.
>>071887
Ставь брейкпоинты (break) в нужное место перед run, ходи по инструкциям (step, next). И вообще, man gdb.
А разве такой подход к стеку не ведет к тому, что стек может быть равномерно забит значениями, для которых хватило бы и 1 байта, т.е. такой подход ведь никак не экономит оперативную память.
Кстати, понял как работать с gdb и попутно понял что это офигеть какой неудобный отладчик. Ощущение что под линукс удобный отладчик с GUI хрен найдешь.
> т.е. такой подход ведь никак не экономит оперативную память.
Еще раз: невыровненный доступ, возникающий из-за хранения байтов и двордов вплотную - это дорого, причем дорого для всех переменных вызываемой функции и ее потомков. При этом экономия на передаче небольших целочисленных констант (это будет какой-нибудь enum или bool) - копеечная. Даже в программах с глубокой вложенностью вызываемых функций ты наэкономил бы максимум какой-нибудь сраный килобайт. В x86-64 ты вообще ничего не наэкономишь, потому что твой байт с большой вероятностью будет передан в 64-битном регистре. Некоторый смысл мог быть при рекурсии, но глубокая рекурсия на системном стеке - зло.
> сразу в машинном коде
Хекс-редактор?
> макросы
Ассемблер?
На flatassembler.net есть fasmg - это ассемблерный движок, не привязанный к конкретной архитектуре. Хуй знает, что тебе нужно.
>Хуй знает, что тебе нужно.
Возможность манипулировать с опкодами, как с ассемблерными коммандами. Например, представить опкод одной комманды в виде функции от другого опкода. В ассемблере можно заменять исходные комманды их логическими эквивалентами, хочется чего-то похожего, но с 16-ричными опкодами и не только логикой, но и любыми функциями, н-р арифметикой.
Ну посмотри на fasmg все же. Когда видишь его впервые, синтаксис кажется слегка странным, если не писал на фасме до этого, но если привыкнуть - вполне норм. Примеры в комплекте, написано оно на себе самом.
> я не очень умею в линуховые отладчики
Можешь отлаживать идой через gdbserver, хотя отладчик в IDA тоже неудобным кажется после OllyDbg.
> почему для выхода из фрейма стека и перезаписи сохраненного ebp и адреса возврата потребовалось 18 байт
Потому что аргумент gets адресуется относительно ebp, а не esp. Передается ebp-10, плюс 4 байта на сохраненный ebp, плюс 4 байта на адрес возврата.
> в gdb есть разница между выводом десятичной десятки и шестнадцатеричной
Не понял вопроса.
За деньги - только если тебя с этого прет. Если не прет - заебешься, проклянешь айти и уйдешь в дворники. Без денег аналогично. А в целом актуально и нужно.
У него там макака ссылку пошатала. Скобку с точкой убери.
Должно работать в досбоксе. Только а) для активации тебе надо нажать хоткей, который он тебе предлагает, б) блокирует оно клавишу "3", а если нужны другие - гугли таблицы сканкодов и меняй сканкод в начале исходника. Можешь допилить и сделать антиспеллчекер (вставлять опечатки или заменять введенные слова на другие).
В конце файла есть хедер одинаковый для всех прошивок, 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 логотип.
Как вычисляется эта контрольная сумма?
про binwalk напиздел, поставил из репы, получил другой ответ
Что-то совсем тебя не понял. Это точно CRC32? Ты смог получить это значение на не изменённой прошивке? Явно там не весь файл проверяется, а только сами данные без заголовка (хотя это не точно).
>Модификация файла с последующим приведением crc32 к исходному виду не помогает
Вот эта фраза мне не понятна. Ты изменил файл, но оставил неизменным контрольную сумму?
Подключайся по отладочному интерфейсу к устройству (JTAG что-ли называется) и смотри, как проверяется контрольная сумма. Может и в файле ещё где-то есть места, где проверяется целостность файла.
crc32 можно привести к любому значению за счёт 4 dummy байт.
Помимо того crc считается для каждого отдельного раздела кроме ресурсов и для целого бинарнка. Получить записанное в прошивке значение у меня не получается, это вполне может быть экзотический полином для crc32 или результат обычного crc32/16 инвертирован/реверсирован/сдвинут, это я пытаюсь выяснить. Я попробовал трюк с приведением crc32 к исходному просто чтобы исключить последнее предположение.
Я менял значение случайных байт в различных частях прошивки, увеличивал/уменьшал размер в конца с начала чтобы определить границы проверки.
Если снять дамп микросхемы, его можно превратить в файл прошивки для usb обрезав хвост после контрольной суммы и дав ему правильное имя.
На плате есть UART, но полезной информации кроме тех. данных платы он не выплёвывает
В итоге мы имеем
1.Файл проверяется целиком, любое изменение в любом месте/размере ведёт к ошибке.
2. Проверочная сумма считается для целого файла на этапе сборки, затем записывается в хвост в виде 2-4 байт, затем файл подгоняется dummy байтами под исходную сумму. Это привычная практика для файлов с вшитой кс.
3. JTAG не вывден, даже если бы был, делать мне там нечего. Есть теоретический дебаг/прошивка через i2c/uart.
Так то мне ничего не мешает внести изменения в бинарник, зашить его через SPI и забыть, если конечно прошивка не проверяет себя при запуске. Мне просто любопытно как организована проверка целостности и как её обойти.
>Помимо того crc считается для каждого отдельного раздела кроме ресурсов
*зачастую, не обязательно в данном случае
Короч, у кого есть предложения, открываю конкурс по окирпичиванию моего телевизора. сделайте мод отличный от оригинала который зальётся по usb.
Посмотрите на демосцены какой там охуеный графон в 64К.
Для простоты разработки можно использовать высокоуровневые макросы но не везде.
Как по вашему идея?
Какие трудности могут возникнуть?
Сколько времени уйдет чтобы дойти до уровня UE4?
Была ли такая идея на кикстартере?
> Почему никто не вкладывает денег в разработку игрового движка на ассемблер
Потому что писать медленно, модифицировать сложно, а практического смысла нет.
> высокая производительность
В теории. На практике компилятор знает лучше тебя, и у него больше возможностей (например, автоматическая оптимизация по результатам профилирования - на сколько проходов тебя хватит вручную?).
> более качественная графика
Не более качественная, чем на любом другом языке программирования.
> какой там охуеный графон в 64К
Практически все даже не на Си - на крестах! И даже 4К многие на Си.
> Сколько времени уйдет чтобы дойти до уровня UE4?
∞ Обоснование: пока пишешь - поддерживаемое железо уйдет в небытие, и ты будешь начинать с нуля снова и снова.
>>083491
Ты прошивку-то реверсить пробовал? Чего гадать, если можно взять дамп и посмотреть на код USB-бутлоадера? Только лучше именно дамп, чтобы не ебаться с распаковкой.
Дамп=прошивка+настройки в хвосте.
Какой бы фс/сжатием эта прошивка не пользовалась, binwalk определить не может.
>Ты прошивку-то реверсить пробовал?
> IDA особенно не помогает
Читай внимательнее.
Не знаю что я делаю не так, но читаемого кода очень мало. в основном всё текстовые строки без кросс отсылок. Единственное где вообще получилось найти касающийся USB_isp и crc кусок - в прошивке под другой процессор tsumv29. Алгоритм проверки там такой же, ибо файлом от 29 можно окирпичить 59. появилась зацепка, строка "golden crc". Но как я понял это как раз и есть механизм записи контрольной суммы файла в сам файл.
> Дамп=прошивка+настройки в хвосте.
Ну кто-то же ее читает и распаковывает!
> Какой бы фс/сжатием эта прошивка не пользовалась, 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.
> но читаемого кода очень мало. в основном всё текстовые строки без кросс отсылок
Есть даташит хотя бы на семейство чипа? Там точно мипсы? (Хотя вроде как регистры репортит вполне себе мипсовые). Код вообще на исполняемый не похож, куда ни ткнись.
>Datasheet..MIPS
Даташита нет. Даже то что это mstar чип я выяснил по уликам в коде и uart инфе. это вполне может быть не mips. Это скорее догадка. Из инфы существует схема и пинаут.
>Ну кто-то же ее читает и распаковывает!
Я к тому что на флеше лежит точная копия файла прошивки без изменений. если и есть фс/сжатие, то код ответственный за распаковку должен быть виден, а у фс должна быть обнаружимая сигнатура/
Потыкал файл свопом с разными настройками, получил mysql compresed data и криптопарашу. Заодно binwalk после свопа начал определять код как Arm. РАзный своп даёт немного больше читаемого кода.
> это вполне может быть не mips
Я тут погуглил еще, и нашелся мануал по сборке бутлоадера под это дело (по крайней мере одно имя файла со скриншота в бинарнике есть):
https://wenku.baidu.com/view/7faa4869a6c30c2258019e25.html
Если поискать по csdn, то найдутся и другие мануалы по сборке, все они настолько же ебнутые (colinux и т. д.) и все предлагают поставить mipsisa32-elf, что как бы намекает.
На pudn лежат исходники бутлоадера от более старой прошивки (по слову mstar ищутся), они в принципе помогли бы составить общее впечатление о прошивке в целом. Есть аккаунт? Мой стух. Если знаешь живой поисковик по облаку baidu вроде умершего wangpanhezi, можешь там поискать. Очень часто всплывают даташиты и инструменты для прошивки.
Адекватные люди не пользуются говномессенджерами, которые привязаны к телефону. Вот если ты жаббер-конфу создашь, можно и набежать.
Можно сразу IRC-канал захуярить, лол.
Алсо, нужно хотя бы 5-15 желающих людей поднять такую конференцию. Если такое число наберется, то можно будет создавать. Желающие решившие поддержать идею — напишите свои юзернеймы в ответ.
>15 желающих людей поднять такую конференцию
хз, зачем это. сидеть там и ололокать? задрачивать самообразование можно и в оффлайне, а для пары вопросов в сутки и тредика хватит
Двачую.
> Программируете микроконтролёры, пишете драйвера для ОС, а то и саму ОС? Вам сюда.
Ну ок, сюда так сюда.
Что такого ОС делает с дисками, что с ними потом нельзя работать через int 13h?
INT 13h AH=00h: Reset Disk Drive не помогает.
Переход из защищенного в реальный режим делаю корректно.
>Создание конфы по этому треду в Telegram Messanger.
Нахуй не нужно, инфа там тонет, общаться там всё равно что пердеть в вечность. А эти треды заархивируем и приложим к первому, так что даже через века ньюфани будут читать наш FAQ и восхищаться нашими знаниями.
>>084109
>Что такого ОС делает с дисками
Какая ОС, мы должны угадать?
Нихрена в этом не понимаю, считаю, что ОС тебя озалупила в режим виртуального V86 и подкладывает тебе эмулированных хуйцов. И весь твой реальный режим эмулирован, и int 13h, даже небо, даже деление на ноль.
>>084271-кун
> Аноним 30/10/17 Пнд 08:46:20 №1084417
>
Читай статьи Нарвахи, он там подробно обьясняет как работать с этим отладчиком.
> это вполне может быть не mips
Вот исходник того, что было пожато дефлейтом:
https://github.com/caxyu/mstar6a918/tree/master/code/MBoot_Napoli_TVOS/sboot/src/macaw12
Судя по синтаксису инструкций, строкам в бинарнике и названиям файлов, это какое-то отродье OpenRISC на асике, но мой дизасм его не жрет, да и статистика показывает что-то больше похожее на 16-битные опкоды. Возможно, опкоды изменены. Кроме того, в дереве исходников овердохуя всяких интересных вещей, вплоть до загрузчика на базе 8051 - ребята там развлекались по-полной.
>>084417
> Стал гуглить, как распаковать
Внезапно upx -d filename (понадобится UPX 2.x, его несложно нагуглить или собрать из исходников). Алсо, там пароль ведь для открытия настроек, а не для файла. Или я что-то делаю неправильно? Алсо, там два exe, чем они отличаются?
Кажется, экзешник HT не нужен, бд открывались с другого. Вот еще одна такая же база расшифрованная:
https://drive.google.com/open?id=0B5YHle7vjDgVU1Z1bC1yUDZYRUU
Там в password.txt я пароль расшифрованный указал.
>Какая ОС, мы должны угадать?
Ленсук.
> Нихрена в этом не понимаю, считаю, что ОС тебя озалупила в режим виртуального V86 и подкладывает тебе эмулированных хуйцов.
Нет, я с помощью kexec загружаю свой бинарь, ему ленсук передаёт всё управление и сам завершается полностью.
С асма начинать проще, и асм все равно нужен будет рано или поздно, но если у тебя одноразовая учебная задача, можно и на си склепать, не погружаясь.
В инишнике по первой ссылке 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".
В принципе можно написать банальный брут по известному открытому тексту.
Если еще что-то нужно - пиши, базу иды пока не удаляю.
Удваиваю вопрос.
Не очень понятно, через что / какими инструментами прогнать строчку в Password, чтобы получилось это 1202201320072010?
Охуеваю еще больше. Мы тут в треде про реверсинг или где? Может, мы еще и не программисты? Бери любимый язык программирования и пиши код (у меня были Python 3 + родной base64 с предварительной трансляцией в стандартный алфавит + blowfish из pip).
>
Совсем запутался с адресацией в двубайтовом массиве.
В di нужен адрес на элемент в массиве.
Изначально в di - адрес на первый элемент.
lea di, array
затем:
1) cmp word ptr arr[bx], word ptr di //сравниваю два байта из массива по смещению bx со значением по адресу di(но тут я походу проебался где-то)
2) lea di, arr[bx] - вот тут тоже.
>1) cmp word ptr arr[bx], word ptr di //сравниваю два байта из массива по смещению bx со значением по адресу di(но тут я походу проебался где-то)
>
сделал так:
mov ax, word ptr [di]
cmp word ptr arr[bx], ax
И заработало. Есть вариант лучше? Без задействования регистров в одну строку?
> cmp word ptr arr[bx], word ptr di
Так нельзя. В инструкциях x86 только один операнд может обращаться к памяти.
> 2) lea di, arr[bx] - вот тут тоже
Тут все норм (кроме ебучего нелогичного синтаксиса адресации). Если не компилируется, попробуй lea di,[arr+bx]
>кроме ебучего нелогичного синтаксиса
А что конкретно?
Так надо было?
lea di, array
Идейно просто было так:
в di и si получить адреса, и их обменять. но потом я понял что проебался ибо адреса в памяти менять то нельзя.
Все вроде работает. Доделал.
>>089542
>Так нельзя. В инструкциях x86 только один операнд может обращаться к памяти.
>
Понял, спасибо
> А что конкретно?
Вот в фасме логичный синтаксис - есть обращение к памяти (или его имитация в lea) - вся хуйня всегда в квадратных скобках, снаружи только тип. Нет обращения - просто втыкаешь имя переменной. И никаких offset, addr, ptr и прочей хуйни. Просто:
mov ax,[di]
cmp [bx],ax
и
lea di,[arr+bx]
Что делать дальше? Как реверсить систему комманд мотора, хотя, я бы даже сказал, сервопривода, так как эта штука имеет свою собственную печатную плату, и при этом предполагается, что она будет подключаться к материнской плате МФУ. Да и сам внешний вид коннектора намекает на то, что там больше пинов, чем просто плюс и минус, то есть какие-то данные между материнкой и платой мотора передаются.
Собственно, способы подобного реверса имеются? Спецификации мотора, положим, найти я могу, но то не интересно.
>Предположим, что его я уже сделал, ну то есть разобрался, какой пин коннектора за что отвечает.
А больше может ничего и не нужно. Например, простейшие контроллеры двигателей управляются без команд как таковых. Один провод направление, а по фронту сигнала на другом проводе двигатель делает шаг.
В любом случае начинать необходимо с поиска схемы, если схему найти не удается то искать документацию на отдельные микросхемы. Иначе будет неизвестно даже что там за микроконтроллер/процессор. Если устройство в рабочем состоянии, то можно посмотреть осциллографом сигналы на этом разъеме.
Только перед тем как тыкать логический анализатор, стоит узнать хотя бы уровни сигналов.
Необходимо перекрыть прерывание таймера. И сделать установку и удаление обработчика используя аргументы командной строки.
И использовать мультиплексорное прерывание.
Я правильно понимаю, что помимо перекрытого обработчика таймера, мне еще придется перекрывать обработчик мультиплексорного прерывания??
Вот я не могу понять:
mov ah,*
mov al,0 ; функция проверки установлен ли обработчик
int 2FH
Что в регистр ah пихать то.
Вроде разобрался.
Загрузка в регистр адреса, по которому располагается регистр для ногодрыга как забить сюда PERIPH_BASE+GPIOA_BASE+GPIO_ODR в душе не ебу, пришлось клеить так
Загрузка в другие два регистра собственно значений для ногодрыга конкретной ногой
Запись значения из регистра по адресу.
Как это правильно оформить?
Судя по названиям регистров это STM32. С этим тебе скорее в /ra/.
>нужно ловить ногодрыг от ведомого устроства
Так делается только в простейшем случае. Для вариантов чуть посложнее в таймерах есть модуль сравнения/захвата. В совсем сложных случаях - пересылка ПДП из GPIO в память.
>которые компилятор заботливо "оптимизирует"
Это потому что Си не знаешь. Для того чтобы компилятор не "выкидывал" код, нужно использовать volatile.
Простейший пока потому, что лепить сразу в кучу все на прерывания займёт достаточно много времени - хочу для начала получить рабочую модель "на пальцах", а уж потом заняться её перетрушиванием. Инты и пдп довольно простые вещи, но работоспособность вперёд.
>Это потому что Си не знаешь.
Есть такое, да. Я в железо хочу, а не в Си, поэтому в душе не ебу, как делать те или иные вещи, которые опытному сишнику на раз-два.
Честно говоря - в душе ебал этот Си с его кучей несовместимых между собой компиляторов, каждую конкретную хуйню приходится по часу шарить в гугле, нет бы предоставить тот же ассемблер, но с возможностью не грузиться вопросами "R2 и R3 трогать нельзя, R0 щас заюзаем, а что там R3? звуки шуршания листингом в поисках последнего использования регистра, каждый проект приходится править, чтоб он начал собираться gcc, а от эвоного инлайн асма с синтаксисом AT&T но при этом типичным расположением операндов я вообще в осадок выпал - это при том, что собсно AS из гнутого тулчейна жрет вполне себе человеческий код безо всяких процентов и амперсандов с кавычками и двоеточиями.
Из твоих портянок нихера не понятно, что же это у тебя за задача такая нетривиальная, но я если она связана с портами и временем, я бы постарался сделать строго на таймерах, тем более, что в stm они прекрасные. Ещё можно использовать DMA, бывает задорно получается.
Ещё замечу, что за десять лет дрочения контроллеров у меня не было ни одного случая, чтобы задачу io нельзя было нормально решить на С.
В конкретном случае я просто пытался проверить, насколько резво стмка умеет дрыгать ногами. Вменяемого результата добился только когда выкинул к ебеням большую часть писанины, оставив только ногодрыг.
Чуть более глобально - ловить ACK от геймпада с выдержкой задержки перед следующим пакетом, 5й канал. В итоге вкуривал, какие же задержки реально выходят.
А, хер с ним. В итоге проц ещё и дрыгает ногой там, где в коде этого вообще не подразумевается, даже полное стирание пару раз прогнал. Обидно, конечно, что нельзя просто так взять и написать в линеечку код, который просто возьмёт и заработает, придётся въезжать на прерываниях.
ещё я не очень понял такую штуку, чем ассемблеры отличаются? я так понял, спецификация по процессору определяет и его ассемблер, тогда почему получился синтаксис ГАС? причём я так понял, под другие архитектуры там всё как у всех.
>Проигрывать можно бесконечно :^)
Ну, то что такой лузер как ты бесконечно проигрывает - это норма
http://codenet.ru/progr/asm/tasm/ Очень сурово.
Тут же и про директивы есть (кто-то в начале тренда спрашивал).
Какие можно взять компиляторы для ARM и MIPS под винду, чтобы удобненько проходить книгу Юричева?
Виртуалбокс с линуксами возьми. Хотя можно и просто шланг для винды (clang --target=mips -S -с foo.c тебе будет вполне достаточно, либы и хедеры не нужны).
>clang --target=mips -S -с foo.c
Почему после ввода clang main.c --target=armv7 возникает ошибка fatal error 'stdio.h' file not found?
Потому что у тебя нет хедеров для ARM, очевидно же. Я думал, тебе не компилировать, а только дизасм смотреть. В теории, можешь спиздить хедеры из любой линуксовой репы https://releases.linaro.org/components/toolchain/binaries/5.2-2015.11-2/arm-eabi/sysroot-linaro-newlib-gcc5.2-2015.11-2-arm-eabi.tar.xz, положить куда-нибудь и сказать -isysrootдиректория, но оно все равно не слинкуется, нужны остатки тулчейна. Ну можешь тот же линаро скачать так-то.
Я в секции .data объявляю строку, например string db 'string $'.
При компиляции lea dx,string , тасм превращает мое lea в mov dx, offset string (экономит байт). Собстно вопрос: почему в отладчике я получаю mov dx,[0000] ? Тасм не учитывает, что при запуске exe в [0000] будет не string, а PSP? Что исправить? Я не понимаю, что делаю не так
Потому что сегмент загрузи. Я хуй знаю, как в ваших тасмах, достаточно ли там assume или нужно явно сказать mov ds,DATA. А если хочешь, чтобы все в одном сегменте валялось, зделой .com, model tiny, вся хуйня.
Хочу вкатиться, открываю beginners.re из шапки, а там прямо в первой главе, как говорится, с места в карьер, и где-то к 50й странице уже становится тяжко и непонятно. Так и должно быть, или мне лучше почитать дополнительную литературу/статьи?
>beginners.re
Как я понял, beginners.re это сайт описывающий технику обратной разработки, предполагая, что изучающий уже знаком с инструментарием языка ассемблера и его особенностями. Посмотри сайты ниже в ОП-посте. Ну или сам погугли какой-нибудь "ASM для чайников". Поищи на вики статьи про такие понятия, как "сегментная адресация", "регистры процессора" и прочее.
>>015083 (OP)
ОП, ты незаслуженно забываешь в шапку добавлять Нарваху. Как практический курс по дебагеру для новичков оч удобно и наглядно.
https://mega.nz/#!Bc9VVAYC!Vk6CFlW6VIoskLNgDKXbsL6FacDQeOKe6LX92wNicKY
А курс кто-нибудь перепилил на x64dbg и современные ОС, или там по-прежнему XP и первая олька?
дык ольки под 64 и нет. Это перевод в виде Chm внутри и олька и плагины и CrackMe, на ехелабе подобрал когда то.
А так как курс под начинающих - смысл перепиливать - с этим разберется как есть - дальше уже сам материал найдет, если будет интересно.
п.с. вроде когда пробегался - всё под вин 7/8/10 более менее работало без проблем.
>ОП, ты незаслуженно забываешь в шапку добавлять Нарваху
Если бы я знал о его существовании... Как бы намекаю
>>015083 (OP)
>Шапка треда в процессе пополнения, пока так.
В следующий раз добавлю.
Бессменный ОП этого треда
В какой-то старой книге или статье Криса Касперски было упоминание про книгу инженера то ли Интел, то ли другой компании.
Описание книги было примерно такое: "корпорация выдавливает из инженера все соки, а затем выкидывает на помойку".
Еле нагуглил.
Недавно заинтересовался реверс-инжинирингом и в качестве первой жертвы выбрал известного в узких кругах бота для игры.
На первый взгляд все было очень просто, и даже с околонулевыми знаниями я вскоре смог запустить основное окно несмотря на неправильный ключ (который должен сверяться на сервере бота). Однако, к игровым серверам оно по-прежнему отказывалось подключаться.
Оказалось, что сначала проверяется статус нужного сервера (пик1), а в случае его доступности активируется функция проверки некоего ключа авторизации (пик2), которая уже выше моего понимания. Интересно, что если ссылку оттуда вставить в браузер и изменять переменные, то значение ключа будет меняться только при редактировании v1, которая скорее всего является айпишником сервера. Возникает вопрос, зачем тогда вообще нужен правильный ключ.
Еще больше вопросов вызывает переменная "HuyZhaet". Кроме прикрепленных скринов она встречается несколько десятков раз в различных функциях, и всегда окружена подобными конструкциями.
Подскажите хоть примерно что дальше делать, у меня даже предположений нет.
Ссылка на мои изыскания, если кому интересно: http://rgho.st/private/8p5MxgZnR/633d5f0ad2d83d1afa68d7bbdf4c1afe
Ссылка на установщик с оффсайта: http://rakbot.ru/download
>Еще больше вопросов вызывает переменная "HuyZhaet". Кроме прикрепленных скринов она встречается несколько десятков раз в различных функциях, и всегда окружена подобными конструкциями.
Это вызов виртуальной функции в C++. Судя по тому, что этой переменной ничего не присваивается, она глобальная. Смотри, где создаётся (легко найти по конструкции вида mov global_var, eax) и восстанавливай виртуальную таблицу. Там и должна быть интересующая тебя функция проверки ключа.
>если ссылку оттуда вставить в браузер и изменять переменные, то значение ключа будет меняться только при редактировании v1, которая скорее всего является айпишником сервера
Нет. Там ясно видно, что это функция типа sprintf и первым параметром передаётся auth_in в создаваемом url. Подозреваю, что это берётся из первого запроса. Запусти Wireshark и посмотри.
Смотри сюда:
http://octopuslabs.io/legend/blog/sample-page.html
https://tuts4you.com/e107_plugins/download/download.php?action=view&id=2876
Самый простой способ вкатиться. По второй ссылке в первых уроках аффтар учит азам АСМа.
Я в asm вкатывался
Калашников - Ассемблер - это просто (морально устарело, но на XP и в DOSBox всё работает, для наглядного использования годно)
и
http://asmworld.ru/uchebnik/
Нет, не он. Посмотри внимательнее.
Зависит от ассемблера. В целом ассемблер как отдельные команды - простой.
> много ли вы получаете профита от асма, если не используете его в работе. Всмысле стоит ли его изучать как хобби?
Можно например оптимизировать функции на других языках, глядя в ассемблерный выхлоп:
https://godbolt.org/
интересно, и часто такая оптимизация используется?
OP, ЯД с Крисом - твой? если да - предлагаю заменить Образ мышления IDA, тут вот оригинальный исходный DOC для издатесльства лежит, только некоторых иллюстраций не хватает, зато все листинги как надо. _https://rutracker.org/forum/viewtopic.php?t=272818
Увы, не мой, добавлю рядом.
Перспектив никаких, работать негде. Реверсеры требуются разве что в АВ компаниях, всё остальное нелегально.
Выбор чуть больше, но суть та же.
Дел, ты просто не умеешь, вот и всё. Как я, например, не умею в патчи бинарников. Короче, всё от навыков зависит.
Вот опять, хипстарок защищает своё глючное поделие только потому что умеет в него. Нода хороша только для сборки фронтенда -- и то, лишь потому, что можно простить ей все глюки зависимостей сотен пакетов на локальной машине.
Боль тебе будет нести всё, что ты не умеешь, лошара
>каким образом можно перехватить ответ от сервера в браузер
Самый простой способ - прокси-сервер. Скорее всего, именно это и было.
>при том, ssl
>в 2001
Нунизнаю. Но это тоже решается очень просто своим корневым сертификатом в системе и того же прокси-сервера.
То есть это делается просто для того, чтобы существовало различие между архитектурами?
Как и разделители каталогов и символы перевода строки.
Google, фатальный недостаток вот это вот всё.
https://softwareengineering.stackexchange.com/questions/95556/what-is-the-advantage-of-little-endian-format
Тлдр:
На ранних pipelined (хз что это) процессорах little-endian улучшал производительность. Big-endian удобочитаем человеками.
В другом месте пишут что эти форматы ни для чего не нужны. Наверное сейчас это наследие 60х
>pipelined (хз что это)
Вычислительный конвейер. Как пример, пока работает АЛУ, можно параллельно считывать следующую инструкцию из памяти. Я не понимаю как порядок байт может улучшить производительность.
>>113533
Какой-то порядок байт все равно должен быть. Оба варианта практически равноценны, какой выбрать? Это как порядок бит при передаче по последовательному интерфейсу.
Может дело в каких-то инструкциях, которым в little-endian нужно меньше тактов, чтобы что-то проверить. Например четность
Вот оно че, михалыч
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.
Сейчас аргумент про длиную арифметику потерял смысл: длинную арифметику реализуют не массивами байтов, а массивами слов, и порядок байтов в слове никак не влияет на реализацию, лишь бы сами слова располагались в порядке little-endian.
Зато есть другой аргумент: компиляторы достаточно часто при работе с переменными типа char или short int кладут временные результаты в полноразмерное слово (int или long int) - это быстрее, а при необходимости (например, при возврате байта из функции) читают оттуда только первые один-два байта. С big-endian такие финты не пройдут: вместо простого чтения по указателю потребовалось бы прибавление офсета, а заодно и само чтение было бы по невыровненному адресу. Алсо, некоторые любят делать магиюписать говнокод вида uint32_t foo = 0x11223344; ∗(uint16_t ∗) foo = 0xffff, который теряет всякий смысл на big-endian машине.
В любой книге по C, в разделах про типы переменных и про указатели.
>Парни как вы находите время на лоу левел?
Открой для себя RetDec:
http://blog.avast.com/avast-open-sources-its-machine-code-decompiler
http://www.opennet.ru/opennews/art.shtml?num=47741
http://github.com/avast-tl/retdec
RetDec одинаково некачественный и бесполезный. Не стоит потраченного времени и тех десятков гигов оперативки, которая требуется, чтобы прожевать им что-нибудь сложнее хелловорлда.
> Стал гуглить, как распаковать
https://2ch.hk/pr/res/1015083.html (М)
'''
Decompress
All UPX supported file formats can be unpacked using the -d switch, eg. upx -d yourfile.exe will uncompress the file you've just compressed.
'''
Начинающему x64 нахуй не нужен. Лишний раз голову морочить.
Там какие-то дополнительные регистры и прерывания есть. Не забивай голову. Ты что, пишешь операционные системы?..
Ну смотри, ОС переключает задачи по прерыванию (по прерыванию таймера, по исключению и т. д.). При переключении задачи ОС сохраняет/восстанавливает регистры в контекст выполнения (кусок памяти, привязанный к потоку выполнения) банально через push/pusha или mov [dest],reg, ну или там через всякие fxsave для FPU/SSEx.
Когда в отлаживаемом процессе возникает исключение (например, когда выполнение дошло до брейкпоинта - брейкпоинты вызывают исключение), ОС видит, что к процессу подключен отладчик, и вместо того, чтобы прибить процесс, она переключает задачу на какую-нибудь другую (например, на этот самый отладчик) и сигнализирует отладчику об этом событии. При этом на отлаживаемую задачу ОС перестает переключаться (т.е., останавливает ее), пока отладчик явно не скажет, что все ок, и можно продолжать.
А теперь, что касается твоего вопроса: раз отлаживаемый процесс остановлен, значит, его состояние сохранено в контексте выполнения и не меняется. А раз оно там сохранено, то по запросу отладчика ОС может это состояние прочитать или изменить.
О, спасибо огромное!
Теперь картинка сложилась.
А аппаратные точки генерируют прерывание или исключение? Помню я читал у нарвахи про их отличие от виртуальных брейкпоинтов. Если не ошибаюсь, то с их помощью, в частности, обходят обходят программы, проверяющие, отлаживают ли их.
Полный список чего они в этом багфиксе перекомпилировали:
http://download.microsoft.com/download/4/6/E/46EE95B4-7B13-4157-BAD1-854D4FA4855A/4056894.csv
https://www.securitylab.ru/analytics/490642.php
Почитал. И не понимаю, почему всем не похуй. Если эта заплатка КОКОКО СНИЖЕНИЕ ПРОИЗВОДИТЕЛЬНОСТИ ДО 30% ОТ НАЧАЛЬНОГО УРОВНЯ то нахер оно нужно? Вот если бы вскрылась уязвимость в процессорах какого-нибудь сетевого оборудования, типа кисок или хуйвеев, вот это была бы проблема. Впрочем, там инфа соточка бэкдуров дохера. Главное, чтобы они не попали в открытый доступ, в руки васянов.
Про статью вестимо.
>>117445
>СНИЖЕНИЕ ПРОИЗВОДИТЕЛЬНОСТИ ДО 30% ОТ НАЧАЛЬНОГО УРОВНЯ то нахер оно нужно?
Нахер тебе тогда вообще защищённая ОС? Сиди на параше без разделения прав, получишь прибавку в скорости в 100%.
>И не понимаю, почему всем не похуй.
Жабаскрипт в броузере может прочитать все твои пароли от архивов с ЦП, и тебе не похуй?
> Жабаскрипт в броузере может прочитать все твои пароли
Не может. В браузерах уже успели похерить точность performance.now (снова!), так что все измерения скорости доступа превращаются в гадание на кофейной гуще. Тащемта даже не в браузерах на более-менее загруженной системе это тоже гадание на кофейной гуще с охуительной скоростью уровня байт-в-секунду.
Нет.
>>117478
Осталось только обновить мой устаревший браузер, так как ничего нового на XP всё равно не идёт.
>Тащемта даже не в браузерах на более-менее загруженной системе это тоже гадание на кофейной гуще с охуительной скоростью уровня байт-в-секунду.
Вот тут в общем согласен, это надо систему в монопольный доступ захватывать.
Пойду поставлю майнер биткоинов в фоновый режим, пусть хакиры пососут.
Кстати вопрос. Функция CmpGetAcpiBiosInformation возвращает в переданном ей аргументе структуру с трёх элементов:
boot_arch
pm_profile
flags
которые добывает из АCPITable FADT
Ни у кого нет мыслей, что это за структура, или мне придмывать свою?
Ёбаный обу когда будет нормальная капча?
Прорвался через 7 слоёв капчи к вам ИТТ!
Хочу вкатиться в GAS на Линухе.
Что посоветуете? Хоть что-нибудь на русском есть?
Алсо, AT&T синтаксис для пацанов, да?
> Хочу вкатиться в GAS на Линухе.
Странное желание.
> Алсо, AT&T синтаксис для пацанов, да?
Для дебилов, как и сам GAS.
У сажа-куна действительно было трудное детство, и он немного грубоват, но тему знает, и в отношении GAS и AT&T он полностью прав.
Тяжело ли ее потом убрать?
Может, хоть ты пояснишь, что с ними не так, и что лучше использовать?
Вообще, у вас тут только тред реверс-инжиниринга, так?
Вы тут игры взламываете и порнуху рипаете, или тут есть программисты на ASM'е?
Синтаксисы intel и at&t это просто представление мнемониками байтов в памяти. Мне нравится интеловский синтаксис тем, (один из плюсов) что порядок записи аргументов команды одинаков с высокоуровневыми языками. Т.е mov ax, 100
Можно записать как
int ax = 100
В at&t это выглядит как
mov 100, ax
Согласен с этим, в т.ч. и в функциях стандартной либы обычно сначала идёт dest.
А что бы ты мне посоветовал?
Я вот быстро поискал https://stackoverflow.com/questions/9347909/can-i-use-intel-syntax-of-x86-assembly-with-gcc
Похоже с флагом можно компилировать в GAS интеловски синтакс. Но вот как с библиотеками это законтачится - я не знаю. Так как я себе поставил дос с tasm'ом для обучения и никаких либ не использовал.
Нормально всё будет, там всё модульно, GAS всё распарсит.
Короче, ты мне посоветовал другой синтаксис, ок, учту.
да научишься с одним, на другой легко будет перескочить)
> mov ax,[ds+si] ;Загружаем байтик
Ты уже обосрался - загрузил вордик. Дальше даже не смотрел.
mov si, offset S
cld
lodsb ;; load string length from first byte of S into AL
mov di, si
xor cx, cx
mov cl, al ;; CX = S string length
read_char:
lodsb
cmp al, 'A' ;; >= 'A'
jl wrong_char
cmp al, 'Z' ;; <= 'Z'
jg wrong_char
or al, 32 ;; lowercase it
wrong_char:
stosb
loop read_char
Это тонкое место, но тасму, если не ошибаюсь, похуй
Таки ворд, или надо movzx al, byte ptr [hooy]
> cmp ax,'A'
B тут не CMP а SUB если уж потом с 25 сравнивать собрался, но это не разрушит AX
За один бранч сравнение 'A' <= x <= 'Z' делается примерно так:
movzx dx, al
sub dx,'A'
cmp dx,'Z'-'A'
ja wrong_char
Кароче садись, два =)
Поспешишь - сделаешь как я))
Мысли наложились и я забыл шо заменил sub на cmp
Не хотел вычитать, потому что пришлось бы прибавлять 'A'
P.S спасибо за объяснение ошибок
>Ни у кого нет мыслей, что это за структура, или мне придмывать свою?
Нашёл, это _MSAcpiInfo, как ни странно.
Посоветуйте справочник по ассемблеру Интел, чтобы открыть, например, про lodsw, и все про нее прочитать
Intel SDM, том второй. Больше, чем написано там, ты нигде не найдешь. Даже псевдокод есть для каждой инструкции.
Бля, не, я в dx там заношу, а он потом значение меняет. Как занести в переменную?
Чтобы промежуточный результат сохранить? Толкай в стек, например (push регистр). Или загрузи в ненужный регистр (какой-нибудь ES)
Можете пояснить за функцию 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;
}
Не помню точно формулировку ошибки, что-то вроде "Could not read file at sector XXXXXXXX, continue?" (ошибка всё равно не гуглится).
В чём может быть дело?
Возможно, антиотладочные приёмы. Что за либа? Если это защита от кряка крупной игры, или другой дорогой софт, то ничего удивительного.
Как это вообще может работать?
Там же просто код, ида же его не выполняет, чтоб он мог себя защищать. Она просто пытается прочесть байты.
ИДА пытается прочитать эти байты и понять, куда они ведут. При использовании некоторых хаков можно добиться разного поведения кода для процессора и с точки зрения иды, то есть процессор будет исполнять валидную инструкцию, а ида неправильно её дешифрует и попытается заглянуть за границу файла.
Ах да, некоторые либы на самом деле являются указателями на функции в дллке, и не содержат кода. Попробуй посмотреть ей 7зипом, лол.
Когда работал с оверлеями, ида не ругалась, когда, например, вызывала функцию за пределами адресного пространства этого файла, а просто помечала адрес красным. Или ты не об этом?
Либо ты несёшь хуйню, либо я тупой. Эти либы статически линкуются с проектом, в них должен быть код, причем тут динамические либы?
>Эти либы статически линкуются с проектом
Я конечно должен был угадать это по скриншоту. Или ты думаешь, я тут же брошусь качать твой СДК?
Сорри.
Это вообще моя догадка, я и самим сдк так-то пользоваться не намерен, у меня обратный процесс.
Могу скинуть либу.
http://puu.sh/z56hX/566b9fa9ce.LIB
LIBC.LIB
Мануал говорит, что это Standard C Library.
Консольке нужны и дефолтные функции сишки.
Я тебе ильфак чтоли? Откуда мне знать? Никто не репортил? Никому не нужно? Напиши свой лоадер всего семейства (CPE, EXE, OBJ, BIOS и т. д.) или возьми 6.5. Лоадер на питоне пишется за пару часов.
Ну да. Рандомная статья из гугла: https://darklabs.squarespace.com/blog/2016/7/25/simple-ida-loader
Что за игру реверсишь?
IDA 7.0.torrent
@
C:\Program Files\IDA 7.0\ida64.exe Не является приложением Win32
@
Патчишь байтики подсистемы PE заголовка
@
Запускаешь на хрюше
Ильфак- пидарас.
А потом один из плагинов захочет современный API, не сможешь вызвать какой-нибудь fstat64 из новой ucrt и что-нибудь тебе сломает. Ильфак не пидорас, это скорее к Microsoft претензии. Но все равно версии в заголовке не просто так сделали.
*окружающим
Код исключения:0xC0000005
Сведения об исключении:Потоком была предпринята попытка прочитать или записать данные на виртуальный адрес, к которому он не имеет соответствующего доступа.
Сведения о куче:Присутствующие
Сука.
C 6.5 открылось всё. Есть смысл ебаться с загрузчиком, чтоб пользоваться 7.0 или и так сойдёт?
Вообще охуеть конечно, даже есть все названия.
Это ж можно просто сопоставлять названия с доками и реверсить не вслепую! Я кончил.
Просто хочется толкового gui-отладчика, а как только ищу адекватные отладчики под линукс, то напрашивается или какой-нибудь voltron производные от gdb, которые еще напильником надо обрабатывать, да еще не на всех дистрах нормально работают или этот edb.
оо! это прекрасная новость!
NASM генерирует только отладочные символы CodeView8 для Win32. Я не знаю ни одного дебаггера, умеющего их читать (кроме самого CodeView, очевидно).
А конвертер cv2pdb у меня не завёлся с готового бинарника. Компилировать его вручную я не хочу.
А что за байтики? Просто меняешь win64 заголовок на корректный с точки зрения формата pe?
мимоиюнь
Типа того. Правлю версии минимальной ОС и подсистемы.
А что же ещё. Неплохо было бы анализировать частоту использования и складывать в долгий ящик редко используемые регистры, но это больше для динамической рекомпиляции подходит, где можно собрать актуальную статистику.
Как-то неудобно выходит, это ж придется ещё записывать куда-нибудь в кучу, где какие регистры сохранены (а тогда уж проще для таблицы регистров и выделить значение в куче, но это уже совсем какая-то эмуляция получается).
>>125547
> Складывать всё в стэк?
Да.
> это ж придется ещё записывать куда-нибудь в кучу, где какие регистры сохранены (а тогда уж проще для таблицы регистров и выделить значение в куче
Хранить регистры в куче бессмысленно. Тебе их между вызовами функций сохранять, а раз ты их все равно сохраняешь в какой-то стек (эмулированный или родной x86), то зачем куча? К тому же, если одна из целей - это натравливание HexRays на результат, то с глобальными переменными результат получается отвратительным. Лучше забудь, что в x86 вообще есть какие-то там регистры и создавай в каждой функции фрейм стека с 32 (ну или меньше) переменными reg_0...reg31. Все действия будешь делать с ними, а x86-регистры будешь использовать только для хранения операндов инструкций, загружая их непосредственно перед инструкцией. Увидишь последовательно выгрузку-загрузку одной и той же переменной - удаляешь. По скорости все это не так ужасно, как кажется - tinycc тому пример. А уже потом поверх этого будешь писать register allocator, выделяя регистры под "горячие" переменные, если захочешь.
> но это уже совсем какая-то эмуляция получается
Никуда не денешься. Тебе все равно придется носить с программой либо кусок своего транслятора, либо эмулятор. Потому что никакая IDA тебе все цели непрямых переходов не найдет. А значит, некоторые такие переходы будут крашить программу. А чтобы не крашилось, нужно инструментировать непрямые call и jmp, проверяя, попадаешь ли ты в начало базового блока. Если цель перехода попадает не в начало базового блока, либо вообще вне базового блока, тогда такой код придется либо транслировать на лету, либо эмулировать. Да, при следующей итерации трансляции эта конкретная позиция пофиксится, но ты никогда не сможешь быть уверен, что пофиксил всё.
Почему не в ARM?
Ёбли меньше.
Лол, чот я только сейчас понял, что call/jmp могут вести в разные места из одного и того же кода.
Может ты еще и классическую статью не читал? Почитай, это наиболее годное введение. http://www.gtoal.com/sbt/
Спасибо.
Не читал офк.
Вообще на всю эту тему очень мало чего гуглится, либо гуглится плохо.
Или я просто тупой.
Скорее всего.
Дай ещё полезных материалов, времени для чтения у меня очень много.
так кст и есть, пробовали уже))
Это копия, сохраненная 8 марта 2018 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.