Заблокирован
1

Исполнение команд ассемблера на лету

16.05.2018, 16:29. Показов 1130. Ответов 12
Метки нет (Все метки)

Привет ребят! Сразу к делу.
Предполагается софт, в котором формируется некий блок памяти в ОЗУ динамический, в этом блоке опкоды процессора (intel64/OS - Windows).
Софт зациклен (main loop), на каждой итерации нужно проверить кое-какое условие и считать следующую команду для исполнения из ОЗУ из этого динамического блока. Не.. ну понятно, что это медленно, всякие кеши к чёрту летят и тд... всё это дело потом будет оптимизироваться, сейчас же меня интересует сам принцип, как вообще это сделать и на чём подобный софт лучше писать? На FASM?

То есть программа софта как бы не последовательная, это "мутируемый софт" или самомодифицируемый как бы. То есть дальнейшие инструкции для выполнения заранее не известны и определяются вначале каждой новой итерации.
Нужно как-то хитро в EIP пихать следующую инструкцию или как? Я нуб в ассемблерах (относительно), но не нуб во всём остальном
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2018, 16:29
Ответы с готовыми решениями:

Перевод команд ассемблера в машинный код
Доброго времени суток. Не так давно начал изучать ассемблер. И возник следующий вопрос... Дан...

Вам представлен машинный код нескольких команд. Получите соответствующие им команды языка Ассемблера
Вам представлен машинный код нескольких команд. Получите соответствующие им команды языка...

Исполнение команд
Добрый день,хотелось бы задать достаточно тупой вопрос по поводу использования консольных команд....

Создание и исполнение команд в консоли из плагинов
Доброго времени суток. Как можно сделать объект команды, на подобие public class Command { ...

12
Эксперт Hardware
5332 / 1876 / 351
Регистрация: 29.07.2014
Сообщений: 2,816
Записей в блоге: 5
16.05.2018, 18:12 2
Лучший ответ Сообщение было отмечено Mikl___ как решение

Решение

Цитата Сообщение от UAIS Посмотреть сообщение
это "мутируемый софт" или самомодифицируемый как бы.
такие фишки вроде уже не прокатывают - их отлавливают функции DEP - Dáta Execútion Prevéntion (запрет на исполнение секций данных). Раньше FASM выручал, в нём можно было задавать каждой секции отдельные атрибуты, а сейчас уже процики DEP контролируют. Если ЦП обнаруживает запись в свой кэш-инструкций, то сразу включает сирену.
3
Заблокирован
16.05.2018, 19:05  [ТС] 3
Цитата Сообщение от R71MT Посмотреть сообщение
такие фишки вроде уже не прокатывают
Хмм... Странно, берёшь железку, а она запрещает тебе её программировать как надо.. То есть, если я буду делать свою ОС, то это ничего не поменяет, т.к. блокирует именно проц?

Вообще говоря...хмм, ну это ж по сути ветвление, просто команды на лету генеряться... Ладно, спасибо, буду дальше думать...
0
Эксперт Hardware
5332 / 1876 / 351
Регистрация: 29.07.2014
Сообщений: 2,816
Записей в блоге: 5
16.05.2018, 20:59 4
Цитата Сообщение от UAIS Посмотреть сообщение
берёшь железку, а она запрещает тебе её программировать как надо
..а с чего ты взял, что имено так надо её шить - ман есть что-ли на девайс?

То есть, если я буду делать свою ОС, то это ничего не поменяет, т.к. блокирует именно проц?
своя ос - это совсем другое дело, появляется возможность заточить чипсет и проц под себя. Вполне возможно, что аппаратный DEP активируется каким-нибудь битом, например в регистрах MSR - Machine-Specific-Registers (нужно маны курить). Так-же, в регистре CR0 есть бит(16) WP - Write-Protect, но толку от него мало (WP=0 - запрет только для кольца(3), WP=1 - запрет на все кольца) - т.е. он не снимает защиту, а распределяет её по-привелегиям.

это ж по сути ветвление, просто команды на лету генеряться
..если хранить эти команды в регистрах, то можно и схалтурить. Но ты-же кидаешь их потом в память, а дальше хочешь выполнить - вот тут-то и сидит засада.

Если сбросить команды в секцию данных, то у неё атрибуты только(RW), а икса (eХecutable) нету. Если кидать в секцию кода, то у неё запрет на запись - только R/X. Раньше стек был исполняемым, но начиная с Висты его тоже выпилили, т.к. черви прочно оккупировали SEH. Сейчас стек - это та-же секция данных, только со-взведённым битом-направления роста адресов. Вот и думай.. (хотя хакеры уже давно придумали, но об этом здесь тсссс, иначе упекут)

Есть куча API, которые меняют атрибуты регионов памяти (программный DEP), но не факт, что они тебе чем-то помогут. Начиная с DualCore (помоему) инженеры решили раз-и-навсегда избавится от этой проблемы - засунули DEP прямо в процессор, хотя где-то обязательно должен быть бит его вкл/выкл. Народ сейчас права свои знает, и хочет сам контролировать работу купленного товара.

А про "..заюзать мутанта под современной ОС" - забудь, если только не установить Win98 с 486-ым камнем.
Может в манах твоего девайса есть минимальные требования?
3
Заблокирован
16.05.2018, 22:06  [ТС] 5
Цитата Сообщение от R71MT Посмотреть сообщение
Может в манах твоего девайса есть минимальные требования?
не понял о чём речь... Софт-то собственно - это Ultimate AI System (искусственный интеллект), который я хочу заставить работать на уровне опкодов проца, то есть научить оперировать на самом низком уровне своим "телом" как бы по дурацкий это не звучало... что бы в перспективе ему можно было бы стравить какой-то драйвер GPU и он смог бы, выявив закономерности, обучиться работать допустим с видеокартой и что бы ему стали доступны все опкоды какого-то современного GPU (байткоды инструкций же есть в бинарном файле драйвера?), той же nVidia (их точно нет в открытом доступе). Когда система обучиться работать с железом (хотя бы одного определённого компа), тогда можно будет, условно, "попросить" её накидать свою базовую ОС. В общем проект серьёзный, вот и думаю, как бы замутить opcodes runtime execution....

Вообще, ну я даже не знаю, на крестах же можно написать что-то типа того:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
void MOV_EAX_EBX
{
    __asm
    {
        mov eax,ebx
    }
}
...
while(1)
{
     if(что-то там)
          MOV_EAX_EBX();
}
и вызывать эту функцию когда надо...
хаха не, ну понятно, что это бред и таких шаблонов потребуется хренова тонна, хотя можно это дело и продумать, сократив кол-во... Но в принципе, это же возможно...

Я наверное как-то криво изъясняюсь... В общем, системе AI должен быть доступен перечень всех возможных команд (опкодов/инстоукций) проца, что бы она могла обучаться работе с ними. То есть фактический, мне нужен какой-то реальный режим работы с процом.... Эээ не так... Брр... В общем, если абстрагироваться от железа:
Мне нужен какой-то эмулятор CPU, в котором бы я мог бы "дёргать" любую инструкцию проца, после этого у меня должна быть возможность прочитать данные всех регистров CPU(ну и ОЗУ читать так же нужно), что бы система могла "видеть" результат своих действий и накапливать опыт. То есть нужно что-то вроде отладчика что ли.. В принципе, у меня были мысли по поводу DOSBox-а или LLVM, что бы там поиграться, но всё же хотелось бы это сделать на реальном процессоре, что бы не терять в скорости.
0
Эксперт Hardware
5332 / 1876 / 351
Регистрация: 29.07.2014
Сообщений: 2,816
Записей в блоге: 5
16.05.2018, 23:01 6
Цитата Сообщение от UAIS Посмотреть сообщение
не понял о чём речь...
Цитата Сообщение от UAIS Посмотреть сообщение
Странно, берёшь железку,
Цитата Сообщение от UAIS Посмотреть сообщение
на крестах же можно написать что-то типа того:
..так этож не самомодификация, а обычное условие - вставляй хоть тыща штук, и хай "твой интелект" думает. а мутация это совсем другое, например:
Assembler
1
2
3
4
5
6
7
8
9
10
11
nop              ; какой-то код..
dec  byte[$+5]   ; меняем инструкцию впереди себя! JNE превратился в JE
nop              ;
nop              ;
jne  @metka      ; модифицируемая инструкция
nop              ;
nop              ;
inc  byte[$+4]   ; был PUSH, стал POP
nop              ;
push ax          ;
nop              ; и т.д.
3
Заблокирован
17.05.2018, 09:27  [ТС] 7
Цитата Сообщение от R71MT Посмотреть сообщение
так этож не самомодификация, а обычное условие
Хмм, ну как бы да, но это касается самого ИИ, но дело в том, что этот интеллект будет писать код софта, но есть это как бы смарт компилятор, то есть ты ему говоришь что сделать и он пишет софт. Ну так вот, для этого, сам интеллект может работать как обычно и может быть написан хоть на крестах, но вот то, над чем он работает, должно как раз модифицироваться...

Вот смотри, допустим возьмём середину процесса разработки интеллектом софта, то есть какой-то код он уже написал. AI "думает" и пробует сделать какой-то изменение в коде целевого софта и хочет сразу же увидеть изменения, что бы понять, принесли ли они пользу для текущей задачи. То есть он должен на лету смодифицировать код target софта. Я знаю, что можно в принципе делать не на лету, а перекомпилировать каждый раз, но это очень долго, ввиду миллиардов таких итераций, это раз, а во вторых - теряется весь контекст памяти и пр, геморр это всё восстанавливать..

То есть что нужно, нужно что бы софт AI мог бы на лету менять код другого работающего процесса под Windows (для начала, потом своя ОС будет), читать его память и состояние виртуальных регистров того процесса. Такое походу вообще не возможно? Если так, хмм... а возможно ли такое в рамках своего же процесса, то есть процесса AI? То есть AI работает и меняет некую мутируемую часть себя, может какую-то секцию кода...

Я не очень шарю в ассемблерах, по этому интересно, вот EIP - это ж указатель на следующую инструкцию? Хмм, а можно же из ОЗУ залить в какой-то EAX нужный байт код инструкции и в EIP сунуть указатель на него?
Не..бред... Всякие FASM-ы же компилируемые.... Слушай, а есть какой-то режим проца, что бы можно было из работающего процесса Windows заставить CPU выполнить какой-то произвольный opcode, то есть просто сунуть камню байт код инструкции на исполнение? Может есть эмулятор какой-то?
0
Эксперт Hardware
5332 / 1876 / 351
Регистрация: 29.07.2014
Сообщений: 2,816
Записей в блоге: 5
17.05.2018, 11:18 8
Лучший ответ Сообщение было отмечено UAIS как решение

Решение

Цитата Сообщение от UAIS Посмотреть сообщение
то есть ты ему говоришь что сделать и он пишет софт.
процессоры ещё не на том уровне, чтобы обладать достаточным интеллектом - сам он ничего не сможет сделать пока ты не укажешь, что именно нужно делать. Всё-что может процессор - это выбрать из нескольких вариантов, и выполнить задачу быстро. Сейчас они ценятся за скорость, а не за интеллект (вырежи с системы биос и процессор встанет как вкопаный).

От сюда следует, что ты должен зашить ему "в мозги" несколько/готовых вариантов, а он (исходя из ситуации) найдёт из них наиболее предпочтительный - в этом и заключается его интеллект, который соответствует интеллекту самого программиста. При тестировании, можно на каждый вариант поставить счётчик-запросов, и потом отсеить за ненадобностью редко/используемые процедуры. Интеллект от этого уменьшится, зато мозг (которого и так мало) освободится для других задач.

То есть нужно что бы софт AI мог бы на лету менять код другого работающего процесса под Windows (для начала, потом своя ОС будет). Такое походу вообще не возможно?
..почему невозможно-то? Это только винда запрещает, т.к. при переходе в защищённый режим назначает всем сегментам свои атрибуты в таблице GDT. Пили свою ОС, и открывай все атрибуты на-распашку. Контролирущий обращения к страницам гипервизор - это часть винды, и если ты напишешь свою ось, то контролировать уже будет некому - баян у тебя на руках, как-хочешь - так и играй.

вот EIP - это ж указатель на следующую инструкцию? а можно же из ОЗУ залить в какой-то EAX нужный байт код инструкции и в EIP сунуть указатель на него?
..можно - push opcode -> ret, только это относится уже к чёрной магии, и за обсуждения здесь деталей реализации, можно отправиться вслед за Ж.Дарк - сожгут на костре. Взлом на этом ресурсе не обсуждают, поэтому ищи соответствующую блэк-площадку.
0
Заблокирован
17.05.2018, 11:59  [ТС] 9
Цитата Сообщение от R71MT Посмотреть сообщение
процессоры ещё не на том уровне, чтобы обладать достаточным интеллектом
Да не, от процессора ничего интеллектуального и не требуется, все условно биологически-подобные нейросети находятся в софте AI, который может работать не обязательно на этом же CPU.
Цитата Сообщение от R71MT Посмотреть сообщение
можно отправиться вслед за Ж.Дарк - сожгут на костре
Кхе.. ну так я ж не вирус пишу, ну да ладно, в общем я понял, нужно свою ОС пилить, спасибо за инфу!
P.S.: хотя, если так подумать, системы уровня ultimate (то есть превосходящие биологический искусственный интеллект) - это не то что бы вирус, это вообще сингулярное хана всему, SkyNet
0
Заблокирован
17.05.2018, 13:03 10
Лучший ответ Сообщение было отмечено UAIS как решение

Решение

Цитата Сообщение от R71MT Посмотреть сообщение
такие фишки вроде уже не прокатывают - их отлавливают функции DEP - Dáta Execútion Prevéntion (запрет на исполнение секций данных)
Давно этой темой не занимался, но вроде это актуально для защиты от переполнения буфера. То есть, чтобы в чужом процессе шелл-код, например, в стеке не выполнялся. А в своем процессе можно себя самомодифицировать сколько влезет. Выделяем память, даем ей права на запись и исполнение, пишем туда, что угодно, исполняем. Без выделения памяти, просто меняем пермишны на регион памяти функции, и в памяти меняем код функции. Это обязано работать.

Добавлено через 2 минуты
Цитата Сообщение от UAIS Посмотреть сообщение
Нужно как-то хитро в EIP пихать следующую инструкцию или как?
Можно написать любой свой код в памяти и сделать на него jump, например. Или call. Зависит все от того кода, который ты напишешь.
0
1149 / 1074 / 172
Регистрация: 19.02.2010
Сообщений: 3,230
17.05.2018, 14:28 11
Цитата Сообщение от UAIS Посмотреть сообщение
То есть он должен на лету смодифицировать код target софта. Я знаю, что можно в принципе делать не на лету, а перекомпилировать каждый раз, но это очень долго, ввиду миллиардов таких итераций, это раз, а во вторых - теряется весь контекст памяти и пр, геморр это всё восстанавливать..
(далее будет пример под Винды)
Так компилируйте не в своё адресное пространство процесса, а в отдельную dll, потом подгружайте её стандартными средствами Винды, вызывайте из dll функцию с нужными аргументами (или без них), по итогам работы - выгружайте и переходите к след.итерации самомодификации.
Да, будет тоже относительно долго - но зато не будет теряться контекст памяти.
В общем, не нужно модифицировать себя (самУ основную прогу) - надо модифицировать плагин к ней. А последующую работу с плагином (загрузку-выгрузку) организовывать средствами ОС.
1
Эксперт Hardware
5332 / 1876 / 351
Регистрация: 29.07.2014
Сообщений: 2,816
Записей в блоге: 5
17.05.2018, 15:22 12
Лучший ответ Сообщение было отмечено Mikl___ как решение

Решение

Цитата Сообщение от Pavel_Srgv Посмотреть сообщение
А в своем процессе можно себя самомодифицировать сколько влезет
..я-бы не стал так категорично утверждать, там есть много нюансов. Ясно, что речь не идёт о выделении памяти с предустановленными атрибутами (и то, если не пронюхает потом факт модификации авер). C тех пор как контроллёр памяти переехал в процессор (Core i3+), логика его работы сильно изменилась - инженеры неразрывно связали контроллёры ОЗУ и кэш, чтобы снизить уязвимости. Теперь, если сможешь изменить код в памяти, то после попадания этого кода в кэш ты его уже не изменишь. То есть менять можно только те инструкции, которые не попали ещё в кэш.

Я пытаюсь донести, что кэш-контроллёр на аппаратном уровне не способен производить запись в кэш-инструкций, как и исполнять инструкции из кэша-данных. Если модифицируемая строка лежит уже в i-кэш, то после её изменения, она запишется уже не на своё место, а автоматом отбросится в кэш-данных, в результате чего не выполнится. Если-уж сильно хочется, то придётся полностью очищать кэш, с выгрузкой грязных строк wbinvd (WriteBack Invalidate cache), а потом затребовать исполнения ещё раз.
1
Заблокирован
17.05.2018, 15:56 13
Цитата Сообщение от R71MT Посмотреть сообщение
Ясно, что речь не идёт о выделении памяти с предустановленными атрибутами
Из сообщения автора я просто не понял, что речь идет не об этом Я думал, что обо всем и о любом способе Самый простой для меня способ был бы VirtualProtect на рендж функции, меняем ее, и все.

Добавлено через 4 минуты
Цитата Сообщение от R71MT Посмотреть сообщение
и то, если не пронюхает потом факт модификации авер
Антивирусы уже вроде давно на самомодификацию не сетуют. Очень много пакеров и "защитников" программ используют расшифровку налету в память во время работы программы. В памяти первым всплывает, пожалуй, Армадилло даже не знаю, существует ли он сейчас.

Добавлено через 26 минут
Вот, набросал небольшой пример самомодификации:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <Windows.h>
 
int func()
{
    int a = 10;
    return a;
} 
 
int main()
{
    printf("%d\n", func());
    DWORD oldProtect;
    if (0 == VirtualProtectEx(GetCurrentProcess(), &func, 20, PAGE_EXECUTE_READWRITE, &oldProtect))
    {
        printf("Unable to change page protection\n%d", GetLastError());
    }
    *(int*)func = 0xc3c3c033;
    printf("%d\n", func());
    getchar();
    return 0;
}
Выводом будет:
Код
10
0
То есть, мы изменили оригинальный код функции на
Assembler
1
2
3
xor eax, eax
ret
ret
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2018, 15:56

список команд ассемблера
есть у кого список команд ассемблера c объяснением?

Исполнение алгоритма для конкретного исполнителя с фиксированным набором команд
http://ege.yandex.ru/informatics/question/A13/1 Пожалуйста помогите решить это ужасное А13, С1 и...

Временно отменить добавление команд в очередь команд диалогового окна
Добрый день, уважаемые программисты! Начнём по порядку... Я пишу оконное приложение на WinApi,...

Таблица футбольных команд: Сформировать показатели команд заданного континента
Есть вот такое задание. Рейтинговая таблица футбольных сборных содержит следующие сведения:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.