В этом треде мы изучаем самый компактный и низкоуровневый язык Ассемблер и смежную с ним область: Реверс-инженеринга (RE).
Вы пишите на ассемблере или собираетесь начать на нём писать? Программируете микроконтролёры, пишете драйвера для ОС, а то и саму ОС? Вам сюда. Вы изучаете алгоритмы работы закрытого софта, пишите патчи бинарников? Вам тоже сюда.
Попрошайки с "решите лабу по асме за меня" идут в общий тред, а лучше нахуй.
Инструменты для 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) Остальное
>>1301039 "Внутреннее устройство Windows" 7 издание. Ну или 6, или любое другое, там внутрянка не меняется. Или тебе что-то другое? >>1301103 >У Архивача очередной раз отключили домен А я то думал, что у меня не открывается.
>>1301223 fld dword[my_float] fstp qword[my_double]. Ну или сразу на стеке. Можно и вручную, но это битоебля на несколько десятков инструкций, плюс обработка всяких денормализованных чисел, бесконечностей и прочих NaN.
Очередной раз ассемблер выебал мой мозг. В Fasm, как я думал, выражение типа word[metka] возвращает значение размером в 2 байта, содержащееся в памяти по этому адресу; но metkaбез квадратных скобок вернет pointer. Но тогда почему при работе с FPU, если я хочу записать в память значение из вершины стека, я должен написать fstp word[metka], а не fstp metka? Ведь в первом случае, как мне казалось, я передаю как аргумент ЗНАЧЕНИЕ, содержащееся по адресу metka, и логичнее был бы второй вариант. Разъясните этот момент, плиз.
>>1301350 > я передаю как аргумент ЗНАЧЕНИЕ > логичнее был бы второй вариант Твоя проблема в том, что ты мыслишь в терминах Си. Ты ничего никуда не передаешь как аргумент. Инструкция - не программа (нет, ну на самом деле микрокод и все дела, но это другая история). Ты пишешь инструкции (т.е., указания процессору, что делать), у которых могут быть операнды (указания, с чем делать). Ассемблер их кодирует, представляя их в более удобной для выполнения форме.
При этом и ассемблеру в листинге, и процессору в закодированных инструкциях нужно как-то отличать 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] сработает.
В очередной раз я зачем-то написал длинную и бессвязную простыню в ответ на простой вопрос.
>>1301383 > fstp word[metka]: скобки есть, инструкция что-то сделает со значением в памяти. Но в том-то и дело: эта команда записывает в память значение из вершины стека fpu. То есть, эта команда использует адрес, но квадратные скобки говорят о том, что, как ты сам сказал, инструкция что-то сделает со значением в памяти.
Вообще, я понял это так: конкретно в случае с этой командой, fasm интерпретирует подобную запись с квадратными скобками и dword/qword не как отсылку к значению, записанному в памяти по адресу metka, а как информацию о том, что записать в память — float (dword) или double (qword).
> Например, напишет туда. Но на самом деле FPU в значения половинной точности не умеет, а fasm об этом знает, поэтому тоже будет ошибка синтаксиса. Вот fistp word[metka] сработает. Word я написал чисто условно, пусть это будет qword или dword, не важно.
> Поинтеры остались в Си. Значение метки - численное значение адреса. Виноват, зря использовал слово, значение которого не знаю. Под поинтером я подразумевал как раз то самое численное значение адреса. Думал, это одно и то же.
>>1301402 > То есть, эта команда использует адрес, но квадратные скобки говорят о том, что, как ты сам сказал, инструкция что-то сделает со значением в памяти. У тебя в скобках просто число. Считай, что там 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-битный.
>>1301238 Рано радуешься, там вышел только первый том, второй ещё или не вышел, или не переведён. Впрочем можешь смело читать 6 издание, там много чего подходит, я как читавший всё со времён третьего говорю.
Господа асмоебы, вкатываюсь после большого перерыва. Поясните, в x64 теперь у нас новые регистры общего пользования, которым даже имена поленились придумать, а старые 64-битные теперь зовутся rax, rcx и так далее, да?
>>1303274 Да. Буковки в именах регистров, пришедших из 32- 16-битного кода, означают accumulator, base, counter, data, source index, destination index, base pointer и stack pointer соответственно. Некоторые инструкции и режимы адресации требовали строго конкретных регистров, потом ограничения ослабили, а у 8 новых регистров, добавленных в x86-64, нет никаких исторических употреблений, нет имен, поэтому и буковки им не нужны. В других архитектурах, где регистры более-менее равноправны с рождения, циферки использовались для большинства регистров изначально.
>>1303301 Спасибо, я в курсе про accumulator и так далее, все-таки несколько лет занимался этим, но все равно спасибо. Но как же stosd и т.п. команды, им же esi,edi нужны по идее, равно как и циклы ecx.
>>1303312 > Но как же stosd и т.п. команды, им же esi,edi нужны по идее Ну так я сказал, что не отменили, а ослабили ограничения, т.е., значительно расширили эффективную адресацию, например.
Хотел сохранить rsp куда-нибудь в xmm0 и получить на один регистр больше, но оно так не работает почему-то, ловлю рандомные сегфолты, а gdb говорит, что не может прочесть память, хотя там просто из одного регистра в другой данные перекладываются, даже нет обращений к памяти. Пиздец ограниченный регистр этот ваш rsp, нельзя им нормально пользоваться, даже если мне стек не нужен.
>>1303510 Ну и то, что какие-то регистры могут быть базой/оффсетами при чтении из памяти, а какие-то нет — тоже полный пиздец. То есть для многих задач эффективное количество регистров оказывается намного меньше, чем 16.
>>1303312 >Но как же stosd и т.п. команды, им же esi,edi нужны по идее, равно как и циклы ecx.
Микроархитектурка порешает, так что в 2к18 этим наследием дремучих cisc-времен заморачиваться не стоит.
Да и в давние времена зилога тру-хацкеры этих еба-инструкций делающих что то сложное чурались и во всей демосцене на спектурме ты ничего кроме простых 8080 опкодов без всей этой зилоговской поеботы не найдешь.
>>1303653 > так что в 2к18 этим наследием дремучих cisc-времен заморачиваться не стоит Да что ты говоришь? А между тем, начиная вроде бы с Ivy Bridge, явный цикл снова сосет у rep stos/movs.
Аноны, я интересующийся/начинающий не суть. Поясните за отрицательные числа. Обычно в книгах так: берём число (7 младших бит онли), инвертим, старший (8-ой бит) ставим в единицу и готово.
Но т.к. профессору похуй, что ты там нахуевертил, каким образом пояснить ему, что это отрицательное число (например, это -5, а не 251). Возможно, это где-то дальше в книге есть, но пока что даже ремарки, что это обрабатывается программно, самим погроммистом, читайте дальше, в книге есть нет. От этого нет полноты картины.
>>1304784 Числа не числа, знаки не знаки Так как это работает? Как мне правильно записать, сохранить и считать отрицательное число? Шо для этого сделать надо? Куда гуглить? Какая схема работы?
>>1304728 Не используй спойлеры в тексте, если уважаешь читающего.
У тебя арифметика по модулю 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 вычислить -x, тебе нужно вычесть 256-х. В двоичном коде это делается инвертированием всех битов. Называется это дополнительный код, так как x + (-x) = 256 = 10000000b
Дальше у нас стоит задача избавиться от неоднозначности - ведь на самом деле мы не можем отличить -x и 256-x. На уровне процессора ты ничего не сделаешь. Но тут приходят на помощь типы данных.
И тогда мы говорим "а старший бит у нас это на самом деле знак". И мы получаем уже знаковую переменную. Или не говорим - тогда получаем не знаковую.
>>1304728 >берём число (7 младших бит онли), инвертим, старший (8-ой бит) ставим в единицу и готово. Не совсем >>1304784 >-1 и 129 это одно и то же Даже близко нет.
>>1304800 > Так как это работает? >>1304824 > -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.
>>1303534 Есть. Вопрос не понял, берется да пишется. Любую работу тебе проще начать с модификации готовых сорцов под свой код, даже декомпилировать ничего не требуется.
>>1303817 Майкрософтами "владеют" через акции, это в основном менеджеры (поскольку старые девелоперы там двигают в менедмент).
Демомейкеры (втч старые) не "боги". Большинство работает программистами или игровых движков или графики или просто тупо в геймдеве.
Но некоторые сумели да. Например Fredrik "Mr. H" Huss и Magnus "Vogue" Högdahl, составлявшие демогруппу Triton, авторы FastTracker позже образовали Starbreeze Studios https://en.wikipedia.org/wiki/Starbreeze_Studios
jg .L2 это "jump greater" на метку .L2 это происходит после того как eax проверяется на 0. Поводи мышкой над командами ассемблера. Выбери другие микропроцессоры или компиляторы и посмотри какие у них команды (опцию компилятора -m32 может понадобиться убрать)
Аноны, почему нельзя загрузить число в стек FPU, заранее не записав его в data section? Почему нельзя написать fild 10 или fld 12.5, но можно написать push 132?
>>1305292 > Нужно ли каждый раз прописывать в программе инициализацию сопроцессора? Если у тебя контролируемая среда: твоя собственная программа, нормальная ОС, все соблюдают конвенции вызова (в том числе и чистят стек), исключения замаскированы и т. д., то не нужно.
> FINIT или FNINIT? fninit, чтобы не свалиться на чужом исключении.
> почему нельзя загрузить число в стек FPU Потому что когда дизайнили FPU, он был отдельным устройством, и immediate-операнды там впихнуть было некуда физически: либо опкод ему говорил, что операнд - стек FPU, либо FPU должен был продолжить операцию с памятью, которую начал центральный процессор (т.е., процессор выставлял адрес на адресную шину). Чтобы поддержать immediate-операнды, потребовался бы более сложный дизайн. Потом FPU запихали в проц, но дизайн опкодов остался.
> можно написать push 132 Центральному проецссору (было) проще, у него декодер вычитывал всю инструкцию, вплоть до 15 байт, а не ебался через ESC-опкоды.
>>1305324 > Ну вот хочу я умножить число на два. Сложи его с самим собой.
> Мне ради этого забить в data section Подразумевается, что код генерит оптимизирующий компилятор, а не макака.
>>1305394 >> Ну вот хочу я умножить число на два. >Сложи его с самим собой.
>> Мне ради этого забить в data section >Подразумевается, что код генерит оптимизирующий компилятор, а не макака.
Двачую этого. Чтобы не ебать мозги, напиши код на Си, откомпилируй годным компилятором и посмотри в IDA или HIEW как там делаются операции. Нормальный компитятор таки суммирует число с самим собой вместо умножения на 2 и еще много чего такого хитровыебанного, до чего ты не дойдешь сам без охуительного опыта. Ну или велосипеды будешь изобретать постоянно.
>>1305795 Я не имел в виду, что анон макака, потому что кладет константы в .data. Компилятор их тоже туда кладет, но самостоятельно, без необходимости бесполезной ручной работы.
>>1305795 >Чтобы не ебать мозги, напиши код на Си, откомпилируй годным компилятором и посмотри в IDA или HIEW как там делаются операции. Вся суть асма в 2018
>>1305820 В 2018-м с 64-битными регистрами (для особо упоротых можно юзать 128-битные, по факту это RDX:RAX), можно реализовывать ОХУИТЕЛЬНО точные и быстрые fixed-point вычисления.
>>1305814 Много умножений-делений сишные компиляторы делают изумительно. Я охуел, когда умножение на 5 через команду LEA много лет назад начал делать интеловский компилятор, равно как и деления сдвигами-вычитаниями.
>>1305962 Всё это охуительное дрочево со сдвигами и магическими константанми это конечно круто, но бывает, что нужно делить, например, на 5.3841, и это придётся хранить в константе.
>>1306309 Да дели, никто не против. Я просто еще раз говорю, что лучше всего алгоритм реализовать на Си, откомпилять, а потом перенести в ассемблер, отшлифовав уже там по вкусу (хуй знает, что тебе надо - размер или скорость).
Сап, двач. Есть вопрос: существуют ли проекты для графического отображения выполненных инструкций в отладке? Или хотя бы вывод в текстовый файл списка только тех команд программы что выполнились до какого-нибудь брейкпойнта?
>>1307138 > существуют ли проекты для графического отображения выполненных инструкций в отладке Да, это такая штука, которая называется отладчик. Представлены в основном в винде, но практически все поддерживают различные варианты трейса, запускаемые одной кнопкой. В линуксах комфортно отлаживаться не любят, предпочитая пердолиться в gdb.
>>1307542 ; push arguments in reverse order (для rand нинужно) call [rand] ; add esp, n*4 (где n - количество аргументов выше) ; что-то делать с eax Можешь посмотреть, как анон на фасме вызывал в прошлом треде: >>1300720
>>1307715 Мне стоило уточнить вопрос: куда помещается значение, которое возвращает функция? > что-то делать с eax То есть, это значение будет в eax? Все ли функции, которые возвращают что-то, используют для этого eax? А если нужно 64 бита? edx:eax? Где вообще можно ознакомиться с подробной информацией о конкретной dll-библиотеке, о ее функциях (о входных и выходных данных в том числе)? Справка по функциям C/C++ не ответила на вопросы по выходным данным в функциях в ассемблере.
>>1307767 > Мне стоило уточнить вопрос: куда помещается значение, которое возвращает функция? В 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.
>>1307770 То есть то, куда функция должна возвращать данные, прописано в соглашениях о вызове? И там, как я понял, указано, что 32-битные значения (в pe32) записываются в eax, 64-битные в edx:eax, а вещественные числа - в стек fpu, так?
Аноны, киньте книгу/ресурс почитать о формате PE, желательно разжеванный до мелочей материал. Я уже блять не могу, какие-то ебанутые структуры в структурах структур, все эти секции, хедеры и прочие пердолинги. С меня как всегда.
>>1307813 Гугл, "Крис Касперски путь воина", потом спеку Microsoft, чтобы понять, что у Криса куча ошибок. И не стесняйся брать одновременно хекс-редактор и какой-нибудь высокоуровневый вьювер (например, CFF Explorer, или что там сейчас модно) и смотреть на нескольких примерах.
>>1307813 если найдешь чё нибудь годное про современные винды - скинь сюда пж, тоже интересно. а то такое чувство, что позже 2010 никто не писал про нововведения в PE
>>1308824 > Какой нибудь фоллаут2? Считай по килобайту в день минус рантайм кажется, что это мало, но ты не будешь заниматься этим каждый день, где-то будешь тупить, к некоторым функциям будешь возвращаться, так что это еще очень оптимистичная оценка, даже с учетом HexRays.. Фоллаут весит метр. Понимаешь, в чем подвох?
>>1308824 >Что? Давно пытаюсь перевести valkyria profile на ps1 чё говорить.. игра пиздатая, если получиться понять алгоритм то можно и остальные игры от tri-ace перевести. Ща поверхностно расскажу что сделал(не цепляйтесь за терминологию, уже подзабыл), игра зашифрована slz-алгоритмом, дешифратор в инете есть. Я разбил весь диск на slz-куски(много получилось), перекодировал и соединил, в аськах можно найти некоторые слова, типа Lenneth, Start чёто такое. Я так понимаю, там своя таблица символов, надо разобраться как она работает. Инструментов в сети хватает, там чел перевёл на испанский и лежат исходники на Lua(я не шарю), тексты можно скомуниздить из переведённой манги. Если что вечером приду с работы.
>>1308890 Всё, я понял что нужно делать, не нужно никаких исходников. Если я правильно понимаю, то на ps1 архивируют инфу кусками для экономии места на диске, вроде бы обычная практика. Значит когда будет текст на экране, нужно поставить паузу в отладчике, думаю таблица символов должна находиться в памяти. Теперь надо просто найти какие slz-куски загружены в память(тупо копипастить hex из разархивированного куска в поиск по памяти), наверняка в одном из них и будет таблица. Потом понаставить бряков на обращение к таблице и должно получиться. Скорей бы выходные.
>>1310296 Я лично просто не понял вопроса. > таблица символов должна находиться в памяти Какую таблицу ты ищешь? Трансляцию в ASCII? Ее может не быть, потому что она никому нахуй не нужна на консолях. Вот есть у тебя квадратная текстура с глифами (буквами), и когда игра рисует текст, она копирует нужный глиф из текстуры, вычисляя позицию в зависимости от численного значения символа. Соответственно, кодировка текста зависит лишь от позиции соответствующего глифа в текстуре и может быть абсолютно любой (в том числе и отличаться в зависимости от шрифта). Могут быть и многобайтовые символы.
>>1310318 Ну ты сказал что я думаю, только сложно. Просто я раньше не замечал что у букв есть тень, значит это текстура. Ну и нужно просто найти обращение к этим текстурам, они наверняка в одном slz-куске, и у того чувака с исходниками тоже фигурирует перерисовка текстур. Просто раньше не понимал как это делается. А то что в аськах стал находиться текст, это к тому что двигаюсь в нужном направлении.
>>1310318 >она копирует нужный глиф из текстуры Там много этих slz-кусков, больше ста точно(и то что это прям куски инфа 100%). Значит игра не подгружает их с диска по отдельности, значит во время прорисовки текста все эти текстуры в памяти - таблица символов (образно говоря), и подгружаются они из одного куска или нескольких(приставке же нужно время чтобы успеть их разархивировать, не будут же они для каждой буквы каждый раз разархивироваться).
>>1310385 >в какой-нибудь nana нельзя Пробовал, находит слова только в аськах. Я не представляю как на lua можно реверсить игру, это же оч. высокоуровневый язык.
>>1310388 > Пробовал, находит слова только в аськах. Это не хекс-редактор, это смотрелка графики (если повезло, и она не пожата ничем).
> это же оч. высокоуровневый язык Ну хуй знает. По мне - это наоборот плюс. Я форматы файлов питоном разбираю - все структуры данных уже в комплекте, не нужно ничего переизобретать, заебись.
Реверсач, как можно получить дескриптор процесса кроме OpenProcess/Nt/ZwOpenProcess/CreateProcess? И еще вычитал, что можно что-то нашаманить с NtMapViewOfSection и писать/читать память без открытого дескриптора, это правда? думаю что нет
>>1310399 >Это не хекс-редактор, это смотрелка графики (если повезло, и она не пожата ничем). Вот если сработает, то нихуя себе ты мне помог. Конечно не пожата, я же всё уже разжал. Завтра выходной, сегодня пивко, поэтому завтра займусь.
Я кажется разбил на slz-куски только slz1 и slz2, они простые, ищутся просто по slz в аськах. А slz3 содержит в заголовке slz, потом кажется кол-во байт в куске, потом 03h. Я собсно и написал ту прогу с видео для поиска таких заголовков. Завтра буду вспоминать.
>>1310791 Читаю и записываю в память другого процесса. Также интересует, как можно повысить скорость чтение/записи памяти. Я использую NtReadVirtualMemory и NtWriteVirtualMemory для этого.Еще вычитал, что можно зашарить секцию/память/что-то там еще с помощью NtMapViewOfSection, тем самым увеличив скорость чтения/записи и тем самым минуя ситуацию с вечно открытыми хэндлом.
>>1310435 >>1310854 Бумп реквесту, анончики! Выкопал инфу из баянистого 2006:
РЕПАМИНГ СТРАНИЦ — ОТОБРАЖАЕМ ФИЗИЧЕСКИЙ АДРЕС СТРАНИЦЫ, КОТОРУЮ МЫ ХОТИМ МОДИФИЦИРОВАТЬ, НА ВИРТУАЛЬНОЕ АДРЕСНОЕ ПРОСТРАНСТВО «СВОЕГО» ПРОЦЕССА ПОСРЕДСТВОМ ВЫЗОВА ФУНКЦИИ NTMAPVIEWOFSECTION. НАЗНАЧАЕМ ВСЕ НЕОБХОДИМЫЕ ПРАВА И АТРИБУТЫ, ПОСЛЕ ЧЕГО ДЕЛАЕМ С НЕЙ ВСЕ, ЧТО ХОТИМ! ТАКИМ ОБРАЗОМ, МОЖНО ОТКРЫТЬ ДОСТУП К ЯДРУ ДАЖЕ С ПРИКЛАДНОГО УРОВНЯ, ПРИЧЕМ БЕЗ ПЕРЕЗАГРУЗКИ!
Кто-нибудь может конкретнее объяснить как это работает? Кроме того, эта информация еще актуальна или нет?
Господа, я очередной пытаюсь выкупить ИДА в этот угрюмый пятничный вечер.
Есть экзешник, в CE, к примеру, функция, которую нужно декомпилировать, она находится по адресу 4D4D80 (или .exe + D4D80), я ее могу там похукать, брейкпоинты, итп, но она достаточно сложная и хотелось бы ее декомипильнуть в хотя бы какой-то сишный код.
Первая проблема, с которой я столкнулся в ИДА - я не могу найти эту функцию, как бы я не пытался, прыгал по адресам, по адресу 4D4D80 находится какая-то ссанина ( возможно это подадреса сегментов ), мне просто хотелось бы, чтобы адреса были такие же, как и в CE, потому адреса в СЕ соответсвуют тому что я читаю/записываю WriteProcessMemory().
Вторая проблема, это перевод в сишный код, я знаю что ИДА это умеет и могёт, на оундкоре считается чем-то вроде классики, если не ошибаюсь, эта фича называется Pseudocode, но я не смог нигде найти упоминаний о существовнии подобного (IDA 7.0.170914)
>>1311270 > теперь осталось найти ту функцию Во-первых, ты можешь приаттачиться отладчиком иды к процессу, тогда адреса (скорее всего) совпадут. Если не совпадут, читай про ASLR, запатчи флаг ASLR-aware в заголовке. > по адресу 4D4D80 находится какая-то ссанина Во-вторых, возьми какой-нибудь детектор упаковщиков (peid, protection id, detect it easy или что там сейчас модно) и узнай, не запакован ли файл. Если упакован - распакуй. Если не можешь, см. во-первых. В-третьих, нахаляву ничего не бывает, читабельный сишный код получается после длительного анализа.
>>1311301 Да нет, тебе IDA (в случае PE .exe) имитирует загрузку программы и показывает такие же виртуальные адреса, как в памяти. И даже если она показывает не те адреса (например, ASLR в системе, или ты грузишь DLL, а ее базовый адрес занят), всегда можно сделать Rebase program в IDA. Но она показывает то же, что и винда видит при старте программы. Если программа после запуска сама себя модифицирует (распаковывает), то IDA, естественно, об этом узнать неоткуда, и ты видишь мусор. Если ты знаешь алгоритм, или серьезно ковыряешься в упаковщике, можно написать статический анпакер, который прямо в IDA будет "выделять" память (создавать дополнительные сегменты) и делать PatchByte так же, как делает стаб упаковщика в рантайме, а можно "просто" запустить упакованую пограмму под отладчиком, дождаться, пока стаб ее распакует и после этого сдампить результаты в файл, на который уже можно натравливать IDA. Ну после ребилда и исправления импортов, если они интересуют.
>>1311316 Теперь память совпадает, но в ИДА не формируются инструкции из байткода, соответственно F5 не работает. Возможно из-за динамичности памяти они решили не обновлять это, как делает СЕ?
Полу-теоретический вопрос. Вот есть игра, в ней из мобов надо выбивать итемы всякие и они падают на землю. Хочу при выпадении определённых вещей чтоб мне мой скрипт пищал. Прочитать память из скрипта я смогу, но как её найти? Как через чит энжин найти память, которая хранит все вещи на земле? Вообще не понимаю что искать.
Нагуглив, я предположил что она вычитывает информацию из https://en.wikipedia.org/wiki/Win32_Thread_Information_Block , которая уникальна для каждого треда. И, соответственно, вызвав функцию из разных потоков можно получить разные результаты (I believe).
Первый вопрос, как прочитать через WinAPI какие треды в процессе какую информацию содержат в этой структре.
Второй, я так понимаю, что эта фича была сделана чтобы одна и та же функция но в разных потоков занималась обновлением всей хуйни, только в первом треде обновляются объекты, в другом - инвентарь, в третем - еще что. Насколько это может быть похоже на правду?
Сап двач нужна ваша помощь У меня в универе изучают ассемблер TASM ( поставлен он там через dosBox никто не может объяснить как они эту парашу ставили ) Мне нужно скачать TASM но я хз где его скачать рабочий и как с ним работать если кто может поделитесь ссылкой
>>1311791 > как прочитать через WinAPI какие треды в процессе какую информацию содержат в этой структре Ты заебешься. Лучше похукай в игре что-нибудь. Но если очень хочется: перечисляешь потоки в процессе, делаешь каждому GetThreadContext, достаешь оттуда SegFs, скармливаешь его GetThreadSelectorEntry, собираешь линейный адрес TEB, разбираешься, как работает TLS, парсишь TLS, профит. Тебе оно надо?
> что эта фича была сделана чтобы одна и та же функция но в разных потоков Это вообще может быть что-нибудь околосистемное. Например, банальные thread-local данные сишного рантайма.
Неужели нет применения? Ничто как ассемблер не позволяет так плотно ебаться с компом. Дрова, загрузчики и лоулевел всегда же быть, хоть немного, но нужны.
>>1312768 В 2018 нет. Асм x86 сам по себе это байткод для микрокода внутри процессора, поэтому до железа тебя в любом случае не пустят. А как тасовать этот самый микрокод для более лучшей скоростности лучше знает компилятор.
>>1312773 >Hex-rays штоле Ну как бы да. ._. С появлением hex rays у меня наконец-то стало получаться реверсить, потому что асмовскую поеботу я вообще не воспринимаю, а вот глючный высер hex-rays'а вполне.
>>1312775 Ну уж точно такую сложную вещь как компилятор на ассемблере не пишут. Хорошим тоном считается написать компилятор языка на самом языке - тогда он считается уже зрелым. Ассемблер тебе понадобится только на последней стадии - кодогенерации из одного из промежуточных представлений. Если ты хочешь написать компилятор в 2018, тебе нужно генерить LLVM-код, а LLVM уже превратит этот код в машинный. Так ты построишь минимум велосипедов, потому что LLVM умеет применять к промежуточному коду кучу оптимизаций и делать много чего еще хорошего. А LLVM написана на С++. Вот кодогенератор, если интересно https://github.com/llvm-mirror/llvm/tree/master/lib/Target/X86
Реверсач, сап. Знаю, что меня сейчас обоссут, но лучше помогите! У крестоводов и сибояр есть так называемые фаст-либы, в которых функции это обертки над ассемблерными вставками. Таким образом они повышают производительность, например математических вычислений. Есть ли способ заюзать все это на C#?
>>1312772 > поэтому до железа тебя в любом случае не пустят Это и есть железо. Микрокод много где есть, и если он есть - он неотъемлемая часть проца.
>>1312776 > С появлением hex rays у меня наконец-то стало получаться реверсить Это пока процессор поддерживается рейсами, а процессорный модуль может в систему типов. Но бывает, что все, что у тебя есть - кривой процессорный модуль на питоне, который еще и править приходится. А еще если ты случайно забудешь где-то volatile, или случайно добавишь лишний const, HexRays спокойно выкинет у тебя из функции большую часть логики или парочку вызовов функций, или свернет while до if.
> потому что асмовскую поеботу я вообще не воспринимаю А ты, не зная асма, не сможешь даже заметить перечисленное, не то, что решить проблему.
>>1312772 > лучше знает компилятор Пикрелейтед. На самом деле это древняя VS2005 и еще какой-то баг в компиляторе, потому сам пикрелейтед был собран с /Od, а в той программе, что я реверсил, качество кода вокруг цикла намекает на сборку с /O2 или /Ox.
Есть, но смысла нет - проблемы с производительностью сисярпа и любого другого безопасного языка не в качестве компилированного кода, а в многочисленных обёртках с проверками на каждый чих.
> Анончики, что можно написать на асм?
Буткод для операционной системы разве только, там есть определенные команды, которые нужно именно из асма дергать, что бы проц в защищенный режим c нужной разрядностью перевести, да виртуальные машины - там нужно тоже пару специальных опкодов дергать.
Да и то первое было актуально во времена обычного биоса до UEFI, сейчас UEFI уже с бута мбр на блюдечке защищенный режим подгоняет.
>>1312896 >А ты, не зная асма, не сможешь даже заметить перечисленное, не то, что решить проблему. ._. Ну на самом деле да. Но реверсинг это, пожалуй, единственное применение асма.
>>1313466 >теперь Ты потерял ссылку на новость, в которой изобрели ИИ?
Что там внутри?Аноним19/12/18 Срд 19:47:17#163№1313703
Писать простейшие программы формата PE, типа "Hello, world!", оказалось несложно: подключил msvcrt.dll с помощью макросов из import32.inc, импортировал методы — профит. Но что из себя представляют эти функции? Например метод exit: как он работает? Программа должна как-то обращаться к ОС, но засчет чего это происходит? С форматом MZ вроде ясно — вызываешь прерывание DOS, а система интерпретирует это как призыв к действию и выполняет какой-то свой код (хотя тут тоже не ясно, что именно происходит дальше, но, по всей видимости, работа с машиной на низком уровне, с этим еще можно разобраться). А вот с PE не очень понятно, где эта точка соприкосновения с системой, когда мы говорим ей "сделай ЭТО, шиндовс". Объясните это, пожалуйста, если не трудно.
>>1313710 > Базовые функции реализованы в динамически подключаемых библиотеках kernel32.dll и advapi32.dll; базовые модули графического интерфейса пользователя — в user32.dll и gdi32.dll У меня все еще вопросы: 1) Выходит, я не могу написать 32-битную программу без использования этих библиотек, или других, использующих первые, так? 2) А что тогда содержится в самих dll, если это — базовые функции? Код, который выполняется системой на самом низком уровне при работе непосредственно с машиной? 3) В msvcrt.dll функции тоже базовые, или выполняются не без использования kernel32.dll?
>>1313722 Это уже не по асму вопросы, а по устройству системы.
1. Можешь, но kernel всегда будет проецироваться в твой адресный процесс 2. Просто функции (библиотека, понимаешь?). Иногда может и сквозь HAL в самый низ уйти. 3. По-разному.
>>1313703 > Например метод exit: как он работает > вызываешь прерывание DOS exit сбрасывает буферы файлов, выполняют прочую деинициализацию и под конец дергает ExitProcess(), это уже Windows API. ExitProcess делает NtTerminateProcess, который вызывает примерно такое же прерывание, как в DOS (int 2e). Но на самом деле через прерывания ходить в ядро медленнее, поэтому в современных ос оно делает sysenter. Ну и там дальше уже ядро разбирается.
>>1313722 > Выходит, я не могу написать 32-битную программу без использования этих библиотек, или других, использующих первые, так? Ты можешь напрямую дергать ядро, но номера системных вызовов ("функций" прерывания, если брать DOS-овые аналоги) меняются от версии к версии, поэтому такой код как минимум может не заработать в очередном билде винды. И неудобно это.
> что тогда содержится в самих dll, если это — базовые функции Некоторые функции целиком реализованы в юзерспейсе. Другие - обертки, которые делают работу с системными вызовами более удобной.
> msvcrt.dll функции тоже базовые, или выполняются не без использования kernel32.dll? Сводятся к kernel32.dll. MSVCRT, как следует из названия (MS Visual C RunTime) - это вообще сишный рантайм, реализующий функции, которые требует реализовывать сишный стандарт, к Windows оно имеет лишь то отношение, что в комплекте винды куча софта, написанного на Си, и которому этот рантайм был нужен. Был - потому что свежие рантаймы лежат в SxS, а этот древний, от шестой вроде студии.
Привет, аноны. Объясните, пожалуйста, как работает static linking. Решил поэкспериментировать (пикрил), но програмка крашнулась. Что не так? Ну, то есть понятно, что не рационально впихивать весь dll в приложение, где используются только две функции, да и смысла линковать статически конкретно эту библиотеку нет, но разве это не должно было сработать? Значения getch и exit — entry point'ы, взял их из dependency walker.
>>1314081 >>1314087 > Уууу, бля. Вот у меня абсолютно точно такая же реакция. Короче, так оно не работает по двум с половиной причинам: 1) Когда винда грузит библиотеку, это не значит, что она просто выделяет память и тупо копирует туда файл. Она парсит много всяких структур и выделяет память сложно. Пересказывать весь формат PE я не буду, лучше найти какую-нибудь готовую статью. Но очевидная проблема в том, что файл на диске отличается от образа в памяти. 1.5) Кроме того всяких вещей, связанных с загрузкой собственно образа, загрузчик также выполняет динамическую линковку (связывание), т.е., пробегается по импортам длл и впатчивает в них адреса тех функций, которые импортируются. До этого попытка вызвать любую импортированную функцию приведет к крашу (там есть некоторые исключения с привязанными длл, о которых я лучше промолчу). 2) Кроме загрузчика, еще и сама длл обычно производит всякую инициализацию, получая управление в DllMain в разные моменты своей жизни. Естественно, ненициализированная длл работать не будет.
В любом случае, статическая линковка - это не просто включить файл. Это еще и разрешение внешних ссылок, и выделение памяти под .bss, и обработка релоков, и куча других мелких задач. Подлинковывать какой-нибудь .obj без внешнего линкера современным FASM-ом теоретически можно (с ограничениями), но это совсем не две строки, и вообще это извращение.
>>1314140 Ты все делаешь не так. Ты не выделил память под функцию, ты не пометил память, как исполняемую, ты читаешь с "r" вместо "rb".
>>1314153 >Ты все делаешь не так. Ты не выделил память под функцию, ты не пометил память, как исполняемую, ты читаешь с "r" вместо "rb". Сделал все по заветам твоим, но сосу.
>>1314159 Под какой компилировалась - никак (ну разве что линкер строчку с путем оставит или что-нибудь еще). Под какую - обычно указано в одном из полей заголовка исполняемого файла. Например IMAGE_NT_HEADERS.FileHeader.Machine для PE или ElfXX_Ehdr.e_machine в ELF.
>>1314161 > Сделал все > ты не пометил память, как исполняемую То, что ты там в ассемблере что-то написал, влияет только на бинарник, который ты из него слинкуешь. А пометить надо память, которую ты маллоком выделил (может не получиться на системе с селинуксом). Алсо, ты точно в чистый бинарник компилируешь, а не пытаешься грузить elf или coff?
>>1313281 >До сих пор пишут в эмбедде, и много. Не очень понимаю, зачем, правда.
Потому что капиталисты по-прежнему жадные и им проще нанять усача за 2000-4000 евро в месяц без учета налогов чтобы тот применив более дешманский МК сэкономил своей байтоеблей от 2 до 20 евро на каждую сраную стиралку/, что при умножении на количество произведенных стиралок дает уже миллионы сэкономленых евреев в зарплату топманагеров и в доход акционеров.
>>1314801 >в настройках декомпилятора есть default radix Не нашел, я пытался, честно.
Эти аррей акссессы меня путают, к примеру, this - тип char ^, this_ptr - int ^. И this_ptr[0x374] != this[0x374], это очень мешает, можно, настроить, чтобы было в виде ^(this + 0x374) или ^(this_ptr + 0x374 * 4). А то менять все типы под char, дабы оффсеты совпадали будет как-то не очень.
>>1315041 > Не нашел, я пытался, честно. Edit->Plugins->Hexrays->Options, справа.
> Эти аррей акссессы меня путают А зачем ты их оставляешь? Делай структуры сразу, без этого крестокод практически невозможно реверсить. Офсеты для отладки будешь подсматривать наведением мыши или табом в дизасм.
> this_ptr = this Тыкай x на this_ptr, чтобы удостовериться, что он присваивается только один раз, тыкай =, мапь на this. Чем чище код, тем легче в нем разбираться.
Анончики, как справляться с чувством ниосиляторства во время изучения этой всей байтоебли? Хочу быть байтойобой и ахуенным спецом, а не тырпрайз макакой... но сложности в обучении каждый раз подводят к тому, чтобы дропнуть все к хуям и вкатываться в тырпрайз. Какие есть советы по этому поводу?
>>1317615 Когда я в конце 90х делал реализацию просмотра JPEG в DOS на чистом asm'е без FPU (ДКП с fixed point это тот еще пиздец), это было в разы проще, чем выучить ебаный Spring Framework для ебаной Java.
>>1317696 Куда прикладывать то? Я практикуюсь реверсить разные хеллоуворды и крякми, ctf-ки решаю. Еще пробовал малварь анализировать, но сэмплы негде брать.
>>1318191 Малварь не так интересно сейчас разбирать. Можешь на https://www.malwaredomainlist.com/mdl.php сходить и набрать себе на любой вкус поделок с платной чисткой фемидой+вмпротект. Но будут там в основном всякие агенты, майнеры да поделки на дотнете. Это раньше весело было увести у пинчевода логи, а то весь ботнет сразу. А сейчас только ctf'ные крякми еще как-то будоражат кровь.
А можно тут попросить помощи? С темой треда относительно пересекается. Есть одно задание по какому-то ctf, категории pwn, с++ прога под Линукс. Хочу, собственно, его решить. Идей нет никаких, хотя довольно долго сижу. Пару предыдущих заданий я там осилил - переполнение, подмена rip, уехали куда надо. Исходник: https://pastebin.com/GcaWX8aE
>>1318421 Ну ок, я не прав, это не просто сраная олимпиадка, а уязвимая сраная олимпиадка, там проверка после find кривая, и можно запатчить длину строки, ну и дальше дело техники.
Здравствуйте, я хочу учить ассемблер и Си для способствованию развития в реверс-инжиниринге.
Моя цель, будучи жителем далекой провинции, выточить напильником из технического и металлического мусора установки для выпуска строительных материалов на основе мусорных отходов, песка, камней, щебня и т.д. За основу хочу взять существующие разработки и с помощью реверс-инжиниринга догадаться как они работают, создать близкий аналог из технического и металлического мусора. После чего построить себе хижину орков из полученных строительных материалов.
Из этого вытекают следующие вопросы: 1) Какие языки программирования надо учить для подобного реверс-инжиниринга? Достаточно ли ассемблера и Си? 2) Насколько углубленно надо учить матан для такой цели? Хватит ли стандартного курса отечественных ВТУЗов? 3) Если я в будущем построю потенциальную хижину, то ко мне сразу на разборки приедут провинциальные коммерсы качать права за то, что я из мусора построился, а не купил у них стройматериалы как все. В связи с этим, какое боевое искусство учить, чтобы по голове сильно не били на тренировках, но чтобы можно было защитить мою потенциальную хижину от разборок коммерсов? Подойдет ли тэквондо ITF, там, вроде, сильно нельзя бить? 4) Как грамотно совместить тренировки, получение умений в программировании и в слесарном деле? Ведь надо будет быть достаточно сильным, чтобы быть готовым к тому, что коммерсы на разборки ездить будут. И достаточно квалифицированным, чтобы создать необходимые установки.
Анончики, поясните за TLS-callback и почему о нем умалчивают. Пикрил, таблица CreateProcess из книги Windows Internals. Здесь сказано, что CreateProcess передает управление сразу к Entry Point. А где тогда находится TLS?
>>1319476 Вот тут: > Заключительная инициализация процесса. все только начинается: вызываются не только TLS-колбеки, но еще и дллки грузятся, вызываются их entry-point-ы и т. д. Но это все частности, поэтому их опускают.
Есть одна программа. Она выделяет память через calloc, но не проверяет, сколько запрашивает пользователь. Так вот, пихаем -1, calloc возвращает NULL ака 0x0. Так как случилось переполнение size_t - прога считает, что предел у нас уехал в максимальное значение 64бит. После этого пользователь может запросить любой элемент массива, но так как мы сломали предел, и указатель на массив 0x0 - мы можем прочитать любой доступный кусок памяти. Так вот, пытаюсь таким образом прочитать стек (подсовывая в качестве индекса адрес начала текущего фрейма стека, найденного через отладчик, конвертированного в десятичное число) - выпадает с SIGSEGV, хотя вроде как не должно. Где я накосячил?
>>1319555 Вот скрины. В данном случае пытаюсь прочитать сохраненный rip, но выпадает SIGSEGV, хотя, по идее, по адресу 0x0 со смещением 0x7fffffffe888 находится наш стек и сохраненный в нем rip.
>>1301036 (OP) Сап. Вопросы касаются архитектуры ПК. 1. Что в иерархии памяти находится ниже? Магнитные или оптические диски? Из этого вытекает 2 вопроса: что стоит дороже и работает быстрее. Я ставлю на то, что ниже находятся оптические диски, но пруфануть не могу. 2. Если запрос к L3 не приносит результата, он передаётся во внешнюю память: а. По шине DDR3 б. По шине PCI в. Запрос никуда не передается Про шину DDR3 я слышу впервые, в гугле тоже ничего не нашел. Однако есть шина данных. Казалось бы, в случае кэш-промоха, идет обращение к ОЗУ, по шине данных, значит ответ по шине DDR3 Но идет речь о внешней памяти, которой ОЗУ не является, хотя если внешней памятью считается все что за цп - тогда ок. В общем здесь я уже даже не знаю.
>>1319726 > ебать в рот gdb и at&t set disassembly-flavor intel в .gdbinit и забыть AT&T как страшный сон пробовал?
>>1319727 > Что в иерархии памяти находится ниже? Магнитные или оптические диски? А одинаково. Если для твоего препода имеет значение технология хранения - с ним что-то не так.
> Если запрос к L3 не приносит результата, он передаётся во внешнюю память Зависит от того, что именно висит в этом регионе памяти.
>>1320163 >А одинаково. Если для твоего препода имеет значение технология хранения - с ним что-то не так.
Не одинаково. Вопрос не про технологию хранения, а про так называемую иерархию памяти, ничего странного в нем нет. Вопрос же "к чему быстрее скорость доступа: к регистрам, к озу" не звучит же странно, хоть ответ и очевиден. Даже если вдруг, появятся (если не уже появились) оптические диски, которые работают быстрее магнитных - иерархия памяти не изменится, и согласно ей, оптические диски все равно будут медленее.
По поводу L3 кэша, имеется ввиду, что нужно лезть в ram(скорее всего), вопрос только по какой из шин. Я нашел 2 варианта: a) cpu -> pci host bridge -> ram (какой-то древний) b) cpu -> data-bus -> ram
>>1320198 > оптические диски, которые работают быстрее магнитных - иерархия памяти не изменится, и согласно ей, оптические диски все равно будут медленее То есть этот способ классификации ничего реально не отражает, и придуман двумя-тремя теоретиками, которые даже друг с другом не в состоянии договориться. На самом деле, оптические диски можно поставить ниже по иерархии не из-за скорости, а из-за того, что они съемные, т.е., не постоянно онлайн, точно так же, как и всякие стримеры нет, не те, которые рожей на твиче светят.
>>1320319 Ну, скажем, насчет ничего реально не отражает это спорно. Все вполне разумно до уровня ЖД. А вообще да, придуман кукоретиками, с этим не поспоришь.
>>1320319 Дело не в том, что они съемные. HDD тоже может быть съемным. Оптические диски очень не любят перезапись. Лучший формат работы с ними - стереть полностью, записать. В этом плане у них чтение более-менее рандомное, а вот запись ближе к стримерам. Иерархия, конечно, из манямирка, но определенный смысл в этом есть.
>>1320538 > Оптические диски очень не любят перезапись Флеш тоже не любит перезапись, и подход там в некотором смысле аналогичен оптическим дискам: писать каждый раз в новые (пустые) страницы (как в сессии на CD/DVD), а грязные блоки тереть в фоне или по необходимости. Значит ли это, что флеш в этой вашей иерархии ниже CD? В моем манямирке, например, он был бы выше HDD из-за практически бесплатного random access. Да и вся эта иерархия должна/упирается в random access. Чем сложнее, тем ниже.
Если я вызову какую-нибудь функцию (допустим, Beep из kernel32) с помощью invoke, введенные в стек параметры ф-ии будут вытолкнуты, но будут ли сохранены значения регистров? Или это необходимо сделать самостоятельно?
>>1323058 Я правильно понимаю, что stdcall — это только про автоматическое выталкивание параметров из стека? А про регистры я ничего не нашел (inb4: плохо искал). Где искать информацию о том, какие регистры будут затронуты той или иной функцией?
google: wikipedia x86 calling conventions google: msdn calling conventions microsoft перепидорасила документацию, теперь из исходной статьи нужно кликнуть по argument passing and naming conventions
> А про регистры я ничего не нашел Стандартно для всех конвенций в x86 (32-битный код): при возврате DF должен быть сброшен, а EBP, EBX, ESI, EDI восстановлены, если ты их трогал. Вот если у тебя внутренняя фукнция (например, ты похукал что-то неэкспортируемое), тогда никаких гарантий или общих требований нет - может понадобиться и ECX/EDX схоронить иногда, это уж как компилятор код сгенерит.
Не тот тред, наверное, но тут разбираются. Решаю я задачи из всяких ctf, категории pwn, в которой нужно вскрыть программу и написать эксплойт, чтобы забрать флаг. Так вот, столкнулся с проблемой. Есть одна программа, я могу управлять ее стеком, ну и соответственно адресом возврата и сохраненными регистрами. Elf x64, включены защиты (PIE, NX, Stack Canary). Я бы не растерялся и устроил ROP-цепочку, разрешил бы исполнение стека и не парился, но в коде нет сисколлов. К программе прилагается еще и libc, т.е, наверное, предполагается, что я должен воспользоваться функциями оттуда, но так как еще и ASLR работает (не знаю, должен ли он быть по условиям, но у себя не выключал) - я не могу просто прыгнуть по адресу libc + смещение нужной функции. Что можно сделать в такой ситуации? Есть ли что почитать?
>>1326382 Asm обычно осваивают с нуля. Так как это самый низкоуровневый из человеко-понимаемых языков. В 20 веке конечно и на машинных кодах писали, но сейчас такие вряд ли существуют.
Тебе не зря советуют изучать еще и Си. Так как писать на ассемблере ты все равно не будешь. Это утомительно, да и не особо нужно. Зато в связке с Си, это может помочь понять, как программы транслируются из высокоуровневых языков в инструкции процессора, через ассемблер.
Я ничего не понимаю, почему так сложно? В первой дизассемблированной строке программа делает push 0xffffffff Во второй push 0x4841а Операнда нет, как понять зачем, нигде не написано. Пойду грузчиком работать.
>>1326588 beginners.re имеет два названия. Реверс инжиниринг для начинающих и понимание языка ассемблера. Так что пробуй его.
>>1326623 > Операнда нет, как понять зачем, нигде не написано. Показывай код. Или сам смотри, что будет дальше - если вызов функции, то смотри, что эта функция будет делать с аргументами. А может это просто SEH-фрейм, если вызова функции нет. В любом случае, понимание кода с неба не свалится, чтобы понять зачем, надо сидеть, смотреть, что происходит и постоянно пытаться понять. Вангую, что ты во втором пуше пропустил цифру. Особенно если это винда.
>>1326711 Бляяя, еще и AT&T, фу таким быть. Я угадал про SEH. Там пушится -1 (для exception level вроде, это крестовая фишка), потом адрес нового обработчика исключений и адрес фрейма предыдущего хэндлера, чтобы сформировать linked list. Получившийся фрейм обработчика пишется в _NT_TIB (fs:0), чтобы винда о нем узнала (потом он удаляется перед ret в обеих ветках). В принципе, весь этот код можно по большей части просто игнорировать, но если ты хочешь узнать подробнее, в сети полно туториалов про внутреннее устройство SEH и про обработку исключений в C++. А вот дальше по 401015 там начинается уже какая-то настоящая работа, вызываются какие-то функции, на которые нужно смотреть, чтобы понять, что делает эта. Я бы на твоем месте выкинул objdump - он пригоден максимум для инспекции сгенерированного компилятором кода, и взял бы вместо него IDA, которая для людей или хотя бы r2, который не для людей.
>>1326817 > еще и AT&T Извините >я был прав это SEH Спасибо большое, почитаю >ida pro У тебя случайно слитой 7.2 версии нет от китайцев? Говорят там inheritance завезли.
>>1326842 > Говорят там inheritance завезли. Очень плохо завезли, мне не понравилось. Обычное крестовое наследование, которое struct foo : bar { ... } уже давно есть, но оно неудобное, поэтому подход с созданием трех struct (struct ClassName { ClassNameVtable ptr, ClassNameFields fields }) по-прежнему рулит.
>>1327611 Тебе вьювер 404 показывает при попытке открыть? 1) Правой кнопкой, свойства, разблокировать, опционально положить в директорию с путем, не содержащим странных символов (мало ли, может ты китаец). 2) Или можешь взять какой-нибудь 7-Zip, и распаковать .chm-ку им. 3) Или можешь смотреть в SumatraPDF, а не в дефолтном вьювере.
>>1328283 Снифаешь USB чем угодно (например, USBlyzer или даже просто wireshark), берешь libusb, пишешь. Если окажется, что винда не дает работать с HID из юзермода, пишешь драйвер или реверсишь драйвер производителя железа.
>>1328415 > Когда вы уже все сдохнете со своим старьем?
Никогда.
А вот что абстрактушки будут делать в ближайшие пару лет (а у них на носу полный конец развитию кремния по муру и заканчиваются техпроцессы, напомню) - вот это действительно вопрос.
Будем развивать компиляторы, добавлять в них ИИ на нейросеточках и машинном обучении и в оконцове победим байтоёбство оптимизаторным оптимизатором, который сможет лучше любого байтоеба код оптимизировать.
А вот вы скоро станете не нужны. Как только наш умный компилятор сможет скомпилить микросервис на Rustе в восьминогую Attiny на 4кб.
Как люди находят находят уязвимости на Pwn2Own? какие скилы нужны для этого? щас дохуя технологий, думаю нет смысла учить все подряд, а нужно сфокусироваться на чем-то одном. Как думаешь анон?
thread.c:1019: internal-error: void finish_thread_state(ptid_t): Assertion `tp' failed. @ A problem internal to GDB has been detected, @ further debugging may prove unreliable. @ Quit this debugging session? (y or n)
>>1301036 (OP) Но ведь, если я тру зондофоб мне же энивей придется создавать свой ЯП с нуля. Откуда я знаю что в ваших FASM.EXE не вшит руткит от васяна? И вы тоже этого знать не можете. А иначе ваш асм нахер не нужен. Поэтому в чём полезность? Набраться опыта перед написанием своего продукта?
>>1329172 Исходники полностью открыты. Берешь тот же самый фасм и собираешь из исходников. Я проверял. Ну, конечно на этапе сборки можно что угодно добавить и без исходников. Да и тысячи строк на ассемблере не перечитать. Но минимальное приложение генерится байт в байт. Главное верить.
>>1329172 > И вы тоже этого знать не можете. fasm достаточно небольшой, а взаимодействия с системой там настолько мало, что можно взять дизасм и поискать руткит от васяна самостоятельно.
>>1329642 В этой области ничего не меняется десятилетиями, ничего принципиально нового ты в свежей книжке не найдешь. Если тебе нужен x86-64 ассемблер, так и ищи книгу по ассемблеру, их дохуя. Если интересно про реверсинг, почитай SAT/SMT by example от того же юричева, что-нибудь про скриптинг ida (и про ее микрокод), про инструментирование, про всевозможные frida и прочие unicorn. Все гуглится по кейвордам, но в основном это не книжки, а выступления, слайды и статьи.
Никогда не писал на ассемблере, на Си и плюсах тоже. В общем не знаю ни про регистры, ни чего такого низкоуровневого. Столкнулся с протоколом MODBUS. Ничего не понимаю. Книг и статей на эту тему почти нет. Посоветуйте что делать, что читать, как практиковаться?
Цель понять разницу между микроконтроллером, промышленным контроллером, микропроцессором, ПЛИС, ПЛК, IOT, СБИС, короче вот это вот все. Понять как их программируют. И понять как программировать управление устройствами по MODBUS.
>>1329728 Все врут! А еще в процессоре бэкдоры. Используй таблички в мануале от интела и декодируй инструкции вручную. В бумажке с ручкой бэкдоров пока вроде не находили?
>>1329676 >микроконтроллером Маленький процессор со своим ПЗУ. >промышленным контроллером Здоровая дура, рулящая технологической линией. Программируется на визуально понятном васяну-слесарю языке, а не на С. >микропроцессором Строгое определение не дам, в большинстве случаев взаимозаменяемо с "микроконтроллер >ПЛИС Программируемая логическая интегральная схема. СБИС, стуктуру которой можно изменить доступным оборудованием. Не лезь пока сюда. >ПЛК То же, что и промышленный (логический) контроллер >IOT Маркетинговый термин, обозначающий чайники с подключением к интернету. Забудь его нахуй. >СБИС Сверхбольшая интегральная схема. Вся современная электроника кроме ПЛИС является СБИС, хотя понятие "сверхбольшая" устарело, т.к. термин введён при царе горохе.
https://radiokot.ru/start/mcu_fpga/avr/ - это ответит на некоторые вопросы. Если есть время и деньги, купи ардуино и ковыряйся с ним по урокам с ютуба. В любом случае, микроконтроллерами занимаются в /ra. Спроси там, они тебе укажут путь.
>>1329816 > Маленький процессор со своим ПЗУ. Главное в нем не пзу, а наличие готовых интерфейсов для ввода-вывода, обычно разнообразных. Чтобы было чем микроконтроллировать.
> хотя понятие "сверхбольшая" устарело Хуй знает, я периодически встречаю в литературе, но только как VLSI - русскоязычные термины умерли вместе с советским союзом.
>>1329824 >Главное в нем не пзу, а наличие готовых интерфейсов для ввода-вывода, обычно разнообразных. Чтобы было чем микроконтроллировать. Ну в ЦПУ на домашних пеках тоже есть готовые интерфейсы зачастую. Может ты и прав, но в таком случае грань между микроконтроллером и (микро)процессором нечёткая.
>Хуй знает, я периодически встречаю в литературе, но только как VLSI - русскоязычные термины умерли вместе с советским союзом. Да, но с тех пор эта "большевизна" выросла в сотни раз. Термин используют, но смысл его несколько утрачен.
>>1329825 > Ну в ЦПУ на домашних пеках тоже есть готовые интерфейсы зачастую Ну как бы да, грань стирается, а десктопные CPU все больше превращаются в SoC.
Есть один экзешник, созданный в Delphi 7 и созданный на-отъебись. Из него можно извлечь какие-то метаданные, связанные с создателем? Имя учётной записи, под который была запущена среда разработки, названия объектных файлов etc. Просто исходники проебались двенадцать лет назад, однао я предполагаю, что они могут быть на одной из подчинённых мне машин.
>>1334386 Кидай сюда, посмотрим. Или сам посмотри банальным hex-редактором или strings (от руссиновича или линуксовым). Но максимум, что ты сможешь получить - путь к проекту и, возможно, названия некоторых юнитов.
>>1334769 IDA славится своей способностью хуево детектить паскалевые строки. Смотри в strings. Боишься консольки - запусти и посмотри в Process Explorer, там в свойствах процесса есть соответствующая вкладка.
Почему из порядка E в 32-битном числе с плавающей запятой отнимается 127, я понимаю. Но как оказалось, это происходит только в нормализованных числах. Разобрался в том, что такое нормализованное и денормализованное число, все понял, за исключением одного момента: КАКОГО ХРЕНА В ДЕНОРМАЛИЗОВАННЫХ ОТ ПОРЯДКА ВЫЧИТАЕТСЯ 126!?
>>1336604 Я еще немного подумал над этим. Кажется, я нашел в этом смысл. Видимо, это происходит потому, что минимальная экспонента в нормализованном числе с плавающей запятой одинарной точности равна 2-126. Денормализованные числа, как я понял, заполняют разрыв между нулем и минимальным значением нормализованного числа. Минимальное нормализованное число — 1.0 × 2-126. Максимально денормализованное число — 0.11...11 × 2-126. То есть, эти два значения находятся почти впритык друг к другу, что было бы невозможно, если бы экспонента в денормализованном числе была равна 2-127.
>>1329676 >Цель понять разницу между > микроконтроллером
Микросхема
см. микропроцессор+встроенная оператива+встроенная флеш-память+ конфигурируемые ноги+различные аппаратные функции для этих ног, начиная от шима и заканчивая разными портами вроде SPI и USB.
> , промышленным контроллером, , ПЛК
Готовое устройство в большом корпусе на DIN рейку, сделанное из микроконтроллера, защищенной обвязке его ног и предназначенное для установки в шкаф.
Суть ПЛК в том что его можно программировать лишь на 5 упоротых язхыках (3 из них визуальные программировать мышкой, один - абсткрактный ассемблер и ещё один - паскалеподобный). Если коробку нельзя программировать на этих 5 языках и/или она не имеет соответсвующей сертификации - это не ПЛК.
Программируемая микросхема с аппаратным эмулятором железа. Эмулирует железхо на уровне железа путем универсальных соединяемых ячеек. Применяется там, где идет разработка других микросхем или там где программы на микропроцессоре работают слишком медленно и нужна аппаратная реализация.
, IOT
Баззворд, internet of things. Суть в том что если запихнуть в каждый утюг и вибратор вайфай или другую радиопередающую хуету которая будет соединять с интернетом то наступить всеобщее счастье.
, СБИС
сверхбольшая интегральная схема. Английский аналог - VLSI. В принципе любой чип который ты можешь найти на материнской плате - СБИС.
, короче вот это вот все. Понять как их программируют.
Судя по твоим вопросма - тебе в АСУ тред в /wrk/
И понять как программировать управление устройствами по MODBUS.
Здравствуйте, пилюкаю на плюсах, потихоньку ковыраю asm, возник вопрос, вот есть функция, которая возвращает какую-то структурку как пример:
struct S1{ float x; float y; };
extern "C" S1 getval()
Вопрос, а как эта структура возвращается программе? если б било бы какое-то простое значение, то для x86 оно либо через EAX, либо чрез ST(0) будет получено. На стеке хз как передать, ибо по окончанию процедуры он будет восстановлен. Как оно вообще все работает?
>>1339013 > Как оно вообще все работает? Если оно влезает в EDX:EAX, то возвращается в них (именно это у тебя и происходит, а остальное - преобразования каждого члена из набора 32 бит в float). Вот такое: S1 getval(void) { return (S1) { 1.0, 2.0 }; } int main(void) { S1 res = getval(); }
Иначе, если оно в EDX:EAX не влезет (например, добавь float z в S1) вызывающая функция неявно первым параметром кладет в стек указатель на структуру, куда вызываемая функция должна записать результат. Вызываемая функция пишет результат и возвращает этот же указатель в eax. Т.е., вот это: S1 getval(void) { return (S1) { 1.0, 2.0, 3.0 }; } int main(void) { S1 res = getval(); }
>>1339020 Пятая и девятая строки по твоей ссылке. Но да, оно одновременно делает для printf даблы из флоатов. Т.е., положили регистр в стек, взяли movss в SSE-регистр, сконвертировали cvtps2pd в дабл и положили movsd в стек дабл.
>>1339018 я просто читал немного про call-convention, и не до конца нашел инфу, как именно написать совместимую с с++ кодом асм функцию и возвращать такие жирные объекты. Оно понятно, что для жирного объекта надо работать с указателем. >>1339021
т.е отъели от стека памяти под структуру, скормили через lea адрес, в который будет записывать функция, так? т.е функция на самом деле будет уже иметь один входной параметр, который будет у нее ожидать компилятор?
>>1339022 > т.е функция на самом деле будет уже иметь один входной параметр, который будет у нее ожидать компилятор? Да, неявный параметр, который всегда на стеке (даже если __fastcall) и всегда первый: если бы было S1 getval(int foo, int bar), фактически компилятор генерил был код для S1∗ getval(S1 ∗result, int foo, int bar).
> т.е отъели от стека памяти под структуру Да. Причем заметь, что оно даже с оптимизациями делает отдельную временную переменную для возвращаемого значения, и потом уже копирует туда, куда ты присваиваешь результат функции, при этом читает оно не из временной структуры, адрес которой компилятору вроде бы известен заранее, а именно по возвращенному в EAX указателю (псевдокод выше кидал).
Зачем нужно копирование, я не знаю, но так было еще в VC++98. Хотя если пофантазировать, при таком подходе у функции есть возможность послать нахуй эту временную структуру (и аргумент с указателем на нее) и возвращать, например, адрес какой-то глобальной константной структуры.
Как посмотреть при дебаггере в IDA какая инструкция выполняется прямо сейчас, по нажатию мыши например. Я нажимаю например добавить поле, ввожу название для него и тд. Должно же состояние меняться по идее, а в дебаггере такого не происходит. Я думаю надо плагин установить.
>>1339273 > для удобства так сделал? Да. У IDA/HexRays для регистров в прототипах используется нечто похожее, а двоеточие - это обычный способ указывать пару регистров (в том числе, и в манаулах интела).
>>1339370 По нажатию мыши выполняется миллион инструкций, и хорошо еще, если один. Тебе стоит прочитать что-нибудь про оконные сообщения в винде.
>>1341127 Сам по себе асм гораздо проще. Но если писать что-то сложное или быстрое, всплывает куча нюансов, требующих глубокого понимания работы процессора и памяти, как минимум.
Реверсачеры, можете пояснить за гипервизоры простым языком? Нагуглил только сложную инфу на ангельском, не могу пока осилить технически. С меня как всегда.
Реверсач, либо я тупой либо я не знаю что. Есть 25 значений по адресу adress + offset, каждое из них занимает по 1 байту. Мне нужно выдернуть 11 значение из этого списка и изменить его. Делаю так: uint8_t* adress + offset |= 1 << 0xb;
Сап реверсач. Есть ли отладчики с возможностью писать комментарии к строкам кода, дампу памяти и прочему? Чтобы можно было просто щелкнуть на определенный фрагмент стека и в поле рядом написать "здесь хранится пароль", просто ситуация когда в одну функцию вложили функций 7, то постоянная сверка этих ebp+78, ebp+160 выносит мой мозг.
>>1347539 IDA позволяет нормально обозвать локальные переменные, смотреть содержимое наведением мыши, в том числе для указателей и т. д., но зато ее отладчик неудобен в остальных моментах.
>>1347616 > OllyDbg даже без плагинов это умеет Там можно только к коду комментарии писать. Или ты обладатель тайного знания о том, как переименовать LOCAL.1 во что-то более внятное или знаешь как заставить OllyDbg распознать локальную переменную, когда он сам не осилил? Без плагинов.
>>1346146 Бамп, анончики! Нужно сдампить. Драйвер не дает это сделать, следовательно надо дампить тоже из ядра... Допустим напишу драйвер, как мне его загрузить-то? Патчгвард не даст же.
>>1347830 Так из ядра он не может предотвратить дамп. Все что мне нужно это получить структуру процесса. Даже если он там что-то похукает, что уже сомнительно, я могу свой callback раньше зарегистрировать.
>>1347834 Могу посоветовать несколько тупо тупых вариантов. 1. Поставить WinXP в виртуалку и не париться на счет подписи драйверов. 2. Сделать BSoD при запущенном файле с фулл-дампом и смотреть в windbg 3. Найти таки generic unpacker под свой протектор. 4. Ознакомиться с https://vxlab.info/wasm/article.php-article=dumping.htm и подобными статьями, чтобы понять, что все не так однозначно, т.к. драйвер может с системой стартовать, раньше чем ты хукать соберешься. 5. Тупо сидеть и трасисровать в windbg syser жив? чем вообще сейчас в ринг0 дебажат? 6. Ну и как вариант - попытаться заинжектить свою длл
>>1347835 О, благодарю, статья очень годная. Почти все способы не подойдут. Там процесс Denuvo накрыт + драйвер как говорил уже ранее. Все таки без танцев с бубнами ничего не выйдет. Буду пробовать тогда писать драйвер дампить через mmcopyvirtualmemory и грузится в тестовом режиме с тестовой подписью, мб пройдет такое.
Аноны, как в windbg просмотреть весь лист вызовов? Например я вызываю функцию CreateProcess в юзермоде и хочу просмотреть всю иерархию вызовов и в ядре тоже.
>>1301036 (OP) Кто-нибудь знает, как в ARMовском ассемблере поместить программу по произвольному адресу в памяти? По умолчанию программа располагается начиная с адреса 0х00000008, а надо, что бы она располагалась, например, по адресу 0х20002000. Я пробывал использовать DCD 0x20002000, но это меняет только регистр-указатель, при этом программа остаётся по старому адресу. Хорошо работает команда SPACE 0x400, но если адрес слишком большой, то компиляция занимает ооооочень много времени. Подскажите, может быть сталкивались с этим?
>>1353014 Почему у тебя x/o пустой и r/o нулевой, хотя ты явно хочешь переместить именно код? Алсо, попробуй org задать в ассемблере, хуй знает. Это Keil?
>Алсо, попробуй org задать в ассемблере Unknown opcode ORG , expecting opcode or Macro. Судя по всему, его даже в системе команд нет.
>Почему у тебя x/o пустой и r/o нулевой Это дефолтные значения, я менял и то, и то, потом менял только x/o, потом менял только r/o, но всё равно в отладчике команды как были по адресу 0x00000008 так и остались.
Допустим есть маленькая утилита (единственный exe файл на 14 мб), которая конектится раком через хуй к дискорду/инторнету и проверяет, совпадает ли ключ. С чего начать, если я совсем нуфажик, но могу в кодинг. На ней наверняка висят какие-то защиты, как вообще к ней поступиться?
>>1354658 14 мб это дохуя, уверен она под протектором. Нихуя ты не сделаешь без знаний, забей. Можешь трафик понюхать, обычно это самое слабое место васянских утилит.
Тру системники тут? Есть фуллскрин приложение Opengl/directx. Возможно ли как-то поверх него разместить свое окно или просто делать отрисовку? Работаю в ядре.
Реверсач, почему у экзешника упакованного Темидой только 1 импорт? lstrcpy. Я знаю, что можно вызывать динамически винапи через GetProcAddress + GetModuleHandle, но тут только lstrcpy. Как это работает, может объяснить кто-нибудь?
Поясните за кернел драйвера. Я так понимаю, что они нужны чтобы читать и модифицировать память какого-то процесса. Но зачем нужен инжект, если драйвер сам по себе обязан иметь все права? Я короч запутался, помогите...
>>1358584 > Я знаю, что можно вызывать динамически винапи TEB->PEB->PEB_LDR_DATA->InLoadOrderModuleList->kernel32.dll, ну и дальше можно парсить экспорты.
Начал я тут обмазываться 8051 и у меня встал вопрос по поводу передачи данных через UART. Вот смотрите, предположим есть у нас 8051 с частотой 12МГц и делителем 12 подключенный через последовательный кабель к компу. Комп настроен на передачу данных со скоростью 9600 бод. Судя по расчетам вот тут: http://www.keil.com/c51/baudrate.asp самая близкая скорость, которую мы можем получить на микроконтроллере это 10 417 бод, что не соответствует нашим стандартным 9600, хотя во всех инструкциях к 8051 пишут, что для 9600 нужно ставить именно эту скорость. Так вот, как это работает, если скорость передачи и приема не совпадают?
>>1358605 Ааааа, вот это уже похоже на правду, но все равно не совсем понял, хоть и писал недавно PE парсер. Получаю PEB своего процесса А как его получить без вызова апи то?, смотрю в список загруженных модулей, там нахожу нужный, применяю парсер, нахожу адреса функций А что дальше? Как их вызывать-то? Или напрямую можно, так как модуль внутренний?.
>>1359065 >[fs:0x18]+0x30 в 32-битном коде и [gs:0x30]+0x60 в 64-битном. Спасибо, погуглю. Не знал что так можно.
>Ну как можно вызывать фукнцию, если у тебя адрес есть? Просто вызываешь и все. Да, тупанул. Парсер писал для удаленных модулей, а не для внутренних, там по-другому немного было.
Получается, что до всей внутренней информации я могу добраться вручную? Без вызовов апи, правильно?
А вот vmprotect в новых версиях используют системные вызовы, чтобы апи похукать нельзя было, но системные вызовы имеют разные коды на разных системах, не хардкодили же они все это дело? Тоже распарсить выходит можно или дизасемблер нужен?
>>1359076 > не хардкодили же они все это дело Хардкодили. Поэтому там по-хорошему должен быть фолбек, если оно не знает текущую винду.
> до всей внутренней информации я могу добраться вручную Ну если оно лежит в юзермоде, и ты не боишься, что твой софт сломается в следующем билде десяточки из-за распидорашенных структур, то можно, да.
Да бомбит блять! Почему windbg такой кривой? dt nt!_eprocess <address> все показывает, хочу вытянуть из eprocess peb, пишу dt nt!_eprocess peb <address> И НИХУЯ! dt nt!_peb <address> тоже нихуя. Зато когда рекурсией прохожусь dt nt!_eprocess <address> -r, то все показывает. Как правильно то делать? Делаю как в книжке написано windows internals и выводится только название структуры, но не ее поля.
Кто умеет по фасту виндовые dll ревёрсить? http://rgho.st/66crCxNyS Будучи запущенной через rundll32 в фоне есть n-1 ядер и перестает есть когда открывается диспетчер задач. (для аналогичных прог остановка не прописана). Рядом лежали dll-ки для SSL, отсылал в сеть менее килобайта данных, по крайней мере на момент когда спалил. В ресурсах рандомные джипеги и описания из видосов на ютубе (и ссылки). Выглядит как рандом чтобы наебнуть чексуммы. Брат умрёт?
Реверсачеры. Что-то я запутался, помогайте. Есть хеллоуворлд, в нем функция складывающая два числа, как мне удаленно вызвать эту функцию с нужными параметрами и получить результат?
Я тут недавно в глупую историю попал из за пароля, поставленного на hdd в биосе. Никто не знает, как там шифрование работает? Или может дадите ссылку почитать где это хорошо расписано именно с программными деталями?
>>1360973 Там какой-то пиздец, если честно. Нихуя не понятно +xmm >>1361200 Тебе лучше в сторону mhdd копать. Есть варианты со стандартным паролем, а есть и без.
Вкатываюсь в изучение FASM. В тех гайдах, по которым я учусь- написано, что скомпилированная программа должна запускаться под Шindows. Но она сука не запускается. Выдаёт мне эту ошибку. Он вроде как компилирует в DOS-овский формат .com Но судя по тому что написано в гайде- он должен прекрасно запускаться
http://asmworld.ru/uchebnyj-kurs/001-neobxodimye-instrumenty/ > Все программы учебного курса вы сможете запустить под Windows. Конечно, реально они будут работать в эмуляторе DOS, в режиме виртуального процессора 8086. Но для учебных целей это вполне подойдёт.
>>1362267 Тебе в любом случае инжектить код, который либо что-то делает сразу, либо грузит длл, которая что-то делает. Можно, например, SetThreadContext сделать, можно традиционный SetWindowsHookEx, зависит все от того, что ты делаешь и зачем.
Сап, читаю Калашникова Остановился на этой программе, не могу понять почему отладчики творят какую-то херню, хотя в обычном DOS выполнении строка выводится Почему отладчик сразу прыгает на адрес смещения Lab_1?
>>1362334 > не могу понять почему отладчики творят какую-то херню Я хуй знаю, что именно имел в виду Калашников 9090h там явно не зря, но по-моему, он промахнулся. Независимо от того, как именно работает конкретный отладчик если это, конечно, не "внешний" отладчик какого-нибудь эмулятора, вроде отладчика DOSBox или Bochs: втыкает ли он int3 в первый байт строки (6), или взводит TF, или у него аппаратные точки останова я, кстати не помню, они в 16-битном режиме есть?, но что бы он ни делал, при попытке пошагового выполнения это должно вызвать исключение, чтобы отладчик получил управление. После выполнения первой же инструкции sp у тебя указывает на lab1, стек растет в обратную сторону, поэтому при передаче управления обработчику исключения (прерывания) процессор положит в стек cs:ip и flags, т.е., 6 байт минимум, и тем самым потрет инструкции из строк (6)-(7)-(8), плюс обработчик тоже что-нибудь свое в стек положит, эти данные потрут строку (5) и, возможно, еще немного PSP. Если отладчик втыкал int3, то он восстановит кусок инструкции в (6), или не восстановит, похуй - все равно при возврате из обработчика прерывания вместо кода будут байты адресов, т.е., мусор. То же самое произойдет в том редком случае, когда после выполнения одной из первых трех инструкций тикнет таймер, или произойдет еще какое-нибудь аппаратное прерывание, поэтому это не антиотладка, а говно генератор псевдослучайных багов.
>>1362334 >>1362350 Лол, а поведение без отладичка-то я и не описал. В общем, в 90h - это инструкция NOP, в строке 7 две эти инструкции кладутся в стек (т.е., SP=SP-2, word[SP] = 9090h), затирая тем самым инструкцию в строке (8), поэтому если каких-то внешних прерываний не будет, то вместо int 20h выполнится два nop, и потом управление уйдет в строку (10).
Читал я о том, что в винде в х86 процессах через FS:[0] а в x64 d GS:[0] я попадаю прямиком на TEB текущего треда. Но вот беда, в дебаггере например х64dbg все значения сегментов всего 2 байта, у которых старшие 16 бит обычно 0, а младшие 16 одинаковые у некоторых сегментых регистров. Как же так, думаю я, пацаны же говорили нормально можно через сегментные регистры шарить, и тут мне говорят, что сейчас сегментные регистры вообще то селекторы в GDT/LDT в зависимости от третьего бита справа, а остальное - оффсет в количестве записей или в байтах? в (G/L)DT. И дальше я завис. А как мне пошарить то в этой LDT? К примеру, вот хочу я в дебаггере посмотреть чё там в TEB, смотрю на FS/GS вижу там 002B 101011 → GDT, 3 ring , и нихуя себе? Это я на ТЕВ данного процесса должен выйти через глобальную таблицу? Как мне из 002В попасть на ТЕВ? И почему несколько сегментных регистров имеют это значение? Я знаю, что они смысла не имеют как в 16 битных процессах, но всё же.
>>1364936 > А как мне пошарить то в этой LDT? GetThreadSelectorEntry() даст тебе базу сегмента по его селектору (не работает в 64-битной винде). Алсо, в самом TEB лежит нормальный, линейный адрес TEB, поэтому в ольке можно в окне дампа перейти (Ctrl+G) по [fs:0x18] и [gs:0x30] и смотреть, а в x64dbg это будет fs:[0x18] и gs:[0x30] для 32- и 64-битного кода соответственно.
> почему несколько сегментных регистров имеют это значение Потому что в x86-64 "сломали" сегментные регистры, и база из дескриптора больше не учитывается, но для fs/gs базой можно манипулировать через MSR (из ядра).
Аноны, нужно вычислить к какому драйверу обращается приложение по хэндлу. Хукаю DeviceIoControl, получаю нужный хэндл. Что дальше с этим хэндлом можно сделать чтобы узнать как можно больше инфы о драйвере?
>>1367027 Машинное слово - платформозависимая хрень, равна разрядности регистров процессора (покури хотя бы вики). В твоей статье используется 16 разрядный режим (см комментарии к коду), word - 16 бит/2 байта. Двойное слово - 32 байта.
>>1358605 Надеюсь ты еще здесь. Пытаюсь тоже самое провернуть в ядре. Знаю что можно динамически получать адрес RtlInitUnicodeString + MmGetSystemRoutineAddress. Можно улучшить как-нибудь?
>>1367341 >>1367344 Проиграл. Но мне тащемта чисто в исследовательских целях нужна эта информация, тарищ майор. Спортивный интерес так сказать. А потом в швитые шышыа понаеду к маломягким работать за котлету вечнозеленых. Ну и у юзверей давно нет доступа к ядру, какие там руткиты.
Как представить 5 байтов в ассемблере как 10 тетрад, аноны? Как их хранить? Мне нужно сделать между ними хоr и я черт его знает как их разделить пополам.
>>1367852 Мне нужно байт разделить на две тетрады. То бишь 10101010 нужно поделить на 1010 и 1010 и между ними сделать хоr, если я правильно задание понял. (Дан массив из 5 байтов. Рассматривая его как массив из 10 тетрад, найти «исключающее или» всех 10 тетрад.) Не к спеху на самом деле, сдача только через неделю, но задание странное. Я нипонил.
>>1367868 >>1367865 Я тут поклацал, поклацал в турбоассемблере(такие дела, у нас изучают это). И выводит вроде не то. Help, please :3 Может я не то делаю, и нужно с байтами по другому. https://ideone.com/bdBqe3
Вы пишите на ассемблере или собираетесь начать на нём писать? Программируете микроконтролёры, пишете драйвера для ОС, а то и саму ОС? Вам сюда.
Вы изучаете алгоритмы работы закрытого софта, пишите патчи бинарников? Вам тоже сюда.
Попрошайки с "решите лабу по асме за меня" идут в общий тред, а лучше нахуй.
Книги по 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 если кому нужен тред, сами архивируйте, я в следующий добавлю.