Это копия, сохраненная 24 апреля 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Вы пишите на ассемблере или собираетесь начать на нём писать? Программируете микроконтролёры, пишете драйвера для ОС, а то и саму ОС? Вам сюда.
Вы изучаете алгоритмы работы закрытого софта, пишите патчи бинарников? Вам тоже сюда.
Попрошайки с "решите лабу по асме за меня" идут в общий тред, а лучше нахуй.
Книги по RE:
https://beginners.re/ - "Reverse Engineering для начинающих"- бесплатная современная книга на русском языке. К прочтению вкатывающимся и прочим ньюфагам обязательна!
https://mega.nz/#!Bc9VVAYC!Vk6CFlW6VIoskLNgDKXbsL6FacDQeOKe6LX92wNicKY Нарваха практический курс по дебагингу
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
https://exelab.ru/
Инструменты для RE:
Дизассемблеры:
1) IDA Pro 7.0.torrent (x64 only, для XP нужно патчить PE + вылеты)
2) IDA Pro 6.8.torrent
3) IDA Pro 5.0 - бесплатная версия для некоммерческого использования
4) Radare 2 - наконец прикрутили гуй, но по прежнему нужна только клиническим, не умеющим в скачивания торрентов
5) Остальное
Все книги и статьи Криса Касперски (R.I.P.)
https://yadi.sk/d/CxzdM1wyea4WP или https://rutracker.org/forum/viewtopic.php?t=5375505
+ https://rutracker.org/forum/viewtopic.php?t=272818
Книги по ассемблеру:
"Архитектура компьютера" Э. Таненбаум
С.В. Зубков: 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://msdn.mirt.net/
http://terminus.rewolf.pl/terminus/
http://geoffchappell.com/
Предыдущие
№4 https://arhivach.cf/thread/301316/
№5 тонущий https://2ch.hk/pr/res/1216107.html (М) если кому нужен тред, сами архивируйте, я в следующий добавлю.
fld dword[my_float] fstp qword[my_double]. Ну или сразу на стеке. Можно и вручную, но это битоебля на несколько десятков инструкций, плюс обработка всяких денормализованных чисел, бесконечностей и прочих NaN.
В Fasm, как я думал, выражение типа word[metka] возвращает значение размером в 2 байта, содержащееся в памяти по этому адресу; но metka без квадратных скобок вернет pointer. Но тогда почему при работе с FPU, если я хочу записать в память значение из вершины стека, я должен написать fstp word[metka], а не fstp metka? Ведь в первом случае, как мне казалось, я передаю как аргумент ЗНАЧЕНИЕ, содержащееся по адресу metka, и логичнее был бы второй вариант. Разъясните этот момент, плиз.
> я передаю как аргумент ЗНАЧЕНИЕ
> логичнее был бы второй вариант
Твоя проблема в том, что ты мыслишь в терминах Си. Ты ничего никуда не передаешь как аргумент. Инструкция - не программа (нет, ну на самом деле микрокод и все дела, но это другая история). Ты пишешь инструкции (т.е., указания процессору, что делать), у которых могут быть операнды (указания, с чем делать). Ассемблер их кодирует, представляя их в более удобной для выполнения форме.
При этом и ассемблеру в листинге, и процессору в закодированных инструкциях нужно как-то отличать immediate (непосредственные) операнды, которые представляют собой просто число, готовое к употреблению, от memory операндов (т.е., тех, что подразумевают обращение к памяти). Как кодируются инструкции, рассказывать не буду (можешь погуглить ModR/M). А вот чтобы отличить операнды в ассемблерном листинге, в фасме используется очень простая логика: есть обращение к памяти - есть квадратные скобки. Иначе нет скобок.
Если операнд, работающий с памятью, используется как источник - из памяти что-то читается, если как результат - пишется, если одновременно как источник и результат (например inc [var]) - будут два обращения. Единственное исключение - это всякие lea reg,[bx+si+3]. Но весь смысл этой инструкции - заставить процессор вычислить эффективный адрес, как если бы мы использовали второй операнд для обращения к памяти, но на самом деле никаких обращений к памяти не делать. Именно поэтому в lea скобки есть.
mov bx,1 ; Скобок нет, первый операнд регистр, второй - непосредственное значение, просто число.
mov ax,bx ; Скобок нет, mov прочитает значение из регистра и запишет в регистр.
mov bx,[1] ; А вот тут есть скобки, mov сходит в память, прочитает значение и запишет в регистр.
mov ax,[bx] ; Есть скобки, но прежде чем сходить в память, придется посчитать адрес (прочитав bx).
mov [bx+1],ax ; Более сложный адрес в скобках.
push 123 ; Нет скобок, в стек кладется непосредственное значение. Да, push пишет в память по sp, да скобок нет, но это неизменное поведение push, которое, к тому же, никак не касается нашего единственного операнда. Вот если бы Intel решил явно указывать оба операнда, тогда были бы скобки: какой-нибудь storedec [sp], 123.
pop [123] ; Операнд описывает, куда записать значение из стека. Скобки есть - пишем в память по 123.
> metka без квадратных скобок вернет pointer
Поинтеры остались в Си. Значение метки - численное значение адреса. И это лишь твое дело, как ты будешь это использовать. При использовании имени метки в инструкции, это просто число, оно абсолютно ничем не отличается от других immediate значений. Если адрес метки известен и фиксирован, можешь сделать так, и оно даже будет работать:
org 100h ; COM-файл.
start:
mov ax,4b00h ; Какое-то значение. Просто значение 4b00h.
add ax,start ; Прибавляем какое-то другое значение 100h.
int 21h
> написать fstp word[metka], а не fstp metka
fstp metka = fstp число: immediate-значение, но у FPU нет инструкций с immediate, т.е., нельзя fld 2.0 fmul 256, поэтому ошибка синтаксиса.
fstp word[metka]: скобки есть, инструкция что-то сделает со значением в памяти. Например, напишет туда. Но на самом деле FPU в значения половинной точности не умеет, а fasm об этом знает, поэтому тоже будет ошибка синтаксиса. Вот fistp word[metka] сработает.
В очередной раз я зачем-то написал длинную и бессвязную простыню в ответ на простой вопрос.
> я передаю как аргумент ЗНАЧЕНИЕ
> логичнее был бы второй вариант
Твоя проблема в том, что ты мыслишь в терминах Си. Ты ничего никуда не передаешь как аргумент. Инструкция - не программа (нет, ну на самом деле микрокод и все дела, но это другая история). Ты пишешь инструкции (т.е., указания процессору, что делать), у которых могут быть операнды (указания, с чем делать). Ассемблер их кодирует, представляя их в более удобной для выполнения форме.
При этом и ассемблеру в листинге, и процессору в закодированных инструкциях нужно как-то отличать immediate (непосредственные) операнды, которые представляют собой просто число, готовое к употреблению, от memory операндов (т.е., тех, что подразумевают обращение к памяти). Как кодируются инструкции, рассказывать не буду (можешь погуглить ModR/M). А вот чтобы отличить операнды в ассемблерном листинге, в фасме используется очень простая логика: есть обращение к памяти - есть квадратные скобки. Иначе нет скобок.
Если операнд, работающий с памятью, используется как источник - из памяти что-то читается, если как результат - пишется, если одновременно как источник и результат (например inc [var]) - будут два обращения. Единственное исключение - это всякие lea reg,[bx+si+3]. Но весь смысл этой инструкции - заставить процессор вычислить эффективный адрес, как если бы мы использовали второй операнд для обращения к памяти, но на самом деле никаких обращений к памяти не делать. Именно поэтому в lea скобки есть.
mov bx,1 ; Скобок нет, первый операнд регистр, второй - непосредственное значение, просто число.
mov ax,bx ; Скобок нет, mov прочитает значение из регистра и запишет в регистр.
mov bx,[1] ; А вот тут есть скобки, mov сходит в память, прочитает значение и запишет в регистр.
mov ax,[bx] ; Есть скобки, но прежде чем сходить в память, придется посчитать адрес (прочитав bx).
mov [bx+1],ax ; Более сложный адрес в скобках.
push 123 ; Нет скобок, в стек кладется непосредственное значение. Да, push пишет в память по sp, да скобок нет, но это неизменное поведение push, которое, к тому же, никак не касается нашего единственного операнда. Вот если бы Intel решил явно указывать оба операнда, тогда были бы скобки: какой-нибудь storedec [sp], 123.
pop [123] ; Операнд описывает, куда записать значение из стека. Скобки есть - пишем в память по 123.
> metka без квадратных скобок вернет pointer
Поинтеры остались в Си. Значение метки - численное значение адреса. И это лишь твое дело, как ты будешь это использовать. При использовании имени метки в инструкции, это просто число, оно абсолютно ничем не отличается от других immediate значений. Если адрес метки известен и фиксирован, можешь сделать так, и оно даже будет работать:
org 100h ; COM-файл.
start:
mov ax,4b00h ; Какое-то значение. Просто значение 4b00h.
add ax,start ; Прибавляем какое-то другое значение 100h.
int 21h
> написать fstp word[metka], а не fstp metka
fstp metka = fstp число: immediate-значение, но у FPU нет инструкций с immediate, т.е., нельзя fld 2.0 fmul 256, поэтому ошибка синтаксиса.
fstp word[metka]: скобки есть, инструкция что-то сделает со значением в памяти. Например, напишет туда. Но на самом деле FPU в значения половинной точности не умеет, а fasm об этом знает, поэтому тоже будет ошибка синтаксиса. Вот fistp word[metka] сработает.
В очередной раз я зачем-то написал длинную и бессвязную простыню в ответ на простой вопрос.
> fstp word[metka]: скобки есть, инструкция что-то сделает со значением в памяти.
Но в том-то и дело: эта команда записывает в память значение из вершины стека fpu. То есть, эта команда использует адрес, но квадратные скобки говорят о том, что, как ты сам сказал, инструкция что-то сделает со значением в памяти.
Вообще, я понял это так: конкретно в случае с этой командой, fasm интерпретирует подобную запись с квадратными скобками и dword/qword не как отсылку к значению, записанному в памяти по адресу metka, а как информацию о том, что записать в память — float (dword) или double (qword).
> Например, напишет туда. Но на самом деле FPU в значения половинной точности не умеет, а fasm об этом знает, поэтому тоже будет ошибка синтаксиса. Вот fistp word[metka] сработает.
Word я написал чисто условно, пусть это будет qword или dword, не важно.
> Поинтеры остались в Си. Значение метки - численное значение адреса.
Виноват, зря использовал слово, значение которого не знаю. Под поинтером я подразумевал как раз то самое численное значение адреса. Думал, это одно и то же.
> То есть, эта команда использует адрес, но квадратные скобки говорят о том, что, как ты сам сказал, инструкция что-то сделает со значением в памяти.
У тебя в скобках просто число. Считай, что там fstp [1234h], и именно скобки говорят, что это число - адрес, а не immediate. Я же тебе показал примеры на обычных инструкциях, там очевиднее: mov eax,1 - значение, mov eax,[1] - чтение значения по адресу, mov [1],eax - запись значения по адресу, mov 1,eax - ошибка синтаксиса.
> dword/qword
Это просто указание размера, оно, в зависимости от того, в каком месте операнда ты его напишешь, изменяет либо размер операнда (mov eax,word[1]), либо размер адреса (mov eax,[word 1]). Оно не только с memory операндами работает, но и с immediate: push dword 1 например - сгенерировать не короткую форму инструкции 6a 01, а длинную 68 01 00 00 00. Или можно даже push dword[word 2000h]: используя 16-битный адрес 2000h прочитать по нему 32-битное значение и засунуть его в стек. Но ты пока с address size не заморачивайся, это крайне редко имеет смысл.
> а как информацию о том, что записать в память — float (dword) или double (qword).
Ну да. Но вообще, fasm может хранить вместе с меткой информацию о размере (а может и не хранить). Если не хранит, и он не может никак логически его вычислить, надо указывать размер явно:
var dq ? ; К метке автоматически привязался размер.
fstp [var] ; Фасм сам "в уме" добавит qword к адресу.
var2: dd ? ; Двоеточие не дает привязать размер.
fstp [var2] ; Ошибка синтаксиса: непонятно, сколько писать, и надо указать размер явно.
mov [var2],eax ; Размер не нужен, пишем 32 бита, потому что источник 32-битный.
Стек 80-битный, но var dq ?, поэтому он помнит, что где var, там qword.
Рано радуешься, там вышел только первый том, второй ещё или не вышел, или не переведён. Впрочем можешь смело читать 6 издание, там много чего подходит, я как читавший всё со времён третьего говорю.
Спасибо за длиннопосты, анончик
Да. Буковки в именах регистров, пришедших из 32- 16-битного кода, означают accumulator, base, counter, data, source index, destination index, base pointer и stack pointer соответственно. Некоторые инструкции и режимы адресации требовали строго конкретных регистров, потом ограничения ослабили, а у 8 новых регистров, добавленных в x86-64, нет никаких исторических употреблений, нет имен, поэтому и буковки им не нужны. В других архитектурах, где регистры более-менее равноправны с рождения, циферки использовались для большинства регистров изначально.
Спасибо, я в курсе про accumulator и так далее, все-таки несколько лет занимался этим, но все равно спасибо. Но как же stosd и т.п. команды, им же esi,edi нужны по идее, равно как и циклы ecx.
В таблицу не влезли.
> Но как же stosd и т.п. команды, им же esi,edi нужны по идее
Ну так я сказал, что не отменили, а ослабили ограничения, т.е., значительно расширили эффективную адресацию, например.
Ну и то, что какие-то регистры могут быть базой/оффсетами при чтении из памяти, а какие-то нет — тоже полный пиздец.
То есть для многих задач эффективное количество регистров оказывается намного меньше, чем 16.
Стек не для этого, да. Нахера тебе в rsp класть? Клади в стек - это быстрее и короче.
>Клади в стек - это быстрее и короче.
Стек - это значит в лучшем случае L1 кеш (в два раза медленнее регистров).
>Но как же stosd и т.п. команды, им же esi,edi нужны по идее, равно как и циклы ecx.
Микроархитектурка порешает, так что в 2к18 этим наследием дремучих cisc-времен заморачиваться не стоит.
Да и в давние времена зилога тру-хацкеры этих еба-инструкций делающих что то сложное чурались и во всей демосцене на спектурме ты ничего кроме простых 8080 опкодов без всей этой зилоговской поеботы не найдешь.
Эти боги уже либо работают во всяких майкрософтах или владеют ими, что более вероятно, либо имеют многомиллионные ботнеты.
Не хочу тебя огорчать, анончик, но выбор всегда только за тобой...
> так что в 2к18 этим наследием дремучих cisc-времен заморачиваться не стоит
Да что ты говоришь? А между тем, начиная вроде бы с Ivy Bridge, явный цикл снова сосет у rep stos/movs.
Но т.к. профессору похуй, что ты там нахуевертил, каким образом пояснить ему, что это отрицательное число (например, это -5, а не 251). Возможно, это где-то дальше в книге есть, но пока что даже ремарки, что это обрабатывается программно, самим погроммистом, читайте дальше, в книге есть нет. От этого нет полноты картины.
А в сопроцессоре существуют.
Вообще чисел не существует. Есть только биты.
Числа не числа, знаки не знаки
Так как это работает? Как мне правильно записать, сохранить и считать отрицательное число? Шо для этого сделать надо? Куда гуглить? Какая схема работы?
Как в сраной сишке же.
Написал uint - получил беззнаковое целое, написал int - получил знаковое.
А в памяти один и тот же байт.
Специально ничего не надо сделать. Отрицательные числа придуманы такими, чтобы с ними работало то же АЛУ, что и с беззнаковыми.
Не используй спойлеры в тексте, если уважаешь читающего.
У тебя арифметика по модулю 2^8. Для арифметики по модулю целый раздел математики есть, но ты можешь считать, что у тебя при прибавлении все закольцовано: 0+1=1, 1+1=2, 3+1=3, ..., 254+1=255, 255+1 = 0. Почему так получается понятно - при переполнении у тебя самый старший разряд выкидывается и остается как будто мы сделали не x+1, а (x+1) mod 256. Аналогично будет и для произвольных чисел, x+y на самом деле равно (x+y) mod 256.
В этой арифметике
-x = (256-x). Не веришь, проверь на калькуляторе https://www.miniwebtool.com/modulo-calculator/?number1=-5&number2=256
Отсюда следует, что когда тебе нужно для данного x вычислить -x, тебе нужно вычесть 256-х. В двоичном коде это делается инвертированием всех битов. Называется это дополнительный код, так как x + (-x) = 256 = 10000000b
Дальше у нас стоит задача избавиться от неоднозначности - ведь на самом деле мы не можем отличить -x и 256-x. На уровне процессора ты ничего не сделаешь. Но тут приходят на помощь типы данных.
И тогда мы говорим "а старший бит у нас это на самом деле знак". И мы получаем уже знаковую переменную. Или не говорим - тогда получаем не знаковую.
Врут конечно. Они по принципу loop реализованы.
> Так как это работает?
>>04824
> -x = (256-x). Не веришь, проверь на калькуляторе
Ты забыл упомнять, что это выражение не дано нам свыше, и проверять на калькуляторе его незачем. Оно появилось из того простого факта, что, как ты упомянул, в арифметике по модулю 2m (m - размер регистра в битах), (255 + 1) % 28 = 0. Но если мы прибавили к чему-то 1 и получили 0, то это же была -1! Т.е., при желании, мы можем интерпретировать 255 как -1. Это работает и дальше: 254 + 1 = 255, значит мы можем интерпретировать 254 как -2 (-2 + 1 = -1). Так и получается формула 2m - x. Но "создавая" таким образом отрицательные числа, нам придется где-то остановиться, ограничить максимальный x, т.е., разбить диапазон беззнаковых 0..255 на положительные и отрицательные. Принято разделять его так (для восьмибитных регистров, m = 8): -128..127, т.е., 0..127 для положительных и 128..255 для отрицательных учитывая ноль, 255 значений никак не получится разбить поровну, и из двух вариантов -128..127 выбран потому, что во всех отрицательных числах -128..-1 -> 128..255 установлен старший бит, что позволяет быстро узнать знак числа. Изредка в софте используются и другие варианты, например, я видел в прошивке DSP -1..254 -> 0..254 для положительных и 255 для -1.
> Куда гуглить?
https://en.wikipedia.org/wiki/Two's_complement
Это самый распространенный, но не единственный способ. Например, во флоатах просто отдельный бит под знак.
Есть.
Вопрос не понял, берется да пишется. Любую работу тебе проще начать с модификации готовых сорцов под свой код, даже декомпилировать ничего не требуется.
Вот пример http://www.pouet.net/prod.php?which=49796
Майкрософтами "владеют" через акции, это в основном менеджеры (поскольку старые девелоперы там двигают в менедмент).
Демомейкеры (втч старые) не "боги". Большинство работает программистами или игровых движков или графики или просто тупо в геймдеве.
Но некоторые сумели да. Например Fredrik "Mr. H" Huss и Magnus "Vogue" Högdahl, составлявшие демогруппу Triton,
авторы FastTracker позже образовали Starbreeze Studios https://en.wikipedia.org/wiki/Starbreeze_Studios
Но при этом твои простыни ахуенны и весьма полезны, добра тебе
а еще ты заебывлася с пунктуацией в километровых простынях, это еще круче
По сути да. Либо пока ECX не обнулится, либо по условному переходу.
Так тебе в этом ничто не мешает убедиться.
https://godbolt.org/z/NBySic
jg .L2
это "jump greater" на метку .L2
это происходит после того как eax проверяется на 0.
Поводи мышкой над командами ассемблера. Выбери другие микропроцессоры или компиляторы и посмотри какие у них команды (опцию компилятора -m32 может понадобиться убрать)
Мне это не подходит, у меня каждый цикл на счету, а ты предлагаешь ждать полчаса.
https://c9x.me/x86/html/file_module_x86_id_100.html
Ладно, не только, но точно не immediate value
Ну вот хочу я умножить число на два. Мне ради этого забить в data section dva_const dq 2.0? Так себе.
Ну ты можешь сканпелировать с dva_const dq 2.0, посмотреть что там получилось, переписать на мокток, а потом
push
push
ololo
> Нужно ли каждый раз прописывать в программе инициализацию сопроцессора?
Если у тебя контролируемая среда: твоя собственная программа, нормальная ОС, все соблюдают конвенции вызова (в том числе и чистят стек), исключения замаскированы и т. д., то не нужно.
> FINIT или FNINIT?
fninit, чтобы не свалиться на чужом исключении.
> почему нельзя загрузить число в стек FPU
Потому что когда дизайнили FPU, он был отдельным устройством, и immediate-операнды там впихнуть было некуда физически: либо опкод ему говорил, что операнд - стек FPU, либо FPU должен был продолжить операцию с памятью, которую начал центральный процессор (т.е., процессор выставлял адрес на адресную шину). Чтобы поддержать immediate-операнды, потребовался бы более сложный дизайн. Потом FPU запихали в проц, но дизайн опкодов остался.
> можно написать push 132
Центральному проецссору (было) проще, у него декодер вычитывал всю инструкцию, вплоть до 15 байт, а не ебался через ESC-опкоды.
>>05324
> Ну вот хочу я умножить число на два.
Сложи его с самим собой.
> Мне ради этого забить в data section
Подразумевается, что код генерит оптимизирующий компилятор, а не макака.
>> Ну вот хочу я умножить число на два.
>Сложи его с самим собой.
>> Мне ради этого забить в data section
>Подразумевается, что код генерит оптимизирующий компилятор, а не макака.
Двачую этого.
Чтобы не ебать мозги, напиши код на Си, откомпилируй годным компилятором и посмотри в IDA или HIEW как там делаются операции.
Нормальный компитятор таки суммирует число с самим собой вместо умножения на 2 и еще много чего такого хитровыебанного, до чего ты не дойдешь сам без охуительного опыта. Ну или велосипеды будешь изобретать постоянно.
Я не имел в виду, что анон макака, потому что кладет константы в .data. Компилятор их тоже туда кладет, но самостоятельно, без необходимости бесполезной ручной работы.
Он с умножением на два просто пример привёл, там вполне могло быть и не два, а что-то с очень далеко плавающей точкой.
>Чтобы не ебать мозги, напиши код на Си, откомпилируй годным компилятором и посмотри в IDA или HIEW как там делаются операции.
Вся суть асма в 2018
Неправда.
Много умножений-делений сишные компиляторы делают изумительно. Я охуел, когда умножение на 5 через команду LEA много лет назад начал делать интеловский компилятор, равно как и деления сдвигами-вычитаниями.
Всё это охуительное дрочево со сдвигами и магическими константанми это конечно круто, но бывает, что нужно делить, например, на 5.3841, и это придётся хранить в константе.
Блядь, да что там говорить, я тыкаю экзешник игры от EA в последнюю неделю, так они там и ны 1000 делят флоатами целые числа.
Да дели, никто не против. Я просто еще раз говорю, что лучше всего алгоритм реализовать на Си, откомпилять, а потом перенести в ассемблер, отшлифовав уже там по вкусу (хуй знает, что тебе надо - размер или скорость).
Нет никакой альтернативы которая скоро спихнет его?
Как вкатиться?
Одно без другого особого смысла не имеет.
Ну, если ты в 1980-м живешь, то вопрос мог бы иметь смысл.
https://stackoverflow.com/questions/2971926/tracing-profiling-instructions
Смотри ответ с галочкой
> существуют ли проекты для графического отображения выполненных инструкций в отладке
Да, это такая штука, которая называется отладчик. Представлены в основном в винде, но практически все поддерживают различные варианты трейса, запускаемые одной кнопкой. В линуксах комфортно отлаживаться не любят, предпочитая пердолиться в gdb.
погромирование на скрутках даст пососать любому fpga
Мне стоило уточнить вопрос: куда помещается значение, которое возвращает функция?
> что-то делать с eax
То есть, это значение будет в eax? Все ли функции, которые возвращают что-то, используют для этого eax? А если нужно 64 бита? edx:eax? Где вообще можно ознакомиться с подробной информацией о конкретной dll-библиотеке, о ее функциях (о входных и выходных данных в том числе)? Справка по функциям C/C++ не ответила на вопросы по выходным данным в функциях в ассемблере.
> Мне стоило уточнить вопрос: куда помещается значение, которое возвращает функция?
В 32-битном коде? 32-битные значения (и меньше) в eax, 64-битные в edx:eax, небольшие структуры тоже в edx:eax, если влезают. Если не влезают, вызывающая функция пихает в стек первым аргументом указатель, по которому нужно структуру записать, а вызываемая этот же указатель возвращает в eax. Значения с плавающей точкой в ST(0) в FPU.
> Справка по функциям C/C++ не ответила на вопросы по выходным данным в функциях в ассемблере.
Соглашения о вызове распространяются на все функции, соглашение указывается в прототипе: __stdcall/__cdecl или всякие дефайны вроде WINAPI, CALLBACK, PASCAL, которые разворачиваются в __stdcall (удостовериться можно, посмотрев в хедерах SDK). Информация о соглашениях публикуется (в том числе и в MSDN есть), есть и в вики: https://en.wikipedia.org/wiki/X86_calling_conventions
> Где вообще можно ознакомиться с подробной информацией о конкретной dll-библиотеке
Гуглишь Dependency Walker, смотришь, какие функции экспортируются, сами функции ищешь в MSDN и в хедерах Windows SDK.
То есть то, куда функция должна возвращать данные, прописано в соглашениях о вызове? И там, как я понял, указано, что 32-битные значения (в pe32) записываются в eax, 64-битные в edx:eax, а вещественные числа - в стек fpu, так?
Гугл, "Крис Касперски путь воина", потом спеку Microsoft, чтобы понять, что у Криса куча ошибок. И не стесняйся брать одновременно хекс-редактор и какой-нибудь высокоуровневый вьювер (например, CFF Explorer, или что там сейчас модно) и смотреть на нескольких примерах.
если найдешь чё нибудь годное про современные винды - скинь сюда пж, тоже интересно. а то такое чувство, что позже 2010 никто не писал про нововведения в PE
Портируй какую-нибудь старую игрушку куда-нибудь. Или сервер для нее сделай. Или редактор карт.
Я не обижаюсь. У меня вопрос:
Будем реверсить серьёзное дерьмо?
> Какой нибудь фоллаут2?
Считай по килобайту в день минус рантайм кажется, что это мало, но ты не будешь заниматься этим каждый день, где-то будешь тупить, к некоторым функциям будешь возвращаться, так что это еще очень оптимистичная оценка, даже с учетом HexRays.. Фоллаут весит метр. Понимаешь, в чем подвох?
Ehh... три года в самом оптимистичном варианте o(〒﹏〒)o
Вытащи алгоритмы фильтра из VST Spire. Я даже заплачу. Но немного, потому что за много я и сам это сделаю
>Что?
Давно пытаюсь перевести valkyria profile на ps1 чё говорить.. игра пиздатая, если получиться понять алгоритм то можно и остальные игры от tri-ace перевести. Ща поверхностно расскажу что сделал(не цепляйтесь за терминологию, уже подзабыл), игра зашифрована slz-алгоритмом, дешифратор в инете есть. Я разбил весь диск на slz-куски(много получилось), перекодировал и соединил, в аськах можно найти некоторые слова, типа Lenneth, Start чёто такое. Я так понимаю, там своя таблица символов, надо разобраться как она работает. Инструментов в сети хватает, там чел перевёл на испанский и лежат исходники на Lua(я не шарю), тексты можно скомуниздить из переведённой манги. Если что вечером приду с работы.
Добавлю. Кто, если не мы?
Уже есть FOnline, там и сырцы недавно открыли.
Всё, я понял что нужно делать, не нужно никаких исходников. Если я правильно понимаю, то на ps1 архивируют инфу кусками для экономии места на диске, вроде бы обычная практика. Значит когда будет текст на экране, нужно поставить паузу в отладчике, думаю таблица символов должна находиться в памяти. Теперь надо просто найти какие slz-куски загружены в память(тупо копипастить hex из разархивированного куска в поиск по памяти), наверняка в одном из них и будет таблица. Потом понаставить бряков на обращение к таблице и должно получиться. Скорей бы выходные.
Я лично просто не понял вопроса.
> таблица символов должна находиться в памяти
Какую таблицу ты ищешь? Трансляцию в ASCII? Ее может не быть, потому что она никому нахуй не нужна на консолях. Вот есть у тебя квадратная текстура с глифами (буквами), и когда игра рисует текст, она копирует нужный глиф из текстуры, вычисляя позицию в зависимости от численного значения символа. Соответственно, кодировка текста зависит лишь от позиции соответствующего глифа в текстуре и может быть абсолютно любой (в том числе и отличаться в зависимости от шрифта). Могут быть и многобайтовые символы.
Ну ты сказал что я думаю, только сложно.
Просто я раньше не замечал что у букв есть тень, значит это текстура. Ну и нужно просто найти обращение к этим текстурам, они наверняка в одном slz-куске, и у того чувака с исходниками тоже фигурирует перерисовка текстур. Просто раньше не понимал как это делается.
А то что в аськах стал находиться текст, это к тому что двигаюсь в нужном направлении.
>она копирует нужный глиф из текстуры
Там много этих slz-кусков, больше ста точно(и то что это прям куски инфа 100%). Значит игра не подгружает их с диска по отдельности, значит во время прорисовки текста все эти текстуры в памяти - таблица символов (образно говоря), и подгружаются они из одного куска или нескольких(приставке же нужно время чтобы успеть их разархивировать, не будут же они для каждой буквы каждый раз разархивироваться).
А просто взять распаковать первые несколько кусков и поскроллить в какой-нибудь nana нельзя (https://web.archive.org/web/20140320175114/http://www.neillcorlett.com:80/nana/ )? Хотя ты сказал же, что есть исходники на Lua, проще в них разобраться, наверное. Или тебе интересен именно процесс?
> тень
Да там просто сдвиг вправо вниз и отрисовка другим цветом. В текстуре тени скорее всего нет.
>в какой-нибудь nana нельзя
Пробовал, находит слова только в аськах.
Я не представляю как на lua можно реверсить игру, это же оч. высокоуровневый язык.
> Пробовал, находит слова только в аськах.
Это не хекс-редактор, это смотрелка графики (если повезло, и она не пожата ничем).
> это же оч. высокоуровневый язык
Ну хуй знает. По мне - это наоборот плюс. Я форматы файлов питоном разбираю - все структуры данных уже в комплекте, не нужно ничего переизобретать, заебись.
>Это не хекс-редактор, это смотрелка графики (если повезло, и она не пожата ничем).
Вот если сработает, то нихуя себе ты мне помог. Конечно не пожата, я же всё уже разжал. Завтра выходной, сегодня пивко, поэтому завтра займусь.
Моё мнение - напиши подробней что ты делаешь, может тебе вместо дескриптора что-нить подойдёт.
> я же всё уже разжал
Это никак не гарантирует, что там нету какого-нибудь RLE у картинок, или даже чего-то посерьезнее.
Читаю и записываю в память другого процесса. Также интересует, как можно повысить скорость чтение/записи памяти. Я использую NtReadVirtualMemory и NtWriteVirtualMemory для этого.Еще вычитал, что можно зашарить секцию/память/что-то там еще с помощью NtMapViewOfSection, тем самым увеличив скорость чтения/записи и тем самым минуя ситуацию с вечно открытыми хэндлом.
320x240, 0:04
>>10854
Бумп реквесту, анончики! Выкопал инфу из баянистого 2006:
РЕПАМИНГ СТРАНИЦ — ОТОБРАЖАЕМ ФИЗИЧЕСКИЙ АДРЕС СТРАНИЦЫ, КОТОРУЮ МЫ ХОТИМ МОДИФИЦИРОВАТЬ, НА ВИРТУАЛЬНОЕ АДРЕСНОЕ ПРОСТРАНСТВО «СВОЕГО» ПРОЦЕССА ПОСРЕДСТВОМ ВЫЗОВА ФУНКЦИИ NTMAPVIEWOFSECTION. НАЗНАЧАЕМ ВСЕ НЕОБХОДИМЫЕ ПРАВА И АТРИБУТЫ, ПОСЛЕ ЧЕГО ДЕЛАЕМ С НЕЙ ВСЕ, ЧТО ХОТИМ! ТАКИМ ОБРАЗОМ, МОЖНО ОТКРЫТЬ ДОСТУП К ЯДРУ ДАЖЕ С ПРИКЛАДНОГО УРОВНЯ, ПРИЧЕМ БЕЗ ПЕРЕЗАГРУЗКИ!
Кто-нибудь может конкретнее объяснить как это работает? Кроме того, эта информация еще актуальна или нет?
Есть экзешник, в CE, к примеру, функция, которую нужно декомпилировать, она находится по адресу 4D4D80 (или .exe + D4D80), я ее могу там похукать, брейкпоинты, итп, но она достаточно сложная и хотелось бы ее декомипильнуть в хотя бы какой-то сишный код.
Первая проблема, с которой я столкнулся в ИДА - я не могу найти эту функцию, как бы я не пытался, прыгал по адресам, по адресу 4D4D80 находится какая-то ссанина ( возможно это подадреса сегментов ), мне просто хотелось бы, чтобы адреса были такие же, как и в CE, потому адреса в СЕ соответсвуют тому что я читаю/записываю WriteProcessMemory().
Вторая проблема, это перевод в сишный код, я знаю что ИДА это умеет и могёт, на оундкоре считается чем-то вроде классики, если не ошибаюсь, эта фича называется Pseudocode, но я не смог нигде найти упоминаний о существовнии подобного (IDA 7.0.170914)
Благодарки, теперь осталось найти ту функцию. Может там можно как-то выключить адреса по сегментам?
> теперь осталось найти ту функцию
Во-первых, ты можешь приаттачиться отладчиком иды к процессу, тогда адреса (скорее всего) совпадут. Если не совпадут, читай про ASLR, запатчи флаг ASLR-aware в заголовке.
> по адресу 4D4D80 находится какая-то ссанина
Во-вторых, возьми какой-нибудь детектор упаковщиков (peid, protection id, detect it easy или что там сейчас модно) и узнай, не запакован ли файл. Если упакован - распакуй. Если не можешь, см. во-первых.
В-третьих, нахаляву ничего не бывает, читабельный сишный код получается после длительного анализа.
Да нет, тебе IDA (в случае PE .exe) имитирует загрузку программы и показывает такие же виртуальные адреса, как в памяти. И даже если она показывает не те адреса (например, ASLR в системе, или ты грузишь DLL, а ее базовый адрес занят), всегда можно сделать Rebase program в IDA. Но она показывает то же, что и винда видит при старте программы. Если программа после запуска сама себя модифицирует (распаковывает), то IDA, естественно, об этом узнать неоткуда, и ты видишь мусор. Если ты знаешь алгоритм, или серьезно ковыряешься в упаковщике, можно написать статический анпакер, который прямо в IDA будет "выделять" память (создавать дополнительные сегменты) и делать PatchByte так же, как делает стаб упаковщика в рантайме, а можно "просто" запустить упакованую пограмму под отладчиком, дождаться, пока стаб ее распакует и после этого сдампить результаты в файл, на который уже можно натравливать IDA. Ну после ребилда и исправления импортов, если они интересуют.
Японцы те ещё извращенцы, если что.
Теперь память совпадает, но в ИДА не формируются инструкции из байткода, соответственно F5 не работает. Возможно из-за динамичности памяти они решили не обновлять это, как делает СЕ?
Вот есть игра, в ней из мобов надо выбивать итемы всякие и они падают на землю.
Хочу при выпадении определённых вещей чтоб мне мой скрипт пищал.
Прочитать память из скрипта я смогу, но как её найти?
Как через чит энжин найти память, которая хранит все вещи на земле? Вообще не понимаю что искать.
mov ecx, fs:[0000002C]
Нагуглив, я предположил что она вычитывает информацию из https://en.wikipedia.org/wiki/Win32_Thread_Information_Block , которая уникальна для каждого треда. И, соответственно, вызвав функцию из разных потоков можно получить разные результаты (I believe).
Первый вопрос, как прочитать через WinAPI какие треды в процессе какую информацию содержат в этой структре.
Второй, я так понимаю, что эта фича была сделана чтобы одна и та же функция но в разных потоков занималась обновлением всей хуйни, только в первом треде обновляются объекты, в другом - инвентарь, в третем - еще что. Насколько это может быть похоже на правду?
У меня в универе изучают ассемблер TASM ( поставлен он там через dosBox никто не может объяснить как они эту парашу ставили )
Мне нужно скачать TASM но я хз где его скачать рабочий и как с ним работать если кто может поделитесь ссылкой
> как прочитать через WinAPI какие треды в процессе какую информацию содержат в этой структре
Ты заебешься. Лучше похукай в игре что-нибудь. Но если очень хочется: перечисляешь потоки в процессе, делаешь каждому GetThreadContext, достаешь оттуда SegFs, скармливаешь его GetThreadSelectorEntry, собираешь линейный адрес TEB, разбираешься, как работает TLS, парсишь TLS, профит. Тебе оно надо?
> что эта фича была сделана чтобы одна и та же функция но в разных потоков
Это вообще может быть что-нибудь околосистемное. Например, банальные thread-local данные сишного рантайма.
>>08847
Решил я короче попробовать зареверинжинирить эту игру в общем:
https://en.wikipedia.org/wiki/State_of_War_(video_game)
Пожелайте удачи и не бросить это дело
Стандартную библиотеку Си
Подробнее.
Неужели нет применения? Ничто как ассемблер не позволяет так плотно ебаться с компом. Дрова, загрузчики и лоулевел всегда же быть, хоть немного, но нужны.
В 2018 нет.
Асм x86 сам по себе это байткод для микрокода внутри процессора, поэтому до железа тебя в любом случае не пустят. А как тасовать этот самый микрокод для более лучшей скоростности лучше знает компилятор.
>Hex-rays штоле
Ну как бы да. ._.
С появлением hex rays у меня наконец-то стало получаться реверсить, потому что асмовскую поеботу я вообще не воспринимаю, а вот глючный высер hex-rays'а вполне.
Ну уж точно такую сложную вещь как компилятор на ассемблере не пишут. Хорошим тоном считается написать компилятор языка на самом языке - тогда он считается уже зрелым.
Ассемблер тебе понадобится только на последней стадии - кодогенерации из одного из промежуточных представлений.
Если ты хочешь написать компилятор в 2018, тебе нужно генерить LLVM-код, а LLVM уже превратит этот код в машинный. Так ты построишь минимум велосипедов, потому что LLVM умеет применять к промежуточному коду кучу оптимизаций и делать много чего еще хорошего.
А LLVM написана на С++. Вот кодогенератор, если интересно https://github.com/llvm-mirror/llvm/tree/master/lib/Target/X86
> поэтому до железа тебя в любом случае не пустят
Это и есть железо. Микрокод много где есть, и если он есть - он неотъемлемая часть проца.
>>12776
> С появлением hex rays у меня наконец-то стало получаться реверсить
Это пока процессор поддерживается рейсами, а процессорный модуль может в систему типов. Но бывает, что все, что у тебя есть - кривой процессорный модуль на питоне, который еще и править приходится. А еще если ты случайно забудешь где-то volatile, или случайно добавишь лишний const, HexRays спокойно выкинет у тебя из функции большую часть логики или парочку вызовов функций, или свернет while до if.
> потому что асмовскую поеботу я вообще не воспринимаю
А ты, не зная асма, не сможешь даже заметить перечисленное, не то, что решить проблему.
>>12772
> лучше знает компилятор
Пикрелейтед. На самом деле это древняя VS2005 и еще какой-то баг в компиляторе, потому сам пикрелейтед был собран с /Od, а в той программе, что я реверсил, качество кода вокруг цикла намекает на сборку с /O2 или /Ox.
>>12798
pinvoke?
>Есть ли способ заюзать все это на C#?
Есть, но смысла нет - проблемы с производительностью сисярпа и любого другого безопасного языка не в качестве компилированного кода, а в многочисленных обёртках с проверками на каждый чих.
> Анончики, что можно написать на асм?
Буткод для операционной системы разве только, там есть определенные команды, которые нужно именно из асма дергать, что бы проц в защищенный режим c нужной разрядностью перевести, да виртуальные машины - там нужно тоже пару специальных опкодов дергать.
Да и то первое было актуально во времена обычного биоса до UEFI, сейчас UEFI уже с бута мбр на блюдечке защищенный режим подгоняет.
>А ты, не зная асма, не сможешь даже заметить перечисленное, не то, что решить проблему.
._.
Ну на самом деле да. Но реверсинг это, пожалуй, единственное применение асма.
На пике надеюсь O0?
>Но реверсинг это, пожалуй, единственное применение асма.
Эксплуатоиты писать.
Да и вообще что угодно
Скачай HiAsm, там особо много знать не надо.
Енто и есть реверсинг, он имел ввиду. Идея в том, что ничего нормального, типа стендалон апп не напишешь на асме.
До сих пор пишут в эмбедде, и много. Не очень понимаю, зачем, правда. Ну и всякие загрузчики надо самому писать на нестандартных девайсах
Уже лет 20 как, лол.
> Базовые функции реализованы в динамически подключаемых библиотеках kernel32.dll и advapi32.dll; базовые модули графического интерфейса пользователя — в user32.dll и gdi32.dll
У меня все еще вопросы:
1) Выходит, я не могу написать 32-битную программу без использования этих библиотек, или других, использующих первые, так?
2) А что тогда содержится в самих dll, если это — базовые функции? Код, который выполняется системой на самом низком уровне при работе непосредственно с машиной?
3) В msvcrt.dll функции тоже базовые, или выполняются не без использования kernel32.dll?
Это уже не по асму вопросы, а по устройству системы.
1. Можешь, но kernel всегда будет проецироваться в твой адресный процесс
2. Просто функции (библиотека, понимаешь?). Иногда может и сквозь HAL в самый низ уйти.
3. По-разному.
> Например метод exit: как он работает
> вызываешь прерывание DOS
exit сбрасывает буферы файлов, выполняют прочую деинициализацию и под конец дергает ExitProcess(), это уже Windows API. ExitProcess делает NtTerminateProcess, который вызывает примерно такое же прерывание, как в DOS (int 2e). Но на самом деле через прерывания ходить в ядро медленнее, поэтому в современных ос оно делает sysenter. Ну и там дальше уже ядро разбирается.
>>13722
> Выходит, я не могу написать 32-битную программу без использования этих библиотек, или других, использующих первые, так?
Ты можешь напрямую дергать ядро, но номера системных вызовов ("функций" прерывания, если брать DOS-овые аналоги) меняются от версии к версии, поэтому такой код как минимум может не заработать в очередном билде винды. И неудобно это.
> что тогда содержится в самих dll, если это — базовые функции
Некоторые функции целиком реализованы в юзерспейсе. Другие - обертки, которые делают работу с системными вызовами более удобной.
> msvcrt.dll функции тоже базовые, или выполняются не без использования kernel32.dll?
Сводятся к kernel32.dll. MSVCRT, как следует из названия (MS Visual C RunTime) - это вообще сишный рантайм, реализующий функции, которые требует реализовывать сишный стандарт, к Windows оно имеет лишь то отношение, что в комплекте винды куча софта, написанного на Си, и которому этот рантайм был нужен. Был - потому что свежие рантаймы лежат в SxS, а этот древний, от шестой вроде студии.
Спасибо, вроде что-то понял.
Ну 6.8 хорошо под вайном бегает
Да
Уууу, бля.
Надеюсь тот анон, что любит простыняшами отвечать, захочет написать как сильно ты не прав.
А что, реализации там нет? =(
Потому что ты не вызываешь _myfunc?
Их так дохуя что ли. Ебать конечно карась.
>>14087
> Уууу, бля.
Вот у меня абсолютно точно такая же реакция. Короче, так оно не работает по двум с половиной причинам:
1) Когда винда грузит библиотеку, это не значит, что она просто выделяет память и тупо копирует туда файл. Она парсит много всяких структур и выделяет память сложно. Пересказывать весь формат PE я не буду, лучше найти какую-нибудь готовую статью. Но очевидная проблема в том, что файл на диске отличается от образа в памяти.
1.5) Кроме того всяких вещей, связанных с загрузкой собственно образа, загрузчик также выполняет динамическую линковку (связывание), т.е., пробегается по импортам длл и впатчивает в них адреса тех функций, которые импортируются. До этого попытка вызвать любую импортированную функцию приведет к крашу (там есть некоторые исключения с привязанными длл, о которых я лучше промолчу).
2) Кроме загрузчика, еще и сама длл обычно производит всякую инициализацию, получая управление в DllMain в разные моменты своей жизни. Естественно, ненициализированная длл работать не будет.
В любом случае, статическая линковка - это не просто включить файл. Это еще и разрешение внешних ссылок, и выделение памяти под .bss, и обработка релоков, и куча других мелких задач. Подлинковывать какой-нибудь .obj без внешнего линкера современным FASM-ом теоретически можно (с ограничениями), но это совсем не две строки, и вообще это извращение.
>>14140
Ты все делаешь не так. Ты не выделил память под функцию, ты не пометил память, как исполняемую, ты читаешь с "r" вместо "rb".
>Ты все делаешь не так. Ты не выделил память под функцию, ты не пометил память, как исполняемую, ты читаешь с "r" вместо "rb".
Сделал все по заветам твоим, но сосу.
Под какой компилировалась - никак (ну разве что линкер строчку с путем оставит или что-нибудь еще). Под какую - обычно указано в одном из полей заголовка исполняемого файла. Например IMAGE_NT_HEADERS.FileHeader.Machine для PE или ElfXX_Ehdr.e_machine в ELF.
Называй меня королем собак.
> Сделал все
> ты не пометил память, как исполняемую
То, что ты там в ассемблере что-то написал, влияет только на бинарник, который ты из него слинкуешь. А пометить надо память, которую ты маллоком выделил (может не получиться на системе с селинуксом). Алсо, ты точно в чистый бинарник компилируешь, а не пытаешься грузить elf или coff?
Ну тогда mprotect или VirtualProtect, или что у тебя там за ОС.
Я думаю он сам особо не понимает что делает.
Мог бы сразу написать 0xEB, 0xFE и не мучиться с файлами.
Я не понимаю что делаю. Я мог бы написать 0хЕВ и 0хFE и не мучиться с файлами.
Лол. Я только сейчас заметил, что там еще и
ptr = (char★)c;
Возможно, стоит начать с изучения Си сначала?
Это случайность, честное слово. Я когда писал код точно хотел заебенить там char приведение.
Хорошо, допустим, я нашел. Теперь я могу из hex-файла начать переписывать программу на си/кресты?
80386 PE формат
Прямо из хексов? Глазками? Дизассемблирование в уме? Нет, не можешь, иначе не задавал бы таких вопросов. Иду возьми лучше с хексрейсами.
Я нихуя не умею, ладно. Начал RE день назад.
>До сих пор пишут в эмбедде, и много. Не очень понимаю, зачем, правда.
Потому что капиталисты по-прежнему жадные и им проще нанять усача за 2000-4000 евро в месяц без учета налогов чтобы тот применив более дешманский МК сэкономил своей байтоеблей от 2 до 20 евро на каждую сраную стиралку/, что при умножении на количество произведенных стиралок дает уже миллионы сэкономленых евреев в зарплату топманагеров и в доход акционеров.
>в настройках декомпилятора есть default radix
Не нашел, я пытался, честно.
Эти аррей акссессы меня путают, к примеру, this - тип char ^, this_ptr - int ^.
И this_ptr[0x374] != this[0x374], это очень мешает, можно, настроить, чтобы было в виде ^(this + 0x374) или ^(this_ptr + 0x374 * 4). А то менять все типы под char, дабы оффсеты совпадали будет как-то не очень.
> Не нашел, я пытался, честно.
Edit->Plugins->Hexrays->Options, справа.
> Эти аррей акссессы меня путают
А зачем ты их оставляешь? Делай структуры сразу, без этого крестокод практически невозможно реверсить. Офсеты для отладки будешь подсматривать наведением мыши или табом в дизасм.
> this_ptr = this
Тыкай x на this_ptr, чтобы удостовериться, что он присваивается только один раз, тыкай =, мапь на this. Чем чище код, тем легче в нем разбираться.
Начни прикладывать свои навыки где-то. Никто не занимается этим дрочем просто "чтобы быть классным спецом и получать свой косарь".
Когда я в конце 90х делал реализацию просмотра JPEG в DOS на чистом asm'е без FPU (ДКП с fixed point это тот еще пиздец), это было в разы проще, чем выучить ебаный Spring Framework для ебаной Java.
Может его могло и не быть на тех процессорах, на которых исполнялась его программа.
В конце 90-х уже SSE на пороге стоял.
Куда прикладывать то? Я практикуюсь реверсить разные хеллоуворды и крякми, ctf-ки решаю. Еще пробовал малварь анализировать, но сэмплы негде брать.
Малварь не так интересно сейчас разбирать. Можешь на https://www.malwaredomainlist.com/mdl.php сходить и набрать себе на любой вкус поделок с платной чисткой фемидой+вмпротект.
Но будут там в основном всякие агенты, майнеры да поделки на дотнете.
Это раньше весело было увести у пинчевода логи, а то весь ботнет сразу. А сейчас только ctf'ные крякми еще как-то будоражат кровь.
Демосцена ебать её... в итоге посаженное зрение и куча потерянного времени. Не повторяйте моих ошибок пацаны.
Я ваще поддерживаю тырпрайз виртуальную машину со своим ассемблером, это не совсем непересекающиеся вещи.
Исходник: https://pastebin.com/GcaWX8aE
> С темой треда относительно пересекается
Каким местом? Это какая-то сраная олимпиадка, там даже to брутить не нужно.
Ну ок, я не прав, это не просто сраная олимпиадка, а уязвимая сраная олимпиадка, там проверка после find кривая, и можно запатчить длину строки, ну и дальше дело техники.
Строка на стеке, его можно дампить, искать там нужные байтики и менять их местами, например.
Звучит жестко, спасибо. Постараюсь доковырять.
А вообще там же replace есть, с ним все еще проще. Ну это если условия тепличные в виде отключенного ASLR.
https://www.youtube.com/watch?v=HlUe0TUHOIc
Быстро понять структуру программы
Книгу.
...нные непонятные слова.
Моя цель, будучи жителем далекой провинции, выточить напильником из технического и металлического мусора установки для выпуска строительных материалов на основе мусорных отходов, песка, камней, щебня и т.д. За основу хочу взять существующие разработки и с помощью реверс-инжиниринга догадаться как они работают, создать близкий аналог из технического и металлического мусора. После чего построить себе хижину орков из полученных строительных материалов.
Из этого вытекают следующие вопросы:
1) Какие языки программирования надо учить для подобного реверс-инжиниринга? Достаточно ли ассемблера и Си?
2) Насколько углубленно надо учить матан для такой цели? Хватит ли стандартного курса отечественных ВТУЗов?
3) Если я в будущем построю потенциальную хижину, то ко мне сразу на разборки приедут провинциальные коммерсы качать права за то, что я из мусора построился, а не купил у них стройматериалы как все. В связи с этим, какое боевое искусство учить, чтобы по голове сильно не били на тренировках, но чтобы можно было защитить мою потенциальную хижину от разборок коммерсов? Подойдет ли тэквондо ITF, там, вроде, сильно нельзя бить?
4) Как грамотно совместить тренировки, получение умений в программировании и в слесарном деле? Ведь надо будет быть достаточно сильным, чтобы быть готовым к тому, что коммерсы на разборки ездить будут. И достаточно квалифицированным, чтобы создать необходимые установки.
Вот тут:
> Заключительная инициализация процесса.
все только начинается: вызываются не только TLS-колбеки, но еще и дллки грузятся, вызываются их entry-point-ы и т. д. Но это все частности, поэтому их опускают.
Вот скрины. В данном случае пытаюсь прочитать сохраненный rip, но выпадает SIGSEGV, хотя, по идее, по адресу 0x0 со смещением 0x7fffffffe888 находится наш стек и сохраненный в нем rip.
Сап.
Вопросы касаются архитектуры ПК.
1. Что в иерархии памяти находится ниже? Магнитные или оптические диски? Из этого вытекает 2 вопроса: что стоит дороже и работает быстрее.
Я ставлю на то, что ниже находятся оптические диски, но пруфануть не могу.
2.
Если запрос к L3 не приносит результата, он передаётся во внешнюю память:
а. По шине DDR3
б. По шине PCI
в. Запрос никуда не передается
Про шину DDR3 я слышу впервые, в гугле тоже ничего не нашел. Однако есть шина данных.
Казалось бы, в случае кэш-промоха, идет обращение к ОЗУ, по шине данных, значит ответ по шине DDR3
Но идет речь о внешней памяти, которой ОЗУ не является, хотя если внешней памятью считается все что за цп - тогда ок.
В общем здесь я уже даже не знаю.
Блять. Спасибо. Буду теперь в Иде перепроверять выхлоп gdb. Это было довольно неочевидно.
Есть radare, если что.
Не думаю что там помогут.
Остановился на PCI (cpu -> pci host bridge -> RAM) и оптических дисках.
> ебать в рот gdb и at&t
set disassembly-flavor intel в .gdbinit и забыть AT&T как страшный сон пробовал?
>>19727
> Что в иерархии памяти находится ниже? Магнитные или оптические диски?
А одинаково. Если для твоего препода имеет значение технология хранения - с ним что-то не так.
> Если запрос к L3 не приносит результата, он передаётся во внешнюю память
Зависит от того, что именно висит в этом регионе памяти.
>А одинаково. Если для твоего препода имеет значение технология хранения - с ним что-то не так.
Не одинаково.
Вопрос не про технологию хранения, а про так называемую иерархию памяти, ничего странного в нем нет. Вопрос же "к чему быстрее скорость доступа: к регистрам, к озу" не звучит же странно, хоть ответ и очевиден. Даже если вдруг, появятся (если не уже появились) оптические диски, которые работают быстрее магнитных - иерархия памяти не изменится, и согласно ей, оптические диски все равно будут медленее.
По поводу L3 кэша, имеется ввиду, что нужно лезть в ram(скорее всего), вопрос только по какой из шин.
Я нашел 2 варианта:
a) cpu -> pci host bridge -> ram (какой-то древний)
b) cpu -> data-bus -> ram
> оптические диски, которые работают быстрее магнитных - иерархия памяти не изменится, и согласно ей, оптические диски все равно будут медленее
То есть этот способ классификации ничего реально не отражает, и придуман двумя-тремя теоретиками, которые даже друг с другом не в состоянии договориться.
На самом деле, оптические диски можно поставить ниже по иерархии не из-за скорости, а из-за того, что они съемные, т.е., не постоянно онлайн, точно так же, как и всякие стримеры нет, не те, которые рожей на твиче светят.
Ну, скажем, насчет ничего реально не отражает это спорно. Все вполне разумно до уровня ЖД. А вообще да, придуман кукоретиками, с этим не поспоришь.
Дело не в том, что они съемные. HDD тоже может быть съемным. Оптические диски очень не любят перезапись. Лучший формат работы с ними - стереть полностью, записать. В этом плане у них чтение более-менее рандомное, а вот запись ближе к стримерам.
Иерархия, конечно, из манямирка, но определенный смысл в этом есть.
> Оптические диски очень не любят перезапись
Флеш тоже не любит перезапись, и подход там в некотором смысле аналогичен оптическим дискам: писать каждый раз в новые (пустые) страницы (как в сессии на CD/DVD), а грязные блоки тереть в фоне или по необходимости. Значит ли это, что флеш в этой вашей иерархии ниже CD? В моем манямирке, например, он был бы выше HDD из-за практически бесплатного random access. Да и вся эта иерархия должна/упирается в random access. Чем сложнее, тем ниже.
В прошлом году всё было нормально.
Я правильно понимаю, что stdcall — это только про автоматическое выталкивание параметров из стека? А про регистры я ничего не нашел (inb4: плохо искал). Где искать информацию о том, какие регистры будут затронуты той или иной функцией?
> плохо искал
this
google: wikipedia x86 calling conventions
google: msdn calling conventions microsoft перепидорасила документацию, теперь из исходной статьи нужно кликнуть по argument passing and naming conventions
> А про регистры я ничего не нашел
Стандартно для всех конвенций в x86 (32-битный код): при возврате DF должен быть сброшен, а EBP, EBX, ESI, EDI восстановлены, если ты их трогал. Вот если у тебя внутренняя фукнция (например, ты похукал что-то неэкспортируемое), тогда никаких гарантий или общих требований нет - может понадобиться и ECX/EDX схоронить иногда, это уж как компилятор код сгенерит.
Что можно сделать в такой ситуации? Есть ли что почитать?
А, и Full RELRO тоже включен, но тут это уже наверное роли не играет.
Без кода сложно, но
> ASLR работает
и
> я могу управлять ее стеком
может быть, ты можешь раскрыть адреса, получив содержимое стека?
Спасибо. Осталось немного.
Изучи программирование немного, например Си. Потом уже можешь beginners.re читать.
Asm обычно осваивают с нуля. Так как это самый низкоуровневый из человеко-понимаемых языков. В 20 веке конечно и на машинных кодах писали, но сейчас такие вряд ли существуют.
Тебе не зря советуют изучать еще и Си. Так как писать на ассемблере ты все равно не будешь. Это утомительно, да и не особо нужно. Зато в связке с Си, это может помочь понять, как программы транслируются из высокоуровневых языков в инструкции процессора, через ассемблер.
Двачую. На асме обычно вставки делают, пару другую функций и все.
Во второй push 0x4841а
Операнда нет, как понять зачем, нигде не написано.
Пойду грузчиком работать.
>>26588
beginners.re имеет два названия. Реверс инжиниринг для начинающих и понимание языка ассемблера. Так что пробуй его.
> Операнда нет, как понять зачем, нигде не написано.
Показывай код. Или сам смотри, что будет дальше - если вызов функции, то смотри, что эта функция будет делать с аргументами. А может это просто SEH-фрейм, если вызова функции нет. В любом случае, понимание кода с неба не свалится, чтобы понять зачем, надо сидеть, смотреть, что происходит и постоянно пытаться понять. Вангую, что ты во втором пуше пропустил цифру. Особенно если это винда.
>Показывай код
https://pastebin.com/Xd3JWGFg
>во втором пуше пропустил цифру
Да
>если это винда
Да, это PE.
как стать успешным и зарабатывать 300к\сек?
Бляяя, еще и AT&T, фу таким быть. Я угадал про SEH. Там пушится -1 (для exception level вроде, это крестовая фишка), потом адрес нового обработчика исключений и адрес фрейма предыдущего хэндлера, чтобы сформировать linked list. Получившийся фрейм обработчика пишется в _NT_TIB (fs:0), чтобы винда о нем узнала (потом он удаляется перед ret в обеих ветках). В принципе, весь этот код можно по большей части просто игнорировать, но если ты хочешь узнать подробнее, в сети полно туториалов про внутреннее устройство SEH и про обработку исключений в C++. А вот дальше по 401015 там начинается уже какая-то настоящая работа, вызываются какие-то функции, на которые нужно смотреть, чтобы понять, что делает эта. Я бы на твоем месте выкинул objdump - он пригоден максимум для инспекции сгенерированного компилятором кода, и взял бы вместо него IDA, которая для людей или хотя бы r2, который не для людей.
Тысяч 50 в Москве и меньше в мухосрансках. Боги получают сотни кесов, впрочем как и везде.
> еще и AT&T
Извините
>я был прав это SEH
Спасибо большое, почитаю
>ida pro
У тебя случайно слитой 7.2 версии нет от китайцев? Говорят там inheritance завезли.
> Говорят там inheritance завезли.
Очень плохо завезли, мне не понравилось. Обычное крестовое наследование, которое struct foo : bar { ... } уже давно есть, но оно неудобное, поэтому подход с созданием трех struct (struct ClassName { ClassNameVtable ptr, ClassNameFields fields }) по-прежнему рулит.
Нет, никакой, нету, никак.
https://mega.nz/#!Bc9VVAYC!Vk6CFlW6VIoskLNgDKXbsL6FacDQeOKe6LX92wNicKY
Я совсем криворукий ебанат или у всех файл скачивается но внутри он пустой ?
Тебе вьювер 404 показывает при попытке открыть?
1) Правой кнопкой, свойства, разблокировать, опционально положить в директорию с путем, не содержащим странных символов (мало ли, может ты китаец).
2) Или можешь взять какой-нибудь 7-Zip, и распаковать .chm-ку им.
3) Или можешь смотреть в SumatraPDF, а не в дефолтном вьювере.
Большое спасибо Sumatra помогла ♥
ты что совсем еблан ? :D
Ну я так и знал, что у вашего брата зп хуйня полная
Там еще примеры в комплекте. На какой-то из них и агрятся. Я же предлагал распаковать chm и посмотреть.
Снифаешь USB чем угодно (например, USBlyzer или даже просто wireshark), берешь libusb, пишешь. Если окажется, что винда не дает работать с HID из юзермода, пишешь драйвер или реверсишь драйвер производителя железа.
Спасибо за быстрый ответ и наводку.
> Когда вы уже все сдохнете со своим старьем?
Никогда.
А вот что абстрактушки будут делать в ближайшие пару лет (а у них на носу полный конец развитию кремния по муру и заканчиваются техпроцессы, напомню) - вот это действительно вопрос.
Будем развивать компиляторы, добавлять в них ИИ на нейросеточках и машинном обучении и в оконцове победим байтоёбство оптимизаторным оптимизатором, который сможет лучше любого байтоеба код оптимизировать.
А вот вы скоро станете не нужны. Как только наш умный компилятор сможет скомпилить микросервис на Rustе в восьминогую Attiny на 4кб.
А дальше в монастырь.
@
A problem internal to GDB has been detected,
@
further debugging may prove unreliable.
@
Quit this debugging session? (y or n)
Сука! Как же я ненавижу ваш прыщеблядский gdb!
Попробуй edb/r2
Но ведь, если я тру зондофоб мне же энивей придется создавать свой ЯП с нуля. Откуда я знаю что в ваших FASM.EXE не вшит руткит от васяна? И вы тоже этого знать не можете. А иначе ваш асм нахер не нужен. Поэтому в чём полезность? Набраться опыта перед написанием своего продукта?
Нет, ты
Исходники полностью открыты. Берешь тот же самый фасм и собираешь из исходников. Я проверял.
Ну, конечно на этапе сборки можно что угодно добавить и без исходников. Да и тысячи строк на ассемблере не перечитать.
Но минимальное приложение генерится байт в байт.
Главное верить.
> И вы тоже этого знать не можете.
fasm достаточно небольшой, а взаимодействия с системой там настолько мало, что можно взять дизасм и поискать руткит от васяна самостоятельно.
В этой области ничего не меняется десятилетиями, ничего принципиально нового ты в свежей книжке не найдешь. Если тебе нужен x86-64 ассемблер, так и ищи книгу по ассемблеру, их дохуя. Если интересно про реверсинг, почитай SAT/SMT by example от того же юричева, что-нибудь про скриптинг ida (и про ее микрокод), про инструментирование, про всевозможные frida и прочие unicorn. Все гуглится по кейвордам, но в основном это не книжки, а выступления, слайды и статьи.
Цель понять разницу между микроконтроллером, промышленным контроллером, микропроцессором, ПЛИС, ПЛК, IOT, СБИС, короче вот это вот все. Понять как их программируют. И понять как программировать управление устройствами по MODBUS.
Все врут! А еще в процессоре бэкдоры. Используй таблички в мануале от интела и декодируй инструкции вручную. В бумажке с ручкой бэкдоров пока вроде не находили?
Intel ME норм бэкдор, не спрячешся.
>микроконтроллером
Маленький процессор со своим ПЗУ.
>промышленным контроллером
Здоровая дура, рулящая технологической линией. Программируется на визуально понятном васяну-слесарю языке, а не на С.
>микропроцессором
Строгое определение не дам, в большинстве случаев взаимозаменяемо с "микроконтроллер
>ПЛИС
Программируемая логическая интегральная схема. СБИС, стуктуру которой можно изменить доступным оборудованием. Не лезь пока сюда.
>ПЛК
То же, что и промышленный (логический) контроллер
>IOT
Маркетинговый термин, обозначающий чайники с подключением к интернету. Забудь его нахуй.
>СБИС
Сверхбольшая интегральная схема. Вся современная электроника кроме ПЛИС является СБИС, хотя понятие "сверхбольшая" устарело, т.к. термин введён при царе горохе.
https://radiokot.ru/start/mcu_fpga/avr/ - это ответит на некоторые вопросы.
Если есть время и деньги, купи ардуино и ковыряйся с ним по урокам с ютуба.
В любом случае, микроконтроллерами занимаются в /ra. Спроси там, они тебе укажут путь.
Большое спасибо.
> Маленький процессор со своим ПЗУ.
Главное в нем не пзу, а наличие готовых интерфейсов для ввода-вывода, обычно разнообразных. Чтобы было чем микроконтроллировать.
> хотя понятие "сверхбольшая" устарело
Хуй знает, я периодически встречаю в литературе, но только как VLSI - русскоязычные термины умерли вместе с советским союзом.
>Главное в нем не пзу, а наличие готовых интерфейсов для ввода-вывода, обычно разнообразных. Чтобы было чем микроконтроллировать.
Ну в ЦПУ на домашних пеках тоже есть готовые интерфейсы зачастую. Может ты и прав, но в таком случае грань между микроконтроллером и (микро)процессором нечёткая.
>Хуй знает, я периодически встречаю в литературе, но только как VLSI - русскоязычные термины умерли вместе с советским союзом.
Да, но с тех пор эта "большевизна" выросла в сотни раз. Термин используют, но смысл его несколько утрачен.
> Ну в ЦПУ на домашних пеках тоже есть готовые интерфейсы зачастую
Ну как бы да, грань стирается, а десктопные CPU все больше превращаются в SoC.
Просто исходники проебались двенадцать лет назад, однао я предполагаю, что они могут быть на одной из подчинённых мне машин.
Кидай сюда, посмотрим. Или сам посмотри банальным hex-редактором или strings (от руссиновича или линуксовым). Но максимум, что ты сможешь получить - путь к проекту и, возможно, названия некоторых юнитов.
В табличках пробелы, а в пробелах тоже зонды!
IDA славится своей способностью хуево детектить паскалевые строки. Смотри в strings. Боишься консольки - запусти и посмотри в Process Explorer, там в свойствах процесса есть соответствующая вкладка.
Тут лучшим вариантом будет iDR, а не IDA
Я еще немного подумал над этим. Кажется, я нашел в этом смысл. Видимо, это происходит потому, что минимальная экспонента в нормализованном числе с плавающей запятой одинарной точности равна 2-126. Денормализованные числа, как я понял, заполняют разрыв между нулем и минимальным значением нормализованного числа.
Минимальное нормализованное число — 1.0 × 2-126.
Максимально денормализованное число — 0.11...11 × 2-126.
То есть, эти два значения находятся почти впритык друг к другу, что было бы невозможно, если бы экспонента в денормализованном числе была равна 2-127.
Сам спросил — сам ответил, мдауш.
>Цель понять разницу между
> микроконтроллером
Микросхема
см. микропроцессор+встроенная оператива+встроенная флеш-память+ конфигурируемые ноги+различные аппаратные функции для этих ног, начиная от шима и заканчивая разными портами вроде SPI и USB.
> , промышленным контроллером, , ПЛК
Готовое устройство в большом корпусе на DIN рейку, сделанное из микроконтроллера, защищенной обвязке его ног и предназначенное для установки в шкаф.
Суть ПЛК в том что его можно программировать лишь на 5 упоротых язхыках (3 из них визуальные программировать мышкой, один - абсткрактный ассемблер и ещё один - паскалеподобный). Если коробку нельзя программировать на этих 5 языках и/или она не имеет соответсвующей сертификации - это не ПЛК.
> микропроцессором,
Микросхема, реализующая вычислительное устройство.
> ПЛИС
Программируемая микросхема с аппаратным эмулятором железа. Эмулирует железхо на уровне железа путем универсальных соединяемых ячеек. Применяется там, где идет разработка других микросхем или там где программы на микропроцессоре работают слишком медленно и нужна аппаратная реализация.
, IOT
Баззворд, internet of things. Суть в том что если запихнуть в каждый утюг и вибратор вайфай или другую радиопередающую хуету которая будет соединять с интернетом то наступить всеобщее счастье.
, СБИС
сверхбольшая интегральная схема. Английский аналог - VLSI. В принципе любой чип который ты можешь найти на материнской плате - СБИС.
, короче вот это вот все. Понять как их программируют.
Судя по твоим вопросма - тебе в АСУ тред в /wrk/
И понять как программировать управление устройствами по MODBUS.
Тебе точно в /wrk/
>Цель понять разницу между
> микроконтроллером
Микросхема
см. микропроцессор+встроенная оператива+встроенная флеш-память+ конфигурируемые ноги+различные аппаратные функции для этих ног, начиная от шима и заканчивая разными портами вроде SPI и USB.
> , промышленным контроллером, , ПЛК
Готовое устройство в большом корпусе на DIN рейку, сделанное из микроконтроллера, защищенной обвязке его ног и предназначенное для установки в шкаф.
Суть ПЛК в том что его можно программировать лишь на 5 упоротых язхыках (3 из них визуальные программировать мышкой, один - абсткрактный ассемблер и ещё один - паскалеподобный). Если коробку нельзя программировать на этих 5 языках и/или она не имеет соответсвующей сертификации - это не ПЛК.
> микропроцессором,
Микросхема, реализующая вычислительное устройство.
> ПЛИС
Программируемая микросхема с аппаратным эмулятором железа. Эмулирует железхо на уровне железа путем универсальных соединяемых ячеек. Применяется там, где идет разработка других микросхем или там где программы на микропроцессоре работают слишком медленно и нужна аппаратная реализация.
, IOT
Баззворд, internet of things. Суть в том что если запихнуть в каждый утюг и вибратор вайфай или другую радиопередающую хуету которая будет соединять с интернетом то наступить всеобщее счастье.
, СБИС
сверхбольшая интегральная схема. Английский аналог - VLSI. В принципе любой чип который ты можешь найти на материнской плате - СБИС.
, короче вот это вот все. Понять как их программируют.
Судя по твоим вопросма - тебе в АСУ тред в /wrk/
И понять как программировать управление устройствами по MODBUS.
Тебе точно в /wrk/
как пример:
struct S1{
float x;
float y;
};
extern "C" S1 getval()
Вопрос, а как эта структура возвращается программе?
если б било бы какое-то простое значение, то для x86 оно либо через EAX, либо чрез ST(0) будет получено. На стеке хз как передать, ибо по окончанию процедуры он будет восстановлен.
Как оно вообще все работает?
Вот накидал на godbolt:
https://godbolt.org/z/VosXLv
dвыглядит будто от уехавшей вершины стека отсчитывает и оттуда значение берет, или я что-то не правильно понял.
> Как оно вообще все работает?
Если оно влезает в EDX:EAX, то возвращается в них (именно это у тебя и происходит, а остальное - преобразования каждого члена из набора 32 бит в float). Вот такое:
S1 getval(void) { return (S1) { 1.0, 2.0 }; }
int main(void) { S1 res = getval(); }
превращается примерно в такое:
<EDX:EAX> getval(void) {
temp = (S1) { 1.0, 2.0 };
<EAX> = ∗(uint32_t ∗) &temp.x;
<EDX> = ∗(uint32_t ∗) &temp.y;
}
int main(void) {
S1 res;
<EDX:EAX> = getval();
uint32_t temp1 = <EAX>, temp2 = <EDX>;
res.x = ∗(float ∗) &temp1;
res.y = ∗(float ∗) &temp2;
}
Иначе, если оно в EDX:EAX не влезет (например, добавь float z в S1) вызывающая функция неявно первым параметром кладет в стек указатель на структуру, куда вызываемая функция должна записать результат. Вызываемая функция пишет результат и возвращает этот же указатель в eax. Т.е., вот это:
S1 getval(void) { return (S1) { 1.0, 2.0, 3.0 }; }
int main(void) { S1 res = getval(); }
практически равнозначно вот такому:
S1 ∗getval(S1 ∗res) { ∗res = (S1) { 1.0, 2.0, 3.0 }; return res; }
int main(void) { S1 res, temp; memcpy(res, getval(&temp), sizeof(temp); }
И еще там есть различные ограничения, когда вроде бы в EDX:EAX результат влезает, но возвращают его все равно вторым способом.
> Как оно вообще все работает?
Если оно влезает в EDX:EAX, то возвращается в них (именно это у тебя и происходит, а остальное - преобразования каждого члена из набора 32 бит в float). Вот такое:
S1 getval(void) { return (S1) { 1.0, 2.0 }; }
int main(void) { S1 res = getval(); }
превращается примерно в такое:
<EDX:EAX> getval(void) {
temp = (S1) { 1.0, 2.0 };
<EAX> = ∗(uint32_t ∗) &temp.x;
<EDX> = ∗(uint32_t ∗) &temp.y;
}
int main(void) {
S1 res;
<EDX:EAX> = getval();
uint32_t temp1 = <EAX>, temp2 = <EDX>;
res.x = ∗(float ∗) &temp1;
res.y = ∗(float ∗) &temp2;
}
Иначе, если оно в EDX:EAX не влезет (например, добавь float z в S1) вызывающая функция неявно первым параметром кладет в стек указатель на структуру, куда вызываемая функция должна записать результат. Вызываемая функция пишет результат и возвращает этот же указатель в eax. Т.е., вот это:
S1 getval(void) { return (S1) { 1.0, 2.0, 3.0 }; }
int main(void) { S1 res = getval(); }
практически равнозначно вот такому:
S1 ∗getval(S1 ∗res) { ∗res = (S1) { 1.0, 2.0, 3.0 }; return res; }
int main(void) { S1 res, temp; memcpy(res, getval(&temp), sizeof(temp); }
И еще там есть различные ограничения, когда вроде бы в EDX:EAX результат влезает, но возвращают его все равно вторым способом.
но я не вижу EAX:EDX в asm листинге, что мне выдает godbolt.org
sub esp, 8
call F1 getval(void) ; getval
mov DWORD PTR $T1[esp+12], edx
и дальше там уже для принта.
Пятая и девятая строки по твоей ссылке. Но да, оно одновременно делает для printf даблы из флоатов. Т.е., положили регистр в стек, взяли movss в SSE-регистр, сконвертировали cvtps2pd в дабл и положили movsd в стек дабл.
я просто читал немного про call-convention, и не до конца нашел инфу, как именно написать совместимую с с++ кодом асм функцию и возвращать такие жирные объекты. Оно понятно, что для жирного объекта надо работать с указателем. >>39021
вот добавил z, и получил:
sub esp, 24 ; 00000018H
lea eax, DWORD PTR $T1[esp+24]
push eax
call _getval
т.е отъели от стека памяти под структуру, скормили через lea адрес, в который будет записывать функция, так?
т.е функция на самом деле будет уже иметь один входной параметр, который будет у нее ожидать компилятор?
З.Ы. благодарствую за ответы.
> т.е функция на самом деле будет уже иметь один входной параметр, который будет у нее ожидать компилятор?
Да, неявный параметр, который всегда на стеке (даже если __fastcall) и всегда первый: если бы было S1 getval(int foo, int bar), фактически компилятор генерил был код для S1∗ getval(S1 ∗result, int foo, int bar).
> т.е отъели от стека памяти под структуру
Да. Причем заметь, что оно даже с оптимизациями делает отдельную временную переменную для возвращаемого значения, и потом уже копирует туда, куда ты присваиваешь результат функции, при этом читает оно не из временной структуры, адрес которой компилятору вроде бы известен заранее, а именно по возвращенному в EAX указателю (псевдокод выше кидал).
Зачем нужно копирование, я не знаю, но так было еще в VC++98. Хотя если пофантазировать, при таком подходе у функции есть возможность послать нахуй эту временную структуру (и аргумент с указателем на нее) и возвращать, например, адрес какой-то глобальной константной структуры.
спасибо тебе, добрый человек.
Игорь, обучающая ассемблеру https://gog.com/game/human_resource_machine
>>39018
> <EDX:EAX>
Это какой-то синтаксис, или ты для удобства так сделал? Выглядит забавно
>>39034 (Del)
Пошёл нахуй
Я нажимаю например добавить поле, ввожу название для него и тд. Должно же состояние меняться по идее, а в дебаггере такого не происходит. Я думаю надо плагин установить.
Это мне уж точно не под силы.
> для удобства так сделал?
Да. У IDA/HexRays для регистров в прототипах используется нечто похожее, а двоеточие - это обычный способ указывать пару регистров (в том числе, и в манаулах интела).
>>39370
По нажатию мыши выполняется миллион инструкций, и хорошо еще, если один. Тебе стоит прочитать что-нибудь про оконные сообщения в винде.
Начни с изучения своей операционной системы.
Сам по себе асм гораздо проще. Но если писать что-то сложное или быстрое, всплывает куча нюансов, требующих глубокого понимания работы процессора и памяти, как минимум.
Реверсачеры, смотрите какие у нас няшные коллеги существуют!
Хотели бы себе такого сеньора в команду?
Я сам фронтендер...
Если не умеешь гуглить, то еще не дорос до такого.
https://www.sim-networks.com/wiki/about-virtualization-technology
https://www.ibm.com/developerworks/ru/library/cl-hypervisorcompare-xen/index.html
На каждой первой VPS.
Есть 25 значений по адресу adress + offset, каждое из них занимает по 1 байту. Мне нужно выдернуть 11 значение из этого списка и изменить его. Делаю так:
uint8_t* adress + offset |= 1 << 0xb;
И это не работает. Где ошибка?
Ну посмотри какое значение указателя у тебя получается. Ты не 11й берёшь, а 2^11й. Не выпендривайся и напиши адрес + офсет + 11
Вот пикрил. Как мне записать в какую-то одну ячейку если они все по одному адресу?
В приведённом коде ты меняешь указатель, а не значение.
Int value = (address+offset+11)
value |= 1<<n
(Address+offset+11) = value
Так делай
Да это же флаги, тебе с битами работать надо.
IDA позволяет нормально обозвать локальные переменные, смотреть содержимое наведением мыши, в том числе для указателей и т. д., но зато ее отладчик неудобен в остальных моментах.
>>47616
> OllyDbg даже без плагинов это умеет
Там можно только к коду комментарии писать. Или ты обладатель тайного знания о том, как переименовать LOCAL.1 во что-то более внятное или знаешь как заставить OllyDbg распознать локальную переменную, когда он сам не осилил? Без плагинов.
Я к этому
>Есть ли отладчики с возможностью писать комментарии к строкам кода, дампу памяти и прочему?
IDA Pro же. Не отладчик, но умеет вызывать другие, как я понимаю.
В иде так можно. Можно подключить дебагер, во время выполнения прокоментить и даже сохранить все это. Гугли мануалы.
Бамп, анончики! Нужно сдампить. Драйвер не дает это сделать, следовательно надо дампить тоже из ядра... Допустим напишу драйвер, как мне его загрузить-то? Патчгвард не даст же.
Так из ядра он не может предотвратить дамп. Все что мне нужно это получить структуру процесса. Даже если он там что-то похукает, что уже сомнительно, я могу свой callback раньше зарегистрировать.
Могу посоветовать несколько тупо тупых вариантов.
1. Поставить WinXP в виртуалку и не париться на счет подписи драйверов.
2. Сделать BSoD при запущенном файле с фулл-дампом и смотреть в windbg
3. Найти таки generic unpacker под свой протектор.
4. Ознакомиться с https://vxlab.info/wasm/article.php-article=dumping.htm и подобными статьями, чтобы понять, что все не так однозначно, т.к. драйвер может с системой стартовать, раньше чем ты хукать соберешься.
5. Тупо сидеть и трасисровать в windbg syser жив? чем вообще сейчас в ринг0 дебажат?
6. Ну и как вариант - попытаться заинжектить свою длл
О, благодарю, статья очень годная. Почти все способы не подойдут.
Там процесс Denuvo накрыт + драйвер как говорил уже ранее.
Все таки без танцев с бубнами ничего не выйдет. Буду пробовать тогда писать драйвер дампить через mmcopyvirtualmemory и грузится в тестовом режиме с тестовой подписью, мб пройдет такое.
Нашел свежий проджект на гитхабе. Драйвер + обертка на сисярпе. Может пригодится кому.https://github.com/EquiFox/KsDumper
Как изменить вектор в таблице прерываний?
mov 0000:[0180h], ax почему-то не работает (TASM, если чё).
Спасибо.
Кто-нибудь знает, как в ARMовском ассемблере поместить программу по произвольному адресу в памяти? По умолчанию программа располагается начиная с адреса 0х00000008, а надо, что бы она располагалась, например, по адресу 0х20002000. Я пробывал использовать DCD 0x20002000, но это меняет только регистр-указатель, при этом программа остаётся по старому адресу. Хорошо работает команда SPACE 0x400, но если адрес слишком большой, то компиляция занимает ооооочень много времени. Подскажите, может быть сталкивались с этим?
Там дамп почти в 1гб выходит + денуво сверху, никто не будет ковыряться в этом скорее всего.
Почему у тебя x/o пустой и r/o нулевой, хотя ты явно хочешь переместить именно код? Алсо, попробуй org задать в ассемблере, хуй знает. Это Keil?
>Это Keil?
Ага.
>Алсо, попробуй org задать в ассемблере
Unknown opcode ORG , expecting opcode or Macro. Судя по всему, его даже в системе команд нет.
>Почему у тебя x/o пустой и r/o нулевой
Это дефолтные значения, я менял и то, и то, потом менял только x/o, потом менял только r/o, но всё равно в отладчике команды как были по адресу 0x00000008 так и остались.
> Unknown opcode ORG , expecting opcode or Macro
Печально. Как же вы там живете с этим? Это ж ебнуться можно все по секциям раскладывать.
У тебя на пике есть use memory layout from target dialog. Пробовал? Ну или смотри скрипт линкера, хуй знает.
Вертани дерево?
>У тебя на пике есть use memory layout from target dialog. Пробовал?
ОФК пробывал. И остальные галочки тоже. Ничего не помогает.
Блин, видимо мне не поиграть в эту бесплатную игру.
На фоне браузеров размером под гигабайт - вполне себе маленькая, лол.
Я предполагаю, что в нем упаковано несколько файлов. Ну так с чего начать?
14 мб это дохуя, уверен она под протектором. Нихуя ты не сделаешь без знаний, забей. Можешь трафик понюхать, обычно это самое слабое место васянских утилит.
Потому что это не асм, а асмоподобная интерпреиируемая прослойка
Работает.
Лучше взломай установочный пароль для IDA Pro 7.2
Вот тут китайцы что-то накидали
https://bbs.pediy.com/thread-248989.htm
прикол в том, что установщик уже есть, остался пароль только
Не, ну я знал что китайца малость ебанутые, но чтоб надеяться в installshield пароль в отладчике увидеть...
им бы аниме рисовать
Товарищ майор.. Как поживаете?
>Подробнее. Чего хукать то?
А погуглить влом?
https://www.unknowncheats.me/forum/counterstrike-1-5-1-6-and-mods/97748-opengl-hook-cs-1-6-wallhack.html
https://forum.antichat.ru/threads/121917/
А всё, братья, нашёл, спасибо. Может добавите в шапку?
http://ricardonarvaja.info/WEB/INTRODUCCION AL CRACKING CON OLLYDBG DESDE CERO/EN FORMATO DOC/
> Я знаю, что можно вызывать динамически винапи
TEB->PEB->PEB_LDR_DATA->InLoadOrderModuleList->kernel32.dll, ну и дальше можно парсить экспорты.
Осторожна, тут хакир!
Тащемта тут ничего сложно нет. Просто берешь и без задней мысли ксоришь дворды в уме.
Ааааа, вот это уже похоже на правду, но все равно не совсем понял, хоть и писал недавно PE парсер.
Получаю PEB своего процесса А как его получить без вызова апи то?, смотрю в список загруженных модулей, там нахожу нужный, применяю парсер, нахожу адреса функций А что дальше? Как их вызывать-то? Или напрямую можно, так как модуль внутренний?.
Неа, не знаю.
> А как его получить без вызова апи то?
[fs:0x18]+0x30 в 32-битном коде и [gs:0x30]+0x60 в 64-битном.
> А что дальше? Как их вызывать-то?
Ну как можно вызывать фукнцию, если у тебя адрес есть? Просто вызываешь и все.
>[fs:0x18]+0x30 в 32-битном коде и [gs:0x30]+0x60 в 64-битном.
Спасибо, погуглю. Не знал что так можно.
>Ну как можно вызывать фукнцию, если у тебя адрес есть? Просто вызываешь и все.
Да, тупанул. Парсер писал для удаленных модулей, а не для внутренних, там по-другому немного было.
Получается, что до всей внутренней информации я могу добраться вручную? Без вызовов апи, правильно?
А вот vmprotect в новых версиях используют системные вызовы, чтобы апи похукать нельзя было, но системные вызовы имеют разные коды на разных системах, не хардкодили же они все это дело? Тоже распарсить выходит можно или дизасемблер нужен?
> не хардкодили же они все это дело
Хардкодили. Поэтому там по-хорошему должен быть фолбек, если оно не знает текущую винду.
> до всей внутренней информации я могу добраться вручную
Ну если оно лежит в юзермоде, и ты не боишься, что твой софт сломается в следующем билде десяточки из-за распидорашенных структур, то можно, да.
Хотя если софт обновляется, то можно и похардкодить...
Да я про юзермод. Вроде обещали что не будут больше структуры херить.
Еще о системных вызовах. В ядре же я могу похукать функции все равно, правильно? А отследить, что функция была вызвана из юзермода можно?
dt nt!_eprocess <address> все показывает, хочу вытянуть из eprocess peb, пишу dt nt!_eprocess peb <address> И НИХУЯ! dt nt!_peb
<address> тоже нихуя. Зато когда рекурсией прохожусь dt nt!_eprocess <address> -r, то все показывает. Как правильно то делать? Делаю как в книжке написано windows internals и выводится только название структуры, но не ее поля.
А чем ядро дебажить-то?
Нет. Хочу отвязать авторизацию от чита, чтобы он работал без авторизации, авторизация мой главный враг, и я должен его уничтожить
https://github.com/NationalSecurityAgency/ghidra
У тебя просто страна неправильная. Смени на правильную, и все будет.
http://rgho.st/66crCxNyS
Будучи запущенной через rundll32 в фоне есть n-1 ядер и перестает есть когда открывается диспетчер задач. (для аналогичных прог остановка не прописана). Рядом лежали dll-ки для SSL, отсылал в сеть менее килобайта данных, по крайней мере на момент когда спалил.
В ресурсах рандомные джипеги и описания из видосов на ютубе (и ссылки). Выглядит как рандом чтобы наебнуть чексуммы.
Брат умрёт?
Read/WriteProcessMemory, CreateRemoteThread, оберточка, которая дергает функцию.
А без CreateRemoteThread можно обойтись?
Но судя по тому что написано в гайде- он должен прекрасно запускаться
http://asmworld.ru/uchebnyj-kurs/001-neobxodimye-instrumenty/
> Все программы учебного курса вы сможете запустить под Windows. Конечно, реально они будут работать в эмуляторе DOS, в режиме виртуального процессора 8086. Но для учебных целей это вполне подойдёт.
Что я делаю не так?
После WinXP в составе винды нет NTvdm, только в dosbox запустится, либо под чистым досом.
Такие дела.
>После WinXP в составе винды нет NTvdm
Пиздишь. Его нет в 64 битных сборках, как хрюши, так и дейсяточки. В 32 битных всё на месте.
Погуглил, на сколько я понял мне нужно либо хукать функцию либо инжектить шеллкод, если я хочу обойтись без CreateRemoteThread ?
Тебе в любом случае инжектить код, который либо что-то делает сразу, либо грузит длл, которая что-то делает. Можно, например, SetThreadContext сделать, можно традиционный SetWindowsHookEx, зависит все от того, что ты делаешь и зачем.
Остановился на этой программе, не могу понять почему отладчики творят какую-то херню, хотя в обычном DOS выполнении строка выводится
Почему отладчик сразу прыгает на адрес смещения Lab_1?
Да это же противоотладка через конвеер.
> не могу понять почему отладчики творят какую-то херню
Я хуй знаю, что именно имел в виду Калашников 9090h там явно не зря, но по-моему, он промахнулся. Независимо от того, как именно работает конкретный отладчик если это, конечно, не "внешний" отладчик какого-нибудь эмулятора, вроде отладчика DOSBox или Bochs: втыкает ли он int3 в первый байт строки (6), или взводит TF, или у него аппаратные точки останова я, кстати не помню, они в 16-битном режиме есть?, но что бы он ни делал, при попытке пошагового выполнения это должно вызвать исключение, чтобы отладчик получил управление. После выполнения первой же инструкции sp у тебя указывает на lab1, стек растет в обратную сторону, поэтому при передаче управления обработчику исключения (прерывания) процессор положит в стек cs:ip и flags, т.е., 6 байт минимум, и тем самым потрет инструкции из строк (6)-(7)-(8), плюс обработчик тоже что-нибудь свое в стек положит, эти данные потрут строку (5) и, возможно, еще немного PSP. Если отладчик втыкал int3, то он восстановит кусок инструкции в (6), или не восстановит, похуй - все равно при возврате из обработчика прерывания вместо кода будут байты адресов, т.е., мусор.
То же самое произойдет в том редком случае, когда после выполнения одной из первых трех инструкций тикнет таймер, или произойдет еще какое-нибудь аппаратное прерывание, поэтому это не антиотладка, а говно генератор псевдослучайных багов.
>>62350
Лол, а поведение без отладичка-то я и не описал. В общем, в 90h - это инструкция NOP, в строке 7 две эти инструкции кладутся в стек (т.е., SP=SP-2, word[SP] = 9090h), затирая тем самым инструкцию в строке (8), поэтому если каких-то внешних прерываний не будет, то вместо int 20h выполнится два nop, и потом управление уйдет в строку (10).
Так же, как и не в асме. Что тебя интересует?
struct ISomethingVtbl
Method1 dd ?
Method2 dd ?
...
MethodN dd ?
ends
struct ISomething
vt dd ? ; указатель на ISomethingVtbl
ends
...
mov eax,указатель на ISomething ; например, от CoCreateInstance
push push push аргументы
push eax ; this
mov ecx,[eax+ISomething.vt] ; указатель на ISomethingVtbl
call [ecx+ISomethingVtbl.MethodN]
test eax,eax
js failed
> А как мне пошарить то в этой LDT?
GetThreadSelectorEntry() даст тебе базу сегмента по его селектору (не работает в 64-битной винде). Алсо, в самом TEB лежит нормальный, линейный адрес TEB, поэтому в ольке можно в окне дампа перейти (Ctrl+G) по [fs:0x18] и [gs:0x30] и смотреть, а в x64dbg это будет fs:[0x18] и gs:[0x30] для 32- и 64-битного кода соответственно.
> почему несколько сегментных регистров имеют это значение
Потому что в x86-64 "сломали" сегментные регистры, и база из дескриптора больше не учитывается, но для fs/gs базой можно манипулировать через MSR (из ядра).
В процесс-хакере нашел object address. Это что? Ссылка на KEPROCESS структуру?
Нашел кажись, анонасы. Вот может пригодится кому: NtQueryInformationFile msdn
В этой статье написано про "слово"
> Запись word означает, что мы переопределяем размер переменной (она объявлена как DWORD) и обращаемся к младшему слову.
Собственно чё это значит?
Да.
Что не понятно? Что такое слово? Или разложение более крупной единицы на младшую/старшую часть?
Машинное слово - платформозависимая хрень, равна разрядности регистров процессора (покури хотя бы вики). В твоей статье используется 16 разрядный режим (см комментарии к коду), word - 16 бит/2 байта. Двойное слово - 32 байта.
Очепятался жи
Надеюсь ты еще здесь. Пытаюсь тоже самое провернуть в ядре. Знаю что можно динамически получать адрес RtlInitUnicodeString + MmGetSystemRoutineAddress. Можно улучшить как-нибудь?
Бля, какой же ты олдфаг, братишка.
На TMS320C6000 похоже.
PCMCAS500, кажется.
Как их хранить? Мне нужно сделать между ними хоr и я черт его знает как их разделить пополам.
Мне нужно байт разделить на две тетрады.
То бишь 10101010 нужно поделить на 1010 и 1010 и между ними сделать хоr, если я правильно задание понял.
(Дан массив из 5 байтов. Рассматривая его как массив из 10 тетрад, найти «исключающее или» всех 10 тетрад.)
Не к спеху на самом деле, сдача только через неделю, но задание странное. Я нипонил.
Можно еще поксорить сначала все числа как есть, байтами: a0 ^ a1 ... ^ a4, а потом уже поксорить куски результата, как сделал ты.
ОП, АЛЛО? ГДЕ ПЕРЕКАТ? ТЫ ЖИВ ТАМ ВООБЩЕ?
>>67865
Я тут поклацал, поклацал в турбоассемблере(такие дела, у нас изучают это).
И выводит вроде не то.
Help, please :3
Может я не то делаю, и нужно с байтами по другому.
https://ideone.com/bdBqe3
24 строка. У тебя BX уехал в ебеня.
А в 25 вообще обнуляешь.
А в 28 берешь [BX+1]
Хуйня какая-то.
4 xor 7 xor 11 xor 6 (23=00010111, 0001 xor 0111=0110=6)xor 5 = 11
>ОП, АЛЛО? ГДЕ ПЕРЕКАТ? ТЫ ЖИВ ТАМ ВООБЩЕ?
Подожди сейчас сделаю. Если бы не ёбанная рекапча, давно бы сделал.
Это копия, сохраненная 24 апреля 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.